Austin Schuh | cbc1740 | 2019-01-21 21:00:30 -0800 | [diff] [blame^] | 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 | |
| 15 | if(__cxx_feature_check) |
| 16 | return() |
| 17 | endif() |
| 18 | set(__cxx_feature_check INCLUDED) |
| 19 | |
| 20 | function(cxx_feature_check FILE) |
| 21 | string(TOLOWER ${FILE} FILE) |
| 22 | string(TOUPPER ${FILE} VAR) |
| 23 | string(TOUPPER "HAVE_${VAR}" FEATURE) |
| 24 | if (DEFINED HAVE_${VAR}) |
| 25 | set(HAVE_${VAR} 1 PARENT_SCOPE) |
| 26 | add_definitions(-DHAVE_${VAR}) |
| 27 | return() |
| 28 | endif() |
| 29 | |
| 30 | if (NOT DEFINED COMPILE_${FEATURE}) |
| 31 | message(STATUS "Performing Test ${FEATURE}") |
| 32 | if(CMAKE_CROSSCOMPILING) |
| 33 | try_compile(COMPILE_${FEATURE} |
| 34 | ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp |
| 35 | CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS} |
| 36 | LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES}) |
| 37 | if(COMPILE_${FEATURE}) |
| 38 | message(WARNING |
| 39 | "If you see build failures due to cross compilation, try setting HAVE_${VAR} to 0") |
| 40 | set(RUN_${FEATURE} 0) |
| 41 | else() |
| 42 | set(RUN_${FEATURE} 1) |
| 43 | endif() |
| 44 | else() |
| 45 | message(STATUS "Performing Test ${FEATURE}") |
| 46 | try_run(RUN_${FEATURE} COMPILE_${FEATURE} |
| 47 | ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp |
| 48 | CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS} |
| 49 | LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES}) |
| 50 | endif() |
| 51 | endif() |
| 52 | |
| 53 | if(RUN_${FEATURE} EQUAL 0) |
| 54 | message(STATUS "Performing Test ${FEATURE} -- success") |
| 55 | set(HAVE_${VAR} 1 PARENT_SCOPE) |
| 56 | add_definitions(-DHAVE_${VAR}) |
| 57 | else() |
| 58 | if(NOT COMPILE_${FEATURE}) |
| 59 | message(STATUS "Performing Test ${FEATURE} -- failed to compile") |
| 60 | else() |
| 61 | message(STATUS "Performing Test ${FEATURE} -- compiled but failed to run") |
| 62 | endif() |
| 63 | endif() |
| 64 | endfunction() |