• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
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 (ARGC GREATER 1)
31    message(STATUS "Enabling additional flags: ${ARGV1}")
32    list(APPEND BENCHMARK_CXX_LINKER_FLAGS ${ARGV1})
33  endif()
34
35  if (NOT DEFINED COMPILE_${FEATURE})
36    message(STATUS "Performing Test ${FEATURE}")
37    if(CMAKE_CROSSCOMPILING)
38      try_compile(COMPILE_${FEATURE}
39              ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp
40              CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS}
41              LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES})
42      if(COMPILE_${FEATURE})
43        message(WARNING
44              "If you see build failures due to cross compilation, try setting HAVE_${VAR} to 0")
45        set(RUN_${FEATURE} 0 CACHE INTERNAL "")
46      else()
47        set(RUN_${FEATURE} 1 CACHE INTERNAL "")
48      endif()
49    else()
50      message(STATUS "Performing Test ${FEATURE}")
51      try_run(RUN_${FEATURE} COMPILE_${FEATURE}
52              ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp
53              CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS}
54              LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES})
55    endif()
56  endif()
57
58  if(RUN_${FEATURE} EQUAL 0)
59    message(STATUS "Performing Test ${FEATURE} -- success")
60    set(HAVE_${VAR} 1 PARENT_SCOPE)
61    add_definitions(-DHAVE_${VAR})
62  else()
63    if(NOT COMPILE_${FEATURE})
64      message(STATUS "Performing Test ${FEATURE} -- failed to compile")
65    else()
66      message(STATUS "Performing Test ${FEATURE} -- compiled but failed to run")
67    endif()
68  endif()
69endfunction()
70