forked from qt-creator/qt-creator
Crash: Fix crash when removing a tool chain
Fix crash on trying to debug an application after the last tool chain for the Qt version used was removed. Task-number: QTCREATORBUG-4197 Reviewed-by: dt
This commit is contained in:
@@ -72,6 +72,11 @@ BuildConfiguration::BuildConfiguration(Target *target, const QString &id) :
|
|||||||
//: Display name of the clean build step list. Used as part of the labels in the project window.
|
//: Display name of the clean build step list. Used as part of the labels in the project window.
|
||||||
bsl->setDefaultDisplayName(tr("Clean"));
|
bsl->setDefaultDisplayName(tr("Clean"));
|
||||||
m_stepLists.append(bsl);
|
m_stepLists.append(bsl);
|
||||||
|
|
||||||
|
connect(ToolChainManager::instance(), SIGNAL(toolChainRemoved(ProjectExplorer::ToolChain*)),
|
||||||
|
this, SLOT(handleToolChainRemovals(ProjectExplorer::ToolChain*)));
|
||||||
|
connect(ToolChainManager::instance(), SIGNAL(toolChainAdded(ProjectExplorer::ToolChain*)),
|
||||||
|
this, SLOT(handleToolChainAddition(ProjectExplorer::ToolChain*)));
|
||||||
}
|
}
|
||||||
|
|
||||||
BuildConfiguration::BuildConfiguration(Target *target, BuildConfiguration *source) :
|
BuildConfiguration::BuildConfiguration(Target *target, BuildConfiguration *source) :
|
||||||
@@ -85,6 +90,11 @@ BuildConfiguration::BuildConfiguration(Target *target, BuildConfiguration *sourc
|
|||||||
// Do not clone stepLists here, do that in the derived constructor instead
|
// Do not clone stepLists here, do that in the derived constructor instead
|
||||||
// otherwise BuildStepFactories might reject to set up a BuildStep for us
|
// otherwise BuildStepFactories might reject to set up a BuildStep for us
|
||||||
// since we are not yet the derived class!
|
// since we are not yet the derived class!
|
||||||
|
|
||||||
|
connect(ToolChainManager::instance(), SIGNAL(toolChainRemoved(ProjectExplorer::ToolChain*)),
|
||||||
|
this, SLOT(handleToolChainRemovals(ProjectExplorer::ToolChain*)));
|
||||||
|
connect(ToolChainManager::instance(), SIGNAL(toolChainAdded(ProjectExplorer::ToolChain*)),
|
||||||
|
this, SLOT(handleToolChainAddition(ProjectExplorer::ToolChain*)));
|
||||||
}
|
}
|
||||||
|
|
||||||
BuildConfiguration::~BuildConfiguration()
|
BuildConfiguration::~BuildConfiguration()
|
||||||
@@ -155,6 +165,22 @@ bool BuildConfiguration::fromMap(const QVariantMap &map)
|
|||||||
return ProjectConfiguration::fromMap(map);
|
return ProjectConfiguration::fromMap(map);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BuildConfiguration::handleToolChainRemovals(ProjectExplorer::ToolChain *tc)
|
||||||
|
{
|
||||||
|
if (m_toolChain != tc)
|
||||||
|
return;
|
||||||
|
setToolChain(target()->preferredToolChain(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
void BuildConfiguration::handleToolChainAddition(ProjectExplorer::ToolChain *tc)
|
||||||
|
{
|
||||||
|
Q_UNUSED(tc);
|
||||||
|
if (m_toolChain != 0)
|
||||||
|
return;
|
||||||
|
setToolChain(target()->preferredToolChain(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Target *BuildConfiguration::target() const
|
Target *BuildConfiguration::target() const
|
||||||
{
|
{
|
||||||
return static_cast<Target *>(parent());
|
return static_cast<Target *>(parent());
|
||||||
|
@@ -120,6 +120,10 @@ protected:
|
|||||||
|
|
||||||
virtual bool fromMap(const QVariantMap &map);
|
virtual bool fromMap(const QVariantMap &map);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void handleToolChainRemovals(ProjectExplorer::ToolChain *tc);
|
||||||
|
void handleToolChainAddition(ProjectExplorer::ToolChain *tc);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool m_clearSystemEnvironment;
|
bool m_clearSystemEnvironment;
|
||||||
QList<Utils::EnvironmentItem> m_userEnvironmentChanges;
|
QList<Utils::EnvironmentItem> m_userEnvironmentChanges;
|
||||||
|
@@ -369,8 +369,7 @@ void Qt4BuildConfiguration::setQtVersion(QtVersion *version)
|
|||||||
void Qt4BuildConfiguration::setToolChain(ProjectExplorer::ToolChain *tc)
|
void Qt4BuildConfiguration::setToolChain(ProjectExplorer::ToolChain *tc)
|
||||||
{
|
{
|
||||||
Q_ASSERT(qtVersion());
|
Q_ASSERT(qtVersion());
|
||||||
if (!qt4Target()->possibleToolChains(this).contains(tc)
|
if (tc != 0 && !qt4Target()->possibleToolChains(this).contains(tc))
|
||||||
|| tc->restrictedToTargets().contains(target()->id()))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
BuildConfiguration::setToolChain(tc);
|
BuildConfiguration::setToolChain(tc);
|
||||||
|
@@ -456,15 +456,20 @@ void Qt4ProjectConfigWidget::toolChainChanged()
|
|||||||
{
|
{
|
||||||
if (m_ignoreChange)
|
if (m_ignoreChange)
|
||||||
return;
|
return;
|
||||||
for (int i=0; i < m_ui->toolChainComboBox->count(); ++i) {
|
for (int i = 0; i < m_ui->toolChainComboBox->count(); ++i) {
|
||||||
ProjectExplorer::ToolChain *tc =
|
ProjectExplorer::ToolChain *tc =
|
||||||
static_cast<ProjectExplorer::ToolChain *>(m_ui->toolChainComboBox->itemData(i, Qt::UserRole).value<void *>());
|
static_cast<ProjectExplorer::ToolChain *>(m_ui->toolChainComboBox->itemData(i, Qt::UserRole).value<void *>());
|
||||||
if (tc == m_buildConfiguration->toolChain()) {
|
if (tc == m_buildConfiguration->toolChain()) {
|
||||||
m_ignoreChange = true;
|
m_ignoreChange = true;
|
||||||
m_ui->toolChainComboBox->setCurrentIndex(i);
|
m_ui->toolChainComboBox->setCurrentIndex(i);
|
||||||
m_ignoreChange = false;
|
m_ignoreChange = false;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
m_ignoreChange = true;
|
||||||
|
m_ui->toolChainComboBox->addItem(tr("<No tool chain selected>"), qVariantFromValue(static_cast<void *>(0)));
|
||||||
|
m_ui->toolChainComboBox->setCurrentIndex(m_ui->toolChainComboBox->count() - 1);
|
||||||
|
m_ignoreChange = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Qt4ProjectConfigWidget::updateToolChainCombo()
|
void Qt4ProjectConfigWidget::updateToolChainCombo()
|
||||||
@@ -476,20 +481,8 @@ void Qt4ProjectConfigWidget::updateToolChainCombo()
|
|||||||
foreach (ProjectExplorer::ToolChain *toolchain, toolchains)
|
foreach (ProjectExplorer::ToolChain *toolchain, toolchains)
|
||||||
m_ui->toolChainComboBox->addItem(toolchain->displayName(),
|
m_ui->toolChainComboBox->addItem(toolchain->displayName(),
|
||||||
qVariantFromValue(static_cast<void *>(toolchain)));
|
qVariantFromValue(static_cast<void *>(toolchain)));
|
||||||
m_ignoreChange = true;
|
|
||||||
if (!m_buildConfiguration->toolChain() || toolchains.isEmpty()) {
|
|
||||||
m_ui->toolChainComboBox->addItem(tr("<Invalid tool chain>"), qVariantFromValue(static_cast<void *>(0)));
|
|
||||||
m_ui->toolChainComboBox->setCurrentIndex(m_ui->toolChainComboBox->count() - 1);
|
|
||||||
} else if (toolchains.contains(m_buildConfiguration->toolChain())) {
|
|
||||||
m_ui->toolChainComboBox->setCurrentIndex(toolchains.indexOf(m_buildConfiguration->toolChain()));
|
|
||||||
} else { // reset to some sensible tool chain
|
|
||||||
ToolChain *tc = 0;
|
|
||||||
if (!toolchains.isEmpty())
|
|
||||||
tc = toolchains.at(0);
|
|
||||||
m_buildConfiguration->setToolChain(tc);
|
|
||||||
}
|
|
||||||
m_ignoreChange = false;
|
|
||||||
m_ui->toolChainComboBox->setEnabled(toolchains.size() > 1);
|
m_ui->toolChainComboBox->setEnabled(toolchains.size() > 1);
|
||||||
|
toolChainChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Qt4ProjectConfigWidget::toolChainSelected(int index)
|
void Qt4ProjectConfigWidget::toolChainSelected(int index)
|
||||||
|
Reference in New Issue
Block a user