1*58b9f456SAndroid Build Coastguard Worker# - Compile and run code to check for C++ features 2*58b9f456SAndroid Build Coastguard Worker# 3*58b9f456SAndroid Build Coastguard Worker# This functions compiles a source file under the `cmake` folder 4*58b9f456SAndroid Build Coastguard Worker# and adds the corresponding `HAVE_[FILENAME]` flag to the CMake 5*58b9f456SAndroid Build Coastguard Worker# environment 6*58b9f456SAndroid Build Coastguard Worker# 7*58b9f456SAndroid Build Coastguard Worker# cxx_feature_check(<FLAG> [<VARIANT>]) 8*58b9f456SAndroid Build Coastguard Worker# 9*58b9f456SAndroid Build Coastguard Worker# - Example 10*58b9f456SAndroid Build Coastguard Worker# 11*58b9f456SAndroid Build Coastguard Worker# include(CXXFeatureCheck) 12*58b9f456SAndroid Build Coastguard Worker# cxx_feature_check(STD_REGEX) 13*58b9f456SAndroid Build Coastguard Worker# Requires CMake 2.8.12+ 14*58b9f456SAndroid Build Coastguard Worker 15*58b9f456SAndroid Build Coastguard Workerif(__cxx_feature_check) 16*58b9f456SAndroid Build Coastguard Worker return() 17*58b9f456SAndroid Build Coastguard Workerendif() 18*58b9f456SAndroid Build Coastguard Workerset(__cxx_feature_check INCLUDED) 19*58b9f456SAndroid Build Coastguard Worker 20*58b9f456SAndroid Build Coastguard Workerfunction(cxx_feature_check FILE) 21*58b9f456SAndroid Build Coastguard Worker string(TOLOWER ${FILE} FILE) 22*58b9f456SAndroid Build Coastguard Worker string(TOUPPER ${FILE} VAR) 23*58b9f456SAndroid Build Coastguard Worker string(TOUPPER "HAVE_${VAR}" FEATURE) 24*58b9f456SAndroid Build Coastguard Worker if (DEFINED HAVE_${VAR}) 25*58b9f456SAndroid Build Coastguard Worker set(HAVE_${VAR} 1 PARENT_SCOPE) 26*58b9f456SAndroid Build Coastguard Worker add_definitions(-DHAVE_${VAR}) 27*58b9f456SAndroid Build Coastguard Worker return() 28*58b9f456SAndroid Build Coastguard Worker endif() 29*58b9f456SAndroid Build Coastguard Worker 30*58b9f456SAndroid Build Coastguard Worker if (NOT DEFINED COMPILE_${FEATURE}) 31*58b9f456SAndroid Build Coastguard Worker message(STATUS "Performing Test ${FEATURE}") 32*58b9f456SAndroid Build Coastguard Worker if(CMAKE_CROSSCOMPILING) 33*58b9f456SAndroid Build Coastguard Worker try_compile(COMPILE_${FEATURE} 34*58b9f456SAndroid Build Coastguard Worker ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp 35*58b9f456SAndroid Build Coastguard Worker CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS} 36*58b9f456SAndroid Build Coastguard Worker LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES}) 37*58b9f456SAndroid Build Coastguard Worker if(COMPILE_${FEATURE}) 38*58b9f456SAndroid Build Coastguard Worker message(WARNING 39*58b9f456SAndroid Build Coastguard Worker "If you see build failures due to cross compilation, try setting HAVE_${VAR} to 0") 40*58b9f456SAndroid Build Coastguard Worker set(RUN_${FEATURE} 0) 41*58b9f456SAndroid Build Coastguard Worker else() 42*58b9f456SAndroid Build Coastguard Worker set(RUN_${FEATURE} 1) 43*58b9f456SAndroid Build Coastguard Worker endif() 44*58b9f456SAndroid Build Coastguard Worker else() 45*58b9f456SAndroid Build Coastguard Worker message(STATUS "Performing Test ${FEATURE}") 46*58b9f456SAndroid Build Coastguard Worker try_run(RUN_${FEATURE} COMPILE_${FEATURE} 47*58b9f456SAndroid Build Coastguard Worker ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp 48*58b9f456SAndroid Build Coastguard Worker CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS} 49*58b9f456SAndroid Build Coastguard Worker LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES}) 50*58b9f456SAndroid Build Coastguard Worker endif() 51*58b9f456SAndroid Build Coastguard Worker endif() 52*58b9f456SAndroid Build Coastguard Worker 53*58b9f456SAndroid Build Coastguard Worker if(RUN_${FEATURE} EQUAL 0) 54*58b9f456SAndroid Build Coastguard Worker message(STATUS "Performing Test ${FEATURE} -- success") 55*58b9f456SAndroid Build Coastguard Worker set(HAVE_${VAR} 1 PARENT_SCOPE) 56*58b9f456SAndroid Build Coastguard Worker add_definitions(-DHAVE_${VAR}) 57*58b9f456SAndroid Build Coastguard Worker else() 58*58b9f456SAndroid Build Coastguard Worker if(NOT COMPILE_${FEATURE}) 59*58b9f456SAndroid Build Coastguard Worker message(STATUS "Performing Test ${FEATURE} -- failed to compile") 60*58b9f456SAndroid Build Coastguard Worker else() 61*58b9f456SAndroid Build Coastguard Worker message(STATUS "Performing Test ${FEATURE} -- compiled but failed to run") 62*58b9f456SAndroid Build Coastguard Worker endif() 63*58b9f456SAndroid Build Coastguard Worker endif() 64*58b9f456SAndroid Build Coastguard Workerendfunction() 65