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 <christian.kandeler@qt.io>
This commit is contained in:
Thomas Epting
2016-10-04 11:29:30 +02:00
parent 3b8087a85c
commit 2d2db8312d
3 changed files with 17 additions and 5 deletions

View File

@@ -273,7 +273,8 @@ QStringList Environment::appendExeExtensions(const QString &executable) const
} }
FileName Environment::searchInPath(const QString &executable, FileName Environment::searchInPath(const QString &executable,
const QStringList &additionalDirs) const const QStringList &additionalDirs,
bool (*func)(const QString &name)) const
{ {
if (executable.isEmpty()) if (executable.isEmpty())
return FileName(); return FileName();
@@ -296,7 +297,7 @@ FileName Environment::searchInPath(const QString &executable,
continue; continue;
alreadyChecked.insert(dir); alreadyChecked.insert(dir);
FileName tmp = searchInDirectory(execs, dir); FileName tmp = searchInDirectory(execs, dir);
if (!tmp.isEmpty()) if (!tmp.isEmpty() && (!func || func(tmp.toString())))
return tmp; return tmp;
} }
@@ -308,7 +309,7 @@ FileName Environment::searchInPath(const QString &executable,
continue; continue;
alreadyChecked.insert(p); alreadyChecked.insert(p);
FileName tmp = searchInDirectory(execs, QDir::fromNativeSeparators(p)); FileName tmp = searchInDirectory(execs, QDir::fromNativeSeparators(p));
if (!tmp.isEmpty()) if (!tmp.isEmpty() && (!func || func(tmp.toString())))
return tmp; return tmp;
} }
return FileName(); return FileName();

View File

@@ -100,7 +100,9 @@ public:
Environment::const_iterator constFind(const QString &name) const; Environment::const_iterator constFind(const QString &name) const;
FileName searchInPath(const QString &executable, 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 path() const;
QStringList appendExeExtensions(const QString &executable) const; QStringList appendExeExtensions(const QString &executable) const;

View File

@@ -201,7 +201,16 @@ Utils::FileName AbstractMsvcToolChain::compilerCommand() const
{ {
Utils::Environment env = Utils::Environment::systemEnvironment(); Utils::Environment env = Utils::Environment::systemEnvironment();
addToEnvironment(env); 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 IOutputParser *AbstractMsvcToolChain::outputParser() const