summaryrefslogtreecommitdiffstats
path: root/cmake/QtPluginHelpers.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/QtPluginHelpers.cmake')
-rw-r--r--cmake/QtPluginHelpers.cmake136
1 files changed, 71 insertions, 65 deletions
diff --git a/cmake/QtPluginHelpers.cmake b/cmake/QtPluginHelpers.cmake
index 9437d4236d..46953d89cb 100644
--- a/cmake/QtPluginHelpers.cmake
+++ b/cmake/QtPluginHelpers.cmake
@@ -15,10 +15,12 @@ macro(qt_internal_get_internal_add_plugin_keywords option_args single_args multi
INSTALL_DIRECTORY
ARCHIVE_INSTALL_DIRECTORY
${__default_target_info_args}
+ ${__qt_internal_sbom_single_args}
)
set(${multi_args}
${__default_private_args}
${__default_public_args}
+ ${__qt_internal_sbom_multi_args}
DEFAULT_IF
)
endmacro()
@@ -170,8 +172,6 @@ function(qt_internal_add_plugin target)
qt_handle_multi_config_output_dirs("${target}")
- qt_internal_library_deprecation_level(deprecation_define)
-
qt_autogen_tools_initial_setup(${target})
unset(plugin_install_package_suffix)
@@ -227,69 +227,6 @@ function(qt_internal_add_plugin target)
set(plugin_target_versioned "${QT_CMAKE_EXPORT_NAMESPACE}::${target}")
get_target_property(type "${plugin_target_versioned}" TYPE)
- if(type STREQUAL STATIC_LIBRARY)
- # Associate plugin with its Qt module when both are both built in the same repository.
- # Check that by comparing the PROJECT_NAME of each.
- # This covers auto-linking of the majority of plugins to executables and in-tree tests.
- # Linking of plugins in standalone tests (when the Qt module will be an imported target)
- # is handled instead by the complicated genex logic in QtModulePlugins.cmake.in.
- set(is_plugin_and_module_in_same_project FALSE)
- if(NOT is_imported_qt_module)
- get_target_property(module_source_dir ${qt_module_target} SOURCE_DIR)
- get_directory_property(module_project_name
- DIRECTORY ${module_source_dir}
- DEFINITION PROJECT_NAME
- )
- if(module_project_name STREQUAL PROJECT_NAME)
- set(is_plugin_and_module_in_same_project TRUE)
- endif()
-
- # When linking static plugins with the special logic in qt_internal_add_executable,
- # make sure to skip non-default plugins.
- if(is_plugin_and_module_in_same_project AND _default_plugin)
- set_property(TARGET ${qt_module_target} APPEND PROPERTY
- _qt_initial_repo_plugins
- "${target}")
- set_property(TARGET ${qt_module_target} APPEND PROPERTY
- _qt_initial_repo_plugin_class_names
- "$<TARGET_PROPERTY:${target},QT_PLUGIN_CLASS_NAME>"
- )
- endif()
- endif()
-
- # Associate plugin with its Qt module when the plugin is built in the current repository
- # but the module is built in a different repository (qtsvg's QSvgPlugin associated with
- # qtbase's QtGui).
- # The association is done in a separate property, to ensure that reconfiguring in-tree tests
- # in qtbase doesn't accidentally cause linking to a plugin from a previously built qtsvg.
- # Needed for in-tree tests like in qtsvg, qtimageformats.
- # This is done for each Qt module regardless if it's an imported target or not, to handle
- # both per-repo and top-level builds (in per-repo build of qtsvg QtGui is imported, in a
- # top-level build Gui is not imported, but in both cases qtsvg tests need to link to
- # QSvgPlugin).
- #
- # TODO: Top-level in-tree tests and qdeclarative per-repo in-tree tests that depend on
- # static Qml plugins won't work due to the requirement of running qmlimportscanner
- # at configure time, but qmlimportscanner is not built at that point. Moving the
- # execution of qmlimportscanner to build time is non-trivial because qmlimportscanner
- # not only generates a cpp file to compile but also outputs a list of static plugins
- # that should be linked and there is no straightforward way to tell CMake to link
- # against a list of libraries that was discovered at build time (apart from
- # response files, which apparently might not work on all platforms).
- # qmake doesn't have this problem because each project is configured separately so
- # qmlimportscanner is always built by the time it needs to be run for a test.
- if(NOT is_plugin_and_module_in_same_project AND _default_plugin)
- string(MAKE_C_IDENTIFIER "${PROJECT_NAME}" current_project_name)
- set(prop_prefix "_qt_repo_${current_project_name}")
- set_property(TARGET ${qt_module_target} APPEND PROPERTY
- ${prop_prefix}_plugins "${target}")
- set_property(TARGET ${qt_module_target} APPEND PROPERTY
- ${prop_prefix}_plugin_class_names
- "$<TARGET_PROPERTY:${target},QT_PLUGIN_CLASS_NAME>"
- )
- endif()
- endif()
-
qt_internal_add_autogen_sync_header_dependencies(${target} ${qt_module_target})
endif()
@@ -377,6 +314,10 @@ function(qt_internal_add_plugin target)
MOC_OPTIONS ${arg_MOC_OPTIONS}
ENABLE_AUTOGEN_TOOLS ${arg_ENABLE_AUTOGEN_TOOLS}
DISABLE_AUTOGEN_TOOLS ${arg_DISABLE_AUTOGEN_TOOLS}
+ ATTRIBUTION_ENTRY_INDEX "${arg_ATTRIBUTION_ENTRY_INDEX}"
+ ATTRIBUTION_FILE_PATHS ${arg_ATTRIBUTION_FILE_PATHS}
+ ATTRIBUTION_FILE_DIR_PATHS ${arg_ATTRIBUTION_FILE_DIR_PATHS}
+ SBOM_DEPENDENCIES ${arg_SBOM_DEPENDENCIES}
)
qt_internal_add_repo_local_defines("${target}")
@@ -479,6 +420,24 @@ function(qt_internal_add_plugin target)
if(NOT arg_SKIP_INSTALL)
list(APPEND finalizer_extra_args INSTALL_PATH "${install_directory}")
endif()
+
+ if(QT_GENERATE_SBOM)
+ set(sbom_args "")
+ list(APPEND sbom_args TYPE QT_PLUGIN)
+
+ qt_get_cmake_configurations(configs)
+ foreach(config IN LISTS configs)
+ _qt_internal_sbom_append_multi_config_aware_single_arg_option(
+ INSTALL_PATH
+ "${install_directory}"
+ "${config}"
+ sbom_args
+ )
+ endforeach()
+
+ _qt_internal_extend_sbom(${target} ${sbom_args})
+ endif()
+
qt_add_list_file_finalizer(qt_finalize_plugin ${target} ${finalizer_extra_args})
if(NOT arg_SKIP_INSTALL)
@@ -507,6 +466,8 @@ function(qt_finalize_plugin target)
qt_generate_plugin_pri_file("${target}")
endif()
endif()
+
+ _qt_internal_finalize_sbom(${target})
endfunction()
function(qt_get_sanitized_plugin_type plugin_type out_var)
@@ -623,3 +584,48 @@ function(qt_internal_add_darwin_permission_plugin permission)
QT_PLUGIN_PRI_EXTRA_CONTENT ${extra_plugin_pri_content}
)
endfunction()
+
+# The function looks and links the static plugins that the target depends on. The function behaves
+# similar to qt_import_plugins, but should be used when building Qt executable or shared libraries.
+# It's expected that all dependencies are valid targets at the time when the function is called.
+# If not their plugins will be not collected for linking.
+function(qt_internal_import_plugins target)
+ set(plugin_targets "")
+ foreach(dep_target IN LISTS ARGN)
+ if(dep_target AND TARGET ${dep_target})
+ get_target_property(plugins ${dep_target} _qt_plugins)
+ if(plugins)
+ list(APPEND plugin_targets ${plugins})
+ else()
+ # Fallback should be remove in Qt 7.
+ get_target_property(target_type ${dep_target} TYPE)
+ if(NOT "${target_type}" STREQUAL "INTERFACE_LIBRARY")
+ get_target_property(plugins ${dep_target} QT_PLUGINS)
+ if(plugins)
+ list(APPEND plugin_targets ${plugins})
+ endif()
+ endif()
+ endif()
+ endif()
+ endforeach()
+
+ set(non_imported_plugin_targets "")
+ foreach(plugin_target IN LISTS plugin_targets)
+ if(NOT TARGET ${plugin_target} OR "${plugin_target}" IN_LIST non_imported_plugin_targets)
+ continue()
+ endif()
+
+ get_target_property(is_imported ${plugin_target} IMPORTED)
+ if(NOT is_imported)
+ list(APPEND non_imported_plugin_targets "${plugin_target}")
+ endif()
+ endforeach()
+
+ if(plugin_targets)
+ __qt_internal_collect_plugin_init_libraries("${non_imported_plugin_targets}" init_libraries)
+ __qt_internal_collect_plugin_libraries("${non_imported_plugin_targets}" plugin_libraries)
+ if(plugin_libraries OR init_libraries)
+ target_link_libraries(${target} PRIVATE ${plugin_libraries} ${init_libraries})
+ endif()
+ endif()
+endfunction()