15dda2efdSMircea Trofin# - Compile and run code to check for C++ features 25dda2efdSMircea Trofin# 35dda2efdSMircea Trofin# This functions compiles a source file under the `cmake` folder 45dda2efdSMircea Trofin# and adds the corresponding `HAVE_[FILENAME]` flag to the CMake 55dda2efdSMircea Trofin# environment 65dda2efdSMircea Trofin# 75dda2efdSMircea Trofin# cxx_feature_check(<FLAG> [<VARIANT>]) 85dda2efdSMircea Trofin# 95dda2efdSMircea Trofin# - Example 105dda2efdSMircea Trofin# 115dda2efdSMircea Trofin# include(CXXFeatureCheck) 125dda2efdSMircea Trofin# cxx_feature_check(STD_REGEX) 135dda2efdSMircea Trofin# Requires CMake 2.8.12+ 145dda2efdSMircea Trofin 155dda2efdSMircea Trofinif(__cxx_feature_check) 165dda2efdSMircea Trofin return() 175dda2efdSMircea Trofinendif() 185dda2efdSMircea Trofinset(__cxx_feature_check INCLUDED) 195dda2efdSMircea Trofin 20*a5b79717SMircea Trofinoption(CXXFEATURECHECK_DEBUG OFF) 21*a5b79717SMircea Trofin 225dda2efdSMircea Trofinfunction(cxx_feature_check FILE) 235dda2efdSMircea Trofin string(TOLOWER ${FILE} FILE) 245dda2efdSMircea Trofin string(TOUPPER ${FILE} VAR) 255dda2efdSMircea Trofin string(TOUPPER "HAVE_${VAR}" FEATURE) 265dda2efdSMircea Trofin if (DEFINED HAVE_${VAR}) 275dda2efdSMircea Trofin set(HAVE_${VAR} 1 PARENT_SCOPE) 285dda2efdSMircea Trofin add_definitions(-DHAVE_${VAR}) 295dda2efdSMircea Trofin return() 305dda2efdSMircea Trofin endif() 315dda2efdSMircea Trofin 32*a5b79717SMircea Trofin set(FEATURE_CHECK_CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS}) 335dda2efdSMircea Trofin if (ARGC GREATER 1) 345dda2efdSMircea Trofin message(STATUS "Enabling additional flags: ${ARGV1}") 35*a5b79717SMircea Trofin list(APPEND FEATURE_CHECK_CMAKE_FLAGS ${ARGV1}) 365dda2efdSMircea Trofin endif() 375dda2efdSMircea Trofin 385dda2efdSMircea Trofin if (NOT DEFINED COMPILE_${FEATURE}) 395dda2efdSMircea Trofin if(CMAKE_CROSSCOMPILING) 40*a5b79717SMircea Trofin message(STATUS "Cross-compiling to test ${FEATURE}") 415dda2efdSMircea Trofin try_compile(COMPILE_${FEATURE} 425dda2efdSMircea Trofin ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp 43*a5b79717SMircea Trofin CXX_STANDARD 11 44*a5b79717SMircea Trofin CXX_STANDARD_REQUIRED ON 45*a5b79717SMircea Trofin CMAKE_FLAGS ${FEATURE_CHECK_CMAKE_FLAGS} 46*a5b79717SMircea Trofin LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES} 47*a5b79717SMircea Trofin OUTPUT_VARIABLE COMPILE_OUTPUT_VAR) 485dda2efdSMircea Trofin if(COMPILE_${FEATURE}) 495dda2efdSMircea Trofin message(WARNING 505dda2efdSMircea Trofin "If you see build failures due to cross compilation, try setting HAVE_${VAR} to 0") 515dda2efdSMircea Trofin set(RUN_${FEATURE} 0 CACHE INTERNAL "") 525dda2efdSMircea Trofin else() 535dda2efdSMircea Trofin set(RUN_${FEATURE} 1 CACHE INTERNAL "") 545dda2efdSMircea Trofin endif() 555dda2efdSMircea Trofin else() 56*a5b79717SMircea Trofin message(STATUS "Compiling and running to test ${FEATURE}") 575dda2efdSMircea Trofin try_run(RUN_${FEATURE} COMPILE_${FEATURE} 585dda2efdSMircea Trofin ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp 59*a5b79717SMircea Trofin CXX_STANDARD 11 60*a5b79717SMircea Trofin CXX_STANDARD_REQUIRED ON 61*a5b79717SMircea Trofin CMAKE_FLAGS ${FEATURE_CHECK_CMAKE_FLAGS} 62*a5b79717SMircea Trofin LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES} 63*a5b79717SMircea Trofin COMPILE_OUTPUT_VARIABLE COMPILE_OUTPUT_VAR) 645dda2efdSMircea Trofin endif() 655dda2efdSMircea Trofin endif() 665dda2efdSMircea Trofin 675dda2efdSMircea Trofin if(RUN_${FEATURE} EQUAL 0) 685dda2efdSMircea Trofin message(STATUS "Performing Test ${FEATURE} -- success") 695dda2efdSMircea Trofin set(HAVE_${VAR} 1 PARENT_SCOPE) 705dda2efdSMircea Trofin add_definitions(-DHAVE_${VAR}) 715dda2efdSMircea Trofin else() 725dda2efdSMircea Trofin if(NOT COMPILE_${FEATURE}) 73*a5b79717SMircea Trofin if(CXXFEATURECHECK_DEBUG) 74*a5b79717SMircea Trofin message(STATUS "Performing Test ${FEATURE} -- failed to compile: ${COMPILE_OUTPUT_VAR}") 75*a5b79717SMircea Trofin else() 765dda2efdSMircea Trofin message(STATUS "Performing Test ${FEATURE} -- failed to compile") 77*a5b79717SMircea Trofin endif() 785dda2efdSMircea Trofin else() 795dda2efdSMircea Trofin message(STATUS "Performing Test ${FEATURE} -- compiled but failed to run") 805dda2efdSMircea Trofin endif() 815dda2efdSMircea Trofin endif() 825dda2efdSMircea Trofinendfunction() 83