summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cmake/Qt3rdPartyLibraryHelpers.cmake4
-rw-r--r--cmake/QtExecutableHelpers.cmake5
-rw-r--r--cmake/QtFlagHandlingHelpers.cmake112
-rw-r--r--cmake/QtModuleHelpers.cmake6
-rw-r--r--cmake/QtPluginHelpers.cmake5
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 "")