diff options
Diffstat (limited to 'src/lib/buildgraph/buildgraph.cpp')
| -rw-r--r-- | src/lib/buildgraph/buildgraph.cpp | 45 |
1 files changed, 31 insertions, 14 deletions
diff --git a/src/lib/buildgraph/buildgraph.cpp b/src/lib/buildgraph/buildgraph.cpp index f8c4f8b6a..81986be49 100644 --- a/src/lib/buildgraph/buildgraph.cpp +++ b/src/lib/buildgraph/buildgraph.cpp @@ -209,14 +209,14 @@ void setupScriptEngineForProduct(ScriptEngine *engine, const ResolvedProductCons rule->module->name.isEmpty() ? QScriptValue() : rule->module->name); } -bool findPath(Artifact *u, Artifact *v, QList<Artifact*> &path) +bool findPath(BuildGraphNode *u, BuildGraphNode *v, QList<BuildGraphNode *> &path) { if (u == v) { path.append(v); return true; } - for (ArtifactList::const_iterator it = u->children.begin(); it != u->children.end(); ++it) { + for (NodeSet::const_iterator it = u->children.begin(); it != u->children.end(); ++it) { if (findPath(*it, v, path)) { path.prepend(u); return true; @@ -235,7 +235,7 @@ bool findPath(Artifact *u, Artifact *v, QList<Artifact*> &path) * also: children means i depend on or i am produced by * parent means "produced by me" or "depends on me" */ -void connect(Artifact *p, Artifact *c) +void connect(BuildGraphNode *p, BuildGraphNode *c) { QBS_CHECK(p != c); p->children.insert(c); @@ -243,28 +243,36 @@ void connect(Artifact *p, Artifact *c) p->product->topLevelProject()->buildData->isDirty = true; } -void loggedConnect(Artifact *u, Artifact *v, const Logger &logger) +void loggedConnect(BuildGraphNode *u, BuildGraphNode *v, const Logger &logger) { QBS_CHECK(u != v); if (logger.traceEnabled()) { logger.qbsTrace() << QString::fromLocal8Bit("[BG] connect '%1' -> '%2'") - .arg(relativeArtifactFileName(u), relativeArtifactFileName(v)); + .arg(u->toString(), v->toString()); } connect(u, v); } -static bool existsPath(Artifact *u, Artifact *v) +static bool existsPath(BuildGraphNode *u, BuildGraphNode *v) { if (u == v) return true; - for (ArtifactList::const_iterator it = u->children.begin(); it != u->children.end(); ++it) + for (NodeSet::const_iterator it = u->children.begin(); it != u->children.end(); ++it) if (existsPath(*it, v)) return true; return false; } +static QStringList toStringList(const QList<BuildGraphNode *> &path) +{ + QStringList lst; + foreach (BuildGraphNode *node, path) + lst << node->toString(); + return lst; +} + bool safeConnect(Artifact *u, Artifact *v, const Logger &logger) { QBS_CHECK(u != v); @@ -274,7 +282,7 @@ bool safeConnect(Artifact *u, Artifact *v, const Logger &logger) } if (existsPath(v, u)) { - QList<Artifact *> circle; + QList<BuildGraphNode *> circle; findPath(v, u, circle); logger.qbsTrace() << "[BG] safeConnect: circle detected " << toStringList(circle); return false; @@ -284,17 +292,22 @@ bool safeConnect(Artifact *u, Artifact *v, const Logger &logger) return true; } -void disconnect(Artifact *u, Artifact *v, const Logger &logger) +void disconnect(BuildGraphNode *u, BuildGraphNode *v, const Logger &logger) { if (logger.traceEnabled()) { logger.qbsTrace() << QString::fromLocal8Bit("[BG] disconnect: '%1' '%2'") - .arg(relativeArtifactFileName(u), relativeArtifactFileName(v)); + .arg(u->toString(), v->toString()); } u->children.remove(v); - u->childrenAddedByScanner.remove(v); v->parents.remove(u); } +void disconnect(Artifact *u, Artifact *v, const Logger &logger) +{ + disconnect(static_cast<BuildGraphNode *>(u), static_cast<BuildGraphNode *>(v), logger); + u->childrenAddedByScanner.remove(v); +} + void removeGeneratedArtifactFromDisk(Artifact *artifact, const Logger &logger) { if (artifact->artifactType != Artifact::Generated) @@ -384,7 +397,7 @@ void insertArtifact(const ResolvedProductPtr &product, Artifact *artifact, const { QBS_CHECK(!artifact->product); QBS_CHECK(!artifact->filePath().isEmpty()); - QBS_CHECK(!product->buildData->artifacts.contains(artifact)); + QBS_CHECK(!product->buildData->nodes.contains(artifact)); #ifdef QT_DEBUG foreach (const ResolvedProductConstPtr &otherProduct, product->project->products) { if (lookupArtifact(otherProduct, artifact->filePath())) { @@ -401,7 +414,7 @@ void insertArtifact(const ResolvedProductPtr &product, Artifact *artifact, const } } #endif - product->buildData->artifacts.insert(artifact); + product->buildData->nodes.insert(artifact); artifact->product = product; product->topLevelProject()->buildData->insertIntoLookupTable(artifact); product->topLevelProject()->buildData->isDirty = true; @@ -414,6 +427,9 @@ void insertArtifact(const ResolvedProductPtr &product, Artifact *artifact, const static void doSanityChecksForProduct(const ResolvedProductConstPtr &product, const Logger &logger) { + Q_UNUSED(product); + Q_UNUSED(logger); +#if 0 logger.qbsDebug() << "Sanity checking product '" << product->name << "'"; CycleDetector cycleDetector(logger); cycleDetector.visitProduct(product); @@ -443,7 +459,7 @@ static void doSanityChecksForProduct(const ResolvedProductConstPtr &product, con QBS_CHECK(transformer); QBS_CHECK(transformer->outputs.contains(artifact)); - ArtifactList transformerOutputChildren; + ArtifactSet transformerOutputChildren; foreach (const Artifact * const output, transformer->outputs) { QBS_CHECK(output->transformer == transformer); transformerOutputChildren.unite(output->children); @@ -460,6 +476,7 @@ static void doSanityChecksForProduct(const ResolvedProductConstPtr &product, con foreach (Artifact * const transformerInput, transformer->inputs) QBS_CHECK(transformerOutputChildren.contains(transformerInput)); } +#endif } static void doSanityChecks(const ResolvedProjectPtr &project, QSet<QString> &productNames, |
