aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@digia.com>2014-07-09 16:00:59 +0200
committerChristian Kandeler <christian.kandeler@digia.com>2014-07-11 15:18:17 +0200
commit64b51ff6cc1dfc4e6af50d85b8cdef510d724f25 (patch)
tree986c4b2dcade3c47dd8bb99713addabd2f265cc9 /src/lib
parentd51dddb4aefa72b2c3a662bb112c41c024a2288c (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.cpp40
-rw-r--r--src/lib/qtprofilesetup/qtmoduleinfo.h8
-rw-r--r--src/lib/qtprofilesetup/qtprofilesetup.cpp32
-rw-r--r--src/lib/qtprofilesetup/templates.qrc2
-rw-r--r--src/lib/qtprofilesetup/templates/QtModule.qbs1
-rw-r--r--src/lib/qtprofilesetup/templates/QtPlugin.qbs31
-rw-r--r--src/lib/qtprofilesetup/templates/gui.qbs1
-rw-r--r--src/lib/qtprofilesetup/templates/plugin.qbs23
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@
+}