diff options
author | Ivan Donchevskii <ivan.donchevskii@qt.io> | 2018-07-02 15:29:15 +0200 |
---|---|---|
committer | Ivan Donchevskii <ivan.donchevskii@qt.io> | 2018-07-05 11:49:15 +0000 |
commit | ad11e08f7288a156d76cf3f8aa0c931c67824efc (patch) | |
tree | ae45fb261c7ce118a10db35e4a4bc2342c3dde60 /src | |
parent | 9bbb085718ca1af4f816331d450b2129e30ff281 (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.cpp | 51 |
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; |