diff options
author | Joerg Bornemann <joerg.bornemann@digia.com> | 2014-02-10 18:08:01 +0100 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@digia.com> | 2014-02-13 15:33:27 +0100 |
commit | e73f60919079fc7cb0f0ad6d50b1a364c7b0d2a6 (patch) | |
tree | 3ce15f1f9b336063d591999ce325ce28a6e21320 /src/lib/corelib/api | |
parent | a3634a6bbb193c47cdec887a6b29356c979961aa (diff) |
support transformers with an unknown number of outputs
To support different types of nodes in the build graph, we introduce
the base class BuildGraphNode. Artifact now derives from BuildGraphNode.
A RuleNode class is introduced that represents a rule in the build graph.
Rules are applied in the build phase and not in a pre-build phase
anymore.
The handling of moc has been revisited. The fixed automoc pre-build
phase is no more.
This is the squashed merge of a feature branch.
Task-number: QBS-370
Change-Id: If27cdc51cba8c9542e4282c2caa456faa723aeff
Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
Diffstat (limited to 'src/lib/corelib/api')
-rw-r--r-- | src/lib/corelib/api/project.cpp | 25 |
1 files changed, 7 insertions, 18 deletions
diff --git a/src/lib/corelib/api/project.cpp b/src/lib/corelib/api/project.cpp index b9e9b4583..99b2eeac0 100644 --- a/src/lib/corelib/api/project.cpp +++ b/src/lib/corelib/api/project.cpp @@ -438,18 +438,10 @@ void ProjectPrivate::addFiles(const ProductData &product, const GroupData &group groupContext.resolvedGroup->files << artifact; } if (groupContext.resolvedProduct->enabled) { - ArtifactsPerFileTagMap artifactsPerFileTag; foreach (const SourceArtifactConstPtr &sa, addedSourceArtifacts) { Artifact * const artifact = createArtifact(groupContext.resolvedProduct, sa, logger); - foreach (const FileTag &ft, artifact->fileTags) - artifactsPerFileTag[ft] += artifact; + groupContext.resolvedProduct->registerAddedArtifact(artifact); } - RulesEvaluationContextPtr &evalContext - = groupContext.resolvedProduct->topLevelProject()->buildData->evaluationContext; - evalContext = QSharedPointer<RulesEvaluationContext>(new RulesEvaluationContext(logger)); - RulesApplicator(groupContext.resolvedProduct, artifactsPerFileTag, logger).applyAllRules(); - addTargetArtifacts(groupContext.resolvedProduct, artifactsPerFileTag, logger); - evalContext.clear(); } doSanityChecks(internalProject, logger); groupContext.currentGroup.d->filePaths << filesContext.absoluteFilePaths; @@ -521,14 +513,10 @@ void ProjectPrivate::removeFilesFromBuildGraph(const ResolvedProductConstPtr &pr QBS_CHECK(internalProject->buildData); foreach (const SourceArtifactPtr &sa, files) { Artifact * const artifact = lookupArtifact(product, sa->absoluteFilePath); - QBS_CHECK(artifact); - internalProject->buildData->removeArtifactAndExclusiveDependents(artifact, logger); + if (artifact) // Can be null if the executor has not yet applied the respective rule. + internalProject->buildData->removeArtifactAndExclusiveDependents(artifact, logger); + delete artifact; } - RulesEvaluationContextPtr &evalContext - = internalProject->buildData->evaluationContext; - evalContext = QSharedPointer<RulesEvaluationContext>(new RulesEvaluationContext(logger)); - internalProject->buildData->updateNodesThatMustGetNewTransformer(logger); - evalContext.clear(); } static void updateLocationIfNecessary(CodeLocation &location, const CodeLocation &changeLocation, @@ -611,7 +599,7 @@ void ProjectPrivate::retrieveProjectData(ProjectData &projectData, product.d->groups << createGroupDataFromGroup(resolvedGroup); if (resolvedProduct->enabled) { QBS_CHECK(resolvedProduct->buildData); - foreach (const Artifact * const a, resolvedProduct->buildData->targetArtifacts) { + foreach (const Artifact * const a, resolvedProduct->buildData->targetArtifacts()) { TargetArtifact ta; ta.d->filePath = a->filePath(); ta.d->fileTags = a->fileTags.toStringList(); @@ -864,7 +852,8 @@ QList<InstallableFile> Project::installableFilesForProduct(const ProductData &pr } if (internalProduct->enabled) { QBS_CHECK(internalProduct->buildData); - foreach (const Artifact * const artifact, internalProduct->buildData->artifacts) { + foreach (const Artifact * const artifact, + ArtifactSet::fromNodeSet(internalProduct->buildData->nodes)) { if (artifact->artifactType == Artifact::SourceFile) continue; InstallableFile f; |