mirror of https://github.com/google/benchmark.git
Ensure we don't need benchmark installed to pass c++ feature checks (#1456)
* Ensure we don't need benchmark installed to pass c++ feature checks Requires removal of some dependencies on benchmark.h from internal low-level headers, which is a good thing. Also added better logging to the feature check cmake module.
This commit is contained in:
parent
5eb16eebb3
commit
974cd5a5c5
|
@ -223,7 +223,7 @@ else()
|
||||||
add_cxx_compiler_flag(-wd654)
|
add_cxx_compiler_flag(-wd654)
|
||||||
add_cxx_compiler_flag(-Wthread-safety)
|
add_cxx_compiler_flag(-Wthread-safety)
|
||||||
if (HAVE_CXX_FLAG_WTHREAD_SAFETY)
|
if (HAVE_CXX_FLAG_WTHREAD_SAFETY)
|
||||||
cxx_feature_check(THREAD_SAFETY_ATTRIBUTES)
|
cxx_feature_check(THREAD_SAFETY_ATTRIBUTES "-DINCLUDE_DIRECTORIES=${PROJECT_SOURCE_DIR}/include")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# On most UNIX like platforms g++ and clang++ define _GNU_SOURCE as a
|
# On most UNIX like platforms g++ and clang++ define _GNU_SOURCE as a
|
||||||
|
|
|
@ -27,17 +27,18 @@ function(cxx_feature_check FILE)
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
set(FEATURE_CHECK_CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS})
|
||||||
if (ARGC GREATER 1)
|
if (ARGC GREATER 1)
|
||||||
message(STATUS "Enabling additional flags: ${ARGV1}")
|
message(STATUS "Enabling additional flags: ${ARGV1}")
|
||||||
list(APPEND BENCHMARK_CXX_LINKER_FLAGS ${ARGV1})
|
list(APPEND FEATURE_CHECK_CMAKE_FLAGS ${ARGV1})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT DEFINED COMPILE_${FEATURE})
|
if (NOT DEFINED COMPILE_${FEATURE})
|
||||||
message(STATUS "Performing Test ${FEATURE}")
|
|
||||||
if(CMAKE_CROSSCOMPILING)
|
if(CMAKE_CROSSCOMPILING)
|
||||||
|
message(STATUS "Cross-compiling to test ${FEATURE}")
|
||||||
try_compile(COMPILE_${FEATURE}
|
try_compile(COMPILE_${FEATURE}
|
||||||
${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp
|
${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp
|
||||||
CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS}
|
CMAKE_FLAGS ${FEATURE_CHECK_CMAKE_FLAGS}
|
||||||
LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES}
|
LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES}
|
||||||
OUTPUT_VARIABLE COMPILE_OUTPUT_VAR)
|
OUTPUT_VARIABLE COMPILE_OUTPUT_VAR)
|
||||||
if(COMPILE_${FEATURE})
|
if(COMPILE_${FEATURE})
|
||||||
|
@ -48,10 +49,10 @@ function(cxx_feature_check FILE)
|
||||||
set(RUN_${FEATURE} 1 CACHE INTERNAL "")
|
set(RUN_${FEATURE} 1 CACHE INTERNAL "")
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
message(STATUS "Performing Test ${FEATURE}")
|
message(STATUS "Compiling and running to test ${FEATURE}")
|
||||||
try_run(RUN_${FEATURE} COMPILE_${FEATURE}
|
try_run(RUN_${FEATURE} COMPILE_${FEATURE}
|
||||||
${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp
|
${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp
|
||||||
CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS}
|
CMAKE_FLAGS ${FEATURE_CHECK_CMAKE_FLAGS}
|
||||||
LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES}
|
LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES}
|
||||||
COMPILE_OUTPUT_VARIABLE COMPILE_OUTPUT_VAR)
|
COMPILE_OUTPUT_VARIABLE COMPILE_OUTPUT_VAR)
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -220,22 +220,11 @@ BENCHMARK(BM_test)->Unit(benchmark::kMillisecond);
|
||||||
|
|
||||||
#if defined(__GNUC__) || defined(__clang__)
|
#if defined(__GNUC__) || defined(__clang__)
|
||||||
#define BENCHMARK_ALWAYS_INLINE __attribute__((always_inline))
|
#define BENCHMARK_ALWAYS_INLINE __attribute__((always_inline))
|
||||||
#define BENCHMARK_NOEXCEPT noexcept
|
|
||||||
#define BENCHMARK_NOEXCEPT_OP(x) noexcept(x)
|
|
||||||
#elif defined(_MSC_VER) && !defined(__clang__)
|
#elif defined(_MSC_VER) && !defined(__clang__)
|
||||||
#define BENCHMARK_ALWAYS_INLINE __forceinline
|
#define BENCHMARK_ALWAYS_INLINE __forceinline
|
||||||
#if _MSC_VER >= 1900
|
|
||||||
#define BENCHMARK_NOEXCEPT noexcept
|
|
||||||
#define BENCHMARK_NOEXCEPT_OP(x) noexcept(x)
|
|
||||||
#else
|
|
||||||
#define BENCHMARK_NOEXCEPT
|
|
||||||
#define BENCHMARK_NOEXCEPT_OP(x)
|
|
||||||
#endif
|
|
||||||
#define __func__ __FUNCTION__
|
#define __func__ __FUNCTION__
|
||||||
#else
|
#else
|
||||||
#define BENCHMARK_ALWAYS_INLINE
|
#define BENCHMARK_ALWAYS_INLINE
|
||||||
#define BENCHMARK_NOEXCEPT
|
|
||||||
#define BENCHMARK_NOEXCEPT_OP(x)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define BENCHMARK_INTERNAL_TOSTRING2(x) #x
|
#define BENCHMARK_INTERNAL_TOSTRING2(x) #x
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#ifndef BENCHMARK_REGISTER_H
|
#ifndef BENCHMARK_REGISTER_H
|
||||||
#define BENCHMARK_REGISTER_H
|
#define BENCHMARK_REGISTER_H
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
|
17
src/check.h
17
src/check.h
|
@ -9,6 +9,23 @@
|
||||||
#include "internal_macros.h"
|
#include "internal_macros.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
|
#if defined(__GNUC__) || defined(__clang__)
|
||||||
|
#define BENCHMARK_NOEXCEPT noexcept
|
||||||
|
#define BENCHMARK_NOEXCEPT_OP(x) noexcept(x)
|
||||||
|
#elif defined(_MSC_VER) && !defined(__clang__)
|
||||||
|
#if _MSC_VER >= 1900
|
||||||
|
#define BENCHMARK_NOEXCEPT noexcept
|
||||||
|
#define BENCHMARK_NOEXCEPT_OP(x) noexcept(x)
|
||||||
|
#else
|
||||||
|
#define BENCHMARK_NOEXCEPT
|
||||||
|
#define BENCHMARK_NOEXCEPT_OP(x)
|
||||||
|
#endif
|
||||||
|
#define __func__ __FUNCTION__
|
||||||
|
#else
|
||||||
|
#define BENCHMARK_NOEXCEPT
|
||||||
|
#define BENCHMARK_NOEXCEPT_OP(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace benchmark {
|
namespace benchmark {
|
||||||
namespace internal {
|
namespace internal {
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
#ifndef BENCHMARK_INTERNAL_MACROS_H_
|
#ifndef BENCHMARK_INTERNAL_MACROS_H_
|
||||||
#define BENCHMARK_INTERNAL_MACROS_H_
|
#define BENCHMARK_INTERNAL_MACROS_H_
|
||||||
|
|
||||||
#include "benchmark/benchmark.h"
|
|
||||||
|
|
||||||
/* Needed to detect STL */
|
/* Needed to detect STL */
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
|
||||||
|
|
26
src/log.h
26
src/log.h
|
@ -4,7 +4,12 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
|
|
||||||
#include "benchmark/benchmark.h"
|
// NOTE: this is also defined in benchmark.h but we're trying to avoid a
|
||||||
|
// dependency.
|
||||||
|
// The _MSVC_LANG check should detect Visual Studio 2015 Update 3 and newer.
|
||||||
|
#if __cplusplus >= 201103L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201103L)
|
||||||
|
#define BENCHMARK_HAS_CXX11
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace benchmark {
|
namespace benchmark {
|
||||||
namespace internal {
|
namespace internal {
|
||||||
|
@ -23,7 +28,16 @@ class LogType {
|
||||||
private:
|
private:
|
||||||
LogType(std::ostream* out) : out_(out) {}
|
LogType(std::ostream* out) : out_(out) {}
|
||||||
std::ostream* out_;
|
std::ostream* out_;
|
||||||
BENCHMARK_DISALLOW_COPY_AND_ASSIGN(LogType);
|
|
||||||
|
// NOTE: we could use BENCHMARK_DISALLOW_COPY_AND_ASSIGN but we shouldn't have
|
||||||
|
// a dependency on benchmark.h from here.
|
||||||
|
#ifndef BENCHMARK_HAS_CXX11
|
||||||
|
LogType(const LogType&);
|
||||||
|
LogType& operator=(const LogType&);
|
||||||
|
#else
|
||||||
|
LogType(const LogType&) = delete;
|
||||||
|
LogType& operator=(const LogType&) = delete;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class Tp>
|
template <class Tp>
|
||||||
|
@ -47,13 +61,13 @@ inline int& LogLevel() {
|
||||||
}
|
}
|
||||||
|
|
||||||
inline LogType& GetNullLogInstance() {
|
inline LogType& GetNullLogInstance() {
|
||||||
static LogType log(nullptr);
|
static LogType null_log((std::ostream*)nullptr);
|
||||||
return log;
|
return null_log;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline LogType& GetErrorLogInstance() {
|
inline LogType& GetErrorLogInstance() {
|
||||||
static LogType log(&std::clog);
|
static LogType error_log(&std::clog);
|
||||||
return log;
|
return error_log;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline LogType& GetLogInstanceForLevel(int level) {
|
inline LogType& GetLogInstanceForLevel(int level) {
|
||||||
|
|
|
@ -4,8 +4,10 @@
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "benchmark/export.h"
|
#include "benchmark/export.h"
|
||||||
|
#include "check.h"
|
||||||
#include "internal_macros.h"
|
#include "internal_macros.h"
|
||||||
|
|
||||||
namespace benchmark {
|
namespace benchmark {
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "../src/benchmark_register.h"
|
#include "../src/benchmark_register.h"
|
||||||
|
#include "benchmark/benchmark.h"
|
||||||
#include "gmock/gmock.h"
|
#include "gmock/gmock.h"
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
|
@ -135,8 +136,7 @@ TEST(AddRangeTest, Simple8) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(AddCustomContext, Simple) {
|
TEST(AddCustomContext, Simple) {
|
||||||
std::map<std::string, std::string> *&global_context =
|
std::map<std::string, std::string> *&global_context = GetGlobalContext();
|
||||||
internal::GetGlobalContext();
|
|
||||||
EXPECT_THAT(global_context, nullptr);
|
EXPECT_THAT(global_context, nullptr);
|
||||||
|
|
||||||
AddCustomContext("foo", "bar");
|
AddCustomContext("foo", "bar");
|
||||||
|
@ -151,8 +151,7 @@ TEST(AddCustomContext, Simple) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(AddCustomContext, DuplicateKey) {
|
TEST(AddCustomContext, DuplicateKey) {
|
||||||
std::map<std::string, std::string> *&global_context =
|
std::map<std::string, std::string> *&global_context = GetGlobalContext();
|
||||||
internal::GetGlobalContext();
|
|
||||||
EXPECT_THAT(global_context, nullptr);
|
EXPECT_THAT(global_context, nullptr);
|
||||||
|
|
||||||
AddCustomContext("foo", "bar");
|
AddCustomContext("foo", "bar");
|
||||||
|
|
Loading…
Reference in New Issue