xref: /aosp_15_r20/external/libcxx/utils/google-benchmark/cmake/AddCXXCompilerFlag.cmake (revision 58b9f456b02922dfdb1fad8a988d5fd8765ecb80)
1*58b9f456SAndroid Build Coastguard Worker# - Adds a compiler flag if it is supported by the compiler
2*58b9f456SAndroid Build Coastguard Worker#
3*58b9f456SAndroid Build Coastguard Worker# This function checks that the supplied compiler flag is supported and then
4*58b9f456SAndroid Build Coastguard Worker# adds it to the corresponding compiler flags
5*58b9f456SAndroid Build Coastguard Worker#
6*58b9f456SAndroid Build Coastguard Worker#  add_cxx_compiler_flag(<FLAG> [<VARIANT>])
7*58b9f456SAndroid Build Coastguard Worker#
8*58b9f456SAndroid Build Coastguard Worker# - Example
9*58b9f456SAndroid Build Coastguard Worker#
10*58b9f456SAndroid Build Coastguard Worker# include(AddCXXCompilerFlag)
11*58b9f456SAndroid Build Coastguard Worker# add_cxx_compiler_flag(-Wall)
12*58b9f456SAndroid Build Coastguard Worker# add_cxx_compiler_flag(-no-strict-aliasing RELEASE)
13*58b9f456SAndroid Build Coastguard Worker# Requires CMake 2.6+
14*58b9f456SAndroid Build Coastguard Worker
15*58b9f456SAndroid Build Coastguard Workerif(__add_cxx_compiler_flag)
16*58b9f456SAndroid Build Coastguard Worker  return()
17*58b9f456SAndroid Build Coastguard Workerendif()
18*58b9f456SAndroid Build Coastguard Workerset(__add_cxx_compiler_flag INCLUDED)
19*58b9f456SAndroid Build Coastguard Worker
20*58b9f456SAndroid Build Coastguard Workerinclude(CheckCXXCompilerFlag)
21*58b9f456SAndroid Build Coastguard Worker
22*58b9f456SAndroid Build Coastguard Workerfunction(mangle_compiler_flag FLAG OUTPUT)
23*58b9f456SAndroid Build Coastguard Worker  string(TOUPPER "HAVE_CXX_FLAG_${FLAG}" SANITIZED_FLAG)
24*58b9f456SAndroid Build Coastguard Worker  string(REPLACE "+" "X" SANITIZED_FLAG ${SANITIZED_FLAG})
25*58b9f456SAndroid Build Coastguard Worker  string(REGEX REPLACE "[^A-Za-z_0-9]" "_" SANITIZED_FLAG ${SANITIZED_FLAG})
26*58b9f456SAndroid Build Coastguard Worker  string(REGEX REPLACE "_+" "_" SANITIZED_FLAG ${SANITIZED_FLAG})
27*58b9f456SAndroid Build Coastguard Worker  set(${OUTPUT} "${SANITIZED_FLAG}" PARENT_SCOPE)
28*58b9f456SAndroid Build Coastguard Workerendfunction(mangle_compiler_flag)
29*58b9f456SAndroid Build Coastguard Worker
30*58b9f456SAndroid Build Coastguard Workerfunction(add_cxx_compiler_flag FLAG)
31*58b9f456SAndroid Build Coastguard Worker  mangle_compiler_flag("${FLAG}" MANGLED_FLAG)
32*58b9f456SAndroid Build Coastguard Worker  set(OLD_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
33*58b9f456SAndroid Build Coastguard Worker  set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${FLAG}")
34*58b9f456SAndroid Build Coastguard Worker  check_cxx_compiler_flag("${FLAG}" ${MANGLED_FLAG})
35*58b9f456SAndroid Build Coastguard Worker  set(CMAKE_REQUIRED_FLAGS "${OLD_CMAKE_REQUIRED_FLAGS}")
36*58b9f456SAndroid Build Coastguard Worker  if(${MANGLED_FLAG})
37*58b9f456SAndroid Build Coastguard Worker    set(VARIANT ${ARGV1})
38*58b9f456SAndroid Build Coastguard Worker    if(ARGV1)
39*58b9f456SAndroid Build Coastguard Worker      string(TOUPPER "_${VARIANT}" VARIANT)
40*58b9f456SAndroid Build Coastguard Worker    endif()
41*58b9f456SAndroid Build Coastguard Worker    set(CMAKE_CXX_FLAGS${VARIANT} "${CMAKE_CXX_FLAGS${VARIANT}} ${BENCHMARK_CXX_FLAGS${VARIANT}} ${FLAG}" PARENT_SCOPE)
42*58b9f456SAndroid Build Coastguard Worker  endif()
43*58b9f456SAndroid Build Coastguard Workerendfunction()
44*58b9f456SAndroid Build Coastguard Worker
45*58b9f456SAndroid Build Coastguard Workerfunction(add_required_cxx_compiler_flag FLAG)
46*58b9f456SAndroid Build Coastguard Worker  mangle_compiler_flag("${FLAG}" MANGLED_FLAG)
47*58b9f456SAndroid Build Coastguard Worker  set(OLD_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
48*58b9f456SAndroid Build Coastguard Worker  set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${FLAG}")
49*58b9f456SAndroid Build Coastguard Worker  check_cxx_compiler_flag("${FLAG}" ${MANGLED_FLAG})
50*58b9f456SAndroid Build Coastguard Worker  set(CMAKE_REQUIRED_FLAGS "${OLD_CMAKE_REQUIRED_FLAGS}")
51*58b9f456SAndroid Build Coastguard Worker  if(${MANGLED_FLAG})
52*58b9f456SAndroid Build Coastguard Worker    set(VARIANT ${ARGV1})
53*58b9f456SAndroid Build Coastguard Worker    if(ARGV1)
54*58b9f456SAndroid Build Coastguard Worker      string(TOUPPER "_${VARIANT}" VARIANT)
55*58b9f456SAndroid Build Coastguard Worker    endif()
56*58b9f456SAndroid Build Coastguard Worker    set(CMAKE_CXX_FLAGS${VARIANT} "${CMAKE_CXX_FLAGS${VARIANT}} ${FLAG}" PARENT_SCOPE)
57*58b9f456SAndroid Build Coastguard Worker    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${FLAG}" PARENT_SCOPE)
58*58b9f456SAndroid Build Coastguard Worker    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${FLAG}" PARENT_SCOPE)
59*58b9f456SAndroid Build Coastguard Worker    set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${FLAG}" PARENT_SCOPE)
60*58b9f456SAndroid Build Coastguard Worker    set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${FLAG}" PARENT_SCOPE)
61*58b9f456SAndroid Build Coastguard Worker  else()
62*58b9f456SAndroid Build Coastguard Worker    message(FATAL_ERROR "Required flag '${FLAG}' is not supported by the compiler")
63*58b9f456SAndroid Build Coastguard Worker  endif()
64*58b9f456SAndroid Build Coastguard Workerendfunction()
65*58b9f456SAndroid Build Coastguard Worker
66*58b9f456SAndroid Build Coastguard Workerfunction(check_cxx_warning_flag FLAG)
67*58b9f456SAndroid Build Coastguard Worker  mangle_compiler_flag("${FLAG}" MANGLED_FLAG)
68*58b9f456SAndroid Build Coastguard Worker  set(OLD_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
69*58b9f456SAndroid Build Coastguard Worker  # Add -Werror to ensure the compiler generates an error if the warning flag
70*58b9f456SAndroid Build Coastguard Worker  # doesn't exist.
71*58b9f456SAndroid Build Coastguard Worker  set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Werror ${FLAG}")
72*58b9f456SAndroid Build Coastguard Worker  check_cxx_compiler_flag("${FLAG}" ${MANGLED_FLAG})
73*58b9f456SAndroid Build Coastguard Worker  set(CMAKE_REQUIRED_FLAGS "${OLD_CMAKE_REQUIRED_FLAGS}")
74*58b9f456SAndroid Build Coastguard Workerendfunction()
75