[Reland][Runtimes] Merge 'compile_commands.json' files from runtimes build (#116303)
[llvm-project.git] / third-party / benchmark / cmake / AddCXXCompilerFlag.cmake
blob858589e9775c6669b260678afbbddfe12f048b38
1 # - Adds a compiler flag if it is supported by the compiler
3 # This function checks that the supplied compiler flag is supported and then
4 # adds it to the corresponding compiler flags
6 #  add_cxx_compiler_flag(<FLAG> [<VARIANT>])
8 # - Example
10 # include(AddCXXCompilerFlag)
11 # add_cxx_compiler_flag(-Wall)
12 # add_cxx_compiler_flag(-no-strict-aliasing RELEASE)
13 # Requires CMake 2.6+
15 if(__add_cxx_compiler_flag)
16   return()
17 endif()
18 set(__add_cxx_compiler_flag INCLUDED)
20 include(CheckCXXCompilerFlag)
22 function(mangle_compiler_flag FLAG OUTPUT)
23   string(TOUPPER "HAVE_CXX_FLAG_${FLAG}" SANITIZED_FLAG)
24   string(REPLACE "+" "X" SANITIZED_FLAG ${SANITIZED_FLAG})
25   string(REGEX REPLACE "[^A-Za-z_0-9]" "_" SANITIZED_FLAG ${SANITIZED_FLAG})
26   string(REGEX REPLACE "_+" "_" SANITIZED_FLAG ${SANITIZED_FLAG})
27   set(${OUTPUT} "${SANITIZED_FLAG}" PARENT_SCOPE)
28 endfunction(mangle_compiler_flag)
30 function(add_cxx_compiler_flag FLAG)
31   mangle_compiler_flag("${FLAG}" MANGLED_FLAG)
32   set(OLD_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
33   set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${FLAG}")
34   check_cxx_compiler_flag("${FLAG}" ${MANGLED_FLAG})
35   set(CMAKE_REQUIRED_FLAGS "${OLD_CMAKE_REQUIRED_FLAGS}")
36   if(${MANGLED_FLAG})
37     if(ARGC GREATER 1)
38       set(VARIANT ${ARGV1})
39       string(TOUPPER "_${VARIANT}" VARIANT)
40     else()
41       set(VARIANT "")
42     endif()
43     set(CMAKE_CXX_FLAGS${VARIANT} "${CMAKE_CXX_FLAGS${VARIANT}} ${BENCHMARK_CXX_FLAGS${VARIANT}} ${FLAG}" PARENT_SCOPE)
44   endif()
45 endfunction()
47 function(add_required_cxx_compiler_flag FLAG)
48   mangle_compiler_flag("${FLAG}" MANGLED_FLAG)
49   set(OLD_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
50   set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${FLAG}")
51   check_cxx_compiler_flag("${FLAG}" ${MANGLED_FLAG})
52   set(CMAKE_REQUIRED_FLAGS "${OLD_CMAKE_REQUIRED_FLAGS}")
53   if(${MANGLED_FLAG})
54     if(ARGC GREATER 1)
55       set(VARIANT ${ARGV1})
56       string(TOUPPER "_${VARIANT}" VARIANT)
57     else()
58       set(VARIANT "")
59     endif()
60     set(CMAKE_CXX_FLAGS${VARIANT} "${CMAKE_CXX_FLAGS${VARIANT}} ${FLAG}" PARENT_SCOPE)
61     set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${FLAG}" PARENT_SCOPE)
62     set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${FLAG}" PARENT_SCOPE)
63     set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${FLAG}" PARENT_SCOPE)
64     set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${FLAG}" PARENT_SCOPE)
65   else()
66     message(FATAL_ERROR "Required flag '${FLAG}' is not supported by the compiler")
67   endif()
68 endfunction()
70 function(check_cxx_warning_flag FLAG)
71   mangle_compiler_flag("${FLAG}" MANGLED_FLAG)
72   set(OLD_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
73   # Add -Werror to ensure the compiler generates an error if the warning flag
74   # doesn't exist.
75   set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Werror ${FLAG}")
76   check_cxx_compiler_flag("${FLAG}" ${MANGLED_FLAG})
77   set(CMAKE_REQUIRED_FLAGS "${OLD_CMAKE_REQUIRED_FLAGS}")
78 endfunction()