diff options
-rwxr-xr-x | scripts/build-qbs-with-qbs.sh | 4 | ||||
-rw-r--r-- | src/app/qbs-setup-qt/setupqt.cpp | 12 | ||||
-rw-r--r-- | src/app/qbs-setup-toolchains/clangclprobe.cpp | 4 | ||||
-rw-r--r-- | src/app/qbs-setup-toolchains/gccprobe.cpp | 20 | ||||
-rw-r--r-- | src/app/qbs-setup-toolchains/gccprobe.h | 2 | ||||
-rw-r--r-- | src/app/qbs-setup-toolchains/msvcprobe.cpp | 2 | ||||
-rw-r--r-- | src/app/qbs-setup-toolchains/probe.cpp | 39 | ||||
-rw-r--r-- | src/app/qbs-setup-toolchains/probe.h | 2 | ||||
-rw-r--r-- | src/app/qbs-setup-toolchains/xcodeprobe.cpp | 6 | ||||
-rw-r--r-- | tests/auto/api/tst_api.cpp | 4 | ||||
-rw-r--r-- | tests/auto/blackbox/tst_blackbox.cpp | 18 | ||||
-rw-r--r-- | tests/auto/blackbox/tst_blackboxqt.cpp | 4 | ||||
-rw-r--r-- | tests/auto/blackbox/tst_clangdb.cpp | 4 | ||||
-rw-r--r-- | tests/auto/shared.h | 17 |
14 files changed, 75 insertions, 63 deletions
diff --git a/scripts/build-qbs-with-qbs.sh b/scripts/build-qbs-with-qbs.sh index f26d2222a..a116bc7b9 100755 --- a/scripts/build-qbs-with-qbs.sh +++ b/scripts/build-qbs-with-qbs.sh @@ -105,6 +105,10 @@ if [ -z "${QBS_AUTOTEST_PROFILE}" ]; then fi fi + qbs run -p qbs_app ${BUILD_OPTIONS} -- config \ + ${RUN_OPTIONS} \ + --list + # QBS_AUTOTEST_PROFILE has been added to the environment # which requires a resolve step qbs resolve ${BUILD_OPTIONS} diff --git a/src/app/qbs-setup-qt/setupqt.cpp b/src/app/qbs-setup-qt/setupqt.cpp index 947cbc5fc..07e1a81b5 100644 --- a/src/app/qbs-setup-qt/setupqt.cpp +++ b/src/app/qbs-setup-qt/setupqt.cpp @@ -47,6 +47,7 @@ #include <tools/set.h> #include <tools/settings.h> #include <tools/stlutils.h> +#include <tools/toolchains.h> #include <tools/version.h> #include <QtCore/qbytearraymatcher.h> @@ -196,7 +197,7 @@ static bool isToolchainProfile(const Profile &profile) { const auto actual = Internal::Set<QString>::fromList( profile.allKeys(Profile::KeySelectionRecursive)); - Internal::Set<QString> expected = Internal::Set<QString> { QStringLiteral("qbs.toolchain") }; + Internal::Set<QString> expected{ QStringLiteral("qbs.toolchainType") }; if (HostOsInfo::isMacosHost()) expected.insert(QStringLiteral("qbs.targetPlatform")); // match only Xcode profiles return Internal::Set<QString>(actual).unite(expected) == actual; @@ -230,8 +231,13 @@ static Match compatibility(const QtEnvironment &env, const Profile &toolchainPro { Match match = MatchFull; - const auto toolchainNames = Internal::Set<QString>::fromList( - toolchainProfile.value(QStringLiteral("qbs.toolchain")).toStringList()); + const auto toolchainType = + toolchainProfile.value(QStringLiteral("qbs.toolchainType")).toString(); + const auto toolchain = !toolchainType.isEmpty() + ? canonicalToolchain(toolchainType) + : toolchainProfile.value(QStringLiteral("qbs.toolchain")).toStringList(); + + const auto toolchainNames = Internal::Set<QString>::fromList(toolchain); const auto qtToolchainNames = Internal::Set<QString>::fromList(env.qbsToolchain); if (areProfilePropertiesIncompatible(toolchainNames, qtToolchainNames)) { auto intersection = toolchainNames; diff --git a/src/app/qbs-setup-toolchains/clangclprobe.cpp b/src/app/qbs-setup-toolchains/clangclprobe.cpp index 6eff83217..a36ded768 100644 --- a/src/app/qbs-setup-toolchains/clangclprobe.cpp +++ b/src/app/qbs-setup-toolchains/clangclprobe.cpp @@ -75,9 +75,7 @@ Profile createProfileHelper( Profile profile(profileName, settings); profile.removeProfile(); profile.setValue(QStringLiteral("qbs.architecture"), architecture); - profile.setValue( - QStringLiteral("qbs.toolchain"), - QStringList{QStringLiteral("clang-cl"), QStringLiteral("msvc")}); + profile.setValue(QStringLiteral("qbs.toolchainType"), QStringLiteral("clang-cl")); profile.setValue(QStringLiteral("cpp.toolchainInstallPath"), toolchainInstallPath); profile.setValue(QStringLiteral("cpp.vcvarsallPath"), vcvarsallPath); qbsInfo() << Tr::tr("Profile '%1' created for '%2'.") diff --git a/src/app/qbs-setup-toolchains/gccprobe.cpp b/src/app/qbs-setup-toolchains/gccprobe.cpp index 86e5e5d2e..df3f92f62 100644 --- a/src/app/qbs-setup-toolchains/gccprobe.cpp +++ b/src/app/qbs-setup-toolchains/gccprobe.cpp @@ -138,9 +138,9 @@ public: }; static void setCommonProperties(Profile &profile, const QFileInfo &compiler, - const QStringList &toolchainTypes, const ToolchainDetails &details) + const QString &toolchainType, const ToolchainDetails &details) { - if (toolchainTypes.contains(QStringLiteral("mingw"))) + if (toolchainType == QStringLiteral("mingw")) profile.setValue(QStringLiteral("qbs.targetPlatform"), QStringLiteral("windows")); @@ -149,7 +149,7 @@ static void setCommonProperties(Profile &profile, const QFileInfo &compiler, profile.setValue(QStringLiteral("cpp.toolchainInstallPath"), compiler.absolutePath()); - profile.setValue(QStringLiteral("qbs.toolchain"), toolchainTypes); + profile.setValue(QStringLiteral("qbs.toolchainType"), toolchainType); if (!standardCompilerFileNames().contains( HostOsInfo::appendExecutableSuffix(details.suffix))) { @@ -453,12 +453,12 @@ static QStringList mplabX32RegistrySearchPaths() } Profile createGccProfile(const QFileInfo &compiler, Settings *settings, - const QStringList &toolchainTypes, + const QString &toolchainType, const QString &profileName) { const QString machineName = gccMachineName(compiler); - if (toolchainTypes.contains(QLatin1String("mingw"))) { + if (toolchainType == QLatin1String("mingw")) { if (!validMinGWMachines().contains(machineName)) { throw ErrorInfo(Tr::tr("Detected gcc platform '%1' is not supported.") .arg(machineName)); @@ -470,9 +470,9 @@ Profile createGccProfile(const QFileInfo &compiler, Settings *settings, const ToolchainDetails details(compiler); - setCommonProperties(profile, compiler, toolchainTypes, details); + setCommonProperties(profile, compiler, toolchainType, details); - if (HostOsInfo::isWindowsHost() && toolchainTypes.contains(QLatin1String("clang"))) { + if (HostOsInfo::isWindowsHost() && toolchainType == QLatin1String("clang")) { const QStringList profileNames = settings->profiles(); bool foundMingw = false; for (const QString &profileName : profileNames) { @@ -497,7 +497,7 @@ Profile createGccProfile(const QFileInfo &compiler, Settings *settings, } } - if (!toolchainTypes.contains(QLatin1String("clang"))) { + if (toolchainType != QLatin1String("clang")) { // Check whether auxiliary tools reside within the toolchain's install path. // This might not be the case when using icecc or another compiler wrapper. const QString compilerDirPath = compiler.absolutePath(); @@ -582,12 +582,12 @@ void gccProbe(Settings *settings, std::vector<Profile> &profiles, const QString } for (const auto &candidate : qAsConst(candidates)) { - const QStringList toolchainTypes = toolchainTypeFromCompilerName( + const QString toolchainType = toolchainTypeFromCompilerName( candidate.baseName()); const QString profileName = buildProfileName(candidate); try { auto profile = createGccProfile(candidate, settings, - toolchainTypes, profileName); + toolchainType, profileName); profiles.push_back(std::move(profile)); } catch (const qbs::ErrorInfo &info) { qbsWarning() << Tr::tr("Skipping %1: %2").arg(profileName, info.toString()); diff --git a/src/app/qbs-setup-toolchains/gccprobe.h b/src/app/qbs-setup-toolchains/gccprobe.h index ae389dafc..98e7eaa1f 100644 --- a/src/app/qbs-setup-toolchains/gccprobe.h +++ b/src/app/qbs-setup-toolchains/gccprobe.h @@ -53,7 +53,7 @@ class Settings; qbs::Profile createGccProfile(const QFileInfo &compiler, qbs::Settings *settings, - const QStringList &toolchainTypes, + const QString &toolchainType, const QString &profileName = QString()); void gccProbe(qbs::Settings *settings, std::vector<qbs::Profile> &profiles, diff --git a/src/app/qbs-setup-toolchains/msvcprobe.cpp b/src/app/qbs-setup-toolchains/msvcprobe.cpp index 8cf1d4de1..bb54add9f 100644 --- a/src/app/qbs-setup-toolchains/msvcprobe.cpp +++ b/src/app/qbs-setup-toolchains/msvcprobe.cpp @@ -88,7 +88,7 @@ static void addMSVCPlatform(Settings *settings, std::vector<Profile> &profiles, Profile p(std::move(name), settings); p.removeProfile(); p.setValue(QStringLiteral("qbs.targetPlatform"), QStringLiteral("windows")); - p.setValue(QStringLiteral("qbs.toolchain"), QStringList(QStringLiteral("msvc"))); + p.setValue(QStringLiteral("qbs.toolchainType"), QStringLiteral("msvc")); p.setValue(QStringLiteral("cpp.toolchainInstallPath"), msvc->binPath); setQtHelperProperties(p, msvc); profiles.push_back(p); diff --git a/src/app/qbs-setup-toolchains/probe.cpp b/src/app/qbs-setup-toolchains/probe.cpp index 4c26e8d60..add7ba05c 100644 --- a/src/app/qbs-setup-toolchains/probe.cpp +++ b/src/app/qbs-setup-toolchains/probe.cpp @@ -97,26 +97,26 @@ QString findExecutable(const QString &fileName) return {}; } -QStringList toolchainTypeFromCompilerName(const QString &compilerName) +QString toolchainTypeFromCompilerName(const QString &compilerName) { if (compilerName == QLatin1String("cl.exe")) - return canonicalToolchain(QStringLiteral("msvc")); + return QStringLiteral("msvc"); if (compilerName == QLatin1String("clang-cl.exe")) - return canonicalToolchain(QLatin1String("clang-cl")); + return QStringLiteral("clang-cl"); const auto types = { QStringLiteral("clang"), QStringLiteral("llvm"), QStringLiteral("mingw"), QStringLiteral("gcc") }; for (const auto &type : types) { if (compilerName.contains(type)) - return canonicalToolchain(type); + return type; } if (compilerName == QLatin1String("g++")) - return canonicalToolchain(QStringLiteral("gcc")); + return QStringLiteral("gcc"); if (isIarCompiler(compilerName)) - return canonicalToolchain(QStringLiteral("iar")); + return QStringLiteral("iar"); if (isKeilCompiler(compilerName)) - return canonicalToolchain(QStringLiteral("keil")); + return QStringLiteral("keil"); if (isSdccCompiler(compilerName)) - return canonicalToolchain(QStringLiteral("sdcc")); + return QStringLiteral("sdcc"); return {}; } @@ -158,23 +158,22 @@ void createProfile(const QString &profileName, const QString &toolchainType, .arg(compilerFilePath)); } - QStringList toolchainTypes; - if (toolchainType.isEmpty()) - toolchainTypes = toolchainTypeFromCompilerName(compiler.fileName()); - else - toolchainTypes = canonicalToolchain(toolchainType); + const QString realToolchainType = !toolchainType.isEmpty() + ? toolchainType + : toolchainTypeFromCompilerName(compiler.fileName()); + const QStringList toolchain = canonicalToolchain(realToolchainType); - if (toolchainTypes.contains(QLatin1String("msvc"))) + if (toolchain.contains(QLatin1String("msvc"))) createMsvcProfile(compiler, settings, profileName); - else if (toolchainTypes.contains(QLatin1String("clang-cl"))) + else if (toolchain.contains(QLatin1String("clang-cl"))) createClangClProfile(compiler, settings, profileName); - else if (toolchainTypes.contains(QLatin1String("gcc"))) - createGccProfile(compiler, settings, toolchainTypes, profileName); - else if (toolchainTypes.contains(QLatin1String("iar"))) + else if (toolchain.contains(QLatin1String("gcc"))) + createGccProfile(compiler, settings, realToolchainType, profileName); + else if (toolchain.contains(QLatin1String("iar"))) createIarProfile(compiler, settings, profileName); - else if (toolchainTypes.contains(QLatin1String("keil"))) + else if (toolchain.contains(QLatin1String("keil"))) createKeilProfile(compiler, settings, profileName); - else if (toolchainTypes.contains(QLatin1String("sdcc"))) + else if (toolchain.contains(QLatin1String("sdcc"))) createSdccProfile(compiler, settings, profileName); else throw qbs::ErrorInfo(Tr::tr("Cannot create profile: Unknown toolchain type.")); diff --git a/src/app/qbs-setup-toolchains/probe.h b/src/app/qbs-setup-toolchains/probe.h index 235d7a899..bce150bd7 100644 --- a/src/app/qbs-setup-toolchains/probe.h +++ b/src/app/qbs-setup-toolchains/probe.h @@ -57,7 +57,7 @@ QStringList systemSearchPaths(); QString findExecutable(const QString &fileName); -QStringList toolchainTypeFromCompilerName(const QString &compilerName); +QString toolchainTypeFromCompilerName(const QString &compilerName); void createProfile(const QString &profileName, const QString &toolchainType, const QString &compilerFilePath, qbs::Settings *settings); diff --git a/src/app/qbs-setup-toolchains/xcodeprobe.cpp b/src/app/qbs-setup-toolchains/xcodeprobe.cpp index 3ac243028..97b043f92 100644 --- a/src/app/qbs-setup-toolchains/xcodeprobe.cpp +++ b/src/app/qbs-setup-toolchains/xcodeprobe.cpp @@ -172,11 +172,7 @@ void XcodeProbe::setupDefaultToolchains(const QString &devPath, const QString &x Profile installationProfile(xcodeName, settings); installationProfile.removeProfile(); - installationProfile.setValue(QStringLiteral("qbs.toolchain"), QStringList() - << QStringLiteral("xcode") - << QStringLiteral("clang") - << QStringLiteral("llvm") - << QStringLiteral("gcc")); + installationProfile.setValue(QStringLiteral("qbs.toolchainType"), QStringLiteral("xcode")); if (devPath != defaultDeveloperPath) installationProfile.setValue(QStringLiteral("xcode.developerPath"), devPath); profiles.push_back(installationProfile); diff --git a/tests/auto/api/tst_api.cpp b/tests/auto/api/tst_api.cpp index d38c40e38..ca2d657dd 100644 --- a/tests/auto/api/tst_api.cpp +++ b/tests/auto/api/tst_api.cpp @@ -1465,7 +1465,7 @@ void TestApi::linkDynamicAndStaticLibs() // The dependent static libs should not appear in the link command for the executable. const SettingsPtr s = settings(); const qbs::Profile buildProfile(profileName(), s.get()); - if (buildProfile.value("qbs.toolchain").toStringList().contains("gcc")) { + if (profileToolchain(buildProfile).contains("gcc")) { static const std::regex appLinkCmdRex(" -o [^ ]*/HelloWorld" QBS_HOST_EXE_SUFFIX " "); QString appLinkCmd; for (const QString &line : qAsConst(bdr.descriptionLines)) { @@ -1498,7 +1498,7 @@ void TestApi::linkStaticAndDynamicLibs() // executable. The -rpath-link line for libdynamic1.so must be there. const SettingsPtr s = settings(); const qbs::Profile buildProfile(profileName(), s.get()); - if (buildProfile.value("qbs.toolchain").toStringList().contains("gcc")) { + if (profileToolchain(buildProfile).contains("gcc")) { static const std::regex appLinkCmdRex(" -o [^ ]*/HelloWorld" QBS_HOST_EXE_SUFFIX " "); QString appLinkCmd; for (const QString &line : qAsConst(bdr.descriptionLines)) { diff --git a/tests/auto/blackbox/tst_blackbox.cpp b/tests/auto/blackbox/tst_blackbox.cpp index f2615678b..3ebbefbf4 100644 --- a/tests/auto/blackbox/tst_blackbox.cpp +++ b/tests/auto/blackbox/tst_blackbox.cpp @@ -1443,7 +1443,7 @@ void TestBlackbox::versionScript() { const SettingsPtr s = settings(); Profile buildProfile(profileName(), s.get()); - QStringList toolchain = buildProfile.value("qbs.toolchain").toStringList(); + QStringList toolchain = profileToolchain(buildProfile); if (!toolchain.contains("gcc") || targetOs() != HostOsInfo::HostOsLinux) QSKIP("version script test only applies to Linux"); QDir::setCurrent(testDataDir + "/versionscript"); @@ -1861,7 +1861,7 @@ void TestBlackbox::separateDebugInfo() const SettingsPtr s = settings(); Profile buildProfile(profileName(), s.get()); - QStringList toolchain = buildProfile.value("qbs.toolchain").toStringList(); + QStringList toolchain = profileToolchain(buildProfile); if (isDarwin) { QVERIFY(directoryExists(relativeProductBuildDir("app1") + "/app1.app.dSYM")); QVERIFY(regularFileExists(relativeProductBuildDir("app1") @@ -2046,7 +2046,7 @@ void TestBlackbox::trackExternalProductChanges() rmDirR(relativeBuildDir()); const SettingsPtr s = settings(); const Profile profile(profileName(), s.get()); - const QStringList toolchainTypes = profile.value("qbs.toolchain").toStringList(); + const QStringList toolchainTypes = profileToolchain(profile); if (!toolchainTypes.contains("gcc")) QSKIP("Need GCC-like compiler to run this test"); params.environment = QProcessEnvironment::systemEnvironment(); @@ -2334,7 +2334,7 @@ void TestBlackbox::reproducibleBuild() { const SettingsPtr s = settings(); const Profile profile(profileName(), s.get()); - const QStringList toolchains = profile.value("qbs.toolchain").toStringList(); + const QStringList toolchains = profileToolchain(profile); if (!toolchains.contains("gcc")) QSKIP("reproducible builds only supported for gcc"); if (toolchains.contains("clang")) @@ -3545,7 +3545,7 @@ void TestBlackbox::emptyProfile() const SettingsPtr s = settings(); const Profile buildProfile(profileName(), s.get()); - const QStringList toolchain = buildProfile.value("qbs.toolchain").toStringList(); + const QStringList toolchain = profileToolchain(buildProfile); QTemporaryDir tempDir; QbsRunParameters params; @@ -3657,7 +3657,7 @@ void TestBlackbox::escapedLinkerFlags() { const SettingsPtr s = settings(); const Profile buildProfile(profileName(), s.get()); - const QStringList toolchain = buildProfile.value("qbs.toolchain").toStringList(); + const QStringList toolchain = profileToolchain(buildProfile); if (!toolchain.contains("gcc")) QSKIP("escaped linker flags test only applies with gcc and GNU ld"); if (targetOs() == HostOsInfo::HostOsMacos) @@ -4218,7 +4218,7 @@ void TestBlackbox::cli() const SettingsPtr s = settings(); Profile p("qbs_autotests-cli", s.get()); - const QStringList toolchain = p.value("qbs.toolchain").toStringList(); + const QStringList toolchain = profileToolchain(p); if (!p.exists() || !(toolchain.contains("dotnet") || toolchain.contains("mono"))) QSKIP("No suitable Common Language Infrastructure test profile"); @@ -4687,7 +4687,7 @@ void TestBlackbox::linkerLibraryDuplicates() { const SettingsPtr s = settings(); Profile buildProfile(profileName(), s.get()); - QStringList toolchain = buildProfile.value("qbs.toolchain").toStringList(); + QStringList toolchain = profileToolchain(buildProfile); if (!toolchain.contains("gcc")) QSKIP("linkerLibraryDuplicates test only applies to GCC toolchain"); @@ -4767,7 +4767,7 @@ void TestBlackbox::linkerScripts() { const SettingsPtr s = settings(); Profile buildProfile(profileName(), s.get()); - QStringList toolchain = buildProfile.value("qbs.toolchain").toStringList(); + QStringList toolchain = profileToolchain(buildProfile); if (!toolchain.contains("gcc") || targetOs() != HostOsInfo::HostOsLinux) QSKIP("linker script test only applies to Linux "); diff --git a/tests/auto/blackbox/tst_blackboxqt.cpp b/tests/auto/blackbox/tst_blackboxqt.cpp index a77676ea2..dd2a4139d 100644 --- a/tests/auto/blackbox/tst_blackboxqt.cpp +++ b/tests/auto/blackbox/tst_blackboxqt.cpp @@ -245,7 +245,7 @@ void TestBlackboxQt::mixedBuildVariants() QDir::setCurrent(testDataDir + "/mixed-build-variants"); const SettingsPtr s = settings(); Profile profile(profileName(), s.get()); - if (profile.value("qbs.toolchain").toStringList().contains("msvc")) { + if (profileToolchain(profile).contains("msvc")) { QbsRunParameters params; params.arguments << "qbs.buildVariant:debug"; params.expectFailure = true; @@ -362,7 +362,7 @@ void TestBlackboxQt::qmlDebugging() QCOMPARE(runQbs(), 0); const SettingsPtr s = settings(); Profile profile(profileName(), s.get()); - if (!profile.value("qbs.toolchain").toStringList().contains("gcc")) + if (!profileToolchain(profile).contains("gcc")) return; QProcess nm; nm.start("nm", QStringList(relativeExecutableFilePath("debuggable-app"))); diff --git a/tests/auto/blackbox/tst_clangdb.cpp b/tests/auto/blackbox/tst_clangdb.cpp index 3a6dd2d92..65e562484 100644 --- a/tests/auto/blackbox/tst_clangdb.cpp +++ b/tests/auto/blackbox/tst_clangdb.cpp @@ -202,9 +202,9 @@ void TestClangDb::checkClangDetectsSourceCodeProblems() // clang-check.exe does not understand MSVC command-line syntax const SettingsPtr s = settings(); qbs::Profile profile(profileName(), s.get()); - if (profile.value("qbs.toolchain").toStringList().contains("msvc")) { + if (profileToolchain(profile).contains("msvc")) { arguments << "-extra-arg-before=--driver-mode=cl"; - } else if (profile.value("qbs.toolchain").toStringList().contains("mingw")) { + } else if (profileToolchain(profile).contains("mingw")) { arguments << "-extra-arg-before=--driver-mode=g++"; } diff --git a/tests/auto/shared.h b/tests/auto/shared.h index ac950f12a..beda8fff3 100644 --- a/tests/auto/shared.h +++ b/tests/auto/shared.h @@ -31,6 +31,7 @@ #include <tools/hostosinfo.h> #include <tools/profile.h> #include <tools/settings.h> +#include <tools/toolchains.h> #include <QtCore/qbytearray.h> #include <QtCore/qcryptographichash.h> @@ -270,14 +271,22 @@ inline void copyFileAndUpdateTimestamp(const QString &source, const QString &tar touch(target); } +inline QStringList profileToolchain(const qbs::Profile &profile) +{ + const auto toolchainType = profile.value(QStringLiteral("qbs.toolchainType")).toString(); + if (!toolchainType.isEmpty()) + return qbs::canonicalToolchain(toolchainType); + return profile.value(QStringLiteral("qbs.toolchain")).toStringList(); +} + inline QString objectFileName(const QString &baseName, const QString &profileName) { const SettingsPtr s = settings(); qbs::Profile profile(profileName, s.get()); - const auto tc = profile.value("qbs.toolchainType").toString(); - const auto tcList = profile.value("qbs.toolchain").toStringList(); - const bool isMsvc = tc == "msvc" || tcList.contains("msvc") - || (tc.isEmpty() && tcList.isEmpty() && qbs::Internal::HostOsInfo::isWindowsHost()); + + const auto tcList = profileToolchain(profile); + const bool isMsvc = tcList.contains("msvc") + || (tcList.isEmpty() && qbs::Internal::HostOsInfo::isWindowsHost()); const QString suffix = isMsvc ? "obj" : "o"; return baseName + '.' + suffix; } |