xref: /aosp_15_r20/external/google-benchmark/cmake/CXXFeatureCheck.cmake (revision dbb99499c3810fa1611fa2242a2fc446be01a57c)
1*dbb99499SAndroid Build Coastguard Worker# - Compile and run code to check for C++ features
2*dbb99499SAndroid Build Coastguard Worker#
3*dbb99499SAndroid Build Coastguard Worker# This functions compiles a source file under the `cmake` folder
4*dbb99499SAndroid Build Coastguard Worker# and adds the corresponding `HAVE_[FILENAME]` flag to the CMake
5*dbb99499SAndroid Build Coastguard Worker# environment
6*dbb99499SAndroid Build Coastguard Worker#
7*dbb99499SAndroid Build Coastguard Worker#  cxx_feature_check(<FLAG> [<VARIANT>])
8*dbb99499SAndroid Build Coastguard Worker#
9*dbb99499SAndroid Build Coastguard Worker# - Example
10*dbb99499SAndroid Build Coastguard Worker#
11*dbb99499SAndroid Build Coastguard Worker# include(CXXFeatureCheck)
12*dbb99499SAndroid Build Coastguard Worker# cxx_feature_check(STD_REGEX)
13*dbb99499SAndroid Build Coastguard Worker# Requires CMake 2.8.12+
14*dbb99499SAndroid Build Coastguard Worker
15*dbb99499SAndroid Build Coastguard Workerif(__cxx_feature_check)
16*dbb99499SAndroid Build Coastguard Worker  return()
17*dbb99499SAndroid Build Coastguard Workerendif()
18*dbb99499SAndroid Build Coastguard Workerset(__cxx_feature_check INCLUDED)
19*dbb99499SAndroid Build Coastguard Worker
20*dbb99499SAndroid Build Coastguard Workeroption(CXXFEATURECHECK_DEBUG OFF)
21*dbb99499SAndroid Build Coastguard Worker
22*dbb99499SAndroid Build Coastguard Workerfunction(cxx_feature_check FILE)
23*dbb99499SAndroid Build Coastguard Worker  string(TOLOWER ${FILE} FILE)
24*dbb99499SAndroid Build Coastguard Worker  string(TOUPPER ${FILE} VAR)
25*dbb99499SAndroid Build Coastguard Worker  string(TOUPPER "HAVE_${VAR}" FEATURE)
26*dbb99499SAndroid Build Coastguard Worker  if (DEFINED HAVE_${VAR})
27*dbb99499SAndroid Build Coastguard Worker    set(HAVE_${VAR} 1 PARENT_SCOPE)
28*dbb99499SAndroid Build Coastguard Worker    add_definitions(-DHAVE_${VAR})
29*dbb99499SAndroid Build Coastguard Worker    return()
30*dbb99499SAndroid Build Coastguard Worker  endif()
31*dbb99499SAndroid Build Coastguard Worker
32*dbb99499SAndroid Build Coastguard Worker  set(FEATURE_CHECK_CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS})
33*dbb99499SAndroid Build Coastguard Worker  if (ARGC GREATER 1)
34*dbb99499SAndroid Build Coastguard Worker    message(STATUS "Enabling additional flags: ${ARGV1}")
35*dbb99499SAndroid Build Coastguard Worker    list(APPEND FEATURE_CHECK_CMAKE_FLAGS ${ARGV1})
36*dbb99499SAndroid Build Coastguard Worker  endif()
37*dbb99499SAndroid Build Coastguard Worker
38*dbb99499SAndroid Build Coastguard Worker  if (NOT DEFINED COMPILE_${FEATURE})
39*dbb99499SAndroid Build Coastguard Worker    if(CMAKE_CROSSCOMPILING)
40*dbb99499SAndroid Build Coastguard Worker      message(STATUS "Cross-compiling to test ${FEATURE}")
41*dbb99499SAndroid Build Coastguard Worker      try_compile(COMPILE_${FEATURE}
42*dbb99499SAndroid Build Coastguard Worker              ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp
43*dbb99499SAndroid Build Coastguard Worker              CXX_STANDARD 11
44*dbb99499SAndroid Build Coastguard Worker              CXX_STANDARD_REQUIRED ON
45*dbb99499SAndroid Build Coastguard Worker              CMAKE_FLAGS ${FEATURE_CHECK_CMAKE_FLAGS}
46*dbb99499SAndroid Build Coastguard Worker              LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES}
47*dbb99499SAndroid Build Coastguard Worker              OUTPUT_VARIABLE COMPILE_OUTPUT_VAR)
48*dbb99499SAndroid Build Coastguard Worker      if(COMPILE_${FEATURE})
49*dbb99499SAndroid Build Coastguard Worker        message(WARNING
50*dbb99499SAndroid Build Coastguard Worker              "If you see build failures due to cross compilation, try setting HAVE_${VAR} to 0")
51*dbb99499SAndroid Build Coastguard Worker        set(RUN_${FEATURE} 0 CACHE INTERNAL "")
52*dbb99499SAndroid Build Coastguard Worker      else()
53*dbb99499SAndroid Build Coastguard Worker        set(RUN_${FEATURE} 1 CACHE INTERNAL "")
54*dbb99499SAndroid Build Coastguard Worker      endif()
55*dbb99499SAndroid Build Coastguard Worker    else()
56*dbb99499SAndroid Build Coastguard Worker      message(STATUS "Compiling and running to test ${FEATURE}")
57*dbb99499SAndroid Build Coastguard Worker      try_run(RUN_${FEATURE} COMPILE_${FEATURE}
58*dbb99499SAndroid Build Coastguard Worker              ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp
59*dbb99499SAndroid Build Coastguard Worker              CXX_STANDARD 11
60*dbb99499SAndroid Build Coastguard Worker              CXX_STANDARD_REQUIRED ON
61*dbb99499SAndroid Build Coastguard Worker              CMAKE_FLAGS ${FEATURE_CHECK_CMAKE_FLAGS}
62*dbb99499SAndroid Build Coastguard Worker              LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES}
63*dbb99499SAndroid Build Coastguard Worker              COMPILE_OUTPUT_VARIABLE COMPILE_OUTPUT_VAR)
64*dbb99499SAndroid Build Coastguard Worker    endif()
65*dbb99499SAndroid Build Coastguard Worker  endif()
66*dbb99499SAndroid Build Coastguard Worker
67*dbb99499SAndroid Build Coastguard Worker  if(RUN_${FEATURE} EQUAL 0)
68*dbb99499SAndroid Build Coastguard Worker    message(STATUS "Performing Test ${FEATURE} -- success")
69*dbb99499SAndroid Build Coastguard Worker    set(HAVE_${VAR} 1 PARENT_SCOPE)
70*dbb99499SAndroid Build Coastguard Worker    add_definitions(-DHAVE_${VAR})
71*dbb99499SAndroid Build Coastguard Worker  else()
72*dbb99499SAndroid Build Coastguard Worker    if(NOT COMPILE_${FEATURE})
73*dbb99499SAndroid Build Coastguard Worker      if(CXXFEATURECHECK_DEBUG)
74*dbb99499SAndroid Build Coastguard Worker        message(STATUS "Performing Test ${FEATURE} -- failed to compile: ${COMPILE_OUTPUT_VAR}")
75*dbb99499SAndroid Build Coastguard Worker      else()
76*dbb99499SAndroid Build Coastguard Worker        message(STATUS "Performing Test ${FEATURE} -- failed to compile")
77*dbb99499SAndroid Build Coastguard Worker      endif()
78*dbb99499SAndroid Build Coastguard Worker    else()
79*dbb99499SAndroid Build Coastguard Worker      message(STATUS "Performing Test ${FEATURE} -- compiled but failed to run")
80*dbb99499SAndroid Build Coastguard Worker    endif()
81*dbb99499SAndroid Build Coastguard Worker  endif()
82*dbb99499SAndroid Build Coastguard Workerendfunction()
83