aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/projectexplorer
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@qt.io>2021-05-19 09:54:07 +0200
committerEike Ziller <eike.ziller@qt.io>2021-05-19 09:54:07 +0200
commitf83be6debe8fcf4a635fae0e755776fd12f85dae (patch)
treefbf56dfee3c9142c0d1f3c7ad0718a8697d2d1b6 /src/plugins/projectexplorer
parentc49a0af5046157039da2194723e0fc4dd48956f5 (diff)
parent801dbdf9324a67462eb6756f4ea49b31ae2074bb (diff)
Merge remote-tracking branch 'origin/4.15'
Diffstat (limited to 'src/plugins/projectexplorer')
-rw-r--r--src/plugins/projectexplorer/msvctoolchain.cpp61
-rw-r--r--src/plugins/projectexplorer/msvctoolchain.h10
-rw-r--r--src/plugins/projectexplorer/toolchain.cpp9
-rw-r--r--src/plugins/projectexplorer/toolchain.h2
4 files changed, 61 insertions, 21 deletions
diff --git a/src/plugins/projectexplorer/msvctoolchain.cpp b/src/plugins/projectexplorer/msvctoolchain.cpp
index 48636393d9..892a8421d5 100644
--- a/src/plugins/projectexplorer/msvctoolchain.cpp
+++ b/src/plugins/projectexplorer/msvctoolchain.cpp
@@ -1470,9 +1470,9 @@ void ClangClToolChainConfigWidget::setFromClangClToolChain()
const auto *clangClToolChain = static_cast<const ClangClToolChain *>(toolChain());
if (clangClToolChain->isAutoDetected())
- m_llvmDirLabel->setText(clangClToolChain->compilerCommand().toUserOutput());
+ m_llvmDirLabel->setText(QDir::toNativeSeparators(clangClToolChain->clangPath()));
else
- m_compilerCommand->setFilePath(clangClToolChain->compilerCommand());
+ m_compilerCommand->setFilePath(Utils::FilePath::fromString(clangClToolChain->clangPath()));
}
static const MsvcToolChain *findMsvcToolChain(unsigned char wordWidth, Abi::OSFlavor flavor)
@@ -1569,7 +1569,7 @@ static QList<ToolChain *> detectClangClToolChainInPath(const QString &clangClPat
res << tc;
} else {
auto cltc = new ClangClToolChain;
- cltc->setCompilerCommand(FilePath::fromString(clangClPath));
+ cltc->setClangPath(clangClPath);
cltc->setDisplayName(name);
cltc->setDetection(ToolChain::AutoDetection);
cltc->setLanguage(language);
@@ -1587,18 +1587,18 @@ static QString compilerFromPath(const QString &path)
void ClangClToolChainConfigWidget::applyImpl()
{
- FilePath compilerCommand = m_compilerCommand->filePath();
+ Utils::FilePath clangClPath = m_compilerCommand->filePath();
auto clangClToolChain = static_cast<ClangClToolChain *>(toolChain());
- clangClToolChain->setCompilerCommand(compilerCommand);
+ clangClToolChain->setClangPath(clangClPath.toString());
- if (compilerCommand.fileName() != "clang-cl.exe") {
+ if (clangClPath.fileName() != "clang-cl.exe") {
clangClToolChain->resetVarsBat();
setFromClangClToolChain();
return;
}
const QString displayedVarsBat = m_varsBatDisplayCombo->currentText();
- QList<ToolChain *> results = detectClangClToolChainInPath(compilerCommand.toString(),
+ QList<ToolChain *> results = detectClangClToolChainInPath(clangClPath.toString(),
{},
displayedVarsBat);
@@ -1638,22 +1638,26 @@ ClangClToolChain::ClangClToolChain()
{
setDisplayName("clang-cl");
setTypeDisplayName(QCoreApplication::translate("ProjectExplorer::ClangToolChainFactory", "Clang"));
- setCompilerCommandKey("ProjectExplorer.ClangClToolChain.LlvmDir");
}
bool ClangClToolChain::isValid() const
{
- return MsvcToolChain::isValid() && compilerCommand().exists()
- && compilerCommand().fileName() == "clang-cl.exe";
+ const QFileInfo fi(clangPath());
+ return MsvcToolChain::isValid() && fi.exists() && fi.fileName() == "clang-cl.exe";
}
void ClangClToolChain::addToEnvironment(Utils::Environment &env) const
{
MsvcToolChain::addToEnvironment(env);
- QDir path = compilerCommand().toFileInfo().absoluteDir(); // bin folder
+ QDir path = QFileInfo(m_clangPath).absoluteDir(); // bin folder
env.prependOrSetPath(path.canonicalPath());
}
+Utils::FilePath ClangClToolChain::compilerCommand() const
+{
+ return Utils::FilePath::fromString(m_clangPath);
+}
+
QStringList ClangClToolChain::suggestedMkspecList() const
{
const QString mkspec = "win32-clang-" + Abi::toString(targetAbi().osFlavor());
@@ -1665,11 +1669,44 @@ QList<OutputLineParser *> ClangClToolChain::createOutputParsers() const
return {new ClangClParser};
}
+static inline QString llvmDirKey()
+{
+ return QStringLiteral("ProjectExplorer.ClangClToolChain.LlvmDir");
+}
+
+QVariantMap ClangClToolChain::toMap() const
+{
+ QVariantMap result = MsvcToolChain::toMap();
+ result.insert(llvmDirKey(), m_clangPath);
+ return result;
+}
+
+bool ClangClToolChain::fromMap(const QVariantMap &data)
+{
+ if (!MsvcToolChain::fromMap(data))
+ return false;
+ const QString clangPath = data.value(llvmDirKey()).toString();
+ if (clangPath.isEmpty())
+ return false;
+ m_clangPath = clangPath;
+
+ return true;
+}
+
std::unique_ptr<ToolChainConfigWidget> ClangClToolChain::createConfigurationWidget()
{
return std::make_unique<ClangClToolChainConfigWidget>(this);
}
+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;
+}
+
Macros ClangClToolChain::msvcPredefinedMacros(const QStringList &cxxflags,
const Utils::Environment &env) const
{
@@ -1683,7 +1720,7 @@ Macros ClangClToolChain::msvcPredefinedMacros(const QStringList &cxxflags,
QStringList arguments = cxxflags;
arguments.append(gccPredefinedMacrosOptions(language()));
arguments.append("-");
- cpp.runBlocking({compilerCommand(), arguments});
+ cpp.runBlocking({clangPath(), arguments});
if (cpp.result() != Utils::QtcProcess::Finished || cpp.exitCode() != 0) {
// Show the warning but still parse the output.
QTC_CHECK(false && "clang-cl exited with non-zero code.");
diff --git a/src/plugins/projectexplorer/msvctoolchain.h b/src/plugins/projectexplorer/msvctoolchain.h
index 7dce6712e1..c5269b1646 100644
--- a/src/plugins/projectexplorer/msvctoolchain.h
+++ b/src/plugins/projectexplorer/msvctoolchain.h
@@ -164,18 +164,28 @@ public:
bool isValid() const override;
QStringList suggestedMkspecList() const override;
void addToEnvironment(Utils::Environment &env) const override;
+ Utils::FilePath compilerCommand() const override; // FIXME: Remove
QList<Utils::OutputLineParser *> createOutputParsers() const override;
+ QVariantMap toMap() const override;
+ bool fromMap(const QVariantMap &data) override;
std::unique_ptr<ToolChainConfigWidget> createConfigurationWidget() override;
BuiltInHeaderPathsRunner createBuiltInHeaderPathsRunner(
const Utils::Environment &env) const override;
const QList<MsvcToolChain *> &msvcToolchains() const;
+ QString clangPath() const { return m_clangPath; }
+ void setClangPath(const QString &path) { m_clangPath = path; }
Macros msvcPredefinedMacros(const QStringList &cxxflags,
const Utils::Environment &env) const override;
Utils::LanguageVersion msvcLanguageVersion(const QStringList &cxxflags,
const Utils::Id &language,
const Macros &macros) const override;
+
+ bool operator==(const ToolChain &) const override;
+
+private:
+ QString m_clangPath;
};
// --------------------------------------------------------------------------
diff --git a/src/plugins/projectexplorer/toolchain.cpp b/src/plugins/projectexplorer/toolchain.cpp
index ff2a827dcb..98df39036a 100644
--- a/src/plugins/projectexplorer/toolchain.cpp
+++ b/src/plugins/projectexplorer/toolchain.cpp
@@ -279,14 +279,7 @@ void ToolChain::toolChainUpdated()
void ToolChain::setDetection(ToolChain::Detection de)
{
- if (d->m_detection == de)
- return;
- if (d->m_detection == ToolChain::UninitializedDetection) {
- d->m_detection = de;
- } else {
- d->m_detection = de;
- toolChainUpdated();
- }
+ d->m_detection = de;
}
QString ToolChain::typeDisplayName() const
diff --git a/src/plugins/projectexplorer/toolchain.h b/src/plugins/projectexplorer/toolchain.h
index 40c9db98b2..2c2a3c68b7 100644
--- a/src/plugins/projectexplorer/toolchain.h
+++ b/src/plugins/projectexplorer/toolchain.h
@@ -146,7 +146,7 @@ public:
Utils::Id language() const;
- Utils::FilePath compilerCommand() const;
+ virtual Utils::FilePath compilerCommand() const; // FIXME: De-virtualize.
void setCompilerCommand(const Utils::FilePath &command);
virtual QList<Utils::OutputLineParser *> createOutputParsers() const = 0;