Clang: Re-use known toolchains when auto-detecting

Change-Id: I7c28bf41c7d613cb7848f02b3a9f436d3ed7307f
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
This commit is contained in:
Orgad Shaneh
2018-07-19 00:01:52 +03:00
committed by Ivan Donchevskii
parent 0f96f735f0
commit 27e9e19ed3

View File

@@ -876,28 +876,44 @@ static const MsvcToolChain *selectMsvcToolChain(const QString &clangClPath,
return toolChain; return toolChain;
} }
static void detectClangClToolChainInPath(const QString &clangClPath, static QList<ToolChain *> detectClangClToolChainInPath(
QList<ToolChain *> &list) const QString &clangClPath, const QList<ToolChain *> &alreadyKnown)
{ {
QList<ToolChain *> res;
const unsigned char wordWidth = Utils::is64BitWindowsBinary(clangClPath) ? 64 : 32; const unsigned char wordWidth = Utils::is64BitWindowsBinary(clangClPath) ? 64 : 32;
const MsvcToolChain *toolChain = selectMsvcToolChain(clangClPath, wordWidth); const MsvcToolChain *toolChain = selectMsvcToolChain(clangClPath, wordWidth);
if (!toolChain) { if (!toolChain) {
qWarning("Unable to find a suitable MSVC version for \"%s\".", qWarning("Unable to find a suitable MSVC version for \"%s\".",
qPrintable(QDir::toNativeSeparators(clangClPath))); qPrintable(QDir::toNativeSeparators(clangClPath)));
return; return res;
} }
Utils::Environment systemEnvironment = Utils::Environment::systemEnvironment();
const Abi targetAbi = toolChain->targetAbi(); const Abi targetAbi = toolChain->targetAbi();
const QString name = QStringLiteral("LLVM ") + QString::number(wordWidth) const QString name = QStringLiteral("LLVM ") + QString::number(wordWidth)
+ QStringLiteral("bit based on ") + QStringLiteral("bit based on ")
+ Abi::toString(targetAbi.osFlavor()).toUpper(); + Abi::toString(targetAbi.osFlavor()).toUpper();
for (auto language: {Constants::C_LANGUAGE_ID, Constants::CXX_LANGUAGE_ID}) { for (auto language: {Constants::C_LANGUAGE_ID, Constants::CXX_LANGUAGE_ID}) {
auto *clangClToolChain = new ClangClToolChain(name, clangClPath, ClangClToolChain *tc = static_cast<ClangClToolChain *>(
language, ToolChain::AutoDetection); Utils::findOrDefault(
clangClToolChain->resetMsvcToolChain(toolChain); alreadyKnown,
list.append(clangClToolChain); [&targetAbi, &language, &clangClPath, &systemEnvironment](ToolChain *tc) -> bool {
if (tc->typeId() != Constants::CLANG_CL_TOOLCHAIN_TYPEID)
return false;
if (tc->targetAbi() != targetAbi)
return false;
if (tc->language() != language)
return false;
return systemEnvironment.isSameExecutable(tc->compilerCommand().toString(), clangClPath);
}));
if (!tc) {
tc = new ClangClToolChain(name, clangClPath, language, ToolChain::AutoDetection);
tc->resetMsvcToolChain(toolChain);
} }
res << tc;
}
return res;
} }
static QString compilerFromPath(const QString &path) static QString compilerFromPath(const QString &path)
@@ -917,8 +933,7 @@ void ClangClToolChainConfigWidget::applyImpl()
return; return;
} }
QList<ToolChain *> results; QList<ToolChain *> results = detectClangClToolChainInPath(clangClPath.toString(), {});
detectClangClToolChainInPath(clangClPath.toString(), results);
if (results.isEmpty()) { if (results.isEmpty()) {
clangClToolChain->resetMsvcToolChain(); clangClToolChain->resetMsvcToolChain();
@@ -1232,7 +1247,7 @@ QList<ToolChain *> ClangClToolChainFactory::autoDetect(const QList<ToolChain *>
const QString path = QDir::cleanPath(registry.value(QStringLiteral(".")).toString()); const QString path = QDir::cleanPath(registry.value(QStringLiteral(".")).toString());
const QString clangClPath = compilerFromPath(path); const QString clangClPath = compilerFromPath(path);
if (!path.isEmpty()) { if (!path.isEmpty()) {
detectClangClToolChainInPath(clangClPath, results); results.append(detectClangClToolChainInPath(clangClPath, alreadyKnown));
return results; return results;
} }
} }
@@ -1240,7 +1255,7 @@ QList<ToolChain *> ClangClToolChainFactory::autoDetect(const QList<ToolChain *>
const Utils::Environment systemEnvironment = Utils::Environment::systemEnvironment(); const Utils::Environment systemEnvironment = Utils::Environment::systemEnvironment();
const Utils::FileName clangClPath = systemEnvironment.searchInPath("clang-cl"); const Utils::FileName clangClPath = systemEnvironment.searchInPath("clang-cl");
if (!clangClPath.isEmpty()) if (!clangClPath.isEmpty())
detectClangClToolChainInPath(clangClPath.toString(), results); results.append(detectClangClToolChainInPath(clangClPath.toString(), alreadyKnown));
return results; return results;
} }