diff options
-rw-r--r-- | cmake/Qt3rdPartyLibraryHelpers.cmake | 4 | ||||
-rw-r--r-- | cmake/QtExecutableHelpers.cmake | 5 | ||||
-rw-r--r-- | cmake/QtFlagHandlingHelpers.cmake | 112 | ||||
-rw-r--r-- | cmake/QtModuleHelpers.cmake | 6 | ||||
-rw-r--r-- | cmake/QtPluginHelpers.cmake | 5 |
5 files changed, 104 insertions, 28 deletions
diff --git a/cmake/Qt3rdPartyLibraryHelpers.cmake b/cmake/Qt3rdPartyLibraryHelpers.cmake index c784039556..d144977c7f 100644 --- a/cmake/Qt3rdPartyLibraryHelpers.cmake +++ b/cmake/Qt3rdPartyLibraryHelpers.cmake @@ -187,7 +187,9 @@ function(qt_internal_add_3rdparty_library target) endif() if(NOT arg_EXCEPTIONS AND NOT arg_INTERFACE) - qt_internal_set_no_exceptions_flags("${target}") + qt_internal_set_exceptions_flags("${target}" FALSE) + elseif(arg_EXCEPTIONS) + qt_internal_set_exceptions_flags("${target}" TRUE) endif() qt_internal_extend_target("${target}" diff --git a/cmake/QtExecutableHelpers.cmake b/cmake/QtExecutableHelpers.cmake index db4cc06be2..5ab7848aae 100644 --- a/cmake/QtExecutableHelpers.cmake +++ b/cmake/QtExecutableHelpers.cmake @@ -115,9 +115,8 @@ function(qt_internal_add_executable name) WIN32_EXECUTABLE "${arg_GUI}" MACOSX_BUNDLE "${arg_GUI}" ) - if(NOT ${arg_EXCEPTIONS}) - qt_internal_set_no_exceptions_flags("${name}") - endif() + + qt_internal_set_exceptions_flags("${name}" ${arg_EXCEPTIONS}) # Check if target needs to be excluded from all target. Also affects qt_install. # Set by qt_exclude_tool_directories_from_default_target. diff --git a/cmake/QtFlagHandlingHelpers.cmake b/cmake/QtFlagHandlingHelpers.cmake index e4e58b8a1e..69558c32db 100644 --- a/cmake/QtFlagHandlingHelpers.cmake +++ b/cmake/QtFlagHandlingHelpers.cmake @@ -145,27 +145,35 @@ function(qt_internal_library_deprecation_level result) set("${result}" "${deprecations}" PARENT_SCOPE) endfunction() -# Sets the exceptions flags for the given target -function(qt_internal_set_no_exceptions_flags target) - target_compile_definitions("${target}" PRIVATE "QT_NO_EXCEPTIONS") - if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") - set(_flag "/wd4530" "/wd4577") - elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") - set(_flag "-fno-exceptions") - elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang") - set(_flag "-fno-exceptions") - elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - if (MSVC) +# Sets the exceptions flags for the given target according to exceptions_on +function(qt_internal_set_exceptions_flags target exceptions_on) + set(_defs "") + set(_flag "") + if(exceptions_on) + if(MSVC) + set(_flag "/EHsc") + endif() + else() + set(_defs "QT_NO_EXCEPTIONS") + if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") set(_flag "/wd4530" "/wd4577") - else() + elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + set(_flag "-fno-exceptions") + elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang") + set(_flag "-fno-exceptions") + elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + if (MSVC) + set(_flag "/wd4530" "/wd4577") + else() + set(_flag "-fno-exceptions") + endif() + elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel") set(_flag "-fno-exceptions") endif() - elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel") - set(_flag "-fno-exceptions") - endif() - if (_flag) - target_compile_options("${target}" PRIVATE ${_flag}) endif() + + target_compile_definitions("${target}" PRIVATE ${_defs}) + target_compile_options("${target}" PRIVATE ${_flag}) endfunction() function(qt_skip_warnings_are_errors target) @@ -398,11 +406,17 @@ endfunction() # Helper function used to update compiler and linker flags further below function(qt_internal_remove_flags_impl flag_var_name flag_values IN_CACHE) + cmake_parse_arguments(arg "REGEX" "" "" ${ARGN}) + set(replace_type REPLACE) + if(arg_REGEX) + list(PREPEND replace_type REGEX) + endif() + # This must come before cache variable modification because setting the # cache variable with FORCE will overwrite the non-cache variable in this # function scope, but we need to use the original value before that change. foreach(flag_value IN LISTS flag_values) - string(REPLACE "${flag_value}" "" ${flag_var_name} "${${flag_var_name}}") + string(${replace_type} "${flag_value}" "" ${flag_var_name} "${${flag_var_name}}") endforeach() string(STRIP "${${flag_var_name}}" ${flag_var_name}) set(${flag_var_name} "${${flag_var_name}}" PARENT_SCOPE) @@ -414,7 +428,7 @@ function(qt_internal_remove_flags_impl flag_var_name flag_values IN_CACHE) # Work exclusively on cache variable value only. set(mod_flags $CACHE{${flag_var_name}}) foreach(flag_value IN LISTS flag_values) - string(REPLACE "${flag_value}" "" mod_flags "${mod_flags}") + string(${replace_type} "${flag_value}" "" mod_flags "${mod_flags}") endforeach() string(STRIP "${mod_flags}" mod_flags) get_property(help_text CACHE ${flag_var_name} PROPERTY HELPSTRING) @@ -485,6 +499,65 @@ function(qt_internal_remove_known_optimization_flags) endforeach() endfunction() +# Removes specified flags from CMAKE_<LANGUAGES>_FLAGS[_CONFIGS] variables +# +# IN_CACHE enables flags removal from CACHE +# CONFIGS list of configurations that need to clear flags. Clears all configs by default if not +# specified. +# LANGUAGES list of LANGUAGES that need clear flags. Clears all languages by default if not +# specified. +# REGEX enables the flag processing as a regular expression. +function(qt_internal_remove_compiler_flags flags) + qt_parse_all_arguments(arg + "qt_internal_remove_compiler_flags" + "IN_CACHE;REGEX" + "" + "CONFIGS;LANGUAGES" + ${ARGN} + ) + + if("${flags}" STREQUAL "") + message(WARNING "qt_internal_remove_compiler_flags was called without any flags specified.") + return() + endif() + + if(arg_LANGUAGES) + set(languages "${arg_LANGUAGES}") + else() + qt_internal_get_enabled_languages_for_flag_manipulation(languages) + endif() + + if(arg_CONFIGS) + set(configs "${arg_CONFIGS}") + else() + message(FATAL_ERROR + "You must specify at least one configuration for which to remove the flags.") + endif() + + if(arg_REGEX) + list(APPEND extra_options "REGEX") + endif() + + foreach(lang ${languages}) + set(flag_var_name "CMAKE_${lang}_FLAGS") + qt_internal_remove_flags_impl(${flag_var_name} + "${flags}" + "${arg_IN_CACHE}" + ${extra_options} + ) + set(${flag_var_name} "${${flag_var_name}}" PARENT_SCOPE) + foreach(config ${configs}) + set(flag_var_name "CMAKE_${lang}_FLAGS_${config}") + qt_internal_remove_flags_impl(${flag_var_name} + "${flags}" + "${arg_IN_CACHE}" + ${extra_options} + ) + set(${flag_var_name} "${${flag_var_name}}" PARENT_SCOPE) + endforeach() + endforeach() +endfunction() + # Adds compiler flags for the given CONFIGS in the calling scope. Can also update the cache # if asked to do so. The flag variables are always updated in the calling scope, even if they # did not exist beforehand. @@ -857,6 +930,7 @@ function(qt_internal_set_up_config_optimizations_like_in_qmake) CONFIGS RELEASE RELWITHDEBINFO MINSIZEREL TYPES EXE SHARED MODULE # when linking static libraries, link.exe can't recognize this parameter, clang-cl will error out. IN_CACHE) + qt_internal_remove_compiler_flags("(^| )/EH[scra-]*( |$)" LANGUAGES CXX CONFIGS ${configs} IN_CACHE REGEX) endif() # Allow opting into generating debug info in object files with a fake feature. diff --git a/cmake/QtModuleHelpers.cmake b/cmake/QtModuleHelpers.cmake index 834c2ec73e..597895b7b6 100644 --- a/cmake/QtModuleHelpers.cmake +++ b/cmake/QtModuleHelpers.cmake @@ -406,8 +406,10 @@ function(qt_internal_add_module target) # thus we can't use qt_internal_extend_target()'s PUBLIC_DEFINES option. target_compile_definitions(${target} INTERFACE QT_${module_define_infix}_LIB) - if(NOT ${arg_EXCEPTIONS} AND NOT ${arg_HEADER_MODULE}) - qt_internal_set_no_exceptions_flags("${target}") + if(NOT arg_EXCEPTIONS AND NOT ${arg_HEADER_MODULE}) + qt_internal_set_exceptions_flags("${target}" FALSE) + elseif(arg_EXCEPTIONS) + qt_internal_set_exceptions_flags("${target}" TRUE) endif() set(configureFile "${CMAKE_CURRENT_SOURCE_DIR}/configure.cmake") diff --git a/cmake/QtPluginHelpers.cmake b/cmake/QtPluginHelpers.cmake index 497ccc0e89..2c26e5bcee 100644 --- a/cmake/QtPluginHelpers.cmake +++ b/cmake/QtPluginHelpers.cmake @@ -203,9 +203,8 @@ function(qt_internal_add_plugin target) ENABLE_AUTOGEN_TOOLS ${arg_ENABLE_AUTOGEN_TOOLS} DISABLE_AUTOGEN_TOOLS ${arg_DISABLE_AUTOGEN_TOOLS} ) - if(NOT ${arg_EXCEPTIONS}) - qt_internal_set_no_exceptions_flags("${target}") - endif() + + qt_internal_set_exceptions_flags("${target}" ${arg_EXCEPTIONS}) set(qt_libs_private "") |