diff --git a/CMakeLists.txt b/CMakeLists.txt index ab7055ef..ab3d2e31 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,39 +23,12 @@ message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) -include(CheckCXXCompilerFlag) -check_cxx_compiler_flag(-std=c++11 HAVE_STD_CPP11_FLAG) -if (HAVE_STD_CPP11_FLAG) - # Check if including cmath works with -std=c++11 and -O3. - # It may not in MinGW due to bug http://ehc.ac/p/mingw/bugs/2250/. - set(CMAKE_REQUIRED_FLAGS "-std=c++11 -O3") - check_cxx_source_compiles(" - #include - int main() {}" FMT_CPP11_CMATH) - # Check if including works with -std=c++11. - # It may not in MinGW due to bug http://sourceforge.net/p/mingw/bugs/2024/. - check_cxx_source_compiles(" - #include - int main() {}" FMT_CPP11_UNISTD_H) - if (FMT_CPP11_CMATH AND FMT_CPP11_UNISTD_H) - set(CPP11_FLAG -std=c++11) - else () - check_cxx_compiler_flag(-std=gnu++11 HAVE_STD_GNUPP11_FLAG) - if (HAVE_STD_CPP11_FLAG) - set(CPP11_FLAG -std=gnu++11) - endif () - endif () - set(CMAKE_REQUIRED_FLAGS ) -else () - check_cxx_compiler_flag(-std=c++0x HAVE_STD_CPP0X_FLAG) - if (HAVE_STD_CPP0X_FLAG) - set(CPP11_FLAG -std=c++0x) - endif () -endif () set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/support/cmake") +include(testCxx11) + if (CMAKE_GENERATOR MATCHES "Visual Studio") # If Microsoft SDK is installed create script run-msbuild.bat that # calls SetEnv.cmd to to set up build environment and runs msbuild. diff --git a/support/cmake/testCxx11.cmake b/support/cmake/testCxx11.cmake new file mode 100644 index 00000000..592147d0 --- /dev/null +++ b/support/cmake/testCxx11.cmake @@ -0,0 +1,58 @@ +include(CheckCXXCompilerFlag) + +check_cxx_compiler_flag(-std=c++11 HAVE_STD_CPP11_FLAG) +if (HAVE_STD_CPP11_FLAG) + # Check if including cmath works with -std=c++11 and -O3. + # It may not in MinGW due to bug http://ehc.ac/p/mingw/bugs/2250/. + set(CMAKE_REQUIRED_FLAGS "-std=c++11 -O3") + check_cxx_source_compiles(" + #include + int main() {}" FMT_CPP11_CMATH) + # Check if including works with -std=c++11. + # It may not in MinGW due to bug http://sourceforge.net/p/mingw/bugs/2024/. + check_cxx_source_compiles(" + #include + int main() {}" FMT_CPP11_UNISTD_H) + if (FMT_CPP11_CMATH AND FMT_CPP11_UNISTD_H) + set(CPP11_FLAG -std=c++11) + else () + check_cxx_compiler_flag(-std=gnu++11 HAVE_STD_GNUPP11_FLAG) + if (HAVE_STD_CPP11_FLAG) + set(CPP11_FLAG -std=gnu++11) + endif () + endif () + set(CMAKE_REQUIRED_FLAGS ) +else () + check_cxx_compiler_flag(-std=c++0x HAVE_STD_CPP0X_FLAG) + if (HAVE_STD_CPP0X_FLAG) + set(CPP11_FLAG -std=c++0x) + endif () +endif () + + +set(CMAKE_REQUIRED_FLAGS ${CPP11_FLAG}) +# Check if variadic templates are working and not affected by GCC bug 39653: +# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=39653 +check_cxx_source_compiles(" + template + struct S { typedef typename S::type type; }; + int main() {}" SUPPORTS_VARIADIC_TEMPLATES) + +# Check if initializer lists are supported. +check_cxx_source_compiles(" + #include + int main() {}" SUPPORTS_INITIALIZER_LIST) + +# Check if enum bases are available +check_cxx_source_compiles(" + enum C : char {A}; + int main() {}" + SUPPORTS_ENUM_BASE) + +# Check if type traits are available +check_cxx_source_compiles(" + #include + class C { void operator=(const C&); }; + int main() { static_assert(!std::is_copy_assignable::value, \"\"); }" + SUPPORTS_TYPE_TRAITS) +set(CMAKE_REQUIRED_FLAGS ) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index f8420937..6e3ea8a7 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -28,18 +28,8 @@ endif () # Check if variadic templates are working and not affected by GCC bug 39653: # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=39653 -check_cxx_source_compiles(" - template - struct S { typedef typename S::type type; }; - int main() {}" FMT_VARIADIC_TEMPLATES) - -# Check if initializer lists are supported. -check_cxx_source_compiles(" - #include - int main() {}" FMT_INITIALIZER_LIST) - -if (NOT FMT_VARIADIC_TEMPLATES OR NOT FMT_INITIALIZER_LIST) - add_definitions(-DGTEST_LANG_CXX11=0) +if (NOT SUPPORTS_VARIADIC_TEMPLATES OR NOT SUPPORTS_INITIALIZER_LIST) + target_compile_definitions(gmock PUBLIC GTEST_LANG_CXX11=0) endif () # Workaround a bug in implementation of variadic templates in MSVC11. @@ -91,11 +81,7 @@ if (CPP11_FLAG) set_target_properties(util-test PROPERTIES COMPILE_FLAGS ${CPP11_FLAG}) endif () -check_cxx_source_compiles(" - enum C : char {A}; - int main() {}" - HAVE_ENUM_BASE) -if (HAVE_ENUM_BASE) +if (SUPPORTS_ENUM_BASE) set_target_properties(util-test PROPERTIES COMPILE_DEFINITIONS "FMT_USE_ENUM_BASE=1") endif () @@ -104,12 +90,7 @@ foreach (src ${FMT_SOURCES}) set(FMT_TEST_SOURCES ${FMT_TEST_SOURCES} ../${src}) endforeach () -check_cxx_source_compiles(" - #include - class C { void operator=(const C&); }; - int main() { static_assert(!std::is_copy_assignable::value, \"\"); }" - HAVE_TYPE_TRAITS) -if (HAVE_TYPE_TRAITS) +if (SUPPORTS_TYPE_TRAITS) foreach (target format-test util-test) set_target_properties(${target} PROPERTIES COMPILE_DEFINITIONS "FMT_USE_TYPE_TRAITS=1")