aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2018-11-05 10:42:12 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2018-11-09 13:42:42 +0000
commit5f1b52e1c6f7668c3ea21ec11fde818ee6efd521 (patch)
tree6cc361275a896ef37ee80df96aed09a108ba966f
parent66e1be8b18967aba395238cc71bb13eff631eaac (diff)
Qt support: Allow users to pull in plugins by type
... and properly set the default values. Fixes: QBS-1409 Change-Id: Ib8f3573fcb48d395d9212ac4b01e5caf910c575f Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io> Reviewed-by: Mitch Curtis <mitch.curtis@qt.io> Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
-rw-r--r--doc/reference/items/convenience/qtguiapplication.qdoc12
-rw-r--r--doc/reference/modules/qt-plugin_support-module.qdoc77
-rw-r--r--share/qbs/imports/qbs/base/QtGuiApplication.qbs6
-rw-r--r--src/lib/qtprofilesetup/qtmoduleinfo.cpp4
-rw-r--r--src/lib/qtprofilesetup/qtmoduleinfo.h3
-rw-r--r--src/lib/qtprofilesetup/qtprofilesetup.cpp37
-rw-r--r--src/lib/qtprofilesetup/templates.qrc1
-rw-r--r--src/lib/qtprofilesetup/templates/QtModule.qbs22
-rw-r--r--src/lib/qtprofilesetup/templates/QtPlugin.qbs20
-rw-r--r--src/lib/qtprofilesetup/templates/dbus.qbs1
-rw-r--r--src/lib/qtprofilesetup/templates/gui.qbs1
-rw-r--r--src/lib/qtprofilesetup/templates/module.qbs1
-rw-r--r--src/lib/qtprofilesetup/templates/plugin.qbs1
-rw-r--r--src/lib/qtprofilesetup/templates/plugin_support.qbs52
-rw-r--r--src/lib/qtprofilesetup/templates/qml.qbs1
-rw-r--r--src/lib/qtprofilesetup/templates/quick.qbs1
-rw-r--r--src/lib/qtprofilesetup/templates/scxml.qbs1
-rw-r--r--tests/auto/blackbox/testdata-qt/plugin-support/modules/m1/m1.qbs4
-rw-r--r--tests/auto/blackbox/testdata-qt/plugin-support/modules/m2/m2.qbs4
-rw-r--r--tests/auto/blackbox/testdata-qt/plugin-support/plugin-support-main.cpp1
-rw-r--r--tests/auto/blackbox/testdata-qt/plugin-support/plugin-support.qbs16
-rw-r--r--tests/auto/blackbox/tst_blackboxqt.cpp18
-rw-r--r--tests/auto/blackbox/tst_blackboxqt.h1
23 files changed, 258 insertions, 27 deletions
diff --git a/doc/reference/items/convenience/qtguiapplication.qdoc b/doc/reference/items/convenience/qtguiapplication.qdoc
index 09b8514f5..e69b9214c 100644
--- a/doc/reference/items/convenience/qtguiapplication.qdoc
+++ b/doc/reference/items/convenience/qtguiapplication.qdoc
@@ -37,15 +37,5 @@
\brief Application with a dependency on the Qt GUI module.
A QtGuiApplication is an application that extends the \l{QtApplication} item
- by loading the \l{Qt.gui} module and possibly also the default
- QPA plugin.
-*/
-
-/*!
- \qmlproperty bool QtGuiApplication::linkDefaultQpaPlugin
-
- Whether or not to add a depencency to the default QPA plugin. The default is
- to do that in the case of a static build, where it is normally required.
-
- \defaultvalue \l{Qt.core::staticBuild}{Qt.core.staticBuild}
+ by loading the \l{Qt.gui} module.
*/
diff --git a/doc/reference/modules/qt-plugin_support-module.qdoc b/doc/reference/modules/qt-plugin_support-module.qdoc
new file mode 100644
index 000000000..fe28ee907
--- /dev/null
+++ b/doc/reference/modules/qt-plugin_support-module.qdoc
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qbs.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Free Documentation License Usage
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of
+** this file. Please review the following information to ensure
+** the GNU Free Documentation License version 1.3 requirements
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \contentspage index.html
+ \qmltype Qt.plugin_support
+ \inqmlmodule QbsModules
+ \since Qbs 1.13.0
+ \brief Allows to fine-tune which Qt plugins get pulled in.
+
+ The \c Qt.plugin_support module provides properties that allow users to control
+ which Qt plugins to pull into a product.
+ This is mostly relevant if Qt was built statically, in which case the respective
+ plugins are static libraries that get linked into your application or library.
+*/
+
+/*!
+ \qmlproperty varList Qt.plugin_support::pluginsByType
+
+ Set this property if you want to override the set of plugins for a certain
+ plugin type. For instance, to disable all image plugins except the JPEG
+ one:
+ \code
+ Qt.plugin_support.pluginsByType: ({imageformats: "qjpeg"})
+ \endcode
+ For plugin types that are not specifically overridden like this, the value in
+ defaultPluginsByType is used.
+
+ \nodefaultvalue
+*/
+
+/*!
+ \qmlproperty var Qt.plugin_support::allPluginsByType
+
+ Provides the complete set of plugins in a statically built Qt.
+ The value is a map. The keys are the plugin types, and the values
+ are lists of plugin names.
+
+ \readonly
+*/
+
+/*!
+ \qmlproperty var Qt.plugin_support::defaultPluginsByType
+
+ Provides the set of plugins that your application or library will
+ link to if you do not set pluginsByType.
+ The value is a map. The keys are the plugin types, and the values
+ are lists of plugin names.
+ The value depends on the Qt modules your product pulls in.
+
+ \readonly
+*/
+
diff --git a/share/qbs/imports/qbs/base/QtGuiApplication.qbs b/share/qbs/imports/qbs/base/QtGuiApplication.qbs
index ead671efb..61bc69752 100644
--- a/share/qbs/imports/qbs/base/QtGuiApplication.qbs
+++ b/share/qbs/imports/qbs/base/QtGuiApplication.qbs
@@ -30,10 +30,4 @@
CppApplication {
Depends { name: "Qt.gui" }
- Depends {
- name: "Qt"
- submodules: Qt.gui.defaultQpaPlugin
- condition: linkDefaultQpaPlugin && Qt.gui.defaultQpaPlugin
- }
- property bool linkDefaultQpaPlugin: Qt.gui.isStaticLibrary
}
diff --git a/src/lib/qtprofilesetup/qtmoduleinfo.cpp b/src/lib/qtprofilesetup/qtmoduleinfo.cpp
index 56827a458..c225bde67 100644
--- a/src/lib/qtprofilesetup/qtmoduleinfo.cpp
+++ b/src/lib/qtprofilesetup/qtmoduleinfo.cpp
@@ -768,7 +768,9 @@ QList<QtModuleInfo> allQt5Modules(const Profile &profile, const QtEnvironment &q
} else if (key.endsWith(".TYPE")) {
moduleInfo.pluginData.type = QString::fromLatin1(value);
} else if (key.endsWith(".EXTENDS")) {
- moduleInfo.pluginData.extends = QString::fromLatin1(value);
+ moduleInfo.pluginData.extends = makeList(value);
+ if (moduleInfo.pluginData.extends.removeOne(QLatin1String("-")))
+ moduleInfo.pluginData.autoLoad = false;
} else if (key.endsWith(".CLASS_NAME")) {
moduleInfo.pluginData.className = QString::fromLatin1(value);
}
diff --git a/src/lib/qtprofilesetup/qtmoduleinfo.h b/src/lib/qtprofilesetup/qtmoduleinfo.h
index 318b5608f..078e08a19 100644
--- a/src/lib/qtprofilesetup/qtmoduleinfo.h
+++ b/src/lib/qtprofilesetup/qtmoduleinfo.h
@@ -95,8 +95,9 @@ public:
struct PluginData {
QString type;
- QString extends;
+ QStringList extends;
QString className;
+ bool autoLoad = true;
} pluginData;
private:
diff --git a/src/lib/qtprofilesetup/qtprofilesetup.cpp b/src/lib/qtprofilesetup/qtprofilesetup.cpp
index 804844d13..03bfc6cfd 100644
--- a/src/lib/qtprofilesetup/qtprofilesetup.cpp
+++ b/src/lib/qtprofilesetup/qtprofilesetup.cpp
@@ -466,6 +466,7 @@ static void replaceSpecialValues(QByteArray *content, const Profile &profile,
dict.insert("libFilePathRelease", utf8JSLiteral(module.libFilePathRelease));
dict.insert("libNameForLinkerDebug",
utf8JSLiteral(module.libNameForLinker(qtEnvironment, true)));
+ dict.insert("pluginTypes", utf8JSLiteral(module.supportedPluginTypes));
dict.insert("libNameForLinkerRelease",
utf8JSLiteral(module.libNameForLinker(qtEnvironment, false)));
dict.insert("entryPointLibsDebug", utf8JSLiteral(qtEnvironment.entryPointLibsDebug));
@@ -517,15 +518,21 @@ static void replaceSpecialValues(QByteArray *content, const Profile &profile,
additionalContent += "\n ";
additionalContent += "isStaticLibrary: true";
}
- if (module.isPlugin)
+ if (module.isPlugin) {
dict.insert("className", utf8JSLiteral(module.pluginData.className));
+ dict.insert("extends", utf8JSLiteral(module.pluginData.extends));
+ }
if (module.hasLibrary && !module.isFramework(qtEnvironment)) {
if (!additionalContent.isEmpty())
additionalContent += "\n";
const QByteArray indent(4, ' ');
- additionalContent += "Group {\n"
- + indent + indent + "files: [Qt[\"" + module.qbsName.toUtf8() + "\"]"
- + ".libFilePath]\n"
+ additionalContent += "Group {\n";
+ if (module.isPlugin) {
+ additionalContent += indent + indent
+ + "condition: Qt[\"" + module.qbsName.toUtf8() + "\"].enableLinking\n";
+ }
+ additionalContent += indent + indent + "files: [Qt[\"" + module.qbsName.toUtf8() + "\"]"
+ + ".libFilePath]\n"
+ indent + indent + "filesAreTargets: true\n"
+ indent + indent + "fileTags: [\"" + libraryFileTag(qtEnvironment, module)
+ "\"]\n"
@@ -544,7 +551,8 @@ static void replaceSpecialValues(QByteArray *content, const Profile &profile,
static void copyTemplateFile(const QString &fileName, const QString &targetDirectory,
const Profile &profile, const QtEnvironment &qtEnv, QStringList *allFiles,
- const QtModuleInfo *module = 0)
+ const QtModuleInfo *module = nullptr, const QVariantMap &pluginMap = QVariantMap(),
+ const QStringList &nonEssentialPlugins = QStringList())
{
if (!QDir::root().mkpath(targetDirectory)) {
throw ErrorInfo(Internal::Tr::tr("Setting up Qt profile '%1' failed: "
@@ -557,8 +565,12 @@ static void copyTemplateFile(const QString &fileName, const QString &targetDirec
"Cannot open '%1' (%2).").arg(sourceFile.fileName(), sourceFile.errorString()));
}
QByteArray newContent = sourceFile.readAll();
- if (module)
+ if (module) {
replaceSpecialValues(&newContent, profile, *module, qtEnv);
+ } else {
+ newContent.replace("@allPluginsByType@", '(' + utf8JSLiteral(pluginMap) + ')');
+ newContent.replace("@nonEssentialPlugins@", utf8JSLiteral(nonEssentialPlugins));
+ }
sourceFile.close();
const QString targetPath = targetDirectory + QLatin1Char('/') + fileName;
allFiles->push_back(QFileInfo(targetPath).absoluteFilePath());
@@ -582,6 +594,16 @@ static void createModules(Profile &profile, Settings *settings,
const QList<QtModuleInfo> modules = qtEnvironment.qtMajorVersion < 5
? allQt4Modules(qtEnvironment)
: allQt5Modules(profile, qtEnvironment);
+ QVariantMap pluginsByType;
+ QStringList nonEssentialPlugins;
+ for (const QtModuleInfo &m : modules) {
+ if (m.isPlugin) {
+ QVariant &v = pluginsByType[m.pluginData.type];
+ v = v.toStringList() << m.name;
+ if (!m.pluginData.autoLoad)
+ nonEssentialPlugins << m.name;
+ }
+ }
const QString profileBaseDir = QString::fromLatin1("%1/profiles/%2")
.arg(QFileInfo(settings->fileName()).dir().absolutePath(),
profile.name());
@@ -591,6 +613,9 @@ static void createModules(Profile &profile, Settings *settings,
&allFiles);
copyTemplateFile(QLatin1String("QtPlugin.qbs"), qbsQtModuleBaseDir, profile, qtEnvironment,
&allFiles);
+ copyTemplateFile(QLatin1String("plugin_support.qbs"),
+ qbsQtModuleBaseDir + QLatin1String("/plugin_support"), profile, qtEnvironment,
+ &allFiles, nullptr, pluginsByType, nonEssentialPlugins);
for (const QtModuleInfo &module : modules) {
const QString qbsQtModuleDir = qbsQtModuleBaseDir + QLatin1Char('/') + module.qbsName;
QString moduleTemplateFileName;
diff --git a/src/lib/qtprofilesetup/templates.qrc b/src/lib/qtprofilesetup/templates.qrc
index 3c6922862..18776b27a 100644
--- a/src/lib/qtprofilesetup/templates.qrc
+++ b/src/lib/qtprofilesetup/templates.qrc
@@ -16,5 +16,6 @@
<file>templates/qmlcache.qbs</file>
<file>templates/quick.js</file>
<file>templates/quick.qbs</file>
+ <file>templates/plugin_support.qbs</file>
</qresource>
</RCC>
diff --git a/src/lib/qtprofilesetup/templates/QtModule.qbs b/src/lib/qtprofilesetup/templates/QtModule.qbs
index 51ddca223..04820ee29 100644
--- a/src/lib/qtprofilesetup/templates/QtModule.qbs
+++ b/src/lib/qtprofilesetup/templates/QtModule.qbs
@@ -13,6 +13,25 @@ Module {
Depends { name: "cpp" }
Depends { name: "Qt.core" }
+ Depends { name: "Qt.plugin_support" }
+ property stringList pluginTypes
+ Qt.plugin_support.pluginTypes: pluginTypes
+ Depends {
+ condition: Qt.core.staticBuild && !isPlugin
+ name: "Qt";
+ submodules: {
+ // We have to pull in all plugins here, because dependency resolving happens
+ // before module merging, and we don't know yet if someone set
+ // Qt.pluginSupport.pluginsByType in the product.
+ // The real filtering is done later by the plugin module files themselves.
+ var list = [];
+ var allPlugins = Qt.plugin_support.allPluginsByType;
+ for (var i = 0; i < (pluginTypes || []).length; ++i)
+ Array.prototype.push.apply(list, allPlugins[pluginTypes[i]])
+ return list;
+ }
+ }
+
property string qtModuleName
property path binPath: Qt.core.binPath
property path incPath: Qt.core.incPath
@@ -53,9 +72,10 @@ Module {
? frameworkPathsDebug: frameworkPathsRelease
cpp.linkerFlags: Qt.core.qtBuildVariant === "debug"
? linkerFlagsDebug : linkerFlagsRelease
+ property bool enableLinking: qtModuleName != undefined && hasLibrary
Properties {
- condition: qtModuleName != undefined && hasLibrary
+ condition: enableLinking
cpp.staticLibraries: staticLibs
cpp.dynamicLibraries: dynamicLibs
cpp.frameworks: mFrameworks.concat(!isStaticLibrary && Qt.core.frameworkBuild
diff --git a/src/lib/qtprofilesetup/templates/QtPlugin.qbs b/src/lib/qtprofilesetup/templates/QtPlugin.qbs
index 3cac14e56..23a6795f3 100644
--- a/src/lib/qtprofilesetup/templates/QtPlugin.qbs
+++ b/src/lib/qtprofilesetup/templates/QtPlugin.qbs
@@ -5,9 +5,27 @@ QtModule {
isPlugin: true
property string className
+ property stringList extendsModules
+
+ enableLinking: {
+ if (!base)
+ return false;
+ if (!isStaticLibrary)
+ return false;
+ if (!(Qt.plugin_support.enabledPlugins || []).contains(qtModuleName))
+ return false;
+ if (!extendsModules || extendsModules.length === 0)
+ return true;
+ for (var i = 0; i < extendsModules.length; ++i) {
+ var moduleName = extendsModules[i];
+ if (product.Qt[moduleName] && product.Qt[moduleName].present)
+ return true;
+ }
+ return false;
+ }
Rule {
- condition: isStaticLibrary
+ condition: enableLinking
multiplex: true
Artifact {
filePath: product.targetName + "_qt_plugin_import_"
diff --git a/src/lib/qtprofilesetup/templates/dbus.qbs b/src/lib/qtprofilesetup/templates/dbus.qbs
index e4fd09d4f..9245a63e3 100644
--- a/src/lib/qtprofilesetup/templates/dbus.qbs
+++ b/src/lib/qtprofilesetup/templates/dbus.qbs
@@ -62,6 +62,7 @@ QtModule {
libNameForLinkerRelease: @libNameForLinkerRelease@
libFilePathDebug: @libFilePathDebug@
libFilePathRelease: @libFilePathRelease@
+ pluginTypes: @pluginTypes@
cpp.defines: @defines@
cpp.includePaths: @includes@
diff --git a/src/lib/qtprofilesetup/templates/gui.qbs b/src/lib/qtprofilesetup/templates/gui.qbs
index 9770e94e1..eb69e0cad 100644
--- a/src/lib/qtprofilesetup/templates/gui.qbs
+++ b/src/lib/qtprofilesetup/templates/gui.qbs
@@ -48,6 +48,7 @@ QtModule {
libNameForLinkerRelease: @libNameForLinkerRelease@
libFilePathDebug: @libFilePathDebug@
libFilePathRelease: @libFilePathRelease@
+ pluginTypes: @pluginTypes@
cpp.defines: @defines@
cpp.includePaths: @includes@
diff --git a/src/lib/qtprofilesetup/templates/module.qbs b/src/lib/qtprofilesetup/templates/module.qbs
index f33c9109d..60ad106e5 100644
--- a/src/lib/qtprofilesetup/templates/module.qbs
+++ b/src/lib/qtprofilesetup/templates/module.qbs
@@ -21,6 +21,7 @@ QtModule {
libNameForLinkerRelease: @libNameForLinkerRelease@
libFilePathDebug: @libFilePathDebug@
libFilePathRelease: @libFilePathRelease@
+ pluginTypes: @pluginTypes@
cpp.defines: @defines@
cpp.includePaths: @includes@
cpp.libraryPaths: @libraryPaths@
diff --git a/src/lib/qtprofilesetup/templates/plugin.qbs b/src/lib/qtprofilesetup/templates/plugin.qbs
index 957988dd5..e73e2a4d9 100644
--- a/src/lib/qtprofilesetup/templates/plugin.qbs
+++ b/src/lib/qtprofilesetup/templates/plugin.qbs
@@ -22,5 +22,6 @@ QtPlugin {
libFilePathDebug: @libFilePathDebug@
libFilePathRelease: @libFilePathRelease@
cpp.libraryPaths: @libraryPaths@
+ extendsModules: @extends@
@additionalContent@
}
diff --git a/src/lib/qtprofilesetup/templates/plugin_support.qbs b/src/lib/qtprofilesetup/templates/plugin_support.qbs
new file mode 100644
index 000000000..c7e479f55
--- /dev/null
+++ b/src/lib/qtprofilesetup/templates/plugin_support.qbs
@@ -0,0 +1,52 @@
+Module {
+ // Set by user.
+ property varList pluginsByType
+
+ // Set by Qt modules.
+ property stringList pluginTypes
+
+ // Set by setup-qt.
+ readonly property var allPluginsByType: @allPluginsByType@
+ readonly property stringList nonEssentialPlugins: @nonEssentialPlugins@
+
+ // Derived.
+ readonly property var defaultPluginsByType: {
+ var map = {};
+ for (var i = 0; i < (pluginTypes || []).length; ++i) {
+ var pType = pluginTypes[i];
+ map[pType] = (allPluginsByType[pType] || []).filter(function(p) {
+ return !nonEssentialPlugins.contains(p); });
+ }
+ return map;
+ }
+ readonly property var effectivePluginsByType: {
+ var ppt = pluginsByType || [];
+ var eppt = {};
+ for (var i = 0; i < ppt.length; ++i) {
+ var listEntry = ppt[i];
+ for (var pluginType in listEntry) {
+ var newValue = listEntry[pluginType];
+ if (!newValue)
+ newValue = [];
+ else if (typeof newValue == "string")
+ newValue = [newValue];
+ if (!Array.isArray(newValue))
+ throw "Invalid value '" + newValue + "' in Qt.plugin_support.pluginsByType";
+ eppt[pluginType] = (eppt[pluginType] || []).uniqueConcat(newValue);
+ }
+ }
+ var dppt = defaultPluginsByType;
+ for (var pluginType in dppt) {
+ if (!eppt[pluginType])
+ eppt[pluginType] = dppt[pluginType];
+ }
+ return eppt;
+ }
+ readonly property stringList enabledPlugins: {
+ var list = [];
+ var eppt = effectivePluginsByType;
+ for (var t in eppt)
+ Array.prototype.push.apply(list, eppt[t]);
+ return list;
+ }
+}
diff --git a/src/lib/qtprofilesetup/templates/qml.qbs b/src/lib/qtprofilesetup/templates/qml.qbs
index 8c518c9f1..51bb5faa2 100644
--- a/src/lib/qtprofilesetup/templates/qml.qbs
+++ b/src/lib/qtprofilesetup/templates/qml.qbs
@@ -42,6 +42,7 @@ QtModule {
libNameForLinkerRelease: @libNameForLinkerRelease@
libFilePathDebug: @libFilePathDebug@
libFilePathRelease: @libFilePathRelease@
+ pluginTypes: @pluginTypes@
cpp.defines: @defines@
cpp.includePaths: @includes@
cpp.libraryPaths: @libraryPaths@
diff --git a/src/lib/qtprofilesetup/templates/quick.qbs b/src/lib/qtprofilesetup/templates/quick.qbs
index 87cdee49d..67394cabb 100644
--- a/src/lib/qtprofilesetup/templates/quick.qbs
+++ b/src/lib/qtprofilesetup/templates/quick.qbs
@@ -57,6 +57,7 @@ QtModule {
libNameForLinkerRelease: @libNameForLinkerRelease@
libFilePathDebug: @libFilePathDebug@
libFilePathRelease: @libFilePathRelease@
+ pluginTypes: @pluginTypes@
cpp.defines: @defines@
cpp.includePaths: @includes@
cpp.libraryPaths: @libraryPaths@
diff --git a/src/lib/qtprofilesetup/templates/scxml.qbs b/src/lib/qtprofilesetup/templates/scxml.qbs
index 1964671f8..b02a49246 100644
--- a/src/lib/qtprofilesetup/templates/scxml.qbs
+++ b/src/lib/qtprofilesetup/templates/scxml.qbs
@@ -69,6 +69,7 @@ QtModule {
libNameForLinkerRelease: @libNameForLinkerRelease@
libFilePathDebug: @libFilePathDebug@
libFilePathRelease: @libFilePathRelease@
+ pluginTypes: @pluginTypes@
cpp.defines: @defines@
cpp.includePaths: @includes@
diff --git a/tests/auto/blackbox/testdata-qt/plugin-support/modules/m1/m1.qbs b/tests/auto/blackbox/testdata-qt/plugin-support/modules/m1/m1.qbs
new file mode 100644
index 000000000..d634742f3
--- /dev/null
+++ b/tests/auto/blackbox/testdata-qt/plugin-support/modules/m1/m1.qbs
@@ -0,0 +1,4 @@
+Module {
+ Depends { name: "Qt.plugin_support" }
+ Qt.plugin_support.pluginsByType: ({imageformats: "qjpeg"})
+}
diff --git a/tests/auto/blackbox/testdata-qt/plugin-support/modules/m2/m2.qbs b/tests/auto/blackbox/testdata-qt/plugin-support/modules/m2/m2.qbs
new file mode 100644
index 000000000..4941495ff
--- /dev/null
+++ b/tests/auto/blackbox/testdata-qt/plugin-support/modules/m2/m2.qbs
@@ -0,0 +1,4 @@
+Module {
+ Depends { name: "Qt.plugin_support" }
+ Qt.plugin_support.pluginsByType: ({imageformats: "qgif"})
+}
diff --git a/tests/auto/blackbox/testdata-qt/plugin-support/plugin-support-main.cpp b/tests/auto/blackbox/testdata-qt/plugin-support/plugin-support-main.cpp
new file mode 100644
index 000000000..237c8ce18
--- /dev/null
+++ b/tests/auto/blackbox/testdata-qt/plugin-support/plugin-support-main.cpp
@@ -0,0 +1 @@
+int main() {}
diff --git a/tests/auto/blackbox/testdata-qt/plugin-support/plugin-support.qbs b/tests/auto/blackbox/testdata-qt/plugin-support/plugin-support.qbs
new file mode 100644
index 000000000..6ea0ecc51
--- /dev/null
+++ b/tests/auto/blackbox/testdata-qt/plugin-support/plugin-support.qbs
@@ -0,0 +1,16 @@
+QtGuiApplication {
+ Probe {
+ id: staticProbe
+ property bool isStaticQt: Qt.gui.isStaticLibrary
+ property var plugins: Qt.plugin_support.effectivePluginsByType
+ configure: {
+ console.info("static Qt: " + isStaticQt);
+ console.info("image plugins: " + plugins.imageformats);
+ console.info("platform plugin count: " + (plugins.platforms || []).length);
+ }
+ }
+
+ Depends { name: "m1" }
+ Depends { name: "m2" }
+ files: "plugin-support-main.cpp"
+}
diff --git a/tests/auto/blackbox/tst_blackboxqt.cpp b/tests/auto/blackbox/tst_blackboxqt.cpp
index 46df8c494..dfaaba504 100644
--- a/tests/auto/blackbox/tst_blackboxqt.cpp
+++ b/tests/auto/blackbox/tst_blackboxqt.cpp
@@ -256,6 +256,24 @@ void TestBlackboxQt::pluginMetaData()
QVERIFY2(m_qbsStdout.contains("moc"), m_qbsStdout.constData());
}
+void TestBlackboxQt::pluginSupport()
+{
+ QDir::setCurrent(testDataDir + "/plugin-support");
+ QCOMPARE(runQbs(), 0);
+ const bool isStaticQt = m_qbsStdout.contains("static Qt: true");
+ const bool isDynamicQt = m_qbsStdout.contains("static Qt: false");
+ QVERIFY(isStaticQt != isDynamicQt);
+ QVERIFY2(!m_qbsStdout.contains("qt_plugin_import_qico.cpp"), m_qbsStdout.constData());
+ if (isStaticQt) {
+ QVERIFY2(m_qbsStdout.contains("image plugins: qjpeg,qgif"), m_qbsStdout.constData());
+ QVERIFY2(m_qbsStdout.contains("platform plugin count: 1"), m_qbsStdout.constData());
+ QVERIFY2(m_qbsStdout.contains("qt_plugin_import_qjpeg.cpp"), m_qbsStdout.constData());
+ QVERIFY2(m_qbsStdout.contains("qt_plugin_import_qgif.cpp"), m_qbsStdout.constData());
+ } else {
+ QSKIP("Qt is not static");
+ }
+}
+
void TestBlackboxQt::qmlDebugging()
{
QDir::setCurrent(testDataDir + "/qml-debugging");
diff --git a/tests/auto/blackbox/tst_blackboxqt.h b/tests/auto/blackbox/tst_blackboxqt.h
index 072f6abdf..b843978d4 100644
--- a/tests/auto/blackbox/tst_blackboxqt.h
+++ b/tests/auto/blackbox/tst_blackboxqt.h
@@ -57,6 +57,7 @@ private slots:
void mocSameFileName();
void pkgconfig();
void pluginMetaData();
+ void pluginSupport();
void qmlDebugging();
void qobjectInObjectiveCpp();
void qtKeywords();