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 15if(__cxx_feature_check) 16 return() 17endif() 18set(__cxx_feature_check INCLUDED) 19 20option(CXXFEATURECHECK_DEBUG OFF) 21 22function(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}) 29 return() 30 endif() 31 32 set(FEATURE_CHECK_CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS}) 33 if (ARGC GREATER 1) 34 message(STATUS "Enabling additional flags: ${ARGV1}") 35 list(APPEND FEATURE_CHECK_CMAKE_FLAGS ${ARGV1}) 36 endif() 37 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 43 CXX_STANDARD 11 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}) 49 message(WARNING 50 "If you see build failures due to cross compilation, try setting HAVE_${VAR} to 0") 51 set(RUN_${FEATURE} 0 CACHE INTERNAL "") 52 else() 53 set(RUN_${FEATURE} 1 CACHE INTERNAL "") 54 endif() 55 else() 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 59 CXX_STANDARD 11 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) 64 endif() 65 endif() 66 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}) 71 else() 72 if(NOT COMPILE_${FEATURE}) 73 if(CXXFEATURECHECK_DEBUG) 74 message(STATUS "Performing Test ${FEATURE} -- failed to compile: ${COMPILE_OUTPUT_VAR}") 75 else() 76 message(STATUS "Performing Test ${FEATURE} -- failed to compile") 77 endif() 78 else() 79 message(STATUS "Performing Test ${FEATURE} -- compiled but failed to run") 80 endif() 81 endif() 82endfunction() 83