1 # - Compile and run code to check for C++ features
3 # This functions compiles a source file under the `cmake` folder
4 # and adds the corresponding `HAVE_[FILENAME]` flag to the CMake
7 # cxx_feature_check(<FLAG> [<VARIANT>])
11 # include(CXXFeatureCheck)
12 # cxx_feature_check(STD_REGEX)
13 # Requires CMake 2.8.12+
15 if(__cxx_feature_check)
18 set(__cxx_feature_check INCLUDED)
20 option(CXXFEATURECHECK_DEBUG OFF)
22 function(cxx_feature_check FILE)
23 string(TOLOWER ${FILE} FILE)
24 string(TOUPPER ${FILE} VAR)
25 string(TOUPPER "HAVE_${VAR}" FEATURE)
26 if (DEFINED HAVE_${VAR})
27 set(HAVE_${VAR} 1 PARENT_SCOPE)
28 add_definitions(-DHAVE_${VAR})
32 set(FEATURE_CHECK_CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS})
34 message(STATUS "Enabling additional flags: ${ARGV1}")
35 list(APPEND FEATURE_CHECK_CMAKE_FLAGS ${ARGV1})
38 if (NOT DEFINED COMPILE_${FEATURE})
39 if(CMAKE_CROSSCOMPILING)
40 message(STATUS "Cross-compiling to test ${FEATURE}")
41 try_compile(COMPILE_${FEATURE}
42 ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp
44 CXX_STANDARD_REQUIRED ON
45 CMAKE_FLAGS ${FEATURE_CHECK_CMAKE_FLAGS}
46 LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES}
47 OUTPUT_VARIABLE COMPILE_OUTPUT_VAR)
48 if(COMPILE_${FEATURE})
50 "If you see build failures due to cross compilation, try setting HAVE_${VAR} to 0")
51 set(RUN_${FEATURE} 0 CACHE INTERNAL "")
53 set(RUN_${FEATURE} 1 CACHE INTERNAL "")
56 message(STATUS "Compiling and running to test ${FEATURE}")
57 try_run(RUN_${FEATURE} COMPILE_${FEATURE}
58 ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp
60 CXX_STANDARD_REQUIRED ON
61 CMAKE_FLAGS ${FEATURE_CHECK_CMAKE_FLAGS}
62 LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES}
63 COMPILE_OUTPUT_VARIABLE COMPILE_OUTPUT_VAR)
67 if(RUN_${FEATURE} EQUAL 0)
68 message(STATUS "Performing Test ${FEATURE} -- success")
69 set(HAVE_${VAR} 1 PARENT_SCOPE)
70 add_definitions(-DHAVE_${VAR})
72 if(NOT COMPILE_${FEATURE})
73 if(CXXFEATURECHECK_DEBUG)
74 message(STATUS "Performing Test ${FEATURE} -- failed to compile: ${COMPILE_OUTPUT_VAR}")
76 message(STATUS "Performing Test ${FEATURE} -- failed to compile")
79 message(STATUS "Performing Test ${FEATURE} -- compiled but failed to run")