diff options
author | Christian Kandeler <christian.kandeler@digia.com> | 2014-01-29 12:55:06 +0100 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@digia.com> | 2014-01-29 12:59:34 +0100 |
commit | efb117fb659f462ecd8db9d2d3d6ce04d01bbe34 (patch) | |
tree | 22a5d0de2e29795bd4971cd1a0d4596dbf9c21c7 | |
parent | e679b1c6395484f145c309d64f7bb432f661aaac (diff) |
Small refactoring in Executor.
- Reduce the scope of some code only relevant to one respective
function.
- Introduce small functions for identifiable tasks.
As a result, the top-level build function becomes less cluttered and it
is easier to grasp what is going on.
Change-Id: I4a12ad0f3f94211630460d4e51cd0bdfec3c4166
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
-rw-r--r-- | src/lib/corelib/buildgraph/executor.cpp | 94 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/executor.h | 8 |
2 files changed, 54 insertions, 48 deletions
diff --git a/src/lib/corelib/buildgraph/executor.cpp b/src/lib/corelib/buildgraph/executor.cpp index 8e9334020..070b37d97 100644 --- a/src/lib/corelib/buildgraph/executor.cpp +++ b/src/lib/corelib/buildgraph/executor.cpp @@ -244,52 +244,17 @@ void Executor::doBuild() m_project->buildData->evaluationContext = m_evalContext; } - m_logger.qbsDebug() << QString::fromLocal8Bit("[EXEC] preparing executor for %1 jobs " - "in parallel").arg(m_buildOptions.maxJobCount()); - addExecutorJobs(m_buildOptions.maxJobCount()); - foreach (ExecutorJob * const job, m_availableJobs) - job->setDryRun(m_buildOptions.dryRun()); + addExecutorJobs(); bool sourceFilesChanged = false; prepareAllArtifacts(&sourceFilesChanged); - Artifact::BuildState initialBuildState = m_buildOptions.changedFiles().isEmpty() - ? Artifact::Buildable : Artifact::Built; - - QList<Artifact *> changedArtifacts; - foreach (const QString &filePath, m_buildOptions.changedFiles()) { - QList<FileResourceBase *> lookupResults; - lookupResults.append(m_project->buildData->lookupFiles(filePath)); - if (lookupResults.isEmpty()) { - m_logger.qbsWarning() << QString::fromLocal8Bit("Out of date file '%1' provided " - "but not found.").arg(QDir::toNativeSeparators(filePath)); - continue; - } - foreach (FileResourceBase *lookupResult, lookupResults) - if (Artifact *artifact = dynamic_cast<Artifact *>(lookupResult)) - changedArtifacts += artifact; - } - qSort(changedArtifacts); - changedArtifacts.erase(std::unique(changedArtifacts.begin(), changedArtifacts.end()), - changedArtifacts.end()); - - // prepare products - ProductPrioritySetter prioritySetter(m_productsToBuild.first()->topLevelProject()); - prioritySetter.apply(); - foreach (ResolvedProductPtr product, m_productsToBuild) - product->setupBuildEnvironment(m_evalContext->engine(), m_project->environment); - - // find the root nodes - m_roots.clear(); - foreach (const ResolvedProductPtr &product, m_productsToBuild) { - foreach (Artifact *targetArtifact, product->buildData->targetArtifacts) - m_roots += targetArtifact; - } - - prepareReachableArtifacts(initialBuildState); + prepareProducts(); + setupRootNodes(); + prepareReachableArtifacts(); setupProgressObserver(sourceFilesChanged); if (sourceFilesChanged) runAutoMoc(); - initLeaves(changedArtifacts); + initLeaves(); if (!scheduleJobs()) { m_logger.qbsTrace() << "Nothing to do at all, finishing."; QTimer::singleShot(0, this, SLOT(finish())); // Don't call back on the caller. @@ -310,8 +275,25 @@ static void initArtifactsBottomUp(Artifact *artifact) initArtifactsBottomUp(parent); } -void Executor::initLeaves(const QList<Artifact *> &changedArtifacts) +void Executor::initLeaves() { + QList<Artifact *> changedArtifacts; + foreach (const QString &filePath, m_buildOptions.changedFiles()) { + QList<FileResourceBase *> lookupResults; + lookupResults.append(m_project->buildData->lookupFiles(filePath)); + if (lookupResults.isEmpty()) { + m_logger.qbsWarning() << QString::fromLocal8Bit("Out of date file '%1' provided " + "but not found.").arg(QDir::toNativeSeparators(filePath)); + continue; + } + foreach (FileResourceBase *lookupResult, lookupResults) + if (Artifact *artifact = dynamic_cast<Artifact *>(lookupResult)) + changedArtifacts += artifact; + } + qSort(changedArtifacts); + changedArtifacts.erase(std::unique(changedArtifacts.begin(), changedArtifacts.end()), + changedArtifacts.end()); + if (changedArtifacts.isEmpty()) { QSet<Artifact *> seenArtifacts; foreach (Artifact *root, m_roots) @@ -719,12 +701,15 @@ void Executor::handleError(const ErrorInfo &error) cancelJobs(); } -void Executor::addExecutorJobs(int jobNumber) +void Executor::addExecutorJobs() { - for (int i = 1; i <= jobNumber; i++) { + m_logger.qbsDebug() << QString::fromLocal8Bit("[EXEC] preparing executor for %1 jobs " + "in parallel").arg(m_buildOptions.maxJobCount()); + for (int i = 1; i <= m_buildOptions.maxJobCount(); i++) { ExecutorJob *job = new ExecutorJob(m_logger, this); job->setMainThreadScriptEngine(m_evalContext->engine()); job->setObjectName(QString::fromLatin1("J%1").arg(i)); + job->setDryRun(m_buildOptions.dryRun()); m_availableJobs.append(job); connect(job, SIGNAL(reportCommandDescription(QString,QString)), this, SIGNAL(reportCommandDescription(QString,QString)), Qt::QueuedConnection); @@ -863,10 +848,12 @@ void Executor::prepareAllArtifacts(bool *sourceFilesChanged) * Walk the build graph top-down from the roots and for each reachable node N * - mark N as buildable. */ -void Executor::prepareReachableArtifacts(const Artifact::BuildState buildState) +void Executor::prepareReachableArtifacts() { + const Artifact::BuildState initialBuildState = m_buildOptions.changedFiles().isEmpty() + ? Artifact::Buildable : Artifact::Built; foreach (Artifact *root, m_roots) - prepareReachableArtifacts_impl(root, buildState); + prepareReachableArtifacts_impl(root, initialBuildState); } void Executor::prepareReachableArtifacts_impl(Artifact *artifact, @@ -880,6 +867,23 @@ void Executor::prepareReachableArtifacts_impl(Artifact *artifact, prepareReachableArtifacts_impl(child, buildState); } +void Executor::prepareProducts() +{ + ProductPrioritySetter prioritySetter(m_project.data()); + prioritySetter.apply(); + foreach (ResolvedProductPtr product, m_productsToBuild) + product->setupBuildEnvironment(m_evalContext->engine(), m_project->environment); +} + +void Executor::setupRootNodes() +{ + m_roots.clear(); + foreach (const ResolvedProductPtr &product, m_productsToBuild) { + foreach (Artifact *targetArtifact, product->buildData->targetArtifacts) + m_roots += targetArtifact; + } +} + void Executor::updateBuildGraph(Artifact::BuildState buildState) { QSet<Artifact *> seenArtifacts; diff --git a/src/lib/corelib/buildgraph/executor.h b/src/lib/corelib/buildgraph/executor.h index ece3b39a3..446ed8c81 100644 --- a/src/lib/corelib/buildgraph/executor.h +++ b/src/lib/corelib/buildgraph/executor.h @@ -93,18 +93,20 @@ private: void doBuild(); void prepareAllArtifacts(bool *sourceFilesChanged); - void prepareReachableArtifacts(const Artifact::BuildState buildState); + void prepareReachableArtifacts(); void prepareReachableArtifacts_impl(Artifact *artifact, const Artifact::BuildState buildState); + void prepareProducts(); + void setupRootNodes(); void updateBuildGraph(Artifact::BuildState buildState); void updateBuildGraph_impl(Artifact *artifact, Artifact::BuildState buildState, QSet<Artifact *> &seenArtifacts); - void initLeaves(const QList<Artifact *> &changedArtifacts); + void initLeaves(); void initLeavesTopDown(Artifact *artifact, QSet<Artifact *> &seenArtifacts); bool scheduleJobs(); void buildArtifact(Artifact *artifact); void finishJob(ExecutorJob *job, bool success); void finishArtifact(Artifact *artifact); void setState(ExecutorState); - void addExecutorJobs(int jobNumber); + void addExecutorJobs(); void runAutoMoc(); void insertLeavesAfterAddingDependencies(QVector<Artifact *> dependencies); void cancelJobs(); |