diff options
| author | Christian Kandeler <christian.kandeler@digia.com> | 2013-09-27 16:23:53 +0200 |
|---|---|---|
| committer | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-09-30 15:13:27 +0200 |
| commit | ff78da7ea63625f9d6d4607e94579fec01be8559 (patch) | |
| tree | b6c3fcb21e4c8b53c61f2b8a72e4519e765e64d3 /src/lib/buildgraph | |
| parent | fdd6cb3195c7845a2b8f32445ab3e38bb951ed60 (diff) | |
| download | qbs-ff78da7ea63625f9d6d4607e94579fec01be8559.tar.gz | |
Do some build graph sanity checks.
Check some invariants after resolving, restoring and change tracking.
Change-Id: I84e92d6f16a96d4a54c928e8cebc06efbf8fde2c
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
Diffstat (limited to 'src/lib/buildgraph')
| -rw-r--r-- | src/lib/buildgraph/artifactlist.h | 4 | ||||
| -rw-r--r-- | src/lib/buildgraph/buildgraph.cpp | 56 | ||||
| -rw-r--r-- | src/lib/buildgraph/buildgraph.h | 2 | ||||
| -rw-r--r-- | src/lib/buildgraph/buildgraphloader.cpp | 3 | ||||
| -rw-r--r-- | src/lib/buildgraph/projectbuilddata.cpp | 3 | ||||
| -rw-r--r-- | src/lib/buildgraph/transformer.h | 2 |
6 files changed, 66 insertions, 4 deletions
diff --git a/src/lib/buildgraph/artifactlist.h b/src/lib/buildgraph/artifactlist.h index e4cc00ad9..ffbe72ba6 100644 --- a/src/lib/buildgraph/artifactlist.h +++ b/src/lib/buildgraph/artifactlist.h @@ -98,6 +98,10 @@ public: // no-op } + bool operator==(const ArtifactList &other) const { return m_data == other.m_data; } + bool operator!=(const ArtifactList &other) const { return !(*this == other); } + + private: std::set<Artifact *> m_data; }; diff --git a/src/lib/buildgraph/buildgraph.cpp b/src/lib/buildgraph/buildgraph.cpp index 34a2eac4e..c336ad7b0 100644 --- a/src/lib/buildgraph/buildgraph.cpp +++ b/src/lib/buildgraph/buildgraph.cpp @@ -29,8 +29,10 @@ #include "buildgraph.h" #include "artifact.h" +#include "cycledetector.h" #include "projectbuilddata.h" #include "productbuilddata.h" +#include "transformer.h" #include <jsextensions/jsextensions.h> #include <jsextensions/moduleproperties.h> @@ -409,5 +411,59 @@ void insertArtifact(const ResolvedProductPtr &product, Artifact *artifact, const } } +static void doSanityChecksForProduct(const ResolvedProductConstPtr &product, const Logger &logger) +{ + logger.qbsDebug() << "Sanity checking product '" << product->name << "'"; + CycleDetector cycleDetector(logger); + cycleDetector.visitProduct(product); + const ProductBuildData * const buildData = product->buildData.data(); + QBS_CHECK(!!product->enabled == !!buildData); + if (!product->enabled) + return; + foreach (Artifact * const artifact, buildData->artifacts) { + logger.qbsDebug() << "Sanity checking artifact '" << artifact->fileName() << "'"; + QBS_CHECK(artifact->product == product); + foreach (const Artifact * const parent, artifact->parents) + QBS_CHECK(parent->children.contains(artifact)); + foreach (const Artifact * const child, artifact->children) + QBS_CHECK(child->parents.contains(artifact)); + const TransformerConstPtr transformer = artifact->transformer; + if (artifact->artifactType == Artifact::SourceFile) + continue; + + QBS_CHECK(transformer); + QBS_CHECK(transformer->outputs.contains(artifact)); + ArtifactList transformerOutputChildren; + foreach (const Artifact * const output, transformer->outputs) { + QBS_CHECK(output->transformer == transformer); + transformerOutputChildren.unite(output->children); + } + if (logger.traceEnabled()) { + logger.qbsTrace() << "The transformer output children are:"; + foreach (const Artifact * const a, transformerOutputChildren) + logger.qbsTrace() << "\t" << a->fileName(); + logger.qbsTrace() << "The transformer inputs are:"; + foreach (const Artifact * const a, transformer->inputs) + logger.qbsTrace() << "\t" << a->fileName(); + } + QBS_CHECK(transformer->inputs.count() <= transformerOutputChildren.count()); + foreach (Artifact * const transformerInput, transformer->inputs) + QBS_CHECK(transformerOutputChildren.contains(transformerInput)); + } +} + +void doSanityChecks(const ResolvedProjectPtr &project, const Logger &logger) +{ + logger.qbsDebug() << "Sanity checking project '" << project->name << "'"; + foreach (const ResolvedProjectPtr &subProject, project->subProjects) + doSanityChecks(subProject, logger); + + foreach (const ResolvedProductConstPtr &product, project->products) { + QBS_CHECK(product->project == project); + QBS_CHECK(product->topLevelProject() == project->topLevelProject()); + doSanityChecksForProduct(product, logger); + } +} + } // namespace Internal } // namespace qbs diff --git a/src/lib/buildgraph/buildgraph.h b/src/lib/buildgraph/buildgraph.h index 4ac59fe07..9f46b1ecb 100644 --- a/src/lib/buildgraph/buildgraph.h +++ b/src/lib/buildgraph/buildgraph.h @@ -79,6 +79,8 @@ void setupScriptEngineForProduct(ScriptEngine *engine, const ResolvedProductCons ScriptPropertyObserver *observer = 0); QString relativeArtifactFileName(const Artifact *artifact); // Debugging helpers +void doSanityChecks(const ResolvedProjectPtr &project, const Logger &logger); + template <typename T> QStringList toStringList(const T &artifactContainer) { diff --git a/src/lib/buildgraph/buildgraphloader.cpp b/src/lib/buildgraph/buildgraphloader.cpp index 511ad4e51..c2cf8b58a 100644 --- a/src/lib/buildgraph/buildgraphloader.cpp +++ b/src/lib/buildgraph/buildgraphloader.cpp @@ -148,6 +148,7 @@ BuildGraphLoadResult BuildGraphLoader::load(const SetupProjectParameters ¶me project->buildDirectory = buildDir; m_result.loadedProject = project; evalContext->incrementProgressValue(); + doSanityChecks(project, m_logger); if (parameters.restoreBehavior() == SetupProjectParameters::RestoreOnly) return m_result; @@ -286,7 +287,7 @@ void BuildGraphLoader::trackProjectChanges(const SetupProjectParameters ¶met oldBuildData.data()); } - CycleDetector(m_logger).visitProject(m_result.newlyResolvedProject); + doSanityChecks(m_result.newlyResolvedProject, m_logger); } bool BuildGraphLoader::hasEnvironmentChanged(const TopLevelProjectConstPtr &restoredProject) const diff --git a/src/lib/buildgraph/projectbuilddata.cpp b/src/lib/buildgraph/projectbuilddata.cpp index e60278ea2..a8798edf5 100644 --- a/src/lib/buildgraph/projectbuilddata.cpp +++ b/src/lib/buildgraph/projectbuilddata.cpp @@ -32,7 +32,6 @@ #include "buildgraph.h" #include "productbuilddata.h" #include "command.h" -#include "cycledetector.h" #include "rulesapplicator.h" #include "rulesevaluationcontext.h" #include "transformer.h" @@ -231,7 +230,7 @@ void BuildDataResolver::resolveBuildData(const TopLevelProjectPtr &resolvedProje evalContext->incrementProgressValue(); } evalContext->incrementProgressValue(); - CycleDetector(m_logger).visitProject(m_project); + doSanityChecks(resolvedProject, m_logger); } void BuildDataResolver::resolveProductBuildDataForExistingProject(const TopLevelProjectPtr &project, diff --git a/src/lib/buildgraph/transformer.h b/src/lib/buildgraph/transformer.h index 35ace34d4..e23cee65e 100644 --- a/src/lib/buildgraph/transformer.h +++ b/src/lib/buildgraph/transformer.h @@ -53,7 +53,7 @@ public: ~Transformer(); - ArtifactList inputs; // can be different from "children of all outputs" + ArtifactList inputs; // Subset of "children of all outputs". ArtifactList outputs; RuleConstPtr rule; QList<AbstractCommand *> commands; |
