forked from qt-creator/qt-creator
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:
@@ -49,6 +49,7 @@ namespace Internal {
|
|||||||
|
|
||||||
QbsProjectParser::QbsProjectParser(QbsProject *project, QFutureInterface<bool> *fi) :
|
QbsProjectParser::QbsProjectParser(QbsProject *project, QFutureInterface<bool> *fi) :
|
||||||
m_qbsSetupProjectJob(0),
|
m_qbsSetupProjectJob(0),
|
||||||
|
m_ruleExecutionJob(0),
|
||||||
m_fi(fi),
|
m_fi(fi),
|
||||||
m_currentProgressBase(0)
|
m_currentProgressBase(0)
|
||||||
{
|
{
|
||||||
@@ -64,6 +65,12 @@ QbsProjectParser::~QbsProjectParser()
|
|||||||
m_qbsSetupProjectJob->deleteLater();
|
m_qbsSetupProjectJob->deleteLater();
|
||||||
m_qbsSetupProjectJob = 0;
|
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
|
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()
|
void QbsProjectParser::cancel()
|
||||||
{
|
{
|
||||||
QTC_ASSERT(m_qbsSetupProjectJob, return);
|
QTC_ASSERT(m_qbsSetupProjectJob, return);
|
||||||
m_qbsSetupProjectJob->cancel();
|
if (m_ruleExecutionJob)
|
||||||
|
m_ruleExecutionJob->cancel();
|
||||||
|
else
|
||||||
|
m_qbsSetupProjectJob->cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
qbs::Project QbsProjectParser::qbsProject() const
|
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
|
// Do not report the operation as canceled here, as we might want to make overlapping
|
||||||
// parses appear atomic to the user.
|
// 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)
|
void QbsProjectParser::handleQbsParsingProgress(int progress)
|
||||||
|
@@ -66,8 +66,12 @@ private:
|
|||||||
QString resourcesBaseDirectory() const;
|
QString resourcesBaseDirectory() const;
|
||||||
QString libExecDirectory() const;
|
QString libExecDirectory() const;
|
||||||
|
|
||||||
|
void startRuleExecution();
|
||||||
|
void handleRuleExecutionDone();
|
||||||
|
|
||||||
QString m_projectFilePath;
|
QString m_projectFilePath;
|
||||||
qbs::SetupProjectJob *m_qbsSetupProjectJob;
|
qbs::SetupProjectJob *m_qbsSetupProjectJob;
|
||||||
|
qbs::BuildJob *m_ruleExecutionJob;
|
||||||
qbs::ErrorInfo m_error;
|
qbs::ErrorInfo m_error;
|
||||||
qbs::Project m_project;
|
qbs::Project m_project;
|
||||||
|
|
||||||
|
Submodule src/shared/qbs updated: 8b2decf0b9...451e5ee777
Reference in New Issue
Block a user