diff options
author | Christian Kandeler <christian.kandeler@digia.com> | 2014-07-09 16:00:59 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@digia.com> | 2014-07-11 15:18:17 +0200 |
commit | 64b51ff6cc1dfc4e6af50d85b8cdef510d724f25 (patch) | |
tree | 986c4b2dcade3c47dd8bb99713addabd2f265cc9 /src/lib | |
parent | d51dddb4aefa72b2c3a662bb112c41c024a2288c (diff) |
libqtprofilesetup: Gather information about Qt plugins.
And create modules for them. These also handle the creation
of the "import" source file when building against a static Qt.
Change-Id: I883a1dd96c5e38c9d4bb5c13af807b1bf388f8b1
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/qtprofilesetup/qtmoduleinfo.cpp | 40 | ||||
-rw-r--r-- | src/lib/qtprofilesetup/qtmoduleinfo.h | 8 | ||||
-rw-r--r-- | src/lib/qtprofilesetup/qtprofilesetup.cpp | 32 | ||||
-rw-r--r-- | src/lib/qtprofilesetup/templates.qrc | 2 | ||||
-rw-r--r-- | src/lib/qtprofilesetup/templates/QtModule.qbs | 1 | ||||
-rw-r--r-- | src/lib/qtprofilesetup/templates/QtPlugin.qbs | 31 | ||||
-rw-r--r-- | src/lib/qtprofilesetup/templates/gui.qbs | 1 | ||||
-rw-r--r-- | src/lib/qtprofilesetup/templates/plugin.qbs | 23 |
8 files changed, 133 insertions, 5 deletions
diff --git a/src/lib/qtprofilesetup/qtmoduleinfo.cpp b/src/lib/qtprofilesetup/qtmoduleinfo.cpp index d69f39423..138bfb187 100644 --- a/src/lib/qtprofilesetup/qtmoduleinfo.cpp +++ b/src/lib/qtprofilesetup/qtmoduleinfo.cpp @@ -40,7 +40,8 @@ namespace qbs { namespace Internal { -QtModuleInfo::QtModuleInfo() : isPrivate(false), hasLibrary(true), isStaticLibrary(false) +QtModuleInfo::QtModuleInfo() + : isPrivate(false), hasLibrary(true), isStaticLibrary(false), isPlugin(false) { } @@ -85,6 +86,9 @@ QStringList QtModuleInfo::qt4ModuleIncludePaths(const QtEnvironment &qtEnvironme QString QtModuleInfo::libraryBaseName(const QtEnvironment &qtEnvironment, bool debugBuild) const { + if (isPlugin) + return libBaseName(name, isStaticLibrary, debugBuild, qtEnvironment); + // Enginio has a different naming scheme, so it doesn't get boring. const bool isEnginio = name == QLatin1String("Enginio"); @@ -112,6 +116,11 @@ void QtModuleInfo::setupLibraries(const QtEnvironment &qtEnv) setupLibraries(qtEnv, false); } +static QStringList makeList(const QByteArray &s) +{ + return QString::fromLatin1(s).split(QLatin1Char(' '), QString::SkipEmptyParts); +} + void QtModuleInfo::setupLibraries(const QtEnvironment &qtEnv, bool debugBuild) { QStringList &libs = isStaticLibrary @@ -132,7 +141,10 @@ void QtModuleInfo::setupLibraries(const QtEnvironment &qtEnv, bool debugBuild) + QLatin1String(".a"); } - QString prlFilePath = qtEnv.libraryPath + QLatin1Char('/'); + QString prlFilePath = isPlugin + ? qtEnv.pluginPath + QLatin1Char('/') + pluginData.type + : qtEnv.libraryPath; + prlFilePath += QLatin1Char('/'); if (qtEnv.frameworkBuild) prlFilePath.append(libraryBaseName(qtEnv, false)).append(QLatin1String(".framework/")); if (!qtEnv.mkspecName.contains(QLatin1String("win")) && !qtEnv.frameworkBuild) @@ -351,16 +363,25 @@ QList<QtModuleInfo> allQt5Modules(const Profile &profile, const QtEnvironment &q QDirIterator dit(qtEnvironment.mkspecBasePath + QLatin1String("/modules")); while (dit.hasNext()) { const QString moduleFileNamePrefix = QLatin1String("qt_lib_"); + const QString pluginFileNamePrefix = QLatin1String("qt_plugin_"); const QString moduleFileNameSuffix = QLatin1String(".pri"); dit.next(); - if (!dit.fileName().startsWith(moduleFileNamePrefix) + const bool fileHasPluginPrefix = dit.fileName().startsWith(pluginFileNamePrefix); + if ((!fileHasPluginPrefix && !dit.fileName().startsWith(moduleFileNamePrefix)) || !dit.fileName().endsWith(moduleFileNameSuffix)) { continue; } QtModuleInfo moduleInfo; - moduleInfo.qbsName = dit.fileName().mid(moduleFileNamePrefix.count(), - dit.fileName().count() - moduleFileNamePrefix.count() + moduleInfo.isPlugin = fileHasPluginPrefix; + const QString fileNamePrefix + = moduleInfo.isPlugin ? pluginFileNamePrefix : moduleFileNamePrefix; + moduleInfo.qbsName = dit.fileName().mid(fileNamePrefix.count(), + dit.fileName().count() - fileNamePrefix.count() - moduleFileNameSuffix.count()); + if (moduleInfo.isPlugin) { + moduleInfo.name = moduleInfo.qbsName; + moduleInfo.isStaticLibrary = true; + } moduleInfo.qbsName.replace(QLatin1String("_private"), QLatin1String("-private")); QFile priFile(dit.filePath()); if (!priFile.open(QIODevice::ReadOnly)) { @@ -406,6 +427,14 @@ QList<QtModuleInfo> allQt5Modules(const Profile &profile, const QtEnvironment &q .split(QLatin1Char(' '), QString::SkipEmptyParts); } else if (key.endsWith(".VERSION")) { moduleInfo.version = QString::fromLocal8Bit(value); + } else if (key.endsWith(".plugin_types")) { + moduleInfo.supportedPluginTypes = makeList(value); + } else if (key.endsWith(".TYPE")) { + moduleInfo.pluginData.type = QString::fromLatin1(value); + } else if (key.endsWith(".EXTENDS")) { + moduleInfo.pluginData.extends = QString::fromLatin1(value); + } else if (key.endsWith(".CLASS_NAME")) { + moduleInfo.pluginData.className = QString::fromLatin1(value); } } @@ -431,6 +460,7 @@ QList<QtModuleInfo> allQt5Modules(const Profile &profile, const QtEnvironment &q if (moduleInfo.qbsName == QLatin1String("designercomponents-private")) addDesignerComponentsModule(modules); } + return modules; } diff --git a/src/lib/qtprofilesetup/qtmoduleinfo.h b/src/lib/qtprofilesetup/qtmoduleinfo.h index 4bb79fd11..e7d4d0eef 100644 --- a/src/lib/qtprofilesetup/qtmoduleinfo.h +++ b/src/lib/qtprofilesetup/qtmoduleinfo.h @@ -72,6 +72,14 @@ public: bool isPrivate; bool hasLibrary; bool isStaticLibrary; + bool isPlugin; + QStringList supportedPluginTypes; + + struct PluginData { + QString type; + QString extends; + QString className; + } pluginData; private: void setupLibraries(const QtEnvironment &qtEnv, bool debugBuild); diff --git a/src/lib/qtprofilesetup/qtprofilesetup.cpp b/src/lib/qtprofilesetup/qtprofilesetup.cpp index 75b15b025..9c6bae4d3 100644 --- a/src/lib/qtprofilesetup/qtprofilesetup.cpp +++ b/src/lib/qtprofilesetup/qtprofilesetup.cpp @@ -83,6 +83,29 @@ static QString pathToJSLiteral(const QString &path) return toJSLiteral(QDir::fromNativeSeparators(path)); } +static QString defaultQpaPlugin(const Profile &profile, const QtModuleInfo &module, + const QtEnvironment &qtEnv) +{ + if (qtEnv.qtMajorVersion < 5) + return QString(); + QFile qConfigPri(qtEnv.mkspecBasePath + QLatin1String("/qconfig.pri")); + if (!qConfigPri.open(QIODevice::ReadOnly)) { + throw ErrorInfo(Tr::tr("Setting up Qt profile '%1' failed: Cannot open " + "file '%2' (%3).") + .arg(profile.name(), qConfigPri.fileName(), qConfigPri.errorString())); + } + const QList<QByteArray> lines = qConfigPri.readAll().split('\n'); + const QByteArray magicString = "QT_DEFAULT_QPA_PLUGIN ="; + foreach (const QByteArray &line, lines) { + const QByteArray simplifiedLine = line.simplified(); + if (simplifiedLine.startsWith(magicString)) + return QString::fromLatin1(simplifiedLine.mid(magicString.count()).trimmed()); + } + if (module.isStaticLibrary) + qDebug("Warning: Could not determine default QPA plugin for static Qt."); + return QString(); +} + static void replaceSpecialValues(const QString &filePath, const Profile &profile, const QtModuleInfo &module, const QtEnvironment &qtEnvironment) { @@ -141,6 +164,10 @@ static void replaceSpecialValues(const QString &filePath, const Profile &profile + baIndent + "}"; } content.replace("@defines@", compilerDefines); + if (module.qbsName == QLatin1String("gui")) { + content.replace("@defaultQpaPlugin@", + utf8JSLiteral(defaultQpaPlugin(profile, module, qtEnvironment))); + } if (!module.modulePrefix.isEmpty()) { if (!propertiesString.isEmpty()) propertiesString += "\n "; @@ -151,6 +178,8 @@ static void replaceSpecialValues(const QString &filePath, const Profile &profile propertiesString += "\n "; propertiesString += "isStaticLibrary: true"; } + if (module.isPlugin) + content.replace("@className@", utf8JSLiteral(module.pluginData.className)); content.replace("@special_properties@", propertiesString); moduleFile.resize(0); moduleFile.write(content); @@ -171,6 +200,7 @@ static void createModules(Profile &profile, Settings *settings, "the existing profile of the same name (%2).").arg(profile.name(), removeError)); } copyTemplateFile(QLatin1String("QtModule.qbs"), qbsQtModuleBaseDir, profile.name()); + copyTemplateFile(QLatin1String("QtPlugin.qbs"), qbsQtModuleBaseDir, profile.name()); foreach (const QtModuleInfo &module, modules) { const QString qbsQtModuleDir = qbsQtModuleBaseDir + QLatin1Char('/') + module.qbsName; QString moduleTemplateFileName; @@ -181,6 +211,8 @@ static void createModules(Profile &profile, Settings *settings, moduleTemplateFileName = QLatin1String("gui.qbs"); } else if (module.qbsName == QLatin1String("phonon")) { moduleTemplateFileName = QLatin1String("phonon.qbs"); + } else if (module.isPlugin) { + moduleTemplateFileName = QLatin1String("plugin.qbs"); } else { moduleTemplateFileName = QLatin1String("module.qbs"); } diff --git a/src/lib/qtprofilesetup/templates.qrc b/src/lib/qtprofilesetup/templates.qrc index f8e6b6746..6b0afd04f 100644 --- a/src/lib/qtprofilesetup/templates.qrc +++ b/src/lib/qtprofilesetup/templates.qrc @@ -6,5 +6,7 @@ <file>templates/module.qbs</file> <file>templates/QtModule.qbs</file> <file>templates/moc.js</file> + <file>templates/plugin.qbs</file> + <file>templates/QtPlugin.qbs</file> </qresource> </RCC> diff --git a/src/lib/qtprofilesetup/templates/QtModule.qbs b/src/lib/qtprofilesetup/templates/QtModule.qbs index c6a1aae49..32ccc6a2e 100644 --- a/src/lib/qtprofilesetup/templates/QtModule.qbs +++ b/src/lib/qtprofilesetup/templates/QtModule.qbs @@ -19,6 +19,7 @@ Module { property string qtVersion: Qt.core.version property bool hasLibrary: true property bool isStaticLibrary: false + property bool isPlugin: false property stringList staticLibsDebug property stringList staticLibsRelease diff --git a/src/lib/qtprofilesetup/templates/QtPlugin.qbs b/src/lib/qtprofilesetup/templates/QtPlugin.qbs new file mode 100644 index 000000000..86fd9ff81 --- /dev/null +++ b/src/lib/qtprofilesetup/templates/QtPlugin.qbs @@ -0,0 +1,31 @@ +import qbs 1.0 +import qbs.FileInfo +import qbs.TextFile + +QtModule { + isPlugin: true + + property string className + + Transformer { + condition: isStaticLibrary + Artifact { + fileName: product.targetName + "_qt_plugin_import_" + + parent.parent.qtModuleName + ".cpp" + fileTags: "cpp" + } + + prepare: { + var cmd = new JavaScriptCommand(); + var pluginName = product.moduleProperty(product.moduleName, "qtModuleName"); + cmd.description = "Creating static import for plugin '" + pluginName + "'."; + cmd.sourceCode = function() { + var f = new TextFile(output.filePath, TextFile.WriteOnly); + var className = product.moduleProperty(product.moduleName, "className"); + f.writeLine("#include <QtPlugin>\n\nQ_IMPORT_PLUGIN(" + className + ")"); + f.close(); + }; + return cmd; + } + } +} diff --git a/src/lib/qtprofilesetup/templates/gui.qbs b/src/lib/qtprofilesetup/templates/gui.qbs index e2d91598e..958d69571 100644 --- a/src/lib/qtprofilesetup/templates/gui.qbs +++ b/src/lib/qtprofilesetup/templates/gui.qbs @@ -32,6 +32,7 @@ QtModule { } } + property string defaultQpaPlugin: @defaultQpaPlugin@ staticLibsDebug: @staticLibsDebug@ staticLibsRelease: @staticLibsRelease@ dynamicLibsDebug: @dynamicLibsDebug@ diff --git a/src/lib/qtprofilesetup/templates/plugin.qbs b/src/lib/qtprofilesetup/templates/plugin.qbs new file mode 100644 index 000000000..7149b3898 --- /dev/null +++ b/src/lib/qtprofilesetup/templates/plugin.qbs @@ -0,0 +1,23 @@ +import qbs 1.0 +import '../QtPlugin.qbs' as QtPlugin + +QtPlugin { + qtModuleName: @name@ + Depends { name: "Qt"; submodules: @dependencies@} + + className: @className@ + staticLibsDebug: @staticLibsDebug@ + staticLibsRelease: @staticLibsRelease@ + dynamicLibsDebug: @dynamicLibsDebug@ + dynamicLibsRelease: @dynamicLibsRelease@ + linkerFlagsDebug: @linkerFlagsDebug@ + linkerFlagsRelease: @linkerFlagsRelease@ + frameworksDebug: @frameworksDebug@ + frameworksRelease: @frameworksRelease@ + frameworkPathsDebug: @frameworkPathsDebug@ + frameworkPathsRelease: @frameworkPathsRelease@ + libNameForLinkerDebug: @libNameForLinkerDebug@ + libNameForLinkerRelease: @libNameForLinkerRelease@ + cpp.libraryPaths: @libraryPaths@ + @special_properties@ +} |