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:
Dominic Hamon 2022-08-04 15:33:35 +01:00 committed by GitHub
parent 5eb16eebb3
commit 974cd5a5c5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 50 additions and 29 deletions

View File

@ -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

View File

@ -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()

View File

@ -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

View File

@ -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>

View File

@ -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 {

View File

@ -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>

View File

@ -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) {

View File

@ -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 {

View File

@ -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");