From b7e42fbe02d6105c5e449e90f74ef16f30500440 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 6 Oct 2014 19:18:16 +0200 Subject: Make Qt build variants logic more sensible. We no longer force the Qt build variant to match the build variant of the application linking against it (except for MSVC, where that is required). Change-Id: Ie2c80fbb0d688cdcbab57ad638aaccbbd6988a22 Reviewed-by: Leena Miettinen Reviewed-by: Joerg Bornemann --- doc/reference/modules/qt-modules.qdoc | 27 ++++++++++++----- src/lib/qtprofilesetup/qtprofilesetup.cpp | 3 +- src/lib/qtprofilesetup/templates/QtModule.qbs | 14 ++++----- src/lib/qtprofilesetup/templates/core.qbs | 35 +++++++++++++++++----- .../testdata/mixed-build-variants/main.cpp | 6 ++++ .../mixed-build-variants/mixed-build-variants.qbs | 6 ++++ tests/auto/blackbox/tst_blackbox.cpp | 20 +++++++++++++ tests/auto/blackbox/tst_blackbox.h | 1 + 8 files changed, 89 insertions(+), 23 deletions(-) create mode 100644 tests/auto/blackbox/testdata/mixed-build-variants/main.cpp create mode 100644 tests/auto/blackbox/testdata/mixed-build-variants/mixed-build-variants.qbs diff --git a/doc/reference/modules/qt-modules.qdoc b/doc/reference/modules/qt-modules.qdoc index 01e2226b9..a183e96ff 100644 --- a/doc/reference/modules/qt-modules.qdoc +++ b/doc/reference/modules/qt-modules.qdoc @@ -186,23 +186,23 @@ interesting to users. Some of them only need to be defined if the respective installation of Qt was built in some unusual way, for instance by setting non-default \c configure flags. - \section3 binPath + \section3 availableBuildVariants \table - \row \li \b{Type:} \li \c{path} - \row \li \b{Default:} \li \c{undefined} + \row \li \b{Type:} \li \c{stringList} + \row \li \b{Default:} \li set by \c{qbs-setup-qt} \endtable - The path in which Qt tools such as \c qmake, \c moc and so on are located. + The build variants that this Qt installation offers. - \section3 buildVariant + \section3 binPath \table - \row \li \b{Type:} \li \c{stringList} + \row \li \b{Type:} \li \c{path} \row \li \b{Default:} \li \c{undefined} \endtable - Specifies the build variants for which Qt was built. + The path in which Qt tools such as \c qmake, \c moc and so on are located. \section3 config @@ -334,6 +334,19 @@ Controls which name the \c qhp file gets when generating documentation with \c qdoc. + \section3 qtBuildVariant + + \table + \row \li \b{Type:} \li \c{string} + \row \li \b{Default:} \li See below. + \endtable + + Specifies the type of Qt libraries to build against: "debug" or "release". + The default value is the build variant of the code linking against Qt. If Qt does not offer + that build variant, the build variant offered by Qt is chosen instead. + \note On some systems, it is not possible to link code built in debug mode against libraries + built in release mode and vice versa. + \section3 qtConfig \table diff --git a/src/lib/qtprofilesetup/qtprofilesetup.cpp b/src/lib/qtprofilesetup/qtprofilesetup.cpp index 65e100f57..3b924616f 100644 --- a/src/lib/qtprofilesetup/qtprofilesetup.cpp +++ b/src/lib/qtprofilesetup/qtprofilesetup.cpp @@ -296,7 +296,8 @@ void doSetupQtProfile(const QString &profileName, Settings *settings, profile.setValue(settingsTemplate.arg("docPath"), qtEnvironment.documentationPath); profile.setValue(settingsTemplate.arg("version"), qtEnvironment.qtVersion); profile.setValue(settingsTemplate.arg("libInfix"), qtEnvironment.qtLibInfix); - profile.setValue(settingsTemplate.arg("buildVariant"), qtEnvironment.buildVariant); + profile.setValue(settingsTemplate.arg("buildVariant"), qtEnvironment.buildVariant); // TODO: Remove in 1.5 + profile.setValue(settingsTemplate.arg("availableBuildVariants"), qtEnvironment.buildVariant); profile.setValue(settingsTemplate.arg(QLatin1String("staticBuild")), staticBuild); // Set the minimum operating system versions appropriate for this Qt version diff --git a/src/lib/qtprofilesetup/templates/QtModule.qbs b/src/lib/qtprofilesetup/templates/QtModule.qbs index 6c088555d..159568bca 100644 --- a/src/lib/qtprofilesetup/templates/QtModule.qbs +++ b/src/lib/qtprofilesetup/templates/QtModule.qbs @@ -12,11 +12,11 @@ Module { property string qtLibInfix: Qt.core.libInfix property string libNameForLinkerDebug property string libNameForLinkerRelease - property string libNameForLinker: qbs.buildVariant === "debug" + property string libNameForLinker: Qt.core.qtBuildVariant === "debug" ? libNameForLinkerDebug : libNameForLinkerRelease property string libFilePathDebug property string libFilePathRelease - property string libFilePath: qbs.buildVariant === "debug" + property string libFilePath: Qt.core.qtBuildVariant === "debug" ? libFilePathDebug : libFilePathRelease property string qtVersion: Qt.core.version property bool hasLibrary: true @@ -29,19 +29,19 @@ Module { property stringList dynamicLibsRelease property stringList linkerFlagsDebug property stringList linkerFlagsRelease - property stringList staticLibs: qbs.buildVariant === "debug" + property stringList staticLibs: Qt.core.qtBuildVariant === "debug" ? staticLibsDebug : staticLibsRelease - property stringList dynamicLibs: qbs.buildVariant === "debug" + property stringList dynamicLibs: Qt.core.qtBuildVariant === "debug" ? dynamicLibsDebug : dynamicLibsRelease property stringList frameworksDebug property stringList frameworksRelease property stringList frameworkPathsDebug property stringList frameworkPathsRelease - property stringList mFrameworks: qbs.buildVariant === "debug" + property stringList mFrameworks: Qt.core.qtBuildVariant === "debug" ? frameworksDebug : frameworksRelease - property stringList mFrameworkPaths: qbs.buildVariant === "debug" + property stringList mFrameworkPaths: Qt.core.qtBuildVariant === "debug" ? frameworkPathsDebug: frameworkPathsRelease - cpp.linkerFlags: qbs.buildVariant === "debug" + cpp.linkerFlags: Qt.core.qtBuildVariant === "debug" ? linkerFlagsDebug : linkerFlagsRelease Properties { diff --git a/src/lib/qtprofilesetup/templates/core.qbs b/src/lib/qtprofilesetup/templates/core.qbs index aefd9c48d..9dd51bd53 100644 --- a/src/lib/qtprofilesetup/templates/core.qbs +++ b/src/lib/qtprofilesetup/templates/core.qbs @@ -30,34 +30,42 @@ Module { property int versionPatch: versionParts[2] property bool frameworkBuild property bool staticBuild - property stringList buildVariant + + property stringList availableBuildVariants + property stringList buildVariant // TODO: Remove in 1.5 + property string qtBuildVariant: { + if (availableBuildVariants.contains(qbs.buildVariant)) + return qbs.buildVariant; + return availableBuildVariants.length > 0 ? availableBuildVariants[0] : ""; + } + property stringList staticLibsDebug: @staticLibsDebug@ property stringList staticLibsRelease: @staticLibsRelease@ property stringList dynamicLibsDebug: @dynamicLibsDebug@ property stringList dynamicLibsRelease: @dynamicLibsRelease@ - property stringList staticLibs: qbs.buildVariant === "debug" + property stringList staticLibs: qtBuildVariant === "debug" ? staticLibsDebug : staticLibsRelease - property stringList dynamicLibs: qbs.buildVariant === "debug" + property stringList dynamicLibs: qtBuildVariant === "debug" ? dynamicLibsDebug : dynamicLibsRelease property stringList linkerFlagsDebug: @linkerFlagsDebug@ property stringList linkerFlagsRelease: @linkerFlagsRelease@ - property stringList coreLinkerFlags: qbs.buildVariant === "debug" + property stringList coreLinkerFlags: qtBuildVariant === "debug" ? linkerFlagsDebug : linkerFlagsRelease property stringList frameworksDebug: @frameworksDebug@ property stringList frameworksRelease: @frameworksRelease@ - property stringList coreFrameworks: qbs.buildVariant === "debug" + property stringList coreFrameworks: qtBuildVariant === "debug" ? frameworksDebug : frameworksRelease property stringList frameworkPathsDebug: @frameworkPathsDebug@ property stringList frameworkPathsRelease: @frameworkPathsRelease@ - property stringList coreFrameworkPaths: qbs.buildVariant === "debug" + property stringList coreFrameworkPaths: qtBuildVariant === "debug" ? frameworkPathsDebug : frameworkPathsRelease property string libNameForLinkerDebug: @libNameForLinkerDebug@ property string libNameForLinkerRelease: @libNameForLinkerRelease@ - property string libNameForLinker: qbs.buildVariant === "debug" + property string libNameForLinker: qtBuildVariant === "debug" ? libNameForLinkerDebug : libNameForLinkerRelease property string libFilePathDebug: @libFilePathDebug@ property string libFilePathRelease: @libFilePathRelease@ - property string libFilePath: qbs.buildVariant === "debug" + property string libFilePath: qtBuildVariant === "debug" ? libFilePathDebug : libFilePathRelease coreLibPaths: @libraryPaths@ @@ -168,6 +176,17 @@ Module { validator.addRangeValidator("versionPatch", versionPatch, 0); validator.validate(); + + if (availableBuildVariants.length === 0) + throw "The Qt installation supports no build variants."; + if (!availableBuildVariants.contains(qtBuildVariant)) { + throw "Qt.core.qtBuildVariant '" + qtBuildVariant + + "' is not supported by this Qt installation."; + } + if (qbs.toolchain.contains("msvc") && qtBuildVariant !== qbs.buildVariant) { + throw "Qt.core.qtBuildVariant is '" + qtBuildVariant + "', but qbs.buildVariant is '" + + qbs.buildVariant + "', which is not allowed when using MSVC."; + } } setupRunEnvironment: { diff --git a/tests/auto/blackbox/testdata/mixed-build-variants/main.cpp b/tests/auto/blackbox/testdata/mixed-build-variants/main.cpp new file mode 100644 index 000000000..c328ff656 --- /dev/null +++ b/tests/auto/blackbox/testdata/mixed-build-variants/main.cpp @@ -0,0 +1,6 @@ +#include + +int main() +{ + qDebug("Tach."); +} diff --git a/tests/auto/blackbox/testdata/mixed-build-variants/mixed-build-variants.qbs b/tests/auto/blackbox/testdata/mixed-build-variants/mixed-build-variants.qbs new file mode 100644 index 000000000..2b208f3d4 --- /dev/null +++ b/tests/auto/blackbox/testdata/mixed-build-variants/mixed-build-variants.qbs @@ -0,0 +1,6 @@ +import qbs + +QtApplication { + Qt.core.qtBuildVariant: "release" + files: ["main.cpp"] +} diff --git a/tests/auto/blackbox/tst_blackbox.cpp b/tests/auto/blackbox/tst_blackbox.cpp index d8a4f0e73..cde04882e 100644 --- a/tests/auto/blackbox/tst_blackbox.cpp +++ b/tests/auto/blackbox/tst_blackbox.cpp @@ -1826,6 +1826,26 @@ void TestBlackbox::inheritQbsSearchPaths() QCOMPARE(runQbs(), 0); } +void TestBlackbox::mixedBuildVariants() +{ + QDir::setCurrent(testDataDir + "/mixed-build-variants"); + Settings settings((QString())); + Profile profile(buildProfileName, &settings); + if (profile.value("qbs.toolchain").toStringList().contains("msvc")) { + QbsRunParameters params; + params.expectFailure = true; + QVERIFY(runQbs(params) != 0); + QVERIFY2(m_qbsStderr.contains("not allowed"), m_qbsStderr.constData()); + } else if (!profile.value("Qt.core.availableBuildVariants").toStringList().contains("release")) { + QbsRunParameters params; + params.expectFailure = true; + QVERIFY(runQbs(params) != 0); + QVERIFY2(m_qbsStderr.contains("not supported"), m_qbsStderr.constData()); + } else { + QCOMPARE(runQbs(), 0); + } +} + void TestBlackbox::mocCppIncluded() { QDir::setCurrent(testDataDir + "/moc_hpp_included"); diff --git a/tests/auto/blackbox/tst_blackbox.h b/tests/auto/blackbox/tst_blackbox.h index 4803ad277..76ae3f04f 100644 --- a/tests/auto/blackbox/tst_blackbox.h +++ b/tests/auto/blackbox/tst_blackbox.h @@ -128,6 +128,7 @@ private slots: void jsExtensionsPropertyList(); void jsExtensionsTextFile(); void inheritQbsSearchPaths(); + void mixedBuildVariants(); void mocCppIncluded(); void newOutputArtifactInDependency(); void newPatternMatch(); -- cgit v1.2.3