From 473692aa234b48e14a29d430aa8733c1db66198f Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 11 Jul 2014 12:44:12 +0200 Subject: [PATCH] QbsProjectManager: Do not reparse the project after every build. While it is true that additional information about target artifacts can appear during a build, this data is already present in the qbs::Project object and can simply be retrieved. No reparsing is necessary. The exception is when reparsing was requested while the build was going on. In that case, we really need to do it after the build has finished. Change-Id: Ief3797782ad0ca5651974d4b5d3d64e1199ca9a5 Reviewed-by: Joerg Bornemann --- .../qbsprojectmanager/qbsbuildstep.cpp | 32 +++++++++++++------ src/plugins/qbsprojectmanager/qbsbuildstep.h | 2 ++ src/plugins/qbsprojectmanager/qbsproject.cpp | 21 +++++++++--- src/plugins/qbsprojectmanager/qbsproject.h | 5 +++ .../qbsprojectmanagerplugin.cpp | 13 ++++---- 5 files changed, 52 insertions(+), 21 deletions(-) diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp index a67e7a54189..24c03a94ec2 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp @@ -243,24 +243,25 @@ void QbsBuildStep::buildingDone(bool success) item.codeLocation().fileName(), item.codeLocation().line()); QbsProject *pro = static_cast(project()); - connect(pro, SIGNAL(projectParsingDone(bool)), this, SLOT(reparsingDone())); // Building can uncover additional target artifacts. - // Wait for reparsing to finish, since before that our run configurations may not be valid. - pro->parseCurrentBuildConfiguration(true); + pro->updateAfterBuild(); + + // The reparsing, if it is necessary, has to be done before finished() is emitted, as + // otherwise a potential additional build step could conflict with the parsing step. + if (pro->parsingScheduled()) { + connect(pro, SIGNAL(projectParsingDone(bool)), this, SLOT(reparsingDone())); + pro->parseCurrentBuildConfiguration(true); + } else { + finish(); + } } void QbsBuildStep::reparsingDone() { disconnect(static_cast(project()), SIGNAL(projectParsingDone(bool)), this, SLOT(reparsingDone())); - QTC_ASSERT(m_fi, return); - m_fi->reportResult(m_lastWasSuccess); - m_fi = 0; // do not delete, it is not ours - m_job->deleteLater(); - m_job = 0; - - emit finished(); + finish(); } void QbsBuildStep::handleTaskStarted(const QString &desciption, int max) @@ -374,6 +375,17 @@ void QbsBuildStep::setMaxJobs(int jobcount) emit qbsBuildOptionsChanged(); } +void QbsBuildStep::finish() +{ + QTC_ASSERT(m_fi, return); + m_fi->reportResult(m_lastWasSuccess); + m_fi = 0; // do not delete, it is not ours + m_job->deleteLater(); + m_job = 0; + + emit finished(); +} + // -------------------------------------------------------------------- // QbsBuildStepConfigWidget: // -------------------------------------------------------------------- diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.h b/src/plugins/qbsprojectmanager/qbsbuildstep.h index 158eaf20410..dded12290a0 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildstep.h +++ b/src/plugins/qbsprojectmanager/qbsbuildstep.h @@ -98,6 +98,8 @@ private: void setCheckTimestamps(bool ts); void setMaxJobs(int jobcount); + void finish(); + QVariantMap m_qbsConfiguration; qbs::BuildOptions m_qbsBuildOptions; diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 18861fd4c50..eaafb89c818 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -101,6 +101,7 @@ QbsProject::QbsProject(QbsManager *manager, const QString &fileName) : m_qbsProjectParser(0), m_qbsUpdateFutureInterface(0), m_forceParsing(false), + m_parsingScheduled(false), m_currentBc(0) { m_parsingDelay.setInterval(1000); // delay parsing by 1s. @@ -358,17 +359,14 @@ void QbsProject::readQbsData() qbs::ProjectData data = m_rootProjectNode->qbsProjectData(); updateCppCodeModel(data); updateQmlJsCodeModel(data); - updateApplicationTargets(data); - updateDeploymentInfo(project); - - foreach (Target *t, targets()) - t->updateDefaultRunConfigurations(); + updateBuildTargetData(); emit fileListChanged(); } void QbsProject::parseCurrentBuildConfiguration(bool force) { + m_parsingScheduled = false; if (!m_forceParsing) m_forceParsing = force; @@ -380,6 +378,11 @@ void QbsProject::parseCurrentBuildConfiguration(bool force) parse(bc->qbsConfiguration(), bc->environment(), bc->buildDirectory().toString()); } +void QbsProject::updateAfterBuild() +{ + updateBuildTargetData(); +} + void QbsProject::registerQbsProjectParser(QbsProjectParser *p) { m_parsingDelay.stop(); @@ -647,5 +650,13 @@ void QbsProject::updateDeploymentInfo(const qbs::Project &project) activeTarget()->setDeploymentData(deploymentData); } +void QbsProject::updateBuildTargetData() +{ + updateApplicationTargets(m_qbsProject.projectData()); + updateDeploymentInfo(m_qbsProject); + foreach (Target *t, targets()) + t->updateDefaultRunConfigurations(); +} + } // namespace Internal } // namespace QbsProjectManager diff --git a/src/plugins/qbsprojectmanager/qbsproject.h b/src/plugins/qbsprojectmanager/qbsproject.h index 902cb2b6f89..97c01787bc1 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.h +++ b/src/plugins/qbsprojectmanager/qbsproject.h @@ -94,6 +94,9 @@ public: bool isParsing() const; bool hasParseResult() const; void parseCurrentBuildConfiguration(bool force); + void scheduleParsing() { m_parsingScheduled = true; } + bool parsingScheduled() const { return m_parsingScheduled; } + void updateAfterBuild(); void registerQbsProjectParser(QbsProjectParser *p); @@ -136,6 +139,7 @@ private: void updateQmlJsCodeModel(const qbs::ProjectData &prj); void updateApplicationTargets(const qbs::ProjectData &projectData); void updateDeploymentInfo(const qbs::Project &project); + void updateBuildTargetData(); QbsManager *const m_manager; const QString m_projectName; @@ -148,6 +152,7 @@ private: QFutureInterface *m_qbsUpdateFutureInterface; bool m_forceParsing; + bool m_parsingScheduled; QFuture m_codeModelFuture; diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp index 9fdd1c7080e..68bfec5291f 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp +++ b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp @@ -514,14 +514,15 @@ void QbsProjectManagerPlugin::reparseCurrentProject() void QbsProjectManagerPlugin::reparseProject(QbsProject *project) { - if (!project || BuildManager::isBuilding(project)) { - // Qbs does update the build graph during the build. So we cannot - // start to parse while a build is running or we will lose information. - // Just return since the qbsbuildstep will trigger a reparse after the build. + if (!project) return; - } - project->parseCurrentBuildConfiguration(true); + // Qbs does update the build graph during the build. So we cannot + // start to parse while a build is running or we will lose information. + if (BuildManager::isBuilding(project)) + project->scheduleParsing(); + else + project->parseCurrentBuildConfiguration(true); } } // namespace Internal