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 (NOT DEFINED COMPILE_${FEATURE})
31    message("-- 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("-- 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("-- 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("-- Performing Test ${FEATURE} -- failed to compile")
60    else()
61      message("-- Performing Test ${FEATURE} -- compiled but failed to run")
62    endif()
63  endif()
64endfunction()
65