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