Eric Fiselier | b08d8b1 | 2016-07-19 23:07:03 +0000 | [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) |
Eric Fiselier | 133a720 | 2017-04-18 07:17:20 +0000 | [diff] [blame] | 13 | # Requires CMake 2.8.12+ |
Eric Fiselier | b08d8b1 | 2016-07-19 23:07:03 +0000 | [diff] [blame] | 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}) |
Eric Fiselier | 1903976 | 2018-01-18 04:23:01 +0000 | [diff] [blame^] | 25 | set(HAVE_${VAR} 1 PARENT_SCOPE) |
| 26 | add_definitions(-DHAVE_${VAR}) |
Eric Fiselier | b08d8b1 | 2016-07-19 23:07:03 +0000 | [diff] [blame] | 27 | return() |
| 28 | endif() |
Eric Fiselier | 1903976 | 2018-01-18 04:23:01 +0000 | [diff] [blame^] | 29 | |
Eric Fiselier | b08d8b1 | 2016-07-19 23:07:03 +0000 | [diff] [blame] | 30 | message("-- Performing Test ${FEATURE}") |
Eric Fiselier | 1903976 | 2018-01-18 04:23:01 +0000 | [diff] [blame^] | 31 | if(CMAKE_CROSSCOMPILING) |
| 32 | try_compile(COMPILE_${FEATURE} |
| 33 | ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp |
| 34 | CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS} |
| 35 | LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES}) |
| 36 | if(COMPILE_${FEATURE}) |
| 37 | message(WARNING |
| 38 | "If you see build failures due to cross compilation, try setting HAVE_${VAR} to 0") |
| 39 | set(RUN_${FEATURE} 0) |
| 40 | else() |
| 41 | set(RUN_${FEATURE} 1) |
| 42 | endif() |
| 43 | else() |
| 44 | message("-- Performing Test ${FEATURE}") |
| 45 | try_run(RUN_${FEATURE} COMPILE_${FEATURE} |
| 46 | ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp |
| 47 | CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS} |
| 48 | LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES}) |
| 49 | endif() |
| 50 | |
Eric Fiselier | b08d8b1 | 2016-07-19 23:07:03 +0000 | [diff] [blame] | 51 | if(RUN_${FEATURE} EQUAL 0) |
| 52 | message("-- Performing Test ${FEATURE} -- success") |
Eric Fiselier | 1903976 | 2018-01-18 04:23:01 +0000 | [diff] [blame^] | 53 | set(HAVE_${VAR} 1 PARENT_SCOPE) |
Eric Fiselier | b08d8b1 | 2016-07-19 23:07:03 +0000 | [diff] [blame] | 54 | add_definitions(-DHAVE_${VAR}) |
| 55 | else() |
| 56 | if(NOT COMPILE_${FEATURE}) |
| 57 | message("-- Performing Test ${FEATURE} -- failed to compile") |
| 58 | else() |
| 59 | message("-- Performing Test ${FEATURE} -- compiled but failed to run") |
| 60 | endif() |
| 61 | endif() |
| 62 | endfunction() |