diff options
Diffstat (limited to 'cmake/QtPlugins.cmake.in')
-rw-r--r-- | cmake/QtPlugins.cmake.in | 50 |
1 files changed, 42 insertions, 8 deletions
diff --git a/cmake/QtPlugins.cmake.in b/cmake/QtPlugins.cmake.in index fb87a54c0d..91884302c6 100644 --- a/cmake/QtPlugins.cmake.in +++ b/cmake/QtPlugins.cmake.in @@ -1,3 +1,5 @@ +include_guard(DIRECTORY) + @QT_MODULE_PLUGIN_INCLUDES@ if(NOT @BUILD_SHARED_LIBS@) @@ -17,9 +19,22 @@ if(NOT @BUILD_SHARED_LIBS@) set(_manual_plugins_genex "$<GENEX_EVAL:$<TARGET_PROPERTY:QT_PLUGINS>>") set(_no_plugins_genex "$<GENEX_EVAL:$<TARGET_PROPERTY:QT_NO_PLUGINS>>") + # In super builds the rules below pollute the dependency rule for the + # plugin target when it's being build, causing cyclic dependencies. + # to overcome this, we check if the current target where this rule evaluates + # has a QT_BUILD_PROJECT_NAME equal to the current PROJECT_NAME. + # If so we disable the injection of plugin link rules to avoid cyclic + # dependencies. + if (@QT_SUPERBUILD@) + set(_build_allow_plugin_link_rules_genex "$<NOT:$<STREQUAL:$<TARGET_PROPERTY:QT_BUILD_PROJECT_NAME>,@PROJECT_NAME@>>") + else() + set(_build_allow_plugin_link_rules_genex 1) + endif() + # The code in here uses the properties defined in qt_import_plugins (Qt6CoreMacros.cmake) foreach(target @qt_plugins@) set(_plugin_target "@INSTALL_CMAKE_NAMESPACE@::${target}") + set(_plugin_target_versionless "Qt::${target}") get_target_property(_classname "${_plugin_target}" QT_PLUGIN_CLASS_NAME) if(NOT _classname) message("Warning: plugin ${_plugin_target} has no class name, skipping.") @@ -38,6 +53,8 @@ if(NOT @BUILD_SHARED_LIBS@) # INCLUDE set(_plugin_is_whitelisted "$<IN_LIST:${_plugin_target},${_manual_plugins_genex}>") + set(_plugin_versionless_is_whitelisted + "$<IN_LIST:${_plugin_target_versionless},${_manual_plugins_genex}>") # Note: qt_import_plugins sets the QT_PLUGINS_${_plugin_type} to "-" # when excluding it with EXCLUDE_BY_TYPE, @@ -47,7 +64,11 @@ if(NOT @BUILD_SHARED_LIBS@) "$<NOT:" # EXCLUDE "$<IN_LIST:${_plugin_target},${_no_plugins_genex}>" ">," - # excludes both plugins targeted by EXCLUDE_BY_TYPE and not included in INCLUDE_BY_TYPE + "$<NOT:" + "$<IN_LIST:${_plugin_target_versionless},${_no_plugins_genex}>" + ">," + # Excludes both plugins targeted by EXCLUDE_BY_TYPE and not included in + # INCLUDE_BY_TYPE. "$<STREQUAL:,$<GENEX_EVAL:$<TARGET_PROPERTY:QT_PLUGINS_${_plugin_type}>>>" ">" ) @@ -61,16 +82,29 @@ if(NOT @BUILD_SHARED_LIBS@) ">" ">" ) + string(CONCAT _plugin_versionless_is_in_type_whitelist + "$<IN_LIST:" + "${_plugin_target_versionless}," + "$<GENEX_EVAL:" + "$<TARGET_PROPERTY:QT_PLUGINS_${_plugin_type}>" + ">" + ">" + ) # Complete condition that defines whether a static plugin is linked string(CONCAT _plugin_condition - "$<BOOL:$<OR:" - "${_plugin_is_whitelisted}," - "${_plugin_is_in_type_whitelist}," - "$<AND:" - "${_default_plugins_are_enabled_wrapped}," - "${_plugin_is_default}," - "${_plugin_is_not_blacklisted}" + "$<BOOL:$<AND:" + "${_build_allow_plugin_link_rules_genex}," + "$<OR:" + "${_plugin_is_whitelisted}," + "${_plugin_versionless_is_whitelisted}," + "${_plugin_is_in_type_whitelist}," + "${_plugin_versionless_is_in_type_whitelist}," + "$<AND:" + "${_default_plugins_are_enabled_wrapped}," + "${_plugin_is_default}," + "${_plugin_is_not_blacklisted}" + ">" ">" ">>" ) |