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