aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIvan Donchevskii <ivan.donchevskii@qt.io>2018-07-02 15:29:15 +0200
committerIvan Donchevskii <ivan.donchevskii@qt.io>2018-07-05 11:49:15 +0000
commitad11e08f7288a156d76cf3f8aa0c931c67824efc (patch)
treeae45fb261c7ce118a10db35e4a4bc2342c3dde60 /src
parent9bbb085718ca1af4f816331d450b2129e30ff281 (diff)
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>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/projectexplorer/msvctoolchain.cpp51
1 files changed, 34 insertions, 17 deletions
diff --git a/src/plugins/projectexplorer/msvctoolchain.cpp b/src/plugins/projectexplorer/msvctoolchain.cpp
index aead49aa6ce..24491e15982 100644
--- a/src/plugins/projectexplorer/msvctoolchain.cpp
+++ b/src/plugins/projectexplorer/msvctoolchain.cpp
@@ -1008,26 +1008,18 @@ static const ToolChain *selectMsvcToolChain(const QString &clangClPath,
return toolChain;
}
-// Detect Clang-cl on top of MSVC2017, MSVC2015 or MSVC2013.
-static void detectClangClToolChain(QList<ToolChain *> *list)
+static void detectClangClToolChainInPath(const QString &clangClPath, QList<ToolChain *> *list)
{
-#ifdef Q_OS_WIN64
- const char registryNode[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\LLVM\\LLVM";
-#else
- const char registryNode[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\LLVM\\LLVM";
-#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);
+
+ 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(path)));
+ qWarning("Unable to find a suitable MSVC version for \"%s\".",
+ qPrintable(QDir::toNativeSeparators(rootPath)));
return;
}
const MsvcToolChain *msvcToolChain = static_cast<const MsvcToolChain *>(toolChain);
@@ -1036,12 +1028,37 @@ static void detectClangClToolChain(QList<ToolChain *> *list)
+ 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,
+ 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)
+{
+#ifdef Q_OS_WIN64
+ const char registryNode[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\LLVM\\LLVM";
+#else
+ const char registryNode[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\LLVM\\LLVM";
+#endif
+
+ const QSettings registry(QLatin1String(registryNode), QSettings::NativeFormat);
+ 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)
{
QList<ToolChain *> results;