ProjectExplorer: Autodetect clang-cl shipped with Qt Creator

In addition to Clang detect it's MSVC compatible twin in
case we run on Windows.

Change-Id: Id997a1a425ca6ce23513b40141f8697521e3cdae
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
This commit is contained in:
Ivan Donchevskii
2018-08-06 12:32:07 +02:00
parent 43031174bc
commit c937534906
3 changed files with 34 additions and 7 deletions
+2
View File
@@ -220,6 +220,8 @@ def deploy_libclang(install_dir, llvm_install_dir, chrpath_bin):
os.path.join(install_dir, 'bin')))
deployinfo.append((os.path.join(llvm_install_dir, 'bin', 'clang.exe'),
clangbindirtarget))
deployinfo.append((os.path.join(llvm_install_dir, 'bin', 'clang-cl.exe'),
clangbindirtarget))
resourcetarget = os.path.join(clanglibdirtarget, 'clang')
else:
libsources = glob(os.path.join(llvm_install_dir, 'lib', 'libclang.so*'))
+30 -7
View File
@@ -30,6 +30,8 @@
#include "taskhub.h"
#include "toolchainmanager.h"
#include <coreplugin/icore.h>
#include <utils/algorithm.h>
#include <utils/hostosinfo.h>
#include <utils/optional.h>
@@ -877,7 +879,7 @@ static const MsvcToolChain *selectMsvcToolChain(const QString &clangClPath,
}
static QList<ToolChain *> detectClangClToolChainInPath(
const QString &clangClPath, const QList<ToolChain *> &alreadyKnown)
const QString &clangClPath, const QList<ToolChain *> &alreadyKnown, bool isDefault = false)
{
QList<ToolChain *> res;
const unsigned char wordWidth = Utils::is64BitWindowsBinary(clangClPath) ? 64 : 32;
@@ -891,9 +893,10 @@ static QList<ToolChain *> detectClangClToolChainInPath(
Utils::Environment systemEnvironment = Utils::Environment::systemEnvironment();
const Abi targetAbi = toolChain->targetAbi();
const QString name = QStringLiteral("LLVM ") + QString::number(wordWidth)
+ QStringLiteral("bit based on ")
+ Abi::toString(targetAbi.osFlavor()).toUpper();
const QString name = QString("%1LLVM %2 bit based on %3")
.arg(QLatin1String(isDefault ? "Default " : ""))
.arg(wordWidth)
.arg(Abi::toString(targetAbi.osFlavor()).toUpper());
for (auto language: {Constants::C_LANGUAGE_ID, Constants::CXX_LANGUAGE_ID}) {
ClangClToolChain *tc = static_cast<ClangClToolChain *>(
Utils::findOrDefault(
@@ -1050,6 +1053,15 @@ void ClangClToolChain::resetMsvcToolChain(const MsvcToolChain *base)
setVarsBatArg(base->varsBatArg());
}
bool ClangClToolChain::operator ==(const ToolChain &other) const
{
if (!MsvcToolChain::operator ==(other))
return false;
const auto *clangClTc = static_cast<const ClangClToolChain *>(&other);
return m_clangPath == clangClTc->m_clangPath;
}
// --------------------------------------------------------------------------
// MsvcToolChainFactory
// --------------------------------------------------------------------------
@@ -1242,20 +1254,31 @@ QList<ToolChain *> ClangClToolChainFactory::autoDetect(const QList<ToolChain *>
#endif
QList<ToolChain *> results;
QList<ToolChain *> known = alreadyKnown;
QString qtCreatorsClang = Core::ICore::clangExecutable(CLANG_BINDIR);
if (!qtCreatorsClang.isEmpty()) {
qtCreatorsClang = Utils::FileName::fromString(qtCreatorsClang).parentDir()
.appendPath("clang-cl.exe").toString();
results.append(detectClangClToolChainInPath(qtCreatorsClang, alreadyKnown, true));
known.append(results);
}
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()) {
results.append(detectClangClToolChainInPath(clangClPath, alreadyKnown));
return results;
results.append(detectClangClToolChainInPath(clangClPath, known));
known.append(results);
}
}
const Utils::Environment systemEnvironment = Utils::Environment::systemEnvironment();
const Utils::FileName clangClPath = systemEnvironment.searchInPath("clang-cl");
if (!clangClPath.isEmpty())
results.append(detectClangClToolChainInPath(clangClPath.toString(), alreadyKnown));
results.append(detectClangClToolChainInPath(clangClPath.toString(), known));
return results;
}
@@ -134,6 +134,8 @@ public:
void setClangPath(const QString &path) { m_clangPath = path; }
void resetMsvcToolChain(const MsvcToolChain *base = nullptr);
bool operator ==(const ToolChain &) const override;
private:
QString m_clangPath;
};