diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/qtprofilesetup/qtmoduleinfo.cpp | 4 | ||||
-rw-r--r-- | src/lib/qtprofilesetup/qtmoduleinfo.h | 3 | ||||
-rw-r--r-- | src/lib/qtprofilesetup/qtprofilesetup.cpp | 37 | ||||
-rw-r--r-- | src/lib/qtprofilesetup/templates.qrc | 1 | ||||
-rw-r--r-- | src/lib/qtprofilesetup/templates/QtModule.qbs | 22 | ||||
-rw-r--r-- | src/lib/qtprofilesetup/templates/QtPlugin.qbs | 20 | ||||
-rw-r--r-- | src/lib/qtprofilesetup/templates/dbus.qbs | 1 | ||||
-rw-r--r-- | src/lib/qtprofilesetup/templates/gui.qbs | 1 | ||||
-rw-r--r-- | src/lib/qtprofilesetup/templates/module.qbs | 1 | ||||
-rw-r--r-- | src/lib/qtprofilesetup/templates/plugin.qbs | 1 | ||||
-rw-r--r-- | src/lib/qtprofilesetup/templates/plugin_support.qbs | 52 | ||||
-rw-r--r-- | src/lib/qtprofilesetup/templates/qml.qbs | 1 | ||||
-rw-r--r-- | src/lib/qtprofilesetup/templates/quick.qbs | 1 | ||||
-rw-r--r-- | src/lib/qtprofilesetup/templates/scxml.qbs | 1 |
14 files changed, 136 insertions, 10 deletions
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@ |