summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/qbsprojectmanager/qbsbuildstep.cpp32
-rw-r--r--src/plugins/qbsprojectmanager/qbsbuildstep.h2
-rw-r--r--src/plugins/qbsprojectmanager/qbsproject.cpp21
-rw-r--r--src/plugins/qbsprojectmanager/qbsproject.h5
-rw-r--r--src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp13
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