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