diff options
Diffstat (limited to 'src/lib/buildgraph/buildgraph.cpp')
| -rw-r--r-- | src/lib/buildgraph/buildgraph.cpp | 56 |
1 files changed, 56 insertions, 0 deletions
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 |
