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