forked from qt-creator/qt-creator
ProjectExplorer: Merge ClangToolChainConfigWidget into GccTCCW
Change-Id: I002356b886015e6a07c13700168c45056279b4f3 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
@@ -50,12 +50,10 @@ namespace Internal {
|
|||||||
class TargetTripleWidget;
|
class TargetTripleWidget;
|
||||||
class GccToolChainConfigWidget : public ToolChainConfigWidget
|
class GccToolChainConfigWidget : public ToolChainConfigWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit GccToolChainConfigWidget(GccToolChain *tc);
|
explicit GccToolChainConfigWidget(GccToolChain *tc);
|
||||||
|
|
||||||
protected:
|
private:
|
||||||
void handleCompilerCommandChange();
|
void handleCompilerCommandChange();
|
||||||
void handlePlatformCodeGenFlagsChange();
|
void handlePlatformCodeGenFlagsChange();
|
||||||
void handlePlatformLinkerFlagsChange();
|
void handlePlatformLinkerFlagsChange();
|
||||||
@@ -67,32 +65,21 @@ protected:
|
|||||||
|
|
||||||
void setFromToolchain();
|
void setFromToolchain();
|
||||||
|
|
||||||
|
void updateParentToolChainComboBox(); // Clang
|
||||||
|
|
||||||
AbiWidget *m_abiWidget;
|
AbiWidget *m_abiWidget;
|
||||||
|
|
||||||
private:
|
GccToolChain::SubType m_subType = GccToolChain::RealGcc;
|
||||||
Utils::PathChooser *m_compilerCommand;
|
|
||||||
|
PathChooser *m_compilerCommand;
|
||||||
QLineEdit *m_platformCodeGenFlagsLineEdit;
|
QLineEdit *m_platformCodeGenFlagsLineEdit;
|
||||||
QLineEdit *m_platformLinkerFlagsLineEdit;
|
QLineEdit *m_platformLinkerFlagsLineEdit;
|
||||||
TargetTripleWidget * const m_targetTripleWidget;
|
TargetTripleWidget * const m_targetTripleWidget;
|
||||||
|
|
||||||
bool m_isReadOnly = false;
|
bool m_isReadOnly = false;
|
||||||
ProjectExplorer::Macros m_macros;
|
ProjectExplorer::Macros m_macros;
|
||||||
};
|
|
||||||
|
|
||||||
class ClangToolChainConfigWidget : public GccToolChainConfigWidget
|
// Clang only
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
explicit ClangToolChainConfigWidget(GccToolChain *tc);
|
|
||||||
|
|
||||||
private:
|
|
||||||
void applyImpl() override;
|
|
||||||
void discardImpl() override { setFromClangToolchain(); }
|
|
||||||
bool isDirtyImpl() const override;
|
|
||||||
void makeReadOnlyImpl() override;
|
|
||||||
|
|
||||||
void setFromClangToolchain();
|
|
||||||
void updateParentToolChainComboBox();
|
|
||||||
QList<QMetaObject::Connection> m_parentToolChainConnections;
|
QList<QMetaObject::Connection> m_parentToolChainConnections;
|
||||||
QComboBox *m_parentToolchainCombo = nullptr;
|
QComboBox *m_parentToolchainCombo = nullptr;
|
||||||
};
|
};
|
||||||
@@ -970,9 +957,6 @@ bool GccToolChain::operator ==(const ToolChain &other) const
|
|||||||
|
|
||||||
std::unique_ptr<ToolChainConfigWidget> GccToolChain::createConfigurationWidget()
|
std::unique_ptr<ToolChainConfigWidget> GccToolChain::createConfigurationWidget()
|
||||||
{
|
{
|
||||||
if (m_subType == Clang)
|
|
||||||
return std::make_unique<ClangToolChainConfigWidget>(this);
|
|
||||||
|
|
||||||
return std::make_unique<GccToolChainConfigWidget>(this);
|
return std::make_unique<GccToolChainConfigWidget>(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1442,11 +1426,10 @@ private:
|
|||||||
GccToolChainConfigWidget::GccToolChainConfigWidget(GccToolChain *tc) :
|
GccToolChainConfigWidget::GccToolChainConfigWidget(GccToolChain *tc) :
|
||||||
ToolChainConfigWidget(tc),
|
ToolChainConfigWidget(tc),
|
||||||
m_abiWidget(new AbiWidget),
|
m_abiWidget(new AbiWidget),
|
||||||
|
m_subType(tc->m_subType),
|
||||||
m_compilerCommand(new PathChooser),
|
m_compilerCommand(new PathChooser),
|
||||||
m_targetTripleWidget(new TargetTripleWidget(tc))
|
m_targetTripleWidget(new TargetTripleWidget(tc))
|
||||||
{
|
{
|
||||||
Q_ASSERT(tc);
|
|
||||||
|
|
||||||
const QStringList gnuVersionArgs = QStringList("--version");
|
const QStringList gnuVersionArgs = QStringList("--version");
|
||||||
m_compilerCommand->setExpectedKind(PathChooser::ExistingCommand);
|
m_compilerCommand->setExpectedKind(PathChooser::ExistingCommand);
|
||||||
m_compilerCommand->setCommandVersionArguments(gnuVersionArgs);
|
m_compilerCommand->setCommandVersionArguments(gnuVersionArgs);
|
||||||
@@ -1476,6 +1459,44 @@ GccToolChainConfigWidget::GccToolChainConfigWidget(GccToolChain *tc) :
|
|||||||
connect(m_abiWidget, &AbiWidget::abiChanged, this, &ToolChainConfigWidget::dirty);
|
connect(m_abiWidget, &AbiWidget::abiChanged, this, &ToolChainConfigWidget::dirty);
|
||||||
connect(m_targetTripleWidget, &TargetTripleWidget::valueChanged,
|
connect(m_targetTripleWidget, &TargetTripleWidget::valueChanged,
|
||||||
this, &ToolChainConfigWidget::dirty);
|
this, &ToolChainConfigWidget::dirty);
|
||||||
|
|
||||||
|
if (m_subType == GccToolChain::Clang) {
|
||||||
|
if (!HostOsInfo::isWindowsHost() || tc->typeId() != Constants::CLANG_TOOLCHAIN_TYPEID)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Remove m_abiWidget row because the parent toolchain abi is going to be used.
|
||||||
|
m_mainLayout->removeRow(m_mainLayout->rowCount() - 3); // FIXME: Do something sane instead.
|
||||||
|
m_abiWidget = nullptr;
|
||||||
|
|
||||||
|
m_parentToolchainCombo = new QComboBox(this);
|
||||||
|
m_mainLayout->insertRow(m_mainLayout->rowCount() - 1,
|
||||||
|
Tr::tr("Parent toolchain:"),
|
||||||
|
m_parentToolchainCombo);
|
||||||
|
|
||||||
|
ToolChainManager *tcManager = ToolChainManager::instance();
|
||||||
|
m_parentToolChainConnections.append(
|
||||||
|
connect(tcManager, &ToolChainManager::toolChainUpdated, this, [this](ToolChain *tc) {
|
||||||
|
if (tc->typeId() == Constants::MINGW_TOOLCHAIN_TYPEID)
|
||||||
|
updateParentToolChainComboBox();
|
||||||
|
}));
|
||||||
|
m_parentToolChainConnections.append(
|
||||||
|
connect(tcManager, &ToolChainManager::toolChainAdded, this, [this](ToolChain *tc) {
|
||||||
|
if (tc->typeId() == Constants::MINGW_TOOLCHAIN_TYPEID)
|
||||||
|
updateParentToolChainComboBox();
|
||||||
|
}));
|
||||||
|
m_parentToolChainConnections.append(
|
||||||
|
connect(tcManager, &ToolChainManager::toolChainRemoved, this, [this](ToolChain *tc) {
|
||||||
|
if (tc->id() == toolChain()->id()) {
|
||||||
|
for (QMetaObject::Connection &connection : m_parentToolChainConnections)
|
||||||
|
QObject::disconnect(connection);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (tc->typeId() == Constants::MINGW_TOOLCHAIN_TYPEID)
|
||||||
|
updateParentToolChainComboBox();
|
||||||
|
}));
|
||||||
|
|
||||||
|
updateParentToolChainComboBox();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GccToolChainConfigWidget::applyImpl()
|
void GccToolChainConfigWidget::applyImpl()
|
||||||
@@ -1506,6 +1527,23 @@ void GccToolChainConfigWidget::applyImpl()
|
|||||||
ToolChain::MacroInspectionReport{m_macros,
|
ToolChain::MacroInspectionReport{m_macros,
|
||||||
ToolChain::languageVersion(tc->language(),
|
ToolChain::languageVersion(tc->language(),
|
||||||
m_macros)});
|
m_macros)});
|
||||||
|
|
||||||
|
if (m_subType == GccToolChain::Clang && m_parentToolchainCombo) {
|
||||||
|
|
||||||
|
tc->m_parentToolChainId.clear();
|
||||||
|
|
||||||
|
const QByteArray parentId = m_parentToolchainCombo->currentData().toByteArray();
|
||||||
|
if (!parentId.isEmpty()) {
|
||||||
|
for (const ToolChain *mingwTC : mingwToolChains()) {
|
||||||
|
if (parentId == mingwTC->id()) {
|
||||||
|
tc->m_parentToolChainId = mingwTC->id();
|
||||||
|
tc->setTargetAbi(mingwTC->targetAbi());
|
||||||
|
tc->setSupportedAbis(mingwTC->supportedAbis());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GccToolChainConfigWidget::setFromToolchain()
|
void GccToolChainConfigWidget::setFromToolchain()
|
||||||
@@ -1523,20 +1561,32 @@ void GccToolChainConfigWidget::setFromToolchain()
|
|||||||
if (!m_isReadOnly && !m_compilerCommand->filePath().toString().isEmpty())
|
if (!m_isReadOnly && !m_compilerCommand->filePath().toString().isEmpty())
|
||||||
m_abiWidget->setEnabled(true);
|
m_abiWidget->setEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_parentToolchainCombo)
|
||||||
|
updateParentToolChainComboBox();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GccToolChainConfigWidget::isDirtyImpl() const
|
bool GccToolChainConfigWidget::isDirtyImpl() const
|
||||||
{
|
{
|
||||||
auto tc = static_cast<GccToolChain *>(toolChain());
|
auto tc = static_cast<GccToolChain *>(toolChain());
|
||||||
Q_ASSERT(tc);
|
|
||||||
return m_compilerCommand->filePath() != tc->compilerCommand()
|
if (m_compilerCommand->filePath() != tc->compilerCommand()
|
||||||
|| m_platformCodeGenFlagsLineEdit->text()
|
|| m_platformCodeGenFlagsLineEdit->text()
|
||||||
!= ProcessArgs::joinArgs(tc->platformCodeGenFlags())
|
!= ProcessArgs::joinArgs(tc->platformCodeGenFlags())
|
||||||
|| m_platformLinkerFlagsLineEdit->text()
|
|| m_platformLinkerFlagsLineEdit->text()
|
||||||
!= ProcessArgs::joinArgs(tc->platformLinkerFlags())
|
!= ProcessArgs::joinArgs(tc->platformLinkerFlags())
|
||||||
|| m_targetTripleWidget->explicitCodeModelTargetTriple()
|
|| m_targetTripleWidget->explicitCodeModelTargetTriple()
|
||||||
!= tc->explicitCodeModelTargetTriple()
|
!= tc->explicitCodeModelTargetTriple()
|
||||||
|| (m_abiWidget && m_abiWidget->currentAbi() != tc->targetAbi());
|
|| (m_abiWidget && m_abiWidget->currentAbi() != tc->targetAbi())) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_parentToolchainCombo)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
const MingwToolChain *parentTC = mingwToolChainFromId(tc->m_parentToolChainId);
|
||||||
|
const QByteArray parentId = parentTC ? parentTC->id() : QByteArray();
|
||||||
|
return parentId != m_parentToolchainCombo->currentData();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GccToolChainConfigWidget::makeReadOnlyImpl()
|
void GccToolChainConfigWidget::makeReadOnlyImpl()
|
||||||
@@ -1548,6 +1598,9 @@ void GccToolChainConfigWidget::makeReadOnlyImpl()
|
|||||||
m_platformLinkerFlagsLineEdit->setEnabled(false);
|
m_platformLinkerFlagsLineEdit->setEnabled(false);
|
||||||
m_targetTripleWidget->setEnabled(false);
|
m_targetTripleWidget->setEnabled(false);
|
||||||
m_isReadOnly = true;
|
m_isReadOnly = true;
|
||||||
|
|
||||||
|
if (m_parentToolchainCombo)
|
||||||
|
m_parentToolchainCombo->setEnabled(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GccToolChainConfigWidget::handleCompilerCommandChange()
|
void GccToolChainConfigWidget::handleCompilerCommandChange()
|
||||||
@@ -1756,48 +1809,10 @@ Toolchains ClangToolChainFactory::detectForImport(const ToolChainDescription &tc
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
ClangToolChainConfigWidget::ClangToolChainConfigWidget(GccToolChain *tc) :
|
void GccToolChainConfigWidget::updateParentToolChainComboBox()
|
||||||
GccToolChainConfigWidget(tc)
|
|
||||||
{
|
{
|
||||||
if (!HostOsInfo::isWindowsHost() || tc->typeId() != Constants::CLANG_TOOLCHAIN_TYPEID)
|
QTC_ASSERT(m_parentToolchainCombo, return);
|
||||||
return;
|
|
||||||
|
|
||||||
// Remove m_abiWidget row because the parent toolchain abi is going to be used.
|
|
||||||
m_mainLayout->removeRow(m_mainLayout->rowCount() - 3); // FIXME: Do something sane instead.
|
|
||||||
m_abiWidget = nullptr;
|
|
||||||
|
|
||||||
m_parentToolchainCombo = new QComboBox(this);
|
|
||||||
m_mainLayout->insertRow(m_mainLayout->rowCount() - 1,
|
|
||||||
Tr::tr("Parent toolchain:"),
|
|
||||||
m_parentToolchainCombo);
|
|
||||||
|
|
||||||
ToolChainManager *tcManager = ToolChainManager::instance();
|
|
||||||
m_parentToolChainConnections.append(
|
|
||||||
connect(tcManager, &ToolChainManager::toolChainUpdated, this, [this](ToolChain *tc) {
|
|
||||||
if (tc->typeId() == Constants::MINGW_TOOLCHAIN_TYPEID)
|
|
||||||
updateParentToolChainComboBox();
|
|
||||||
}));
|
|
||||||
m_parentToolChainConnections.append(
|
|
||||||
connect(tcManager, &ToolChainManager::toolChainAdded, this, [this](ToolChain *tc) {
|
|
||||||
if (tc->typeId() == Constants::MINGW_TOOLCHAIN_TYPEID)
|
|
||||||
updateParentToolChainComboBox();
|
|
||||||
}));
|
|
||||||
m_parentToolChainConnections.append(
|
|
||||||
connect(tcManager, &ToolChainManager::toolChainRemoved, this, [this](ToolChain *tc) {
|
|
||||||
if (tc->id() == toolChain()->id()) {
|
|
||||||
for (QMetaObject::Connection &connection : m_parentToolChainConnections)
|
|
||||||
QObject::disconnect(connection);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (tc->typeId() == Constants::MINGW_TOOLCHAIN_TYPEID)
|
|
||||||
updateParentToolChainComboBox();
|
|
||||||
}));
|
|
||||||
|
|
||||||
setFromClangToolchain();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ClangToolChainConfigWidget::updateParentToolChainComboBox()
|
|
||||||
{
|
|
||||||
auto *tc = static_cast<GccToolChain *>(toolChain());
|
auto *tc = static_cast<GccToolChain *>(toolChain());
|
||||||
QByteArray parentId = m_parentToolchainCombo->currentData().toByteArray();
|
QByteArray parentId = m_parentToolchainCombo->currentData().toByteArray();
|
||||||
if (tc->isAutoDetected() || m_parentToolchainCombo->count() == 0)
|
if (tc->isAutoDetected() || m_parentToolchainCombo->count() == 0)
|
||||||
@@ -1821,58 +1836,6 @@ void ClangToolChainConfigWidget::updateParentToolChainComboBox()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClangToolChainConfigWidget::setFromClangToolchain()
|
|
||||||
{
|
|
||||||
GccToolChainConfigWidget::setFromToolchain();
|
|
||||||
|
|
||||||
if (m_parentToolchainCombo)
|
|
||||||
updateParentToolChainComboBox();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ClangToolChainConfigWidget::applyImpl()
|
|
||||||
{
|
|
||||||
GccToolChainConfigWidget::applyImpl();
|
|
||||||
if (!m_parentToolchainCombo)
|
|
||||||
return;
|
|
||||||
|
|
||||||
auto *tc = static_cast<GccToolChain *>(toolChain());
|
|
||||||
tc->m_parentToolChainId.clear();
|
|
||||||
|
|
||||||
const QByteArray parentId = m_parentToolchainCombo->currentData().toByteArray();
|
|
||||||
if (!parentId.isEmpty()) {
|
|
||||||
for (const ToolChain *mingwTC : mingwToolChains()) {
|
|
||||||
if (parentId == mingwTC->id()) {
|
|
||||||
tc->m_parentToolChainId = mingwTC->id();
|
|
||||||
tc->setTargetAbi(mingwTC->targetAbi());
|
|
||||||
tc->setSupportedAbis(mingwTC->supportedAbis());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ClangToolChainConfigWidget::isDirtyImpl() const
|
|
||||||
{
|
|
||||||
if (GccToolChainConfigWidget::isDirtyImpl())
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if (!m_parentToolchainCombo)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
auto tc = static_cast<GccToolChain *>(toolChain());
|
|
||||||
Q_ASSERT(tc);
|
|
||||||
const MingwToolChain *parentTC = mingwToolChainFromId(tc->m_parentToolChainId);
|
|
||||||
const QByteArray parentId = parentTC ? parentTC->id() : QByteArray();
|
|
||||||
return parentId != m_parentToolchainCombo->currentData();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ClangToolChainConfigWidget::makeReadOnlyImpl()
|
|
||||||
{
|
|
||||||
GccToolChainConfigWidget::makeReadOnlyImpl();
|
|
||||||
if (m_parentToolchainCombo)
|
|
||||||
m_parentToolchainCombo->setEnabled(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
// MingwToolChain
|
// MingwToolChain
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ namespace ProjectExplorer {
|
|||||||
|
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
class ClangToolChainFactory;
|
class ClangToolChainFactory;
|
||||||
class ClangToolChainConfigWidget;
|
|
||||||
class GccToolChainConfigWidget;
|
class GccToolChainConfigWidget;
|
||||||
class GccToolChainFactory;
|
class GccToolChainFactory;
|
||||||
class MingwToolChainFactory;
|
class MingwToolChainFactory;
|
||||||
@@ -186,9 +185,8 @@ private:
|
|||||||
|
|
||||||
friend class Internal::GccToolChainConfigWidget;
|
friend class Internal::GccToolChainConfigWidget;
|
||||||
friend class Internal::GccToolChainFactory;
|
friend class Internal::GccToolChainFactory;
|
||||||
friend class ToolChainFactory;
|
|
||||||
friend class Internal::ClangToolChainFactory;
|
friend class Internal::ClangToolChainFactory;
|
||||||
friend class Internal::ClangToolChainConfigWidget;
|
friend class ToolChainFactory;
|
||||||
|
|
||||||
// "resolved" on macOS from /usr/bin/clang(++) etc to <DeveloperDir>/usr/bin/clang(++)
|
// "resolved" on macOS from /usr/bin/clang(++) etc to <DeveloperDir>/usr/bin/clang(++)
|
||||||
// which is used for comparison with matchesCompilerCommand
|
// which is used for comparison with matchesCompilerCommand
|
||||||
|
|||||||
Reference in New Issue
Block a user