diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2018-11-05 10:42:12 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2018-11-09 13:42:42 +0000 |
commit | 5f1b52e1c6f7668c3ea21ec11fde818ee6efd521 (patch) | |
tree | 6cc361275a896ef37ee80df96aed09a108ba966f | |
parent | 66e1be8b18967aba395238cc71bb13eff631eaac (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>
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(); |