forked from qt-creator/qt-creator
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:
committed by
Ivan Donchevskii
parent
0f96f735f0
commit
27e9e19ed3
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user