From 2d2db8312dca1747aadde698ff4d565de0d412d2 Mon Sep 17 00:00:00 2001 From: Thomas Epting Date: Tue, 4 Oct 2016 11:29:30 +0200 Subject: [PATCH] MSVC: Ensure the correct MSVC installation folder is detected With this change, tools like Bullseye Coverage that wrap cl.exe are disregarded. Only true MSVC installation folders are considered now, which allows using Creator+Qbs with such tools again. Task-number: QBS-1000 Change-Id: Ifb49b3c032359aa4ba1bc702de0dc3d30d3b6075 Reviewed-by: Christian Kandeler --- src/libs/utils/environment.cpp | 7 ++++--- src/libs/utils/environment.h | 4 +++- src/plugins/projectexplorer/abstractmsvctoolchain.cpp | 11 ++++++++++- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/libs/utils/environment.cpp b/src/libs/utils/environment.cpp index 50c32f9a07a..900d4e63e1c 100644 --- a/src/libs/utils/environment.cpp +++ b/src/libs/utils/environment.cpp @@ -273,7 +273,8 @@ QStringList Environment::appendExeExtensions(const QString &executable) const } FileName Environment::searchInPath(const QString &executable, - const QStringList &additionalDirs) const + const QStringList &additionalDirs, + bool (*func)(const QString &name)) const { if (executable.isEmpty()) return FileName(); @@ -296,7 +297,7 @@ FileName Environment::searchInPath(const QString &executable, continue; alreadyChecked.insert(dir); FileName tmp = searchInDirectory(execs, dir); - if (!tmp.isEmpty()) + if (!tmp.isEmpty() && (!func || func(tmp.toString()))) return tmp; } @@ -308,7 +309,7 @@ FileName Environment::searchInPath(const QString &executable, continue; alreadyChecked.insert(p); FileName tmp = searchInDirectory(execs, QDir::fromNativeSeparators(p)); - if (!tmp.isEmpty()) + if (!tmp.isEmpty() && (!func || func(tmp.toString()))) return tmp; } return FileName(); diff --git a/src/libs/utils/environment.h b/src/libs/utils/environment.h index 78f51bb7f4a..a04cbe92849 100644 --- a/src/libs/utils/environment.h +++ b/src/libs/utils/environment.h @@ -100,7 +100,9 @@ public: Environment::const_iterator constFind(const QString &name) const; FileName searchInPath(const QString &executable, - const QStringList &additionalDirs = QStringList()) const; + const QStringList &additionalDirs = QStringList(), + bool (*func)(const QString &name) = nullptr) const; + QStringList path() const; QStringList appendExeExtensions(const QString &executable) const; diff --git a/src/plugins/projectexplorer/abstractmsvctoolchain.cpp b/src/plugins/projectexplorer/abstractmsvctoolchain.cpp index 34436b892c8..e2930db03a3 100644 --- a/src/plugins/projectexplorer/abstractmsvctoolchain.cpp +++ b/src/plugins/projectexplorer/abstractmsvctoolchain.cpp @@ -201,7 +201,16 @@ Utils::FileName AbstractMsvcToolChain::compilerCommand() const { Utils::Environment env = Utils::Environment::systemEnvironment(); addToEnvironment(env); - return env.searchInPath(QLatin1String("cl.exe")); + + Utils::FileName clexe = env.searchInPath(QLatin1String("cl.exe"), QStringList(), [](const QString &name) { + QDir dir(QDir::cleanPath(QFileInfo(name).absolutePath() + QStringLiteral("/.."))); + do { + if (QFile::exists(dir.absoluteFilePath(QStringLiteral("vcvarsall.bat")))) + return true; + } while (dir.cdUp() && !dir.isRoot()); + return false; + }); + return clexe; } IOutputParser *AbstractMsvcToolChain::outputParser() const