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