CMake: Don't propagate -fapplication-extension to user projects

Both the compiler and linker -fapplication-extension flag should only
be applied when building Qt's libraries (not executables).

It's up to the user project whether their code will be restricted with
application-extension-only APIs.

In qmake that can be achieved by adding to the qmake project
  CONFIG += app_extension_api_only

In CMake it can be achieved by either adding the compiler and link flags
in the project directly (using target_X_options) or by setting the
appropriate setting in the Xcode project when using the Xcode
generator.

Amends e189126f1a

Pick-to: 6.2
Task-number: QTBUG-95199
Change-Id: Ie7a764d460a89c7650391abff0fcc5abfcabef64
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
This commit is contained in:
Alexandru Croitor 2021-07-15 13:04:15 +02:00
parent 616c32be04
commit 3595613a0a
5 changed files with 28 additions and 2 deletions

View File

@ -50,6 +50,7 @@ function(qt_internal_add_common_qt_library_helper target)
endif()
_qt_internal_add_library(${target} ${arg_STATIC} ${arg_SHARED} ${arg_MODULE} ${arg_INTERFACE})
qt_internal_mark_as_internal_library(${target})
endfunction()
# Wrapper function to create a regular cmake target and forward all the

View File

@ -325,8 +325,22 @@ function(qt_handle_apple_app_extension_api_only)
# Build Qt libraries with -fapplication-extension. Needed to avoid linker warnings
# transformed into errors on darwin platforms.
set(flags "-fapplication-extension")
set(genex_condition "$<NOT:$<BOOL:$<TARGET_PROPERTY:QT_NO_APP_EXTENSION_ONLY_API>>>")
set(flags "$<${genex_condition}:${flags}>")
# The flags should only be applied to internal Qt libraries like modules and plugins.
# The reason why we use a custom property to apply the flags is because there's no other
# way to prevent the link options spilling out into user projects if the target that links
# against PlatformXInternal is a static library.
# The exported static library's INTERFACE_LINK_LIBRARIES property would contain
# $<LINK_ONLY:PlatformXInternal> and PlatformXInternal's INTERFACE_LINK_OPTIONS would be
# applied to a user project target.
# So to contain the spilling out of the flags, we ensure the link options are only added
# to internal Qt libraries that are marked with the property.
set(not_disabled "$<NOT:$<BOOL:$<TARGET_PROPERTY:QT_NO_APP_EXTENSION_ONLY_API>>>")
set(is_qt_internal_library "$<BOOL:$<TARGET_PROPERTY:_qt_is_internal_library>>")
set(condition "$<AND:${not_disabled},${is_qt_internal_library}>")
set(flags "$<${condition}:${flags}>")
target_compile_options(PlatformModuleInternal INTERFACE ${flags})
target_link_options(PlatformModuleInternal INTERFACE ${flags})
target_compile_options(PlatformPluginInternal INTERFACE ${flags})

View File

@ -105,6 +105,7 @@ function(qt_internal_add_module target)
endif()
_qt_internal_add_library("${target}" ${type_to_create})
qt_internal_mark_as_internal_library("${target}")
get_target_property(target_type ${target} TYPE)

View File

@ -76,6 +76,7 @@ function(qt_internal_add_plugin target)
${ARGN}
)
qt6_add_plugin(${target} ${plugin_args})
qt_internal_mark_as_internal_library(${target})
qt_get_sanitized_plugin_type("${arg_TYPE}" plugin_type_escaped)

View File

@ -753,3 +753,12 @@ function(qt_internal_adjust_main_config_runtime_output_dir target output_dir)
RUNTIME_OUTPUT_DIRECTORY_${main_cmake_configuration} "${output_dir}"
)
endfunction()
# Marks a target with a property that it is a library (shared or static) which was built using the
# internal Qt API (qt_internal_add_module, qt_internal_add_plugin, etc) as opposed to it being
# a user project library (qt_add_library, qt_add_plugin, etc).
#
# Needed to allow selectively applying certain flags via PlatformXInternal targets.
function(qt_internal_mark_as_internal_library target)
set_target_properties(${target} PROPERTIES _qt_is_internal_library TRUE)
endfunction()