From 2202f8b65c6eb3c1fc4784bdc76f758578856432 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 22 Sep 2014 12:05:48 +0200 Subject: libqbsqtprofilesetup: Get rid of bogus warnings about missing prl files. - Don't look for debug libraries in a release-only Qt (and vice versa). - Some libraries are never built as debug libs. - On Darwin, some modules are not frameworks even in a framework build. This also fixes a bug setting up plugins of a static Qt build. Change-Id: I7e6c1e06070897982fdb9b12930bd7f75ae620b0 Reviewed-by: Joerg Bornemann --- src/lib/qtprofilesetup/qtmoduleinfo.cpp | 55 +++++++++++++++++++++++---------- src/lib/qtprofilesetup/qtmoduleinfo.h | 6 ++-- 2 files changed, 42 insertions(+), 19 deletions(-) diff --git a/src/lib/qtprofilesetup/qtmoduleinfo.cpp b/src/lib/qtprofilesetup/qtmoduleinfo.cpp index 8acea44ee..220ee5b25 100644 --- a/src/lib/qtprofilesetup/qtmoduleinfo.cpp +++ b/src/lib/qtprofilesetup/qtmoduleinfo.cpp @@ -112,7 +112,7 @@ QString QtModuleInfo::frameworkHeadersPath(const QtEnvironment &qtEnvironment) c QStringList QtModuleInfo::qt4ModuleIncludePaths(const QtEnvironment &qtEnvironment) const { QStringList paths; - if (qtEnvironment.frameworkBuild && !isStaticLibrary) { + if (isFramework(qtEnvironment)) { paths << frameworkHeadersPath(qtEnvironment); } else { paths << qtEnvironment.includePath @@ -125,19 +125,17 @@ QString QtModuleInfo::libraryBaseName(const QtEnvironment &qtEnvironment, bool debugBuild) const { if (isPlugin) - return libBaseName(name, isStaticLibrary, debugBuild, qtEnvironment); + return libBaseName(name, debugBuild, qtEnvironment); // Enginio has a different naming scheme, so it doesn't get boring. const bool isEnginio = name == QLatin1String("Enginio"); QString libName = modulePrefix.isEmpty() && !isEnginio ? QLatin1String("Qt") : modulePrefix; - if (qtEnvironment.qtMajorVersion >= 5 && (!qtEnvironment.frameworkBuild || isStaticLibrary) - && !isEnginio) { + if (qtEnvironment.qtMajorVersion >= 5 && !isFramework(qtEnvironment) && !isEnginio) libName += QString::number(qtEnvironment.qtMajorVersion); - } libName += moduleNameWithoutPrefix(); libName += qtEnvironment.qtLibInfix; - return libBaseName(libName, isStaticLibrary, debugBuild, qtEnvironment); + return libBaseName(libName, debugBuild, qtEnvironment); } QString QtModuleInfo::libNameForLinker(const QtEnvironment &qtEnvironment, bool debugBuild) const @@ -167,6 +165,18 @@ void QtModuleInfo::setupLibraries(const QtEnvironment &qtEnv, bool debugBuild, if (!hasLibrary) return; // Can happen for Qt4 convenience modules, like "widgets". + if (debugBuild) { + if (!qtEnv.buildVariant.contains(QLatin1String("debug"))) + return; + const QStringList modulesNeverBuiltAsDebug = QStringList() << "bootstrap" << "qmldevtools"; + foreach (const QString &m, modulesNeverBuiltAsDebug) { + if (qbsName == m || qbsName == m + "-private") + return; + } + } else if (!qtEnv.buildVariant.contains(QLatin1String("release"))) { + return; + } + QStringList &libs = isStaticLibrary ? (debugBuild ? staticLibrariesDebug : staticLibrariesRelease) : (debugBuild ? dynamicLibrariesDebug : dynamicLibrariesRelease); @@ -182,7 +192,7 @@ void QtModuleInfo::setupLibraries(const QtEnvironment &qtEnv, bool debugBuild, << platformSupportModule.libNameForLinker(qtEnv, debugBuild); flags << QLatin1String("-force_load") << qtEnv.pluginPath + QLatin1String("/platforms/") - + libBaseName(QLatin1String("libqios"), true, debugBuild, qtEnv) + + libBaseName(QLatin1String("libqios"), debugBuild, qtEnv) + QLatin1String(".a"); } @@ -190,10 +200,10 @@ void QtModuleInfo::setupLibraries(const QtEnvironment &qtEnv, bool debugBuild, ? qtEnv.pluginPath + QLatin1Char('/') + pluginData.type : qtEnv.libraryPath; prlFilePath += QLatin1Char('/'); - if (qtEnv.frameworkBuild) + if (isFramework(qtEnv)) prlFilePath.append(libraryBaseName(qtEnv, false)).append(QLatin1String(".framework/")); const QString libDir = prlFilePath; - if (!qtEnv.mkspecName.startsWith(QLatin1String("win")) && !qtEnv.frameworkBuild) + if (!qtEnv.mkspecName.startsWith(QLatin1String("win")) && !isFramework(qtEnv)) prlFilePath += QLatin1String("lib"); prlFilePath.append(libraryBaseName(qtEnv, debugBuild)); const bool isNonStaticQt4OnWindows = qtEnv.mkspecName.startsWith(QLatin1String("win")) @@ -264,6 +274,16 @@ void QtModuleInfo::setupLibraries(const QtEnvironment &qtEnv, bool debugBuild, } } +bool QtModuleInfo::isFramework(const QtEnvironment &qtEnv) const +{ + if (!qtEnv.frameworkBuild || isStaticLibrary) + return false; + const QStringList modulesNeverBuiltAsFrameworks = QStringList() + << "bootstrap" << "openglextensions" << "platformsupport" << "qmldevtools" << "uitools" + << "harfbuzzng"; + return !modulesNeverBuiltAsFrameworks.contains(qbsName); +} + // We erroneously called the "testlib" module "test" for quite a while. Let's not punish users // for that. static void addTestModule(QList &modules) @@ -489,7 +509,8 @@ QList allQt5Modules(const Profile &profile, const QtEnvironment &q moduleInfo.name = moduleInfo.qbsName; moduleInfo.isStaticLibrary = true; } - const QByteArray moduleKeyPrefix = "QT." + moduleInfo.qbsName.toLatin1() + '.'; + const QByteArray moduleKeyPrefix = QByteArray(moduleInfo.isPlugin ? "QT_PLUGIN" : "QT") + + '.' + moduleInfo.qbsName.toLatin1() + '.'; moduleInfo.qbsName.replace(QLatin1String("_private"), QLatin1String("-private")); foreach (const QByteArray &line, getPriFileContentsRecursively(profile, dit.filePath())) { const QByteArray simplifiedLine = line.simplified(); @@ -540,8 +561,9 @@ QList allQt5Modules(const Profile &profile, const QtEnvironment &q } } - // Fix include paths for OS X frameworks. The qt_lib_XXX.pri files contain wrong values. - if (qtEnvironment.frameworkBuild && !moduleInfo.isStaticLibrary) { + // Fix include paths for OS X and iOS frameworks. + // The qt_lib_XXX.pri files contain wrong values. + if (moduleInfo.isFramework(qtEnvironment)) { moduleInfo.includePaths.clear(); QString baseIncDir = moduleInfo.frameworkHeadersPath(qtEnvironment); if (moduleInfo.isPrivate) { @@ -567,19 +589,20 @@ QList allQt5Modules(const Profile &profile, const QtEnvironment &q return modules; } -QString libBaseName(const QString &libName, bool staticLib, bool debugBuild, - const QtEnvironment &qtEnvironment) +QString QtModuleInfo::libBaseName(const QString &libName, bool debugBuild, + const QtEnvironment &qtEnvironment) const { QString name = libName; if (qtEnvironment.mkspecName.startsWith(QLatin1String("win"))) { if (debugBuild) name += QLatin1Char('d'); - if (!staticLib && qtEnvironment.qtMajorVersion < 5) + if (!isStaticLibrary && qtEnvironment.qtMajorVersion < 5) name += QString::number(qtEnvironment.qtMajorVersion); } if (qtEnvironment.mkspecName.contains(QLatin1String("macx")) + || qtEnvironment.mkspecName.contains(QLatin1String("ios")) || qtEnvironment.mkspecName.contains(QLatin1String("darwin"))) { - if (!qtEnvironment.frameworkBuild + if (!isFramework(qtEnvironment) && qtEnvironment.buildVariant.contains(QLatin1String("debug")) && (!qtEnvironment.buildVariant.contains(QLatin1String("release")) || debugBuild)) { name += QLatin1String("_debug"); diff --git a/src/lib/qtprofilesetup/qtmoduleinfo.h b/src/lib/qtprofilesetup/qtmoduleinfo.h index 733c7992f..0aa056af1 100644 --- a/src/lib/qtprofilesetup/qtmoduleinfo.h +++ b/src/lib/qtprofilesetup/qtmoduleinfo.h @@ -49,8 +49,11 @@ public: QString frameworkHeadersPath(const QtEnvironment &qtEnvironment) const; QStringList qt4ModuleIncludePaths(const QtEnvironment &qtEnvironment) const; QString libraryBaseName(const QtEnvironment &qtEnvironment, bool debugBuild) const; + QString libBaseName(const QString &libName, bool debugBuild, + const QtEnvironment &qtEnvironment) const; QString libNameForLinker(const QtEnvironment &qtEnvironment, bool debugBuild) const; void setupLibraries(const QtEnvironment &qtEnv, QSet *nonExistingPrlFiles); + bool isFramework(const QtEnvironment &qtEnv) const; QString modulePrefix; // default is empty and means "Qt". QString name; // As in the path to the headers and ".name" in the pri files. @@ -89,9 +92,6 @@ private: QSet *nonExistingPrlFiles); }; -QString libBaseName(const QString &libName, bool staticLib, bool debugBuild, - const QtEnvironment &qtEnvironment); - QList allQt4Modules(const QtEnvironment &qtEnvironment); QList allQt5Modules(const Profile &profile, const QtEnvironment &qtEnvironment); -- cgit v1.2.3