diff --git a/cmake/modules/AddCompilerFlags.cmake b/cmake/modules/AddCompilerFlags.cmake --- a/cmake/modules/AddCompilerFlags.cmake +++ b/cmake/modules/AddCompilerFlags.cmake @@ -16,58 +16,52 @@ set(${RESULT} ${${TEST_NAME}} PARENT_SCOPE) endfunction() -function(add_c_compiler_flags) +function(add_compiler_flags_to_var TARGET LANGUAGE) foreach(f ${ARGN}) - check_compiler_flag(FLAG_IS_SUPPORTED C ${f}) + check_compiler_flag(FLAG_IS_SUPPORTED ${LANGUAGE} ${f}) if(${FLAG_IS_SUPPORTED}) - string(APPEND CMAKE_C_FLAGS " ${f}") + string(APPEND ${TARGET} " ${f}") endif() endforeach() - set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} PARENT_SCOPE) + set(${TARGET} ${${TARGET}} PARENT_SCOPE) endfunction() -function(add_cxx_compiler_flags) - foreach(f ${ARGN}) - check_compiler_flag(FLAG_IS_SUPPORTED CXX ${f}) - if(${FLAG_IS_SUPPORTED}) - string(APPEND CMAKE_CXX_FLAGS " ${f}") - endif() - endforeach() - set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} PARENT_SCOPE) -endfunction() +macro(add_c_compiler_flags) + add_compiler_flags_to_var(CMAKE_C_FLAGS C ${ARGN}) +endmacro() + +macro(add_cxx_compiler_flags) + add_compiler_flags_to_var(CMAKE_CXX_FLAGS CXX ${ARGN}) +endmacro() macro(add_compiler_flags) add_c_compiler_flags(${ARGN}) add_cxx_compiler_flags(${ARGN}) endmacro() -macro(remove_c_compiler_flags) - if(NOT "${CMAKE_BUILD_TYPE}" STREQUAL "") - string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE) - set(BUILD_TYPE_C_FLAGS "CMAKE_C_FLAGS_${BUILD_TYPE}") - endif() - +macro(remove_compiler_flags_from_var TARGET) foreach(f ${ARGN}) - string(REGEX REPLACE "${f}( |$)" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") - if(NOT "${CMAKE_BUILD_TYPE}" STREQUAL "") - string(REGEX REPLACE "${f}( |$)" "" ${BUILD_TYPE_C_FLAGS} "${${BUILD_TYPE_C_FLAGS}}") - endif() + string(REGEX REPLACE "${f}( |$)" "" ${TARGET} "${${TARGET}}") endforeach() endmacro() -macro(remove_cxx_compiler_flags) +function(remove_c_compiler_flags) + remove_compiler_flags_from_var(CMAKE_C_FLAGS ${ARGN}) if(NOT "${CMAKE_BUILD_TYPE}" STREQUAL "") - string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE) - set(BUILD_TYPE_CXX_FLAGS "CMAKE_CXX_FLAGS_${BUILD_TYPE}") + string(TOUPPER "CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}" BUILD_TYPE_FLAGS) + remove_compiler_flags_from_var(${BUILD_TYPE_FLAGS} ${ARGN}) endif() - - foreach(f ${ARGN}) - string(REGEX REPLACE "${f}( |$)" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - if(NOT "${CMAKE_BUILD_TYPE}" STREQUAL "") - string(REGEX REPLACE "${f}( |$)" "" ${BUILD_TYPE_CXX_FLAGS} "${${BUILD_TYPE_CXX_FLAGS}}") - endif() - endforeach() -endmacro() + set(${BUILD_TYPE_FLAGS} ${${BUILD_TYPE_FLAGS}} PARENT_SCOPE) +endfunction() + +function(remove_cxx_compiler_flags) + remove_compiler_flags_from_var(CMAKE_CXX_FLAGS ${ARGN}) + if(NOT "${CMAKE_BUILD_TYPE}" STREQUAL "") + string(TOUPPER "CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}" BUILD_TYPE_FLAGS) + remove_compiler_flags_from_var(${BUILD_TYPE_FLAGS} ${ARGN}) + endif() + set(${BUILD_TYPE_FLAGS} ${${BUILD_TYPE_FLAGS}} PARENT_SCOPE) +endfunction() macro(remove_compiler_flags) remove_c_compiler_flags(${ARGN}) @@ -78,18 +72,15 @@ # Remove the fallback flag if it exists, so that the main flag will override # it if it was previously added. remove_cxx_compiler_flags(${FALLBACK}) - + set(FLAG_CANDIDATE ${FLAG}) check_compiler_flag(FLAG_IS_SUPPORTED CXX ${FLAG_CANDIDATE}) if(NOT ${FLAG_IS_SUPPORTED}) set(FLAG_CANDIDATE ${FALLBACK}) - check_compiler_flag(FLAG_IS_SUPPORTED CXX ${FLAG_CANDIDATE}) - endif() - - if(${FLAG_IS_SUPPORTED}) - string(APPEND ${TARGET_VAR} " ${FLAG_CANDIDATE}") - set(${TARGET_VAR} ${${TARGET_VAR}} PARENT_SCOPE) endif() + + add_compiler_flags_to_var(${TARGET_VAR} CXX ${FLAG_CANDIDATE}) + set(${TARGET_VAR} ${${TARGET_VAR}} PARENT_SCOPE) endfunction() # Note that CMake does not provide any facility to check that a linker flag is @@ -106,16 +97,11 @@ # Using -Werror will promote these warnings to errors so # CHECK_CXX_COMPILER_FLAG() will return false, preventing the flag from # being set. - check_compiler_flag(WUNUSED_CLI_ARGUMENT_IS_SUPPORTED + add_compiler_flags_to_var( + CMAKE_REQUIRED_FLAGS CXX "-Wunused-command-line-argument" ) - if(${WUNUSED_CLI_ARGUMENT_IS_SUPPORTED}) - string(APPEND - CMAKE_REQUIRED_FLAGS - " -Werror=unused-command-line-argument" - ) - endif() # Save the current linker flags set(SAVE_CMAKE_EXE_LINKERFLAGS ${CMAKE_EXE_LINKER_FLAGS}) @@ -126,11 +112,9 @@ CHECK_CXX_COMPILER_FLAG("" ${FLAG_IS_SUPPORTED}) # Unset the -Werror=unused-command-line-argument flag if it is set. - string(REGEX REPLACE - " -Werror=unused-command-line-argument" - "" + remove_compiler_flags_from_var( CMAKE_REQUIRED_FLAGS - "${CMAKE_REQUIRED_FLAGS}" + "-Wunused-command-line-argument" ) # If the flag is not supported restore CMAKE_EXE_LINKER_FLAGS