aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIvan Donchevskii <ivan.donchevskii@qt.io>2018-08-06 12:32:07 +0200
committerIvan Donchevskii <ivan.donchevskii@qt.io>2018-08-09 10:52:49 +0000
commitc937534906214f403024473f6c65c6b9b29034a8 (patch)
tree7827216db7be21738ccfeeeef1570332840ac29c
parent43031174bc98dcd2ea7f8235e6cab5dd93a4c038 (diff)
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>
-rwxr-xr-xscripts/deployqt.py2
-rw-r--r--src/plugins/projectexplorer/msvctoolchain.cpp37
-rw-r--r--src/plugins/projectexplorer/msvctoolchain.h2
3 files changed, 34 insertions, 7 deletions
diff --git a/scripts/deployqt.py b/scripts/deployqt.py
index 35c664b37e..f7891f4e79 100755
--- a/scripts/deployqt.py
+++ b/scripts/deployqt.py
@@ -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*'))
diff --git a/src/plugins/projectexplorer/msvctoolchain.cpp b/src/plugins/projectexplorer/msvctoolchain.cpp
index 7fe8ee1098..95b6bcbdaf 100644
--- a/src/plugins/projectexplorer/msvctoolchain.cpp
+++ b/src/plugins/projectexplorer/msvctoolchain.cpp
@@ -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;
}
diff --git a/src/plugins/projectexplorer/msvctoolchain.h b/src/plugins/projectexplorer/msvctoolchain.h
index 9bbf36757c..8510cece09 100644
--- a/src/plugins/projectexplorer/msvctoolchain.h
+++ b/src/plugins/projectexplorer/msvctoolchain.h
@@ -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;
};