1*dbb99499SAndroid Build Coastguard Worker# - Compile and run code to check for C++ features 2*dbb99499SAndroid Build Coastguard Worker# 3*dbb99499SAndroid Build Coastguard Worker# This functions compiles a source file under the `cmake` folder 4*dbb99499SAndroid Build Coastguard Worker# and adds the corresponding `HAVE_[FILENAME]` flag to the CMake 5*dbb99499SAndroid Build Coastguard Worker# environment 6*dbb99499SAndroid Build Coastguard Worker# 7*dbb99499SAndroid Build Coastguard Worker# cxx_feature_check(<FLAG> [<VARIANT>]) 8*dbb99499SAndroid Build Coastguard Worker# 9*dbb99499SAndroid Build Coastguard Worker# - Example 10*dbb99499SAndroid Build Coastguard Worker# 11*dbb99499SAndroid Build Coastguard Worker# include(CXXFeatureCheck) 12*dbb99499SAndroid Build Coastguard Worker# cxx_feature_check(STD_REGEX) 13*dbb99499SAndroid Build Coastguard Worker# Requires CMake 2.8.12+ 14*dbb99499SAndroid Build Coastguard Worker 15*dbb99499SAndroid Build Coastguard Workerif(__cxx_feature_check) 16*dbb99499SAndroid Build Coastguard Worker return() 17*dbb99499SAndroid Build Coastguard Workerendif() 18*dbb99499SAndroid Build Coastguard Workerset(__cxx_feature_check INCLUDED) 19*dbb99499SAndroid Build Coastguard Worker 20*dbb99499SAndroid Build Coastguard Workeroption(CXXFEATURECHECK_DEBUG OFF) 21*dbb99499SAndroid Build Coastguard Worker 22*dbb99499SAndroid Build Coastguard Workerfunction(cxx_feature_check FILE) 23*dbb99499SAndroid Build Coastguard Worker string(TOLOWER ${FILE} FILE) 24*dbb99499SAndroid Build Coastguard Worker string(TOUPPER ${FILE} VAR) 25*dbb99499SAndroid Build Coastguard Worker string(TOUPPER "HAVE_${VAR}" FEATURE) 26*dbb99499SAndroid Build Coastguard Worker if (DEFINED HAVE_${VAR}) 27*dbb99499SAndroid Build Coastguard Worker set(HAVE_${VAR} 1 PARENT_SCOPE) 28*dbb99499SAndroid Build Coastguard Worker add_definitions(-DHAVE_${VAR}) 29*dbb99499SAndroid Build Coastguard Worker return() 30*dbb99499SAndroid Build Coastguard Worker endif() 31*dbb99499SAndroid Build Coastguard Worker 32*dbb99499SAndroid Build Coastguard Worker set(FEATURE_CHECK_CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS}) 33*dbb99499SAndroid Build Coastguard Worker if (ARGC GREATER 1) 34*dbb99499SAndroid Build Coastguard Worker message(STATUS "Enabling additional flags: ${ARGV1}") 35*dbb99499SAndroid Build Coastguard Worker list(APPEND FEATURE_CHECK_CMAKE_FLAGS ${ARGV1}) 36*dbb99499SAndroid Build Coastguard Worker endif() 37*dbb99499SAndroid Build Coastguard Worker 38*dbb99499SAndroid Build Coastguard Worker if (NOT DEFINED COMPILE_${FEATURE}) 39*dbb99499SAndroid Build Coastguard Worker if(CMAKE_CROSSCOMPILING) 40*dbb99499SAndroid Build Coastguard Worker message(STATUS "Cross-compiling to test ${FEATURE}") 41*dbb99499SAndroid Build Coastguard Worker try_compile(COMPILE_${FEATURE} 42*dbb99499SAndroid Build Coastguard Worker ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp 43*dbb99499SAndroid Build Coastguard Worker CXX_STANDARD 11 44*dbb99499SAndroid Build Coastguard Worker CXX_STANDARD_REQUIRED ON 45*dbb99499SAndroid Build Coastguard Worker CMAKE_FLAGS ${FEATURE_CHECK_CMAKE_FLAGS} 46*dbb99499SAndroid Build Coastguard Worker LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES} 47*dbb99499SAndroid Build Coastguard Worker OUTPUT_VARIABLE COMPILE_OUTPUT_VAR) 48*dbb99499SAndroid Build Coastguard Worker if(COMPILE_${FEATURE}) 49*dbb99499SAndroid Build Coastguard Worker message(WARNING 50*dbb99499SAndroid Build Coastguard Worker "If you see build failures due to cross compilation, try setting HAVE_${VAR} to 0") 51*dbb99499SAndroid Build Coastguard Worker set(RUN_${FEATURE} 0 CACHE INTERNAL "") 52*dbb99499SAndroid Build Coastguard Worker else() 53*dbb99499SAndroid Build Coastguard Worker set(RUN_${FEATURE} 1 CACHE INTERNAL "") 54*dbb99499SAndroid Build Coastguard Worker endif() 55*dbb99499SAndroid Build Coastguard Worker else() 56*dbb99499SAndroid Build Coastguard Worker message(STATUS "Compiling and running to test ${FEATURE}") 57*dbb99499SAndroid Build Coastguard Worker try_run(RUN_${FEATURE} COMPILE_${FEATURE} 58*dbb99499SAndroid Build Coastguard Worker ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp 59*dbb99499SAndroid Build Coastguard Worker CXX_STANDARD 11 60*dbb99499SAndroid Build Coastguard Worker CXX_STANDARD_REQUIRED ON 61*dbb99499SAndroid Build Coastguard Worker CMAKE_FLAGS ${FEATURE_CHECK_CMAKE_FLAGS} 62*dbb99499SAndroid Build Coastguard Worker LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES} 63*dbb99499SAndroid Build Coastguard Worker COMPILE_OUTPUT_VARIABLE COMPILE_OUTPUT_VAR) 64*dbb99499SAndroid Build Coastguard Worker endif() 65*dbb99499SAndroid Build Coastguard Worker endif() 66*dbb99499SAndroid Build Coastguard Worker 67*dbb99499SAndroid Build Coastguard Worker if(RUN_${FEATURE} EQUAL 0) 68*dbb99499SAndroid Build Coastguard Worker message(STATUS "Performing Test ${FEATURE} -- success") 69*dbb99499SAndroid Build Coastguard Worker set(HAVE_${VAR} 1 PARENT_SCOPE) 70*dbb99499SAndroid Build Coastguard Worker add_definitions(-DHAVE_${VAR}) 71*dbb99499SAndroid Build Coastguard Worker else() 72*dbb99499SAndroid Build Coastguard Worker if(NOT COMPILE_${FEATURE}) 73*dbb99499SAndroid Build Coastguard Worker if(CXXFEATURECHECK_DEBUG) 74*dbb99499SAndroid Build Coastguard Worker message(STATUS "Performing Test ${FEATURE} -- failed to compile: ${COMPILE_OUTPUT_VAR}") 75*dbb99499SAndroid Build Coastguard Worker else() 76*dbb99499SAndroid Build Coastguard Worker message(STATUS "Performing Test ${FEATURE} -- failed to compile") 77*dbb99499SAndroid Build Coastguard Worker endif() 78*dbb99499SAndroid Build Coastguard Worker else() 79*dbb99499SAndroid Build Coastguard Worker message(STATUS "Performing Test ${FEATURE} -- compiled but failed to run") 80*dbb99499SAndroid Build Coastguard Worker endif() 81*dbb99499SAndroid Build Coastguard Worker endif() 82*dbb99499SAndroid Build Coastguard Workerendfunction() 83