forked from qt-creator/qt-creator
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:
@@ -1008,6 +1008,32 @@ static const ToolChain *selectMsvcToolChain(const QString &clangClPath,
|
|||||||
return toolChain;
|
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.
|
// Detect Clang-cl on top of MSVC2017, MSVC2015 or MSVC2013.
|
||||||
static void detectClangClToolChain(QList<ToolChain *> *list)
|
static void detectClangClToolChain(QList<ToolChain *> *list)
|
||||||
{
|
{
|
||||||
@@ -1018,28 +1044,19 @@ static void detectClangClToolChain(QList<ToolChain *> *list)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
const QSettings registry(QLatin1String(registryNode), QSettings::NativeFormat);
|
const QSettings registry(QLatin1String(registryNode), QSettings::NativeFormat);
|
||||||
if (registry.status() != QSettings::NoError)
|
if (registry.status() == QSettings::NoError) {
|
||||||
return;
|
const QString path = QDir::cleanPath(registry.value(QStringLiteral(".")).toString());
|
||||||
const QString path = QDir::cleanPath(registry.value(QStringLiteral(".")).toString());
|
const QString clangClPath = compilerFromPath(path);
|
||||||
if (path.isEmpty())
|
if (!path.isEmpty()) {
|
||||||
return;
|
detectClangClToolChainInPath(path, list);
|
||||||
const QString clangClPath = compilerFromPath(path);
|
return;
|
||||||
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));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
QList<ToolChain *> MsvcToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown)
|
||||||
|
Reference in New Issue
Block a user