xref: /aosp_15_r20/external/libcxx/utils/google-benchmark/cmake/CXXFeatureCheck.cmake (revision 58b9f456b02922dfdb1fad8a988d5fd8765ecb80)
1*58b9f456SAndroid Build Coastguard Worker# - Compile and run code to check for C++ features
2*58b9f456SAndroid Build Coastguard Worker#
3*58b9f456SAndroid Build Coastguard Worker# This functions compiles a source file under the `cmake` folder
4*58b9f456SAndroid Build Coastguard Worker# and adds the corresponding `HAVE_[FILENAME]` flag to the CMake
5*58b9f456SAndroid Build Coastguard Worker# environment
6*58b9f456SAndroid Build Coastguard Worker#
7*58b9f456SAndroid Build Coastguard Worker#  cxx_feature_check(<FLAG> [<VARIANT>])
8*58b9f456SAndroid Build Coastguard Worker#
9*58b9f456SAndroid Build Coastguard Worker# - Example
10*58b9f456SAndroid Build Coastguard Worker#
11*58b9f456SAndroid Build Coastguard Worker# include(CXXFeatureCheck)
12*58b9f456SAndroid Build Coastguard Worker# cxx_feature_check(STD_REGEX)
13*58b9f456SAndroid Build Coastguard Worker# Requires CMake 2.8.12+
14*58b9f456SAndroid Build Coastguard Worker
15*58b9f456SAndroid Build Coastguard Workerif(__cxx_feature_check)
16*58b9f456SAndroid Build Coastguard Worker  return()
17*58b9f456SAndroid Build Coastguard Workerendif()
18*58b9f456SAndroid Build Coastguard Workerset(__cxx_feature_check INCLUDED)
19*58b9f456SAndroid Build Coastguard Worker
20*58b9f456SAndroid Build Coastguard Workerfunction(cxx_feature_check FILE)
21*58b9f456SAndroid Build Coastguard Worker  string(TOLOWER ${FILE} FILE)
22*58b9f456SAndroid Build Coastguard Worker  string(TOUPPER ${FILE} VAR)
23*58b9f456SAndroid Build Coastguard Worker  string(TOUPPER "HAVE_${VAR}" FEATURE)
24*58b9f456SAndroid Build Coastguard Worker  if (DEFINED HAVE_${VAR})
25*58b9f456SAndroid Build Coastguard Worker    set(HAVE_${VAR} 1 PARENT_SCOPE)
26*58b9f456SAndroid Build Coastguard Worker    add_definitions(-DHAVE_${VAR})
27*58b9f456SAndroid Build Coastguard Worker    return()
28*58b9f456SAndroid Build Coastguard Worker  endif()
29*58b9f456SAndroid Build Coastguard Worker
30*58b9f456SAndroid Build Coastguard Worker  if (NOT DEFINED COMPILE_${FEATURE})
31*58b9f456SAndroid Build Coastguard Worker    message(STATUS "Performing Test ${FEATURE}")
32*58b9f456SAndroid Build Coastguard Worker    if(CMAKE_CROSSCOMPILING)
33*58b9f456SAndroid Build Coastguard Worker      try_compile(COMPILE_${FEATURE}
34*58b9f456SAndroid Build Coastguard Worker              ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp
35*58b9f456SAndroid Build Coastguard Worker              CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS}
36*58b9f456SAndroid Build Coastguard Worker              LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES})
37*58b9f456SAndroid Build Coastguard Worker      if(COMPILE_${FEATURE})
38*58b9f456SAndroid Build Coastguard Worker        message(WARNING
39*58b9f456SAndroid Build Coastguard Worker              "If you see build failures due to cross compilation, try setting HAVE_${VAR} to 0")
40*58b9f456SAndroid Build Coastguard Worker        set(RUN_${FEATURE} 0)
41*58b9f456SAndroid Build Coastguard Worker      else()
42*58b9f456SAndroid Build Coastguard Worker        set(RUN_${FEATURE} 1)
43*58b9f456SAndroid Build Coastguard Worker      endif()
44*58b9f456SAndroid Build Coastguard Worker    else()
45*58b9f456SAndroid Build Coastguard Worker      message(STATUS "Performing Test ${FEATURE}")
46*58b9f456SAndroid Build Coastguard Worker      try_run(RUN_${FEATURE} COMPILE_${FEATURE}
47*58b9f456SAndroid Build Coastguard Worker              ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp
48*58b9f456SAndroid Build Coastguard Worker              CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS}
49*58b9f456SAndroid Build Coastguard Worker              LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES})
50*58b9f456SAndroid Build Coastguard Worker    endif()
51*58b9f456SAndroid Build Coastguard Worker  endif()
52*58b9f456SAndroid Build Coastguard Worker
53*58b9f456SAndroid Build Coastguard Worker  if(RUN_${FEATURE} EQUAL 0)
54*58b9f456SAndroid Build Coastguard Worker    message(STATUS "Performing Test ${FEATURE} -- success")
55*58b9f456SAndroid Build Coastguard Worker    set(HAVE_${VAR} 1 PARENT_SCOPE)
56*58b9f456SAndroid Build Coastguard Worker    add_definitions(-DHAVE_${VAR})
57*58b9f456SAndroid Build Coastguard Worker  else()
58*58b9f456SAndroid Build Coastguard Worker    if(NOT COMPILE_${FEATURE})
59*58b9f456SAndroid Build Coastguard Worker      message(STATUS "Performing Test ${FEATURE} -- failed to compile")
60*58b9f456SAndroid Build Coastguard Worker    else()
61*58b9f456SAndroid Build Coastguard Worker      message(STATUS "Performing Test ${FEATURE} -- compiled but failed to run")
62*58b9f456SAndroid Build Coastguard Worker    endif()
63*58b9f456SAndroid Build Coastguard Worker  endif()
64*58b9f456SAndroid Build Coastguard Workerendfunction()
65