diff options
-rw-r--r-- | src/plugins/qbsprojectmanager/qbsbuildstep.cpp | 32 | ||||
-rw-r--r-- | src/plugins/qbsprojectmanager/qbsbuildstep.h | 2 | ||||
-rw-r--r-- | src/plugins/qbsprojectmanager/qbsproject.cpp | 21 | ||||
-rw-r--r-- | src/plugins/qbsprojectmanager/qbsproject.h | 5 | ||||
-rw-r--r-- | src/plugins/qbsprojectmanager/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 a67e7a5418..24c03a94ec 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<QbsProject *>(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<QbsProject *>(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 158eaf2041..dded12290a 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 18861fd4c5..eaafb89c81 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 902cb2b6f8..97c01787bc 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<bool> *m_qbsUpdateFutureInterface; bool m_forceParsing; + bool m_parsingScheduled; QFuture<void> m_codeModelFuture; diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp index 9fdd1c7080..68bfec5291 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 |