aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCraig Scott <craig.scott@qt.io>2021-08-16 15:10:38 +1000
committerAlexandru Croitor <alexandru.croitor@qt.io>2021-08-20 18:06:28 +0200
commit96fdbf597e581fe5e09e02758a4a2b0fe12add53 (patch)
tree6cadc070ed6473b16cf9a99bb73f5849ddc59d1f
parent86a477e72be6a71f50213e5ac2841eba0b4e78b4 (diff)
Allow QML plugin's CMake target name to be specified for qmldir file
The current code assumes that the basename of the QML plugin is the same as the CMake target it corresponds to. This won't be the case for installed Qt packages due to the installed name including a namespace. It also won't match when a Qt library infix is used. The current code works around the former by trying to heuristically work out whether a namespaced Qt target exists for the plugin. The Qt library infix is more problematic because the plugin target name won't include the infix whereas the plugin library basename will. Address both of those issues by adding an internal option INSTALLED_PLUGIN_TARGET to qt6_add_qml_module() which allows the installed target name to be provided. When included in a qmldir file, qt6_import_qml_plugin() will use that name, otherwise it will fall back to using the plugin library's basename, as per the current behavior. The option may become public in the future, but for now it is only for Qt's internal use for the 6.2 release. Conflicts: src/qml/qmldirparser/qqmldirparser_p.h Fixes: QTBUG-95140 Change-Id: I5a057c80b70ee802c0f0840e9eea2e579193d126 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io> (cherry picked from commit a25f650c317e4886007a8beb0e9f2f7e973e6e7c) Reviewed-by: Craig Scott <craig.scott@qt.io>
-rw-r--r--src/imports/builtins/jsroot.qmltypes2
-rw-r--r--src/qml/Qt6QmlBuildInternals.cmake28
-rw-r--r--src/qml/Qt6QmlMacros.cmake48
-rw-r--r--src/qml/qmldirparser/qqmldirparser.cpp19
-rw-r--r--src/qml/qmldirparser/qqmldirparser_p.h2
-rw-r--r--tests/auto/qml/qmlimportscanner/CMakeLists.txt3
-rw-r--r--tests/auto/qml/qmlimportscanner/data/CompositeSingleton.json8
-rw-r--r--tests/auto/qml/qmlimportscanner/data/CompositeWithEnum.json5
-rw-r--r--tests/auto/qml/qmlimportscanner/data/CompositeWithinSingleton.json8
-rw-r--r--tests/auto/qml/qmlimportscanner/data/Drawer.qml.json5
-rw-r--r--tests/auto/qml/qmlimportscanner/data/Imports.json8
-rw-r--r--tests/auto/qml/qmlimportscanner/data/ListProperty.qml.json8
-rw-r--r--tests/auto/qml/qmlimportscanner/data/QTBUG-45916.js.json8
-rw-r--r--tests/auto/qml/qmlimportscanner/data/Simple.qml.json8
-rw-r--r--tests/auto/qml/qmlimportscanner/data/Singleton.json8
-rw-r--r--tests/auto/qml/qmlimportscanner/data/Things.json8
-rw-r--r--tests/auto/qml/qmlimportscanner/data/javascriptMethods.qml.json5
-rw-r--r--tests/auto/qml/qmlimportscanner/data/localImport.qml.json8
-rw-r--r--tests/auto/qml/qmlimportscanner/data/parentEnum.qml.json8
-rw-r--r--tests/auto/qml/qmlimportscanner/data/qmldirImportAndDepend.qml.json8
-rw-r--r--tests/auto/qml/qmlimportscanner/data/qtQmlOnly.qml.json5
-rw-r--r--tests/auto/qml/qmlimportscanner/data/rootPath.json8
-rw-r--r--tests/auto/qml/qmlimportscanner/tst_qmlimportscanner.cpp4
-rw-r--r--tools/qmlimportscanner/main.cpp11
24 files changed, 181 insertions, 52 deletions
diff --git a/src/imports/builtins/jsroot.qmltypes b/src/imports/builtins/jsroot.qmltypes
index 419a4e5726..0a8b70babe 100644
--- a/src/imports/builtins/jsroot.qmltypes
+++ b/src/imports/builtins/jsroot.qmltypes
@@ -623,7 +623,7 @@ Module {
Property { name: "Math"; type: "Math" }
Property { name: "JSON"; type: "JSON" }
Property { name: "Reflect"; type: "Reflect" }
- Property { name: "undefined" }
+ Property { name: "undefined"; isReadonly: true }
Property { name: "NaN"; type: "number"; isReadonly: true }
Property { name: "Infinity"; type: "number"; isReadonly: true }
Property { name: "Qt"; type: "Qt" }
diff --git a/src/qml/Qt6QmlBuildInternals.cmake b/src/qml/Qt6QmlBuildInternals.cmake
index 3b9e99c782..f979c9f656 100644
--- a/src/qml/Qt6QmlBuildInternals.cmake
+++ b/src/qml/Qt6QmlBuildInternals.cmake
@@ -197,6 +197,8 @@ function(qt_internal_add_qml_module target)
)
endif()
+ set(add_qml_module_args "")
+
if(NOT arg_NO_PLUGIN AND NOT arg_NO_CREATE_PLUGIN_TARGET)
# If the qt_internal_add_qml_module call didn't specify a CLASS_NAME, we need to pre-compute
# it here and pass it along to qt_internal_add_plugin -> qt_add_plugin so that
@@ -217,6 +219,28 @@ function(qt_internal_add_qml_module target)
qt_internal_add_plugin(${arg_PLUGIN_TARGET} ${plugin_args})
+ # Get the last dot-separated part of the URI. There should only be one
+ # plugin library in the output directory, so we shouldn't need to
+ # include the full URI namespace.
+ string(REGEX REPLACE "^(.*\\.)?([^.]+)$" "\\2" plugin_basename "${arg_URI}")
+ # Add the infix and "plugin", lowercase that and use it as the basename
+ # of the plugin library.
+ string(TOLOWER "${plugin_basename}${QT_LIBINFIX}plugin" plugin_basename)
+ set_target_properties(${arg_PLUGIN_TARGET} PROPERTIES
+ OUTPUT_NAME "${plugin_basename}"
+ )
+
+ get_target_property(export_name ${arg_PLUGIN_TARGET} EXPORT_NAME)
+ if(export_name)
+ list(APPEND add_qml_module_args
+ INSTALLED_PLUGIN_TARGET "${QT_CMAKE_EXPORT_NAMESPACE}::${export_name}"
+ )
+ else()
+ list(APPEND add_qml_module_args
+ INSTALLED_PLUGIN_TARGET "${QT_CMAKE_EXPORT_NAMESPACE}::${arg_PLUGIN_TARGET}"
+ )
+ endif()
+
if(NOT arg_PLUGIN_TARGET STREQUAL target)
get_target_property(lib_type ${arg_PLUGIN_TARGET} TYPE)
if(lib_type STREQUAL "STATIC_LIBRARY")
@@ -254,10 +278,6 @@ function(qt_internal_add_qml_module target)
endif()
endforeach()
- if(QT_LIBINFIX)
- list(APPEND add_qml_module_args __QT_INTERNAL_QT_LIBINFIX "${QT_LIBINFIX}")
- endif()
-
# Update the backing and plugin targets with qml-specific things.
qt6_add_qml_module(${target}
${add_qml_module_args}
diff --git a/src/qml/Qt6QmlMacros.cmake b/src/qml/Qt6QmlMacros.cmake
index d2a40a2065..0f3aff5291 100644
--- a/src/qml/Qt6QmlMacros.cmake
+++ b/src/qml/Qt6QmlMacros.cmake
@@ -28,6 +28,7 @@ function(qt6_add_qml_module target)
set(args_single
PLUGIN_TARGET
+ INSTALLED_PLUGIN_TARGET # Internal option only, it may be removed
OUTPUT_TARGETS
RESOURCE_PREFIX
URI
@@ -42,7 +43,6 @@ function(qt6_add_qml_module target)
RESOURCE_EXPORT
INSTALL_DIRECTORY
INSTALL_LOCATION
- __QT_INTERNAL_QT_LIBINFIX # Used only by _qt_internal_target_generate_qmldir()
)
set(args_multi
@@ -235,6 +235,9 @@ function(qt6_add_qml_module target)
# The plugin can't be optional when it has no backing target
set(arg_NO_PLUGIN_OPTIONAL TRUE)
endif()
+ if(NOT arg_INSTALLED_PLUGIN_TARGET)
+ set(arg_INSTALLED_PLUGIN_TARGET ${arg_PLUGIN_TARGET})
+ endif()
set(no_gen_source)
if(arg_NO_GENERATE_PLUGIN_SOURCE)
@@ -409,8 +412,8 @@ function(qt6_add_qml_module target)
QT_QML_MODULE_TARGET_PATH "${arg_TARGET_PATH}"
QT_QML_MODULE_VERSION "${arg_VERSION}"
QT_QML_MODULE_CLASS_NAME "${arg_CLASS_NAME}"
- QT_QML_MODULE_LIBINFIX "${arg___QT_INTERNAL_QT_LIBINFIX}"
QT_QML_MODULE_PLUGIN_TARGET "${arg_PLUGIN_TARGET}"
+ QT_QML_MODULE_INSTALLED_PLUGIN_TARGET "${arg_INSTALLED_PLUGIN_TARGET}"
QT_QML_MODULE_DESIGNER_SUPPORTED "${arg_DESIGNER_SUPPORTED}"
QT_QML_MODULE_OUTPUT_DIRECTORY "${arg_OUTPUT_DIRECTORY}"
QT_QML_MODULE_RESOURCE_PREFIX "${qt_qml_module_resource_prefix}"
@@ -835,6 +838,8 @@ function(_qt_internal_target_generate_qmldir target)
endif()
set(content "module ${uri}\n")
+ _qt_internal_qmldir_item(linktarget QT_QML_MODULE_INSTALLED_PLUGIN_TARGET)
+
get_target_property(plugin_target ${target} QT_QML_MODULE_PLUGIN_TARGET)
if(plugin_target)
get_target_property(no_plugin_optional ${target} QT_QML_MODULE_NO_PLUGIN_OPTIONAL)
@@ -842,8 +847,16 @@ function(_qt_internal_target_generate_qmldir target)
string(APPEND content "optional ")
endif()
- get_target_property(qt_libinfix ${target} QT_QML_MODULE_LIBINFIX)
- string(APPEND content "plugin ${plugin_target}${qt_libinfix}\n")
+ set(plugin_basename)
+ if(TARGET ${plugin_target})
+ get_target_property(plugin_basename ${plugin_target} OUTPUT_NAME)
+ endif()
+ if(plugin_basename)
+ string(APPEND content "plugin ${plugin_basename}\n")
+ else()
+ string(APPEND content "plugin ${plugin_target}\n")
+ endif()
+
_qt_internal_qmldir_item(classname QT_QML_MODULE_CLASS_NAME)
endif()
@@ -1877,7 +1890,8 @@ but this file does not exist. Possible reasons include:
set(entry_name "qml_import_scanner_import_${idx}")
cmake_parse_arguments("entry"
""
- "CLASSNAME;NAME;PATH;PLUGIN;RELATIVEPATH;TYPE;VERSION;" ""
+ "CLASSNAME;NAME;PATH;PLUGIN;RELATIVEPATH;TYPE;VERSION;LINKTARGET"
+ ""
${${entry_name}}
)
endmacro()
@@ -1968,18 +1982,20 @@ but this file does not exist. Possible reasons include:
# (typically brought in via find_package(Qt6...) ).
# For other plugins, the targets can come from the project itself.
#
- # Handles Qt provided Qml plugins
- if(TARGET "${QT_CMAKE_EXPORT_NAMESPACE}::${entry_PLUGIN}")
- set(plugin_target "${QT_CMAKE_EXPORT_NAMESPACE}::${entry_PLUGIN}")
- list(APPEND plugins_to_link "${plugin_target}")
-
- # Handles user project provided Qml plugins
- elseif(TARGET ${entry_PLUGIN} AND TARGET ${entry_PLUGIN}_init)
- set(plugin_target "${entry_PLUGIN}")
- list(APPEND plugins_to_link "${plugin_target}")
-
- # TODO: QTBUG-94605 Figure out if this is a reasonable scenario to support
+ if(entry_LINKTARGET)
+ if(TARGET ${entry_LINKTARGET})
+ list(APPEND plugins_to_link "${entry_LINKTARGET}")
+ else()
+ message(WARNING
+ "The qml plugin '${entry_PLUGIN}' is a dependency of '${target}', "
+ "but the link target it defines (${entry_LINKTARGET}) does not exist "
+ "in the current scope. The plugin will not be linked."
+ )
+ endif()
+ elseif(TARGET ${entry_PLUGIN})
+ list(APPEND plugins_to_link "${entry_PLUGIN}")
else()
+ # TODO: QTBUG-94605 Figure out if this is a reasonable scenario to support
message(WARNING
"The qml plugin '${entry_PLUGIN}' is a dependency of '${target}', "
"but there is no target by that name in the current scope. The plugin will "
diff --git a/src/qml/qmldirparser/qqmldirparser.cpp b/src/qml/qmldirparser/qqmldirparser.cpp
index 1dbf35f1d3..ae6edde3c0 100644
--- a/src/qml/qmldirparser/qqmldirparser.cpp
+++ b/src/qml/qmldirparser/qqmldirparser.cpp
@@ -85,6 +85,7 @@ void QQmlDirParser::clear()
_designerSupported = false;
_typeInfos.clear();
_classNames.clear();
+ _linkTarget.clear();
}
inline static void scanSpace(const QChar *&ch) {
@@ -321,6 +322,24 @@ bool QQmlDirParser::parse(const QString &source)
}
_preferredPath = sections[1];
+ } else if (sections[0] == QLatin1String("linktarget")) {
+ if (sectionCount < 2) {
+ reportError(lineNumber, 0,
+ QStringLiteral("linktarget directive requires an argument, "
+ "but %1 were provided")
+ .arg(sectionCount - 1));
+ continue;
+ }
+
+ if (!_linkTarget.isEmpty()) {
+ reportError(
+ lineNumber, 0,
+ QStringLiteral(
+ "only one linktarget directive may be defined in a qmldir file"));
+ continue;
+ }
+
+ _linkTarget = sections[1];
} else if (sectionCount == 2) {
// No version specified (should only be used for relative qmldir files)
const Component entry(sections[0], sections[1], QTypeRevision());
diff --git a/src/qml/qmldirparser/qqmldirparser_p.h b/src/qml/qmldirparser/qqmldirparser_p.h
index eabaceae91..22073d26c5 100644
--- a/src/qml/qmldirparser/qqmldirparser_p.h
+++ b/src/qml/qmldirparser/qqmldirparser_p.h
@@ -161,6 +161,7 @@ public:
QStringList typeInfos() const;
QStringList classNames() const;
QString preferredPath() const;
+ QString linkTarget() const { return _linkTarget; }
private:
bool maybeAddComponent(const QString &typeName, const QString &fileName, const QString &version, QHash<QString,Component> &hash, int lineNumber = -1, bool multi = true);
@@ -178,6 +179,7 @@ private:
bool _designerSupported = false;
QStringList _typeInfos;
QStringList _classNames;
+ QString _linkTarget;
};
using QQmlDirComponents = QMultiHash<QString,QQmlDirParser::Component>;
diff --git a/tests/auto/qml/qmlimportscanner/CMakeLists.txt b/tests/auto/qml/qmlimportscanner/CMakeLists.txt
index ec69f00516..28a48e2f21 100644
--- a/tests/auto/qml/qmlimportscanner/CMakeLists.txt
+++ b/tests/auto/qml/qmlimportscanner/CMakeLists.txt
@@ -35,8 +35,9 @@ qt_internal_extend_target(tst_qmlimportscanner CONDITION NOT ANDROID AND NOT IOS
)
# special case begin
+string(TOLOWER "${QT_LIBINFIX}" infix_lowercase)
qt_internal_extend_target(tst_qmlimportscanner CONDITION DEFINED QT_LIBINFIX
DEFINES
- LIBINFIX=${QT_LIBINFIX}
+ LIBINFIX=${infix_lowercase}
)
# special case end
diff --git a/tests/auto/qml/qmlimportscanner/data/CompositeSingleton.json b/tests/auto/qml/qmlimportscanner/data/CompositeSingleton.json
index f8ac3438f9..4978bb1d77 100644
--- a/tests/auto/qml/qmlimportscanner/data/CompositeSingleton.json
+++ b/tests/auto/qml/qmlimportscanner/data/CompositeSingleton.json
@@ -6,22 +6,25 @@
},
{
"classname": "QtQuick2Plugin",
+ "linkTarget": "Qt6::qtquick2plugin",
"name": "QtQuick",
- "plugin": "qtquick2plugin",
+ "plugin": "qtquickplugin",
"pluginIsOptional": true,
"relativePath": "QtQuick",
"type": "module"
},
{
"classname": "QtQmlPlugin",
+ "linkTarget": "Qt6::qmlplugin",
"name": "QtQml",
- "plugin": "qmlplugin",
+ "plugin": "qtqmlplugin",
"pluginIsOptional": true,
"relativePath": "QtQml",
"type": "module"
},
{
"classname": "QtQmlModelsPlugin",
+ "linkTarget": "Qt6::modelsplugin",
"name": "QtQml.Models",
"plugin": "modelsplugin",
"pluginIsOptional": true,
@@ -30,6 +33,7 @@
},
{
"classname": "QtQmlWorkerScriptPlugin",
+ "linkTarget": "Qt6::workerscriptplugin",
"name": "QtQml.WorkerScript",
"plugin": "workerscriptplugin",
"pluginIsOptional": true,
diff --git a/tests/auto/qml/qmlimportscanner/data/CompositeWithEnum.json b/tests/auto/qml/qmlimportscanner/data/CompositeWithEnum.json
index 92d6797bec..9afc620f17 100644
--- a/tests/auto/qml/qmlimportscanner/data/CompositeWithEnum.json
+++ b/tests/auto/qml/qmlimportscanner/data/CompositeWithEnum.json
@@ -6,14 +6,16 @@
},
{
"classname": "QtQmlPlugin",
+ "linkTarget": "Qt6::qmlplugin",
"name": "QtQml",
- "plugin": "qmlplugin",
+ "plugin": "qtqmlplugin",
"pluginIsOptional": true,
"relativePath": "QtQml",
"type": "module"
},
{
"classname": "QtQmlModelsPlugin",
+ "linkTarget": "Qt6::modelsplugin",
"name": "QtQml.Models",
"plugin": "modelsplugin",
"pluginIsOptional": true,
@@ -22,6 +24,7 @@
},
{
"classname": "QtQmlWorkerScriptPlugin",
+ "linkTarget": "Qt6::workerscriptplugin",
"name": "QtQml.WorkerScript",
"plugin": "workerscriptplugin",
"pluginIsOptional": true,
diff --git a/tests/auto/qml/qmlimportscanner/data/CompositeWithinSingleton.json b/tests/auto/qml/qmlimportscanner/data/CompositeWithinSingleton.json
index ceed744ea4..274ee20a97 100644
--- a/tests/auto/qml/qmlimportscanner/data/CompositeWithinSingleton.json
+++ b/tests/auto/qml/qmlimportscanner/data/CompositeWithinSingleton.json
@@ -6,22 +6,25 @@
},
{
"classname": "QtQuick2Plugin",
+ "linkTarget": "Qt6::qtquick2plugin",
"name": "QtQuick",
- "plugin": "qtquick2plugin",
+ "plugin": "qtquickplugin",
"pluginIsOptional": true,
"relativePath": "QtQuick",
"type": "module"
},
{
"classname": "QtQmlPlugin",
+ "linkTarget": "Qt6::qmlplugin",
"name": "QtQml",
- "plugin": "qmlplugin",
+ "plugin": "qtqmlplugin",
"pluginIsOptional": true,
"relativePath": "QtQml",
"type": "module"
},
{
"classname": "QtQmlModelsPlugin",
+ "linkTarget": "Qt6::modelsplugin",
"name": "QtQml.Models",
"plugin": "modelsplugin",
"pluginIsOptional": true,
@@ -30,6 +33,7 @@
},
{
"classname": "QtQmlWorkerScriptPlugin",
+ "linkTarget": "Qt6::workerscriptplugin",
"name": "QtQml.WorkerScript",
"plugin": "workerscriptplugin",
"pluginIsOptional": true,
diff --git a/tests/auto/qml/qmlimportscanner/data/Drawer.qml.json b/tests/auto/qml/qmlimportscanner/data/Drawer.qml.json
index 4eac05306a..efc104cb69 100644
--- a/tests/auto/qml/qmlimportscanner/data/Drawer.qml.json
+++ b/tests/auto/qml/qmlimportscanner/data/Drawer.qml.json
@@ -1,14 +1,16 @@
[
{
"classname": "QtQmlPlugin",
+ "linkTarget": "Qt6::qmlplugin",
"name": "QtQml",
- "plugin": "qmlplugin",
+ "plugin": "qtqmlplugin",
"pluginIsOptional": true,
"relativePath": "QtQml",
"type": "module"
},
{
"classname": "QtQmlModelsPlugin",
+ "linkTarget": "Qt6::modelsplugin",
"name": "QtQml.Models",
"plugin": "modelsplugin",
"pluginIsOptional": true,
@@ -17,6 +19,7 @@
},
{
"classname": "QtQmlWorkerScriptPlugin",
+ "linkTarget": "Qt6::workerscriptplugin",
"name": "QtQml.WorkerScript",
"plugin": "workerscriptplugin",
"pluginIsOptional": true,
diff --git a/tests/auto/qml/qmlimportscanner/data/Imports.json b/tests/auto/qml/qmlimportscanner/data/Imports.json
index 1a1850163d..d1410cb626 100644
--- a/tests/auto/qml/qmlimportscanner/data/Imports.json
+++ b/tests/auto/qml/qmlimportscanner/data/Imports.json
@@ -6,22 +6,25 @@
},
{
"classname": "QtQuick2Plugin",
+ "linkTarget": "Qt6::qtquick2plugin",
"name": "QtQuick",
- "plugin": "qtquick2plugin",
+ "plugin": "qtquickplugin",
"pluginIsOptional": true,
"relativePath": "QtQuick",
"type": "module"
},
{
"classname": "QtQmlPlugin",
+ "linkTarget": "Qt6::qmlplugin",
"name": "QtQml",
- "plugin": "qmlplugin",
+ "plugin": "qtqmlplugin",
"pluginIsOptional": true,
"relativePath": "QtQml",
"type": "module"
},
{
"classname": "QtQmlModelsPlugin",
+ "linkTarget": "Qt6::modelsplugin",
"name": "QtQml.Models",
"plugin": "modelsplugin",
"pluginIsOptional": true,
@@ -30,6 +33,7 @@
},
{
"classname": "QtQmlWorkerScriptPlugin",
+ "linkTarget": "Qt6::workerscriptplugin",
"name": "QtQml.WorkerScript",
"plugin": "workerscriptplugin",
"pluginIsOptional": true,
diff --git a/tests/auto/qml/qmlimportscanner/data/ListProperty.qml.json b/tests/auto/qml/qmlimportscanner/data/ListProperty.qml.json
index d647f7f9ae..c49f02e710 100644
--- a/tests/auto/qml/qmlimportscanner/data/ListProperty.qml.json
+++ b/tests/auto/qml/qmlimportscanner/data/ListProperty.qml.json
@@ -2,7 +2,8 @@
{
"classname": "QtQuick2Plugin",
"name": "QtQuick",
- "plugin": "qtquick2plugin",
+ "linkTarget": "Qt6::qtquick2plugin",
+ "plugin": "qtquickplugin",
"pluginIsOptional": true,
"relativePath": "QtQuick",
"type": "module"
@@ -15,14 +16,16 @@
},
{
"classname": "QtQmlPlugin",
+ "linkTarget": "Qt6::qmlplugin",
"name": "QtQml",
- "plugin": "qmlplugin",
+ "plugin": "qtqmlplugin",
"pluginIsOptional": true,
"relativePath": "QtQml",
"type": "module"
},
{
"classname": "QtQmlModelsPlugin",
+ "linkTarget": "Qt6::modelsplugin",
"name": "QtQml.Models",
"plugin": "modelsplugin",
"pluginIsOptional": true,
@@ -31,6 +34,7 @@
},
{
"classname": "QtQmlWorkerScriptPlugin",
+ "linkTarget": "Qt6::workerscriptplugin",
"name": "QtQml.WorkerScript",
"plugin": "workerscriptplugin",
"pluginIsOptional": true,
diff --git a/tests/auto/qml/qmlimportscanner/data/QTBUG-45916.js.json b/tests/auto/qml/qmlimportscanner/data/QTBUG-45916.js.json
index f7bddd6a91..948a629903 100644
--- a/tests/auto/qml/qmlimportscanner/data/QTBUG-45916.js.json
+++ b/tests/auto/qml/qmlimportscanner/data/QTBUG-45916.js.json
@@ -1,22 +1,25 @@
[
{
"classname": "QtQuick2Plugin",
+ "linkTarget": "Qt6::qtquick2plugin",
"name": "QtQuick",
- "plugin": "qtquick2plugin",
+ "plugin": "qtquickplugin",
"pluginIsOptional": true,
"relativePath": "QtQuick",
"type": "module"
},
{
"classname": "QtQmlPlugin",
+ "linkTarget": "Qt6::qmlplugin",
"name": "QtQml",
- "plugin": "qmlplugin",
+ "plugin": "qtqmlplugin",
"pluginIsOptional": true,
"relativePath": "QtQml",
"type": "module"
},
{
"classname": "QtQmlModelsPlugin",
+ "linkTarget": "Qt6::modelsplugin",
"name": "QtQml.Models",
"plugin": "modelsplugin",
"pluginIsOptional": true,
@@ -25,6 +28,7 @@
},
{
"classname": "QtQmlWorkerScriptPlugin",
+ "linkTarget": "Qt6::workerscriptplugin",
"name": "QtQml.WorkerScript",
"plugin": "workerscriptplugin",
"pluginIsOptional": true,
diff --git a/tests/auto/qml/qmlimportscanner/data/Simple.qml.json b/tests/auto/qml/qmlimportscanner/data/Simple.qml.json
index f7bddd6a91..948a629903 100644
--- a/tests/auto/qml/qmlimportscanner/data/Simple.qml.json
+++ b/tests/auto/qml/qmlimportscanner/data/Simple.qml.json
@@ -1,22 +1,25 @@
[
{
"classname": "QtQuick2Plugin",
+ "linkTarget": "Qt6::qtquick2plugin",
"name": "QtQuick",
- "plugin": "qtquick2plugin",
+ "plugin": "qtquickplugin",
"pluginIsOptional": true,
"relativePath": "QtQuick",
"type": "module"
},
{
"classname": "QtQmlPlugin",
+ "linkTarget": "Qt6::qmlplugin",
"name": "QtQml",
- "plugin": "qmlplugin",
+ "plugin": "qtqmlplugin",
"pluginIsOptional": true,
"relativePath": "QtQml",
"type": "module"
},
{
"classname": "QtQmlModelsPlugin",
+ "linkTarget": "Qt6::modelsplugin",
"name": "QtQml.Models",
"plugin": "modelsplugin",
"pluginIsOptional": true,
@@ -25,6 +28,7 @@
},
{
"classname": "QtQmlWorkerScriptPlugin",
+ "linkTarget": "Qt6::workerscriptplugin",
"name": "QtQml.WorkerScript",
"plugin": "workerscriptplugin",
"pluginIsOptional": true,
diff --git a/tests/auto/qml/qmlimportscanner/data/Singleton.json b/tests/auto/qml/qmlimportscanner/data/Singleton.json
index ca1d0b2d4d..ad8e6dc0ec 100644
--- a/tests/auto/qml/qmlimportscanner/data/Singleton.json
+++ b/tests/auto/qml/qmlimportscanner/data/Singleton.json
@@ -6,22 +6,25 @@
},
{
"classname": "QtQuick2Plugin",
+ "linkTarget": "Qt6::qtquick2plugin",
"name": "QtQuick",
- "plugin": "qtquick2plugin",
+ "plugin": "qtquickplugin",
"pluginIsOptional": true,
"relativePath": "QtQuick",
"type": "module"
},
{
"classname": "QtQmlPlugin",
+ "linkTarget": "Qt6::qmlplugin",
"name": "QtQml",
- "plugin": "qmlplugin",
+ "plugin": "qtqmlplugin",
"pluginIsOptional": true,
"relativePath": "QtQml",
"type": "module"
},
{
"classname": "QtQmlModelsPlugin",
+ "linkTarget": "Qt6::modelsplugin",
"name": "QtQml.Models",
"plugin": "modelsplugin",
"pluginIsOptional": true,
@@ -30,6 +33,7 @@
},
{
"classname": "QtQmlWorkerScriptPlugin",
+ "linkTarget": "Qt6::workerscriptplugin",
"name": "QtQml.WorkerScript",
"plugin": "workerscriptplugin",
"pluginIsOptional": true,
diff --git a/tests/auto/qml/qmlimportscanner/data/Things.json b/tests/auto/qml/qmlimportscanner/data/Things.json
index e50902152e..27814e1246 100644
--- a/tests/auto/qml/qmlimportscanner/data/Things.json
+++ b/tests/auto/qml/qmlimportscanner/data/Things.json
@@ -7,22 +7,25 @@
},
{
"classname": "QtQuick2Plugin",
+ "linkTarget": "Qt6::qtquick2plugin",
"name": "QtQuick",
- "plugin": "qtquick2plugin",
+ "plugin": "qtquickplugin",
"pluginIsOptional": true,
"relativePath": "QtQuick",
"type": "module"
},
{
"classname": "QtQmlPlugin",
+ "linkTarget": "Qt6::qmlplugin",
"name": "QtQml",
- "plugin": "qmlplugin",
+ "plugin": "qtqmlplugin",
"pluginIsOptional": true,
"relativePath": "QtQml",
"type": "module"
},
{
"classname": "QtQmlModelsPlugin",
+ "linkTarget": "Qt6::modelsplugin",
"name": "QtQml.Models",
"plugin": "modelsplugin",
"pluginIsOptional": true,
@@ -31,6 +34,7 @@
},
{
"classname": "QtQmlWorkerScriptPlugin",
+ "linkTarget": "Qt6::workerscriptplugin",
"name": "QtQml.WorkerScript",
"plugin": "workerscriptplugin",
"pluginIsOptional": true,
diff --git a/tests/auto/qml/qmlimportscanner/data/javascriptMethods.qml.json b/tests/auto/qml/qmlimportscanner/data/javascriptMethods.qml.json
index cbd409266d..5cd9f6dea0 100644
--- a/tests/auto/qml/qmlimportscanner/data/javascriptMethods.qml.json
+++ b/tests/auto/qml/qmlimportscanner/data/javascriptMethods.qml.json
@@ -1,8 +1,9 @@
[
{
"classname": "QtQmlPlugin",
+ "linkTarget": "Qt6::qmlplugin",
"name": "QtQml",
- "plugin": "qmlplugin",
+ "plugin": "qtqmlplugin",
"pluginIsOptional": true,
"relativePath": "QtQml",
"type": "module"
@@ -13,6 +14,7 @@
},
{
"classname": "QtQmlModelsPlugin",
+ "linkTarget": "Qt6::modelsplugin",
"name": "QtQml.Models",
"plugin": "modelsplugin",
"pluginIsOptional": true,
@@ -21,6 +23,7 @@
},
{
"classname": "QtQmlWorkerScriptPlugin",
+ "linkTarget": "Qt6::workerscriptplugin",
"name": "QtQml.WorkerScript",
"plugin": "workerscriptplugin",
"pluginIsOptional": true,
diff --git a/tests/auto/qml/qmlimportscanner/data/localImport.qml.json b/tests/auto/qml/qmlimportscanner/data/localImport.qml.json
index e50902152e..27814e1246 100644
--- a/tests/auto/qml/qmlimportscanner/data/localImport.qml.json
+++ b/tests/auto/qml/qmlimportscanner/data/localImport.qml.json
@@ -7,22 +7,25 @@
},
{
"classname": "QtQuick2Plugin",
+ "linkTarget": "Qt6::qtquick2plugin",
"name": "QtQuick",
- "plugin": "qtquick2plugin",
+ "plugin": "qtquickplugin",
"pluginIsOptional": true,
"relativePath": "QtQuick",
"type": "module"
},
{
"classname": "QtQmlPlugin",
+ "linkTarget": "Qt6::qmlplugin",
"name": "QtQml",
- "plugin": "qmlplugin",
+ "plugin": "qtqmlplugin",
"pluginIsOptional": true,
"relativePath": "QtQml",
"type": "module"
},
{
"classname": "QtQmlModelsPlugin",
+ "linkTarget": "Qt6::modelsplugin",
"name": "QtQml.Models",
"plugin": "modelsplugin",
"pluginIsOptional": true,
@@ -31,6 +34,7 @@
},
{
"classname": "QtQmlWorkerScriptPlugin",
+ "linkTarget": "Qt6::workerscriptplugin",
"name": "QtQml.WorkerScript",
"plugin": "workerscriptplugin",
"pluginIsOptional": true,
diff --git a/tests/auto/qml/qmlimportscanner/data/parentEnum.qml.json b/tests/auto/qml/qmlimportscanner/data/parentEnum.qml.json
index f7bddd6a91..948a629903 100644
--- a/tests/auto/qml/qmlimportscanner/data/parentEnum.qml.json
+++ b/tests/auto/qml/qmlimportscanner/data/parentEnum.qml.json
@@ -1,22 +1,25 @@
[
{
"classname": "QtQuick2Plugin",
+ "linkTarget": "Qt6::qtquick2plugin",
"name": "QtQuick",
- "plugin": "qtquick2plugin",
+ "plugin": "qtquickplugin",
"pluginIsOptional": true,
"relativePath": "QtQuick",
"type": "module"
},
{
"classname": "QtQmlPlugin",
+ "linkTarget": "Qt6::qmlplugin",
"name": "QtQml",
- "plugin": "qmlplugin",
+ "plugin": "qtqmlplugin",
"pluginIsOptional": true,
"relativePath": "QtQml",
"type": "module"
},
{
"classname": "QtQmlModelsPlugin",
+ "linkTarget": "Qt6::modelsplugin",
"name": "QtQml.Models",
"plugin": "modelsplugin",
"pluginIsOptional": true,
@@ -25,6 +28,7 @@
},
{
"classname": "QtQmlWorkerScriptPlugin",
+ "linkTarget": "Qt6::workerscriptplugin",
"name": "QtQml.WorkerScript",
"plugin": "workerscriptplugin",
"pluginIsOptional": true,
diff --git a/tests/auto/qml/qmlimportscanner/data/qmldirImportAndDepend.qml.json b/tests/auto/qml/qmlimportscanner/data/qmldirImportAndDepend.qml.json
index e50902152e..27814e1246 100644
--- a/tests/auto/qml/qmlimportscanner/data/qmldirImportAndDepend.qml.json
+++ b/tests/auto/qml/qmlimportscanner/data/qmldirImportAndDepend.qml.json
@@ -7,22 +7,25 @@
},
{
"classname": "QtQuick2Plugin",
+ "linkTarget": "Qt6::qtquick2plugin",
"name": "QtQuick",
- "plugin": "qtquick2plugin",
+ "plugin": "qtquickplugin",
"pluginIsOptional": true,
"relativePath": "QtQuick",
"type": "module"
},
{
"classname": "QtQmlPlugin",
+ "linkTarget": "Qt6::qmlplugin",
"name": "QtQml",
- "plugin": "qmlplugin",
+ "plugin": "qtqmlplugin",
"pluginIsOptional": true,
"relativePath": "QtQml",
"type": "module"
},
{
"classname": "QtQmlModelsPlugin",
+ "linkTarget": "Qt6::modelsplugin",
"name": "QtQml.Models",
"plugin": "modelsplugin",
"pluginIsOptional": true,
@@ -31,6 +34,7 @@
},
{
"classname": "QtQmlWorkerScriptPlugin",
+ "linkTarget": "Qt6::workerscriptplugin",
"name": "QtQml.WorkerScript",
"plugin": "workerscriptplugin",
"pluginIsOptional": true,
diff --git a/tests/auto/qml/qmlimportscanner/data/qtQmlOnly.qml.json b/tests/auto/qml/qmlimportscanner/data/qtQmlOnly.qml.json
index 4eac05306a..efc104cb69 100644
--- a/tests/auto/qml/qmlimportscanner/data/qtQmlOnly.qml.json
+++ b/tests/auto/qml/qmlimportscanner/data/qtQmlOnly.qml.json
@@ -1,14 +1,16 @@
[
{
"classname": "QtQmlPlugin",
+ "linkTarget": "Qt6::qmlplugin",
"name": "QtQml",
- "plugin": "qmlplugin",
+ "plugin": "qtqmlplugin",
"pluginIsOptional": true,
"relativePath": "QtQml",
"type": "module"
},
{
"classname": "QtQmlModelsPlugin",
+ "linkTarget": "Qt6::modelsplugin",
"name": "QtQml.Models",
"plugin": "modelsplugin",
"pluginIsOptional": true,
@@ -17,6 +19,7 @@
},
{
"classname": "QtQmlWorkerScriptPlugin",
+ "linkTarget": "Qt6::workerscriptplugin",
"name": "QtQml.WorkerScript",
"plugin": "workerscriptplugin",
"pluginIsOptional": true,
diff --git a/tests/auto/qml/qmlimportscanner/data/rootPath.json b/tests/auto/qml/qmlimportscanner/data/rootPath.json
index 21dbb12629..7abce5675b 100644
--- a/tests/auto/qml/qmlimportscanner/data/rootPath.json
+++ b/tests/auto/qml/qmlimportscanner/data/rootPath.json
@@ -1,22 +1,25 @@
[
{
"classname": "QtQuick2Plugin",
+ "linkTarget": "Qt6::qtquick2plugin",
"name": "QtQuick",
- "plugin": "qtquick2plugin",
+ "plugin": "qtquickplugin",
"pluginIsOptional": true,
"relativePath": "QtQuick",
"type": "module"
},
{
"classname": "QtQmlPlugin",
+ "linkTarget": "Qt6::qmlplugin",
"name": "QtQml",
- "plugin": "qmlplugin",
+ "plugin": "qtqmlplugin",
"pluginIsOptional": true,
"relativePath": "QtQml",
"type": "module"
},
{
"classname": "QtQmlModelsPlugin",
+ "linkTarget": "Qt6::modelsplugin",
"name": "QtQml.Models",
"plugin": "modelsplugin",
"pluginIsOptional": true,
@@ -25,6 +28,7 @@
},
{
"classname": "QtQmlWorkerScriptPlugin",
+ "linkTarget": "Qt6::workerscriptplugin",
"name": "QtQml.WorkerScript",
"plugin": "workerscriptplugin",
"pluginIsOptional": true,
diff --git a/tests/auto/qml/qmlimportscanner/tst_qmlimportscanner.cpp b/tests/auto/qml/qmlimportscanner/tst_qmlimportscanner.cpp
index 5b8b92748a..267a213eca 100644
--- a/tests/auto/qml/qmlimportscanner/tst_qmlimportscanner.cpp
+++ b/tests/auto/qml/qmlimportscanner/tst_qmlimportscanner.cpp
@@ -157,9 +157,9 @@ void TestQmlimportscanner::runQmlimportscanner(const QString &mode, const QStrin
#define STR(A) #A
if (object.contains("plugin")) {
auto plugin = object["plugin"].toString();
- const auto pos = plugin.lastIndexOf(XSTR(LIBINFIX));
+ const auto pos = plugin.lastIndexOf(XSTR(LIBINFIX) "plugin");
if (pos != -1)
- object["plugin"] = plugin.left(pos);
+ object["plugin"] = plugin.left(pos) + "plugin";
}
#endif
diff --git a/tools/qmlimportscanner/main.cpp b/tools/qmlimportscanner/main.cpp
index d59dc4a2e1..ab26abae46 100644
--- a/tools/qmlimportscanner/main.cpp
+++ b/tools/qmlimportscanner/main.cpp
@@ -69,6 +69,10 @@ inline QString dependenciesLiteral() { return QStringLiteral("dependencies"); }
inline QString moduleLiteral() { return QStringLiteral("module"); }
inline QString javascriptLiteral() { return QStringLiteral("javascript"); }
inline QString directoryLiteral() { return QStringLiteral("directory"); }
+inline QString linkTargetLiteral()
+{
+ return QStringLiteral("linkTarget");
+}
void printUsage(const QString &appNameIn)
{
@@ -193,6 +197,10 @@ QVariantMap pluginsForModulePath(const QString &modulePath, const QString &versi
pluginInfo[pluginIsOptionalLiteral()] = true;
}
+ if (!parser.linkTarget().isEmpty()) {
+ pluginInfo[linkTargetLiteral()] = parser.linkTarget();
+ }
+
pluginInfo[classnamesLiteral()] = parser.classNames().join(QLatin1Char(' '));
QStringList importsAndDependencies;
@@ -310,9 +318,12 @@ QVariantList findPathsForModuleImports(const QVariantList &imports)
import.insert(relativePathLiteral(), paths.second);
plugininfo = pluginsForModulePath(paths.first, version);
}
+ QString linkTarget = plugininfo.value(linkTargetLiteral()).toString();
QString plugins = plugininfo.value(pluginsLiteral()).toString();
bool isOptional = plugininfo.value(pluginIsOptionalLiteral(), QVariant(false)).toBool();
QString classnames = plugininfo.value(classnamesLiteral()).toString();
+ if (!linkTarget.isEmpty())
+ import.insert(linkTargetLiteral(), linkTarget);
if (!plugins.isEmpty())
import.insert(QStringLiteral("plugin"), plugins);
if (isOptional)