ProjectExplorer: Search for clang-cl compiler in path

Currently we only check if it's in the registry which
is not the case when you have a custom build.

Change-Id: I20ec25378d16996f790726ed14238861bc220004
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
Ivan Donchevskii
2018-07-02 15:29:15 +02:00
parent 9bbb085718
commit ad11e08f72

View File

@@ -1008,6 +1008,32 @@ static const ToolChain *selectMsvcToolChain(const QString &clangClPath,
return toolChain;
}
static void detectClangClToolChainInPath(const QString &clangClPath, QList<ToolChain *> *list)
{
const unsigned char wordWidth = Utils::is64BitWindowsBinary(clangClPath) ? 64 : 32;
const ToolChain *toolChain = selectMsvcToolChain(clangClPath, *list, wordWidth);
QDir path = QFileInfo(clangClPath).absoluteDir(); // bin folder
path.cdUp(); // cd to LLVM root
const QString rootPath = path.canonicalPath();
if (!toolChain) {
qWarning("Unable to find a suitable MSVC version for \"%s\".",
qPrintable(QDir::toNativeSeparators(rootPath)));
return;
}
const MsvcToolChain *msvcToolChain = static_cast<const MsvcToolChain *>(toolChain);
const Abi targetAbi = msvcToolChain->targetAbi();
const QString name = QStringLiteral("LLVM ") + QString::number(wordWidth)
+ QStringLiteral("bit based on ")
+ Abi::toString(targetAbi.osFlavor()).toUpper();
for (auto language: {Constants::C_LANGUAGE_ID, Constants::CXX_LANGUAGE_ID}) {
list->append(new ClangClToolChain(name, rootPath, targetAbi,
msvcToolChain->varsBat(), msvcToolChain->varsBatArg(),
language, ToolChain::AutoDetection));
}
}
// Detect Clang-cl on top of MSVC2017, MSVC2015 or MSVC2013.
static void detectClangClToolChain(QList<ToolChain *> *list)
{
@@ -1018,28 +1044,19 @@ static void detectClangClToolChain(QList<ToolChain *> *list)
#endif
const QSettings registry(QLatin1String(registryNode), QSettings::NativeFormat);
if (registry.status() != QSettings::NoError)
return;
const QString path = QDir::cleanPath(registry.value(QStringLiteral(".")).toString());
if (path.isEmpty())
return;
const QString clangClPath = compilerFromPath(path);
const unsigned char wordWidth = Utils::is64BitWindowsBinary(clangClPath) ? 64 : 32;
const ToolChain *toolChain = selectMsvcToolChain(clangClPath, *list, wordWidth);
if (!toolChain) {
qWarning("Unable to find a suitable MSVC version for \"%s\".", qPrintable(QDir::toNativeSeparators(path)));
return;
}
const MsvcToolChain *msvcToolChain = static_cast<const MsvcToolChain *>(toolChain);
const Abi targetAbi = msvcToolChain->targetAbi();
const QString name = QStringLiteral("LLVM ") + QString::number(wordWidth)
+ QStringLiteral("bit based on ")
+ Abi::toString(targetAbi.osFlavor()).toUpper();
for (auto language: {Constants::C_LANGUAGE_ID, Constants::CXX_LANGUAGE_ID}) {
list->append(new ClangClToolChain(name, path, targetAbi,
msvcToolChain->varsBat(), msvcToolChain->varsBatArg(),
language, ToolChain::AutoDetection));
if (registry.status() == QSettings::NoError) {
const QString path = QDir::cleanPath(registry.value(QStringLiteral(".")).toString());
const QString clangClPath = compilerFromPath(path);
if (!path.isEmpty()) {
detectClangClToolChainInPath(path, list);
return;
}
}
const Utils::Environment systemEnvironment = Utils::Environment::systemEnvironment();
const Utils::FileName clangClPath = systemEnvironment.searchInPath("clang-cl");
if (!clangClPath.isEmpty())
detectClangClToolChainInPath(clangClPath.toString(), list);
}
QList<ToolChain *> MsvcToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown)