83 lines · plain
1# - Compile and run code to check for C++ features2#3# This functions compiles a source file under the `cmake` folder4# and adds the corresponding `HAVE_[FILENAME]` flag to the CMake5# environment6#7# cxx_feature_check(<FLAG> [<VARIANT>])8#9# - Example10#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}.cpp43 CXX_STANDARD 1144 CXX_STANDARD_REQUIRED ON45 CMAKE_FLAGS ${FEATURE_CHECK_CMAKE_FLAGS}46 LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES}47 OUTPUT_VARIABLE COMPILE_OUTPUT_VAR)48 if(COMPILE_${FEATURE})49 message(WARNING50 "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}.cpp59 CXX_STANDARD 1160 CXX_STANDARD_REQUIRED ON61 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