blob: 99b56dd6239048285d13bad13ed2dcde0d7ae5c2 [file] [log] [blame]
Austin Schuhcbc17402019-01-21 21:00:30 -08001# - 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
15if(__cxx_feature_check)
16 return()
17endif()
18set(__cxx_feature_check INCLUDED)
19
20function(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()
64endfunction()