Revert "ProjectExplorer: Remove ClangClToolChain::m_clangPath"

This reverts commit 7a2e49435c
as it broke handling clang-cl toolchains on Windows.

Fixes: QTCREATORBUG-25690
Fixes: QTCREATORBUG-25693
Fixes: QTCREATORBUG-25698
Change-Id: Idfc7bc86ad8dd97f645908d4fe9530c760085347
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
Christian Stenger
2021-05-12 17:25:24 +02:00
parent 99cc306e0f
commit c79a4fab6e
3 changed files with 60 additions and 13 deletions

View File

@@ -1471,9 +1471,9 @@ void ClangClToolChainConfigWidget::setFromClangClToolChain()
const auto *clangClToolChain = static_cast<const ClangClToolChain *>(toolChain()); const auto *clangClToolChain = static_cast<const ClangClToolChain *>(toolChain());
if (clangClToolChain->isAutoDetected()) if (clangClToolChain->isAutoDetected())
m_llvmDirLabel->setText(clangClToolChain->compilerCommand().toUserOutput()); m_llvmDirLabel->setText(QDir::toNativeSeparators(clangClToolChain->clangPath()));
else else
m_compilerCommand->setFilePath(clangClToolChain->compilerCommand()); m_compilerCommand->setFilePath(Utils::FilePath::fromString(clangClToolChain->clangPath()));
} }
static const MsvcToolChain *findMsvcToolChain(unsigned char wordWidth, Abi::OSFlavor flavor) static const MsvcToolChain *findMsvcToolChain(unsigned char wordWidth, Abi::OSFlavor flavor)
@@ -1571,7 +1571,7 @@ static QList<ToolChain *> detectClangClToolChainInPath(const QString &clangClPat
res << tc; res << tc;
} else { } else {
auto cltc = new ClangClToolChain; auto cltc = new ClangClToolChain;
cltc->setCompilerCommand(FilePath::fromString(clangClPath)); cltc->setClangPath(clangClPath);
cltc->setDisplayName(name); cltc->setDisplayName(name);
cltc->setDetection(ToolChain::AutoDetection); cltc->setDetection(ToolChain::AutoDetection);
cltc->setLanguage(language); cltc->setLanguage(language);
@@ -1589,18 +1589,18 @@ static QString compilerFromPath(const QString &path)
void ClangClToolChainConfigWidget::applyImpl() void ClangClToolChainConfigWidget::applyImpl()
{ {
FilePath compilerCommand = m_compilerCommand->filePath(); Utils::FilePath clangClPath = m_compilerCommand->filePath();
auto clangClToolChain = static_cast<ClangClToolChain *>(toolChain()); 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(); clangClToolChain->resetVarsBat();
setFromClangClToolChain(); setFromClangClToolChain();
return; return;
} }
const QString displayedVarsBat = m_varsBatDisplayCombo->currentText(); const QString displayedVarsBat = m_varsBatDisplayCombo->currentText();
QList<ToolChain *> results = detectClangClToolChainInPath(compilerCommand.toString(), QList<ToolChain *> results = detectClangClToolChainInPath(clangClPath.toString(),
{}, {},
displayedVarsBat); displayedVarsBat);
@@ -1640,22 +1640,26 @@ ClangClToolChain::ClangClToolChain()
{ {
setDisplayName("clang-cl"); setDisplayName("clang-cl");
setTypeDisplayName(QCoreApplication::translate("ProjectExplorer::ClangToolChainFactory", "Clang")); setTypeDisplayName(QCoreApplication::translate("ProjectExplorer::ClangToolChainFactory", "Clang"));
setCompilerCommandKey("ProjectExplorer.ClangClToolChain.LlvmDir");
} }
bool ClangClToolChain::isValid() const bool ClangClToolChain::isValid() const
{ {
return MsvcToolChain::isValid() && compilerCommand().exists() const QFileInfo fi(clangPath());
&& compilerCommand().fileName() == "clang-cl.exe"; return MsvcToolChain::isValid() && fi.exists() && fi.fileName() == "clang-cl.exe";
} }
void ClangClToolChain::addToEnvironment(Utils::Environment &env) const void ClangClToolChain::addToEnvironment(Utils::Environment &env) const
{ {
MsvcToolChain::addToEnvironment(env); MsvcToolChain::addToEnvironment(env);
QDir path = compilerCommand().toFileInfo().absoluteDir(); // bin folder QDir path = QFileInfo(m_clangPath).absoluteDir(); // bin folder
env.prependOrSetPath(path.canonicalPath()); env.prependOrSetPath(path.canonicalPath());
} }
Utils::FilePath ClangClToolChain::compilerCommand() const
{
return Utils::FilePath::fromString(m_clangPath);
}
QStringList ClangClToolChain::suggestedMkspecList() const QStringList ClangClToolChain::suggestedMkspecList() const
{ {
const QString mkspec = "win32-clang-" + Abi::toString(targetAbi().osFlavor()); const QString mkspec = "win32-clang-" + Abi::toString(targetAbi().osFlavor());
@@ -1667,11 +1671,44 @@ QList<OutputLineParser *> ClangClToolChain::createOutputParsers() const
return {new ClangClParser}; 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() std::unique_ptr<ToolChainConfigWidget> ClangClToolChain::createConfigurationWidget()
{ {
return std::make_unique<ClangClToolChainConfigWidget>(this); 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, Macros ClangClToolChain::msvcPredefinedMacros(const QStringList &cxxflags,
const Utils::Environment &env) const const Utils::Environment &env) const
{ {
@@ -1685,7 +1722,7 @@ Macros ClangClToolChain::msvcPredefinedMacros(const QStringList &cxxflags,
QStringList arguments = cxxflags; QStringList arguments = cxxflags;
arguments.append(gccPredefinedMacrosOptions(language())); arguments.append(gccPredefinedMacrosOptions(language()));
arguments.append("-"); arguments.append("-");
Utils::SynchronousProcessResponse response = cpp.runBlocking({compilerCommand(), arguments}); Utils::SynchronousProcessResponse response = cpp.runBlocking({clangPath(), arguments});
if (response.result != Utils::SynchronousProcessResponse::Finished || response.exitCode != 0) { if (response.result != Utils::SynchronousProcessResponse::Finished || response.exitCode != 0) {
// Show the warning but still parse the output. // Show the warning but still parse the output.
QTC_CHECK(false && "clang-cl exited with non-zero code."); QTC_CHECK(false && "clang-cl exited with non-zero code.");

View File

@@ -164,18 +164,28 @@ public:
bool isValid() const override; bool isValid() const override;
QStringList suggestedMkspecList() const override; QStringList suggestedMkspecList() const override;
void addToEnvironment(Utils::Environment &env) const override; void addToEnvironment(Utils::Environment &env) const override;
Utils::FilePath compilerCommand() const override; // FIXME: Remove
QList<Utils::OutputLineParser *> createOutputParsers() const override; QList<Utils::OutputLineParser *> createOutputParsers() const override;
QVariantMap toMap() const override;
bool fromMap(const QVariantMap &data) override;
std::unique_ptr<ToolChainConfigWidget> createConfigurationWidget() override; std::unique_ptr<ToolChainConfigWidget> createConfigurationWidget() override;
BuiltInHeaderPathsRunner createBuiltInHeaderPathsRunner( BuiltInHeaderPathsRunner createBuiltInHeaderPathsRunner(
const Utils::Environment &env) const override; const Utils::Environment &env) const override;
const QList<MsvcToolChain *> &msvcToolchains() const; const QList<MsvcToolChain *> &msvcToolchains() const;
QString clangPath() const { return m_clangPath; }
void setClangPath(const QString &path) { m_clangPath = path; }
Macros msvcPredefinedMacros(const QStringList &cxxflags, Macros msvcPredefinedMacros(const QStringList &cxxflags,
const Utils::Environment &env) const override; const Utils::Environment &env) const override;
Utils::LanguageVersion msvcLanguageVersion(const QStringList &cxxflags, Utils::LanguageVersion msvcLanguageVersion(const QStringList &cxxflags,
const Utils::Id &language, const Utils::Id &language,
const Macros &macros) const override; const Macros &macros) const override;
bool operator==(const ToolChain &) const override;
private:
QString m_clangPath;
}; };
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------

View File

@@ -145,7 +145,7 @@ public:
Utils::Id language() const; Utils::Id language() const;
Utils::FilePath compilerCommand() const; virtual Utils::FilePath compilerCommand() const; // FIXME: De-virtualize.
void setCompilerCommand(const Utils::FilePath &command); void setCompilerCommand(const Utils::FilePath &command);
virtual QList<Utils::OutputLineParser *> createOutputParsers() const = 0; virtual QList<Utils::OutputLineParser *> createOutputParsers() const = 0;