diff options
-rw-r--r-- | cmake/QtPublicPluginHelpers.cmake | 26 | ||||
-rw-r--r-- | src/corelib/Qt6CoreMacros.cmake | 10 |
2 files changed, 33 insertions, 3 deletions
diff --git a/cmake/QtPublicPluginHelpers.cmake b/cmake/QtPublicPluginHelpers.cmake index 0c4eebec0b..8c98852c49 100644 --- a/cmake/QtPublicPluginHelpers.cmake +++ b/cmake/QtPublicPluginHelpers.cmake @@ -150,8 +150,30 @@ endfunction() # Generates C++ import macro source code for given plugin function(__qt_internal_get_plugin_import_macro plugin_target out_var) - set(plugin_target_versioned "${QT_CMAKE_EXPORT_NAMESPACE}::${plugin_target}") - get_target_property(class_name "${plugin_target_versioned}" QT_PLUGIN_CLASS_NAME) + set(plugin_target_prefixed "${QT_CMAKE_EXPORT_NAMESPACE}::${plugin_target}") + + # Query the class name of plugin targets prefixed with a Qt namespace and without, this is + # needed to support plugin object initializers created by user projects. + set(class_name"") + set(class_name_prefixed "") + + if(TARGET ${plugin_target}) + get_target_property(class_name "${plugin_target}" QT_PLUGIN_CLASS_NAME) + endif() + + if(TARGET ${plugin_target_prefixed}) + get_target_property(class_name_prefixed "${plugin_target_prefixed}" QT_PLUGIN_CLASS_NAME) + endif() + + if(NOT class_name AND NOT class_name_prefixed) + message(FATAL_ERROR "No QT_PLUGIN_CLASS_NAME value on target: '${plugin_target}'") + endif() + + # Qt prefixed target takes priority. + if(class_name_prefixed) + set(class_name "${class_name_prefixed}") + endif() + set(${out_var} "Q_IMPORT_PLUGIN(${class_name})" PARENT_SCOPE) endfunction() diff --git a/src/corelib/Qt6CoreMacros.cmake b/src/corelib/Qt6CoreMacros.cmake index ce09f83ca5..3636ddecd9 100644 --- a/src/corelib/Qt6CoreMacros.cmake +++ b/src/corelib/Qt6CoreMacros.cmake @@ -1807,7 +1807,6 @@ function(qt6_add_plugin target) endif() # Derive the class name from the target name if it's not explicitly specified. - # Don't set it for qml plugins though. set(plugin_class_name "") if (NOT "${arg_TYPE}" STREQUAL "qml_plugin") if (NOT arg_CLASS_NAME) @@ -1815,7 +1814,16 @@ function(qt6_add_plugin target) else() set(plugin_class_name "${arg_CLASS_NAME}") endif() + else() + # Make sure to set any passed-in class name for qml plugins as well, because it's used for + # building the qml plugin foo_init object libraries. + if(arg_CLASS_NAME) + set(plugin_class_name "${arg_CLASS_NAME}") + else() + message(FATAL_ERROR "Qml plugin target has no CLASS_NAME specified: '${target}'") + endif() endif() + set_target_properties(${target} PROPERTIES QT_PLUGIN_CLASS_NAME "${plugin_class_name}") target_compile_definitions(${target} PRIVATE |