1 # - Compile and run code to check for C++ features 2 # 3 # This functions compiles a source file under the `cmake` folder 4 # and adds the corresponding `HAVE_[FILENAME]` flag to the CMake 5 # environment 6 # 7 # cxx_feature_check(<FLAG> [<VARIANT>]) 8 # 9 # - Example 10 # 11 # include(CXXFeatureCheck) 12 # cxx_feature_check(STD_REGEX) 13 # Requires CMake 2.8.12+ 14 15 if(__cxx_feature_check) 16 return() 17 endif() 18 set(__cxx_feature_check INCLUDED) 19 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}) 27 return() 28 endif() 29 30 if (NOT DEFINED COMPILE_${FEATURE}) 31 message(STATUS "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}) 38 message(WARNING 39 "If you see build failures due to cross compilation, try setting HAVE_${VAR} to 0") 40 set(RUN_${FEATURE} 0) 41 else() 42 set(RUN_${FEATURE} 1) 43 endif() 44 else() 45 message(STATUS "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}) 50 endif() 51 endif() 52 53 if(RUN_${FEATURE} EQUAL 0) 54 message(STATUS "Performing Test ${FEATURE} -- success") 55 set(HAVE_${VAR} 1 PARENT_SCOPE) 56 add_definitions(-DHAVE_${VAR}) 57 else() 58 if(NOT COMPILE_${FEATURE}) 59 message(STATUS "Performing Test ${FEATURE} -- failed to compile") 60 else() 61 message(STATUS "Performing Test ${FEATURE} -- compiled but failed to run") 62 endif() 63 endif() 64 endfunction() 65