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) :
 | 
			
		||||
    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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
 Submodule src/shared/qbs updated: 8b2decf0b9...451e5ee777
									
								
							
		Reference in New Issue
	
	Block a user