forked from qt-creator/qt-creator
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:
@@ -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.");
|
||||||
|
@@ -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 ¯os) const override;
|
const Macros ¯os) const override;
|
||||||
|
|
||||||
|
bool operator==(const ToolChain &) const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString m_clangPath;
|
||||||
};
|
};
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user