QbsProjectManager: Execute rules when parsing a project.

This makes information about build artifacts available before the actual
build starts (as far as the rule implementations allow that), at the
cost of a higher initial project resolving time.

Task-number: QBS-901
Change-Id: I0a223db85001136d359a53d4edc7239350f01701
Reviewed-by: Ulf Hermann <ulf.hermann@theqtcompany.com>
Reviewed-by: Jake Petroules <jake.petroules@theqtcompany.com>
This commit is contained in:
Christian Kandeler
2016-03-02 16:38:00 +01:00
parent da3f3eecc5
commit a57e75884e
3 changed files with 43 additions and 3 deletions

View File

@@ -49,6 +49,7 @@ namespace Internal {
QbsProjectParser::QbsProjectParser(QbsProject *project, QFutureInterface<bool> *fi) :
m_qbsSetupProjectJob(0),
m_ruleExecutionJob(0),
m_fi(fi),
m_currentProgressBase(0)
{
@@ -64,6 +65,12 @@ QbsProjectParser::~QbsProjectParser()
m_qbsSetupProjectJob->deleteLater();
m_qbsSetupProjectJob = 0;
}
if (m_ruleExecutionJob) {
m_ruleExecutionJob->disconnect(this);
m_ruleExecutionJob->cancel();
m_ruleExecutionJob->deleteLater();
m_ruleExecutionJob = 0;
}
m_fi = 0; // we do not own m_fi, do not delete
}
@@ -110,7 +117,10 @@ void QbsProjectParser::parse(const QVariantMap &config, const Environment &env,
void QbsProjectParser::cancel()
{
QTC_ASSERT(m_qbsSetupProjectJob, return);
m_qbsSetupProjectJob->cancel();
if (m_ruleExecutionJob)
m_ruleExecutionJob->cancel();
else
m_qbsSetupProjectJob->cancel();
}
qbs::Project QbsProjectParser::qbsProject() const
@@ -133,7 +143,33 @@ void QbsProjectParser::handleQbsParsingDone(bool success)
// Do not report the operation as canceled here, as we might want to make overlapping
// parses appear atomic to the user.
emit done(success);
if (!success)
emit done(false);
else
startRuleExecution();
}
void QbsProjectParser::startRuleExecution()
{
qbs::BuildOptions options;
options.setExecuteRulesOnly(true);
m_ruleExecutionJob = m_project.buildAllProducts(
options, qbs::Project::ProductSelectionWithNonDefault, this);
connect(m_ruleExecutionJob, &qbs::AbstractJob::finished,
this, &QbsProjectParser::handleRuleExecutionDone);
connect(m_ruleExecutionJob, &qbs::AbstractJob::taskStarted,
this, &QbsProjectParser::handleQbsParsingTaskSetup);
connect(m_ruleExecutionJob, &qbs::AbstractJob::taskProgress,
this, &QbsProjectParser::handleQbsParsingProgress);
}
void QbsProjectParser::handleRuleExecutionDone()
{
QTC_ASSERT(m_ruleExecutionJob, return);
// We always report success here, since execution of some very dynamic rules might fail due
// to artifacts not being present. No genuine errors will get lost, as they will re-appear
// on the next build attempt.
emit done(true);
}
void QbsProjectParser::handleQbsParsingProgress(int progress)

View File

@@ -66,8 +66,12 @@ private:
QString resourcesBaseDirectory() const;
QString libExecDirectory() const;
void startRuleExecution();
void handleRuleExecutionDone();
QString m_projectFilePath;
qbs::SetupProjectJob *m_qbsSetupProjectJob;
qbs::BuildJob *m_ruleExecutionJob;
qbs::ErrorInfo m_error;
qbs::Project m_project;