summaryrefslogtreecommitdiff
path: root/src/lib/buildgraph
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@digia.com>2013-09-27 16:23:53 +0200
committerJoerg Bornemann <joerg.bornemann@digia.com>2013-09-30 15:13:27 +0200
commitff78da7ea63625f9d6d4607e94579fec01be8559 (patch)
treeb6c3fcb21e4c8b53c61f2b8a72e4519e765e64d3 /src/lib/buildgraph
parentfdd6cb3195c7845a2b8f32445ab3e38bb951ed60 (diff)
downloadqbs-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.h4
-rw-r--r--src/lib/buildgraph/buildgraph.cpp56
-rw-r--r--src/lib/buildgraph/buildgraph.h2
-rw-r--r--src/lib/buildgraph/buildgraphloader.cpp3
-rw-r--r--src/lib/buildgraph/projectbuilddata.cpp3
-rw-r--r--src/lib/buildgraph/transformer.h2
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 &parame
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 &paramet
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;