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