forked from qt-creator/qt-creator
Make it possible to continue with "Build All Projects" after errors
The user might still want to get the second project built after the first one failed. Fixes: QTCREATORBUG-22140 Change-Id: I644e64ae2267b25e9804cb4a614edd5a3340a2e7 Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
@@ -80,6 +80,7 @@ public:
|
|||||||
bool m_skipDisabled = false;
|
bool m_skipDisabled = false;
|
||||||
bool m_canceling = false;
|
bool m_canceling = false;
|
||||||
bool m_lastStepSucceeded = true;
|
bool m_lastStepSucceeded = true;
|
||||||
|
bool m_allStepsSucceeded = true;
|
||||||
BuildStep *m_currentBuildStep = nullptr;
|
BuildStep *m_currentBuildStep = nullptr;
|
||||||
QString m_currentConfiguration;
|
QString m_currentConfiguration;
|
||||||
// used to decide if we are building a project to decide when to emit buildStateChanged(Project *)
|
// used to decide if we are building a project to decide when to emit buildStateChanged(Project *)
|
||||||
@@ -305,6 +306,7 @@ void BuildManager::startBuildQueue()
|
|||||||
d->m_progressFutureInterface->setProgressRange(0, d->m_maxProgress * 100);
|
d->m_progressFutureInterface->setProgressRange(0, d->m_maxProgress * 100);
|
||||||
|
|
||||||
d->m_running = true;
|
d->m_running = true;
|
||||||
|
d->m_allStepsSucceeded = true;
|
||||||
d->m_progressFutureInterface->reportStarted();
|
d->m_progressFutureInterface->reportStarted();
|
||||||
nextStep();
|
nextStep();
|
||||||
} else {
|
} else {
|
||||||
@@ -372,6 +374,7 @@ void BuildManager::nextBuildQueue()
|
|||||||
nextStep();
|
nextStep();
|
||||||
} else {
|
} else {
|
||||||
// Build Failure
|
// Build Failure
|
||||||
|
d->m_allStepsSucceeded = false;
|
||||||
Target *t = d->m_currentBuildStep->target();
|
Target *t = d->m_currentBuildStep->target();
|
||||||
const QString projectName = d->m_currentBuildStep->project()->displayName();
|
const QString projectName = d->m_currentBuildStep->project()->displayName();
|
||||||
const QString targetName = t->displayName();
|
const QString targetName = t->displayName();
|
||||||
@@ -382,10 +385,28 @@ void BuildManager::nextBuildQueue()
|
|||||||
.arg(targetName), BuildStep::OutputFormat::Stderr);
|
.arg(targetName), BuildStep::OutputFormat::Stderr);
|
||||||
}
|
}
|
||||||
addToOutputWindow(tr("When executing step \"%1\"").arg(d->m_currentBuildStep->displayName()), BuildStep::OutputFormat::Stderr);
|
addToOutputWindow(tr("When executing step \"%1\"").arg(d->m_currentBuildStep->displayName()), BuildStep::OutputFormat::Stderr);
|
||||||
// NBS TODO fix in qtconcurrent
|
|
||||||
d->m_progressFutureInterface->setProgressValueAndText(d->m_progress*100, tr("Error while building/deploying project %1 (kit: %2)").arg(projectName, targetName));
|
|
||||||
|
|
||||||
clearBuildQueue();
|
bool abort = ProjectExplorerPlugin::projectExplorerSettings().abortBuildAllOnError;
|
||||||
|
if (!abort) {
|
||||||
|
while (!d->m_buildQueue.isEmpty()
|
||||||
|
&& d->m_buildQueue.front()->target() == t) {
|
||||||
|
BuildStep * const nextStepForFailedTarget = d->m_buildQueue.takeFirst();
|
||||||
|
disconnectOutput(nextStepForFailedTarget);
|
||||||
|
decrementActiveBuildSteps(nextStepForFailedTarget);
|
||||||
|
}
|
||||||
|
if (d->m_buildQueue.isEmpty())
|
||||||
|
abort = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (abort) {
|
||||||
|
// NBS TODO fix in qtconcurrent
|
||||||
|
d->m_progressFutureInterface->setProgressValueAndText(d->m_progress * 100,
|
||||||
|
tr("Error while building/deploying project %1 (kit: %2)")
|
||||||
|
.arg(projectName, targetName));
|
||||||
|
clearBuildQueue();
|
||||||
|
} else {
|
||||||
|
nextStep();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -438,7 +459,7 @@ void BuildManager::nextStep()
|
|||||||
delete d->m_progressFutureInterface;
|
delete d->m_progressFutureInterface;
|
||||||
d->m_progressFutureInterface = nullptr;
|
d->m_progressFutureInterface = nullptr;
|
||||||
d->m_maxProgress = 0;
|
d->m_maxProgress = 0;
|
||||||
emit m_instance->buildQueueFinished(true);
|
emit m_instance->buildQueueFinished(d->m_allStepsSucceeded);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -253,6 +253,8 @@ const char TERMINAL_MODE_SETTINGS_KEY[] = "ProjectExplorer/Settings/TerminalMode
|
|||||||
const char CLOSE_FILES_WITH_PROJECT_SETTINGS_KEY[]
|
const char CLOSE_FILES_WITH_PROJECT_SETTINGS_KEY[]
|
||||||
= "ProjectExplorer/Settings/CloseFilesWithProject";
|
= "ProjectExplorer/Settings/CloseFilesWithProject";
|
||||||
const char CLEAR_ISSUES_ON_REBUILD_SETTINGS_KEY[] = "ProjectExplorer/Settings/ClearIssuesOnRebuild";
|
const char CLEAR_ISSUES_ON_REBUILD_SETTINGS_KEY[] = "ProjectExplorer/Settings/ClearIssuesOnRebuild";
|
||||||
|
const char ABORT_BUILD_ALL_ON_ERROR_SETTINGS_KEY[]
|
||||||
|
= "ProjectExplorer/Settings/AbortBuildAllOnError";
|
||||||
|
|
||||||
} // namespace Constants
|
} // namespace Constants
|
||||||
|
|
||||||
@@ -1379,6 +1381,8 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
|
|||||||
= s->value(Constants::CLOSE_FILES_WITH_PROJECT_SETTINGS_KEY, true).toBool();
|
= s->value(Constants::CLOSE_FILES_WITH_PROJECT_SETTINGS_KEY, true).toBool();
|
||||||
dd->m_projectExplorerSettings.clearIssuesOnRebuild
|
dd->m_projectExplorerSettings.clearIssuesOnRebuild
|
||||||
= s->value(Constants::CLEAR_ISSUES_ON_REBUILD_SETTINGS_KEY, true).toBool();
|
= s->value(Constants::CLEAR_ISSUES_ON_REBUILD_SETTINGS_KEY, true).toBool();
|
||||||
|
dd->m_projectExplorerSettings.abortBuildAllOnError
|
||||||
|
= s->value(Constants::ABORT_BUILD_ALL_ON_ERROR_SETTINGS_KEY, true).toBool();
|
||||||
dd->m_projectExplorerSettings.buildDirectoryTemplate
|
dd->m_projectExplorerSettings.buildDirectoryTemplate
|
||||||
= s->value(Constants::DEFAULT_BUILD_DIRECTORY_TEMPLATE_KEY).toString();
|
= s->value(Constants::DEFAULT_BUILD_DIRECTORY_TEMPLATE_KEY).toString();
|
||||||
if (dd->m_projectExplorerSettings.buildDirectoryTemplate.isEmpty())
|
if (dd->m_projectExplorerSettings.buildDirectoryTemplate.isEmpty())
|
||||||
@@ -1987,6 +1991,8 @@ void ProjectExplorerPluginPrivate::savePersistentSettings()
|
|||||||
dd->m_projectExplorerSettings.closeSourceFilesWithProject);
|
dd->m_projectExplorerSettings.closeSourceFilesWithProject);
|
||||||
s->setValue(Constants::CLEAR_ISSUES_ON_REBUILD_SETTINGS_KEY,
|
s->setValue(Constants::CLEAR_ISSUES_ON_REBUILD_SETTINGS_KEY,
|
||||||
dd->m_projectExplorerSettings.clearIssuesOnRebuild);
|
dd->m_projectExplorerSettings.clearIssuesOnRebuild);
|
||||||
|
s->setValue(Constants::ABORT_BUILD_ALL_ON_ERROR_SETTINGS_KEY,
|
||||||
|
dd->m_projectExplorerSettings.abortBuildAllOnError);
|
||||||
s->setValue(QLatin1String("ProjectExplorer/Settings/AutomaticallyCreateRunConfigurations"),
|
s->setValue(QLatin1String("ProjectExplorer/Settings/AutomaticallyCreateRunConfigurations"),
|
||||||
dd->m_projectExplorerSettings.automaticallyCreateRunConfigurations);
|
dd->m_projectExplorerSettings.automaticallyCreateRunConfigurations);
|
||||||
s->setValue(QLatin1String("ProjectExplorer/Settings/EnvironmentId"), dd->m_projectExplorerSettings.environmentId.toByteArray());
|
s->setValue(QLatin1String("ProjectExplorer/Settings/EnvironmentId"), dd->m_projectExplorerSettings.environmentId.toByteArray());
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ public:
|
|||||||
bool addLibraryPathsToRunEnv = true;
|
bool addLibraryPathsToRunEnv = true;
|
||||||
bool closeSourceFilesWithProject = true;
|
bool closeSourceFilesWithProject = true;
|
||||||
bool clearIssuesOnRebuild = true;
|
bool clearIssuesOnRebuild = true;
|
||||||
|
bool abortBuildAllOnError = true;
|
||||||
StopBeforeBuild stopBeforeBuild = StopBeforeBuild::StopNone;
|
StopBeforeBuild stopBeforeBuild = StopBeforeBuild::StopNone;
|
||||||
TerminalMode terminalMode = TerminalMode::Smart;
|
TerminalMode terminalMode = TerminalMode::Smart;
|
||||||
QString buildDirectoryTemplate;
|
QString buildDirectoryTemplate;
|
||||||
@@ -75,6 +76,7 @@ inline bool operator==(const ProjectExplorerSettings &p1, const ProjectExplorerS
|
|||||||
&& p1.terminalMode == p2.terminalMode
|
&& p1.terminalMode == p2.terminalMode
|
||||||
&& p1.closeSourceFilesWithProject == p2.closeSourceFilesWithProject
|
&& p1.closeSourceFilesWithProject == p2.closeSourceFilesWithProject
|
||||||
&& p1.clearIssuesOnRebuild == p2.clearIssuesOnRebuild
|
&& p1.clearIssuesOnRebuild == p2.clearIssuesOnRebuild
|
||||||
|
&& p1.abortBuildAllOnError == p2.abortBuildAllOnError
|
||||||
&& p1.buildDirectoryTemplate == p2.buildDirectoryTemplate;
|
&& p1.buildDirectoryTemplate == p2.buildDirectoryTemplate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -108,6 +108,7 @@ ProjectExplorerSettings ProjectExplorerSettingsWidget::settings() const
|
|||||||
m_settings.terminalMode = static_cast<TerminalMode>(m_ui.terminalModeComboBox->currentIndex());
|
m_settings.terminalMode = static_cast<TerminalMode>(m_ui.terminalModeComboBox->currentIndex());
|
||||||
m_settings.closeSourceFilesWithProject = m_ui.closeSourceFilesCheckBox->isChecked();
|
m_settings.closeSourceFilesWithProject = m_ui.closeSourceFilesCheckBox->isChecked();
|
||||||
m_settings.clearIssuesOnRebuild = m_ui.clearIssuesCheckBox->isChecked();
|
m_settings.clearIssuesOnRebuild = m_ui.clearIssuesCheckBox->isChecked();
|
||||||
|
m_settings.abortBuildAllOnError = m_ui.abortBuildAllOnErrorCheckBox->isChecked();
|
||||||
m_settings.buildDirectoryTemplate = buildDirectoryTemplate();
|
m_settings.buildDirectoryTemplate = buildDirectoryTemplate();
|
||||||
return m_settings;
|
return m_settings;
|
||||||
}
|
}
|
||||||
@@ -126,6 +127,7 @@ void ProjectExplorerSettingsWidget::setSettings(const ProjectExplorerSettings &
|
|||||||
m_ui.terminalModeComboBox->setCurrentIndex(static_cast<int>(m_settings.terminalMode));
|
m_ui.terminalModeComboBox->setCurrentIndex(static_cast<int>(m_settings.terminalMode));
|
||||||
m_ui.closeSourceFilesCheckBox->setChecked(m_settings.closeSourceFilesWithProject);
|
m_ui.closeSourceFilesCheckBox->setChecked(m_settings.closeSourceFilesWithProject);
|
||||||
m_ui.clearIssuesCheckBox->setChecked(m_settings.clearIssuesOnRebuild);
|
m_ui.clearIssuesCheckBox->setChecked(m_settings.clearIssuesOnRebuild);
|
||||||
|
m_ui.abortBuildAllOnErrorCheckBox->setChecked(m_settings.abortBuildAllOnError);
|
||||||
setBuildDirectoryTemplate(pes.buildDirectoryTemplate);
|
setBuildDirectoryTemplate(pes.buildDirectoryTemplate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -141,6 +141,13 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="abortBuildAllOnErrorCheckBox">
|
||||||
|
<property name="text">
|
||||||
|
<string>Abort on error when building all projects</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QFormLayout" name="formLayout">
|
<layout class="QFormLayout" name="formLayout">
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
@@ -302,6 +309,7 @@
|
|||||||
<zorder>promptToStopRunControlCheckBox</zorder>
|
<zorder>promptToStopRunControlCheckBox</zorder>
|
||||||
<zorder>addLibraryPathsToRunEnvCheckBox</zorder>
|
<zorder>addLibraryPathsToRunEnvCheckBox</zorder>
|
||||||
<zorder>clearIssuesCheckBox</zorder>
|
<zorder>clearIssuesCheckBox</zorder>
|
||||||
|
<zorder>abortBuildAllOnErrorCheckBox</zorder>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
|
|||||||
Reference in New Issue
Block a user