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 function(cxx_feature_check FILE)
21 string(TOLOWER ${FILE} FILE)
22 string(TOUPPER ${FILE} VAR)
23 string(TOUPPER "HAVE_${VAR}" FEATURE)
24 if (DEFINED HAVE_${VAR})
25 set(HAVE_${VAR} 1 PARENT_SCOPE)
26 add_definitions(-DHAVE_${VAR})
30 if (NOT DEFINED COMPILE_${FEATURE})
31 message("-- Performing Test ${FEATURE}")
32 if(CMAKE_CROSSCOMPILING)
33 try_compile(COMPILE_${FEATURE}
34 ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp
35 CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS}
36 LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES})
37 if(COMPILE_${FEATURE})
39 "If you see build failures due to cross compilation, try setting HAVE_${VAR} to 0")
45 message("-- Performing Test ${FEATURE}")
46 try_run(RUN_${FEATURE} COMPILE_${FEATURE}
47 ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp
48 CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS}
49 LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES})
53 if(RUN_${FEATURE} EQUAL 0)
54 message("-- Performing Test ${FEATURE} -- success")
55 set(HAVE_${VAR} 1 PARENT_SCOPE)
56 add_definitions(-DHAVE_${VAR})
58 if(NOT COMPILE_${FEATURE})
59 message("-- Performing Test ${FEATURE} -- failed to compile")
61 message("-- Performing Test ${FEATURE} -- compiled but failed to run")