forked from qt-creator/qt-creator
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:
@@ -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,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;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user