From 31c8031847b5cb33eac70b0a195aa1ae3f1de668 Mon Sep 17 00:00:00 2001 From: Alexandru Croitor Date: Thu, 23 Jan 2025 18:31:01 +0100 Subject: [PATCH] CMake: Collect all known qml plugin targets into a directory variable Just like we do with qt plugins, collect all found qml plugin targets into two new directory scoped variables: - QT_ALL_QML_PLUGINS_FOUND_VIA_FIND_PACKAGE - QT_ALL_QML_PLUGINS_VERSIONED_FOUND_VIA_FIND_PACKAGE The plugin target names are derived from the Config.cmake file names, based on the existing assumption that qt_internal_add_plugin always uses the target name when generating the Config.cmake file. Pick-to: 6.8 Change-Id: I78c76488e133fb3c0374cbc149425726077f6c31 Reviewed-by: Joerg Bornemann (cherry picked from commit bf83fffd13c176391d353080cd76bc68ae7ea184) Reviewed-by: Qt Cherry-pick Bot --- cmake/QtPublicPluginHelpers.cmake | 43 ++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/cmake/QtPublicPluginHelpers.cmake b/cmake/QtPublicPluginHelpers.cmake index 741488f32af..e5fe476a391 100644 --- a/cmake/QtPublicPluginHelpers.cmake +++ b/cmake/QtPublicPluginHelpers.cmake @@ -518,6 +518,20 @@ function(__qt_internal_add_interface_plugin_target plugin_module_target plugin_t APPEND PROPERTY INTERFACE_QT_PLUGIN_TARGETS ${plugin_target_name_wrapped}) endfunction() +# TODO: Figure out how to do this more reliably, instead of parsing the file name to get +# the target name. +function(__qt_internal_get_target_name_from_plugin_config_file_name + config_file_path + package_prefix_regex + out_var) + string(REGEX REPLACE + "^.*/${QT_CMAKE_EXPORT_NAMESPACE}(${package_prefix_regex})Config.cmake$" + "\\1" + target "${config_file_path}") + + set(${out_var} "${target}" PARENT_SCOPE) +endfunction() + # Include CMake plugin packages that belong to the Qt module ${target} and initialize automatic # linkage of the plugins in static builds. # The variables inside the macro have to be named unique to the module because an included Plugin @@ -546,11 +560,14 @@ macro(__qt_internal_include_plugin_packages target) file(GLOB __qt_${target}_plugin_config_files "${CMAKE_CURRENT_LIST_DIR}/${QT_CMAKE_EXPORT_NAMESPACE}*PluginConfig.cmake") foreach(__qt_${target}_plugin_config_file ${__qt_${target}_plugin_config_files}) - string(REGEX REPLACE - "^.*/${QT_CMAKE_EXPORT_NAMESPACE}(.*Plugin)Config.cmake$" - "\\1" - __qt_${target}_qt_plugin "${__qt_${target}_plugin_config_file}") include("${__qt_${target}_plugin_config_file}") + + __qt_internal_get_target_name_from_plugin_config_file_name( + "${__qt_${target}_plugin_config_file}" + "(.*Plugin)" + __qt_${target}_qt_plugin + ) + if(TARGET "${QT_CMAKE_EXPORT_NAMESPACE}::${__qt_${target}_qt_plugin}") list(APPEND __qt_${target}_plugins ${__qt_${target}_qt_plugin}) __qt_internal_add_interface_plugin_target(${__qt_${target}_plugin_module_target} @@ -677,6 +694,24 @@ macro(__qt_internal_include_qml_plugin_packages) foreach(__qt_qml_plugin_config_file ${__qt_qml_plugins_config_file_list}) include(${__qt_qml_plugin_config_file}) + __qt_internal_get_target_name_from_plugin_config_file_name( + "${__qt_qml_plugin_config_file}" + "(.*)" + __qt_qml_plugin_target + ) + set(__qt_qml_plugin_target_versioned + "${QT_CMAKE_EXPORT_NAMESPACE}::${__qt_qml_plugin_target}") + + if(TARGET "${__qt_qml_plugin_target_versioned}" + AND NOT "${__qt_qml_plugin_target}" + IN_LIST QT_ALL_QML_PLUGINS_FOUND_VIA_FIND_PACKAGE) + list(APPEND QT_ALL_QML_PLUGINS_FOUND_VIA_FIND_PACKAGE "${__qt_qml_plugin_target}") + list(APPEND QT_ALL_QML_PLUGINS_VERSIONED_FOUND_VIA_FIND_PACKAGE + "${__qt_qml_plugin_target_versioned}") + endif() + unset(__qt_qml_plugin_target) + unset(__qt_qml_plugin_target_versioned) + if(${CMAKE_FIND_PACKAGE_NAME}_NOT_FOUND_MESSAGE) string(APPEND ${CMAKE_FIND_PACKAGE_NAME}_NOT_FOUND_MESSAGE "\nThe message was set in ${__qt_qml_plugin_config_file} ")