aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/qtprofilesetup
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/qtprofilesetup')
-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
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@