diff options
author | Ivan Komissarov <abbapoh@gmail.com> | 2021-04-18 22:24:23 +0300 |
---|---|---|
committer | Ivan Komissarov <ABBAPOH@gmail.com> | 2021-04-19 10:41:05 +0000 |
commit | d38fd9fa901cd7f30821367b831676837eb82fe3 (patch) | |
tree | 307cf3c6e5ec9fe650ce9f61fa30f90c43063125 | |
parent | 0976a94724854501a12581201b2c6d860a0f6dd4 (diff) |
Fix detecting MSVC via Probe when multiple versions are present
Previously, Qbs iterated over different versions in the ascending order.
During the setup-toolchains this means that the newest one will be
written in the settings as only the last one is actually written.
When running ClBinaryProbe, the first one (i.e. the oldest was picked
up) which did not work well with vcvarsall (without -vcvars_ver
parameter, it uses the newest one). So, pick up the newest compiler both
when running setup-toolchains and when detecting via Probe.
Task-number: QBS-1498
Change-Id: Ib1b433ca7e17747dee986ba383a3c01ee91851fb
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
-rw-r--r-- | src/app/qbs-setup-toolchains/msvcprobe.cpp | 6 | ||||
-rw-r--r-- | src/lib/corelib/tools/msvcinfo.cpp | 11 |
2 files changed, 16 insertions, 1 deletions
diff --git a/src/app/qbs-setup-toolchains/msvcprobe.cpp b/src/app/qbs-setup-toolchains/msvcprobe.cpp index bb54add9f..19da1e25a 100644 --- a/src/app/qbs-setup-toolchains/msvcprobe.cpp +++ b/src/app/qbs-setup-toolchains/msvcprobe.cpp @@ -58,6 +58,7 @@ #include <QtCore/qstringlist.h> #include <algorithm> +#include <unordered_set> #include <vector> using namespace qbs; @@ -182,9 +183,14 @@ void msvcProbe(Settings *settings, std::vector<Profile> &profiles) } } + std::unordered_set<QString> seenNames; for (MSVC &msvc : msvcs) { const QString name = QLatin1String("MSVC") + msvc.version + QLatin1Char('-') + msvc.architecture; + // TODO: Qbs currently does not support multiple versions of installed MSVCs + // so we stop at the first (the newest) one + if (!seenNames.insert(name).second) + continue; try { msvc.init(); addMSVCPlatform(settings, profiles, name, &msvc); diff --git a/src/lib/corelib/tools/msvcinfo.cpp b/src/lib/corelib/tools/msvcinfo.cpp index 42cfefe7b..83c53ba5c 100644 --- a/src/lib/corelib/tools/msvcinfo.cpp +++ b/src/lib/corelib/tools/msvcinfo.cpp @@ -43,6 +43,7 @@ #include <logging/logger.h> #include <tools/error.h> #include <tools/profile.h> +#include <tools/stlutils.h> #include <tools/stringconstants.h> #include <QtCore/qbytearray.h> @@ -471,12 +472,20 @@ static std::vector<MSVC> installedCompilersHelper(Logger &logger) QDir vcInstallDir = vsInstallDir; vcInstallDir.cd(QStringLiteral("Tools/MSVC")); const auto vcVersionStrs = vcInstallDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot); + std::vector<Version> vcVersions; + vcVersions.reserve(vcVersionStrs.size()); for (const QString &vcVersionStr : vcVersionStrs) { const Version vcVersion = Version::fromString(vcVersionStr); if (!vcVersion.isValid()) continue; + vcVersions.push_back(vcVersion); + } + // sort the versions so the new one comes first + std::sort(vcVersions.begin(), vcVersions.end(), std::greater()); + + for (const Version &vcVersion : vcVersions) { QDir specificVcInstallDir = vcInstallDir; - if (!specificVcInstallDir.cd(vcVersionStr) + if (!specificVcInstallDir.cd(vcVersion.toString()) || !specificVcInstallDir.cd(QStringLiteral("bin"))) { continue; } |