diff --git a/Core/CppMicroServices/CMake/usFunctionCheckCompilerFlags.cmake b/Core/CppMicroServices/CMake/usFunctionCheckCompilerFlags.cmake index 4907ce5786..d9917e4a5e 100644 --- a/Core/CppMicroServices/CMake/usFunctionCheckCompilerFlags.cmake +++ b/Core/CppMicroServices/CMake/usFunctionCheckCompilerFlags.cmake @@ -1,52 +1,64 @@ # # Helper macro allowing to check if the given flags are supported # by the underlying build tool # # If the flag(s) is/are supported, they will be appended to the string identified by RESULT_VAR # # Usage: # usFunctionCheckCompilerFlags(FLAGS_TO_CHECK VALID_FLAGS_VAR) # # Example: # # set(myflags) # usFunctionCheckCompilerFlags("-fprofile-arcs" myflags) # message(1-myflags:${myflags}) # usFunctionCheckCompilerFlags("-fauto-bugfix" myflags) # message(2-myflags:${myflags}) # usFunctionCheckCompilerFlags("-Wall" myflags) # message(1-myflags:${myflags}) # # The output will be: # 1-myflags: -fprofile-arcs # 2-myflags: -fprofile-arcs # 3-myflags: -fprofile-arcs -Wall include(TestCXXAcceptsFlag) -function(usFunctionCheckCompilerFlags CXX_FLAG_TO_TEST RESULT_VAR) +function(usFunctionCheckCompilerFlags FLAG_TO_TEST RESULT_VAR) - if(CXX_FLAG_TO_TEST STREQUAL "") - message(FATAL_ERROR "CXX_FLAG_TO_TEST shouldn't be empty") + if(FLAG_TO_TEST STREQUAL "") + message(FATAL_ERROR "FLAG_TO_TEST shouldn't be empty") endif() - set(_test_flag ${CXX_FLAG_TO_TEST}) - CHECK_CXX_ACCEPTS_FLAG("-Werror=unknown-warning-option" HAS_FLAG_unknown-warning-option) - if(HAS_FLAG_unknown-warning-option) - set(_test_flag "-Werror=unknown-warning-option ${CXX_FLAG_TO_TEST}") - endif() + # Clear all flags. If not, existing flags triggering warnings might lead to + # false-negatives when checking for certain compiler flags. + set(CMAKE_C_FLAGS ) + set(CMAKE_C_FLAGS_DEBUG ) + set(CMAKE_C_FLAGS_MINSIZEREL ) + set(CMAKE_C_FLAGS_RELEASE ) + set(CMAKE_C_FLAGS_RELWITHDEBINFO ) + set(CMAKE_CXX_FLAGS ) + set(CMAKE_CXX_FLAGS_DEBUG ) + set(CMAKE_CXX_FLAGS_MINSIZEREL ) + set(CMAKE_CXX_FLAGS_RELEASE ) + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO ) - # Internally, the macro CMAKE_CXX_ACCEPTS_FLAG calls TRY_COMPILE. To avoid + # Internally, the macro CMAKE_CXX_COMPILER_FLAG calls TRY_COMPILE. To avoid # the cost of compiling the test each time the project is configured, the variable set by # the macro is added to the cache so that following invocation of the macro with # the same variable name skip the compilation step. - # For that same reason, usFunctionCheckCompilerFlags function appends a unique suffix to - # the HAS_FLAG variable. This suffix is created using a 'clean version' of the flag to test. - string(REGEX REPLACE "-\\s\\$\\+\\*\\{\\}\\(\\)\\#" "" suffix ${CXX_FLAG_TO_TEST}) - CHECK_CXX_ACCEPTS_FLAG(${_test_flag} HAS_FLAG_${suffix}) + # For that same reason, the usFunctionCheckCompilerFlags function appends a unique suffix to + # the HAS_CXX_FLAG variable. This suffix is created using a 'clean version' of the + # flag to test. The value of HAS_CXX_FLAG_${suffix} additonally needs to be a valid + # pre-processor token because CHECK_CXX_COMPILER_FLAG adds it as a definition to the compiler + # arguments. An invalid token triggers compiler warnings, which in case of the "-Werror" flag + # leads to false-negative checks. + string(REGEX REPLACE "[/-]" "_" suffix ${FLAG_TO_TEST}) + string(REGEX REPLACE "[, \\$\\+\\*\\{\\}\\(\\)\\#]" "" suffix ${suffix}) + CHECK_CXX_COMPILER_FLAG(${FLAG_TO_TEST} HAS_CXX_FLAG_${suffix}) - if(HAS_FLAG_${suffix}) - set(${RESULT_VAR} "${${RESULT_VAR}} ${CXX_FLAG_TO_TEST}" PARENT_SCOPE) + if(HAS_CXX_FLAG_${suffix}) + set(${RESULT_VAR} "${${RESULT_VAR}} ${FLAG_TO_TEST}" PARENT_SCOPE) endif() endfunction()