diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/android/ResourceDependencies.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/android/ResourceDependencies.java | 260 |
1 files changed, 234 insertions, 26 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceDependencies.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceDependencies.java index 92d4eebdbb..a41319016c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceDependencies.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceDependencies.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.rules.android; import com.google.common.collect.ImmutableList; +import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.cmdline.Label; @@ -47,9 +48,20 @@ public final class ResourceDependencies { * properly maintain ordering and ease of merging. */ private final NestedSet<ResourceContainer> directResources; - /** - * Whether the resources of the current rule should be treated as neverlink. - */ + + private final NestedSet<Artifact> transitiveResourceRoots; + + private final NestedSet<Artifact> transitiveManifests; + + private final NestedSet<Artifact> transitiveAapt2RTxt; + + private final NestedSet<Artifact> transitiveSymbolsBin; + + private final NestedSet<Artifact> transitiveStaticLib; + + private final NestedSet<Artifact> transitiveRTxt; + + /** Whether the resources of the current rule should be treated as neverlink. */ private final boolean neverlink; public static ResourceDependencies fromRuleResources(RuleContext ruleContext, boolean neverlink) { @@ -59,48 +71,143 @@ public final class ResourceDependencies { NestedSetBuilder<ResourceContainer> transitiveDependencies = NestedSetBuilder.naiveLinkOrder(); NestedSetBuilder<ResourceContainer> directDependencies = NestedSetBuilder.naiveLinkOrder(); + NestedSetBuilder<Artifact> transitiveResourceRoots = NestedSetBuilder.naiveLinkOrder(); + NestedSetBuilder<Artifact> transitiveManifests = NestedSetBuilder.naiveLinkOrder(); + NestedSetBuilder<Artifact> transitiveAapt2RTxt = NestedSetBuilder.naiveLinkOrder(); + NestedSetBuilder<Artifact> transitiveSymbolsBin = NestedSetBuilder.naiveLinkOrder(); + NestedSetBuilder<Artifact> transitiveStaticLib = NestedSetBuilder.naiveLinkOrder(); + NestedSetBuilder<Artifact> transitiveRTxt = NestedSetBuilder.naiveLinkOrder(); extractFromAttributes( - ImmutableList.of("resources"), ruleContext, transitiveDependencies, directDependencies); - return new ResourceDependencies(neverlink, - transitiveDependencies.build(), directDependencies.build()); + ImmutableList.of("resources"), + ruleContext, + transitiveDependencies, + directDependencies, + transitiveResourceRoots, + transitiveManifests, + transitiveAapt2RTxt, + transitiveSymbolsBin, + transitiveStaticLib, + transitiveRTxt); + return new ResourceDependencies( + neverlink, + transitiveDependencies.build(), + directDependencies.build(), + transitiveResourceRoots.build(), + transitiveManifests.build(), + transitiveAapt2RTxt.build(), + transitiveSymbolsBin.build(), + transitiveStaticLib.build(), + transitiveRTxt.build()); } public static ResourceDependencies fromRuleDeps(RuleContext ruleContext, boolean neverlink) { NestedSetBuilder<ResourceContainer> transitiveDependencies = NestedSetBuilder.naiveLinkOrder(); NestedSetBuilder<ResourceContainer> directDependencies = NestedSetBuilder.naiveLinkOrder(); - extractFromAttributes(AndroidCommon.TRANSITIVE_ATTRIBUTES, ruleContext, transitiveDependencies, - directDependencies); - return new ResourceDependencies(neverlink, - transitiveDependencies.build(), directDependencies.build()); + NestedSetBuilder<Artifact> transitiveResourceRoots = NestedSetBuilder.naiveLinkOrder(); + NestedSetBuilder<Artifact> transitiveManifests = NestedSetBuilder.naiveLinkOrder(); + NestedSetBuilder<Artifact> transitiveAapt2RTxt = NestedSetBuilder.naiveLinkOrder(); + NestedSetBuilder<Artifact> transitiveSymbolsBin = NestedSetBuilder.naiveLinkOrder(); + NestedSetBuilder<Artifact> transitiveStaticLib = NestedSetBuilder.naiveLinkOrder(); + NestedSetBuilder<Artifact> transitiveRTxt = NestedSetBuilder.naiveLinkOrder(); + extractFromAttributes( + AndroidCommon.TRANSITIVE_ATTRIBUTES, + ruleContext, + transitiveDependencies, + directDependencies, + transitiveResourceRoots, + transitiveManifests, + transitiveAapt2RTxt, + transitiveSymbolsBin, + transitiveStaticLib, + transitiveRTxt); + return new ResourceDependencies( + neverlink, + transitiveDependencies.build(), + directDependencies.build(), + transitiveResourceRoots.build(), + transitiveManifests.build(), + transitiveAapt2RTxt.build(), + transitiveSymbolsBin.build(), + transitiveStaticLib.build(), + transitiveRTxt.build()); } public static ResourceDependencies fromRuleResourceAndDeps(RuleContext ruleContext, boolean neverlink) { NestedSetBuilder<ResourceContainer> transitiveDependencies = NestedSetBuilder.naiveLinkOrder(); NestedSetBuilder<ResourceContainer> directDependencies = NestedSetBuilder.naiveLinkOrder(); + NestedSetBuilder<Artifact> transitiveResourceRoots = NestedSetBuilder.naiveLinkOrder(); + NestedSetBuilder<Artifact> transitiveManifests = NestedSetBuilder.naiveLinkOrder(); + NestedSetBuilder<Artifact> transitiveAapt2RTxt = NestedSetBuilder.naiveLinkOrder(); + NestedSetBuilder<Artifact> transitiveSymbolsBin = NestedSetBuilder.naiveLinkOrder(); + NestedSetBuilder<Artifact> transitiveStaticLib = NestedSetBuilder.naiveLinkOrder(); + NestedSetBuilder<Artifact> transitiveRTxt = NestedSetBuilder.naiveLinkOrder(); if (hasResourceAttribute(ruleContext)) { extractFromAttributes( - ImmutableList.of("resources"), ruleContext, transitiveDependencies, directDependencies); + ImmutableList.of("resources"), + ruleContext, + transitiveDependencies, + directDependencies, + transitiveResourceRoots, + transitiveManifests, + transitiveAapt2RTxt, + transitiveSymbolsBin, + transitiveStaticLib, + transitiveRTxt); } if (directDependencies.isEmpty()) { // There are no resources, so this library will forward the direct and transitive dependencies // without changes. - extractFromAttributes(AndroidCommon.TRANSITIVE_ATTRIBUTES, ruleContext, - transitiveDependencies, directDependencies); + extractFromAttributes( + AndroidCommon.TRANSITIVE_ATTRIBUTES, + ruleContext, + transitiveDependencies, + directDependencies, + transitiveResourceRoots, + transitiveManifests, + transitiveAapt2RTxt, + transitiveSymbolsBin, + transitiveStaticLib, + transitiveRTxt); } else { // There are resources, so the direct dependencies and the transitive will be merged into // the transitive dependencies. This maintains the relationship of the resources being // directly on the rule. - extractFromAttributes(AndroidCommon.TRANSITIVE_ATTRIBUTES, ruleContext, - transitiveDependencies, transitiveDependencies); + extractFromAttributes( + AndroidCommon.TRANSITIVE_ATTRIBUTES, + ruleContext, + transitiveDependencies, + transitiveDependencies, + transitiveResourceRoots, + transitiveManifests, + transitiveAapt2RTxt, + transitiveSymbolsBin, + transitiveStaticLib, + transitiveRTxt); } - return new ResourceDependencies(neverlink, - transitiveDependencies.build(), directDependencies.build()); + return new ResourceDependencies( + neverlink, + transitiveDependencies.build(), + directDependencies.build(), + transitiveResourceRoots.build(), + transitiveManifests.build(), + transitiveAapt2RTxt.build(), + transitiveSymbolsBin.build(), + transitiveStaticLib.build(), + transitiveRTxt.build()); } - private static void extractFromAttributes(Iterable<String> attributeNames, - RuleContext ruleContext, NestedSetBuilder<ResourceContainer> builderForTransitive, - NestedSetBuilder<ResourceContainer> builderForDirect) { + private static void extractFromAttributes( + Iterable<String> attributeNames, + RuleContext ruleContext, + NestedSetBuilder<ResourceContainer> builderForTransitive, + NestedSetBuilder<ResourceContainer> builderForDirect, + NestedSetBuilder<Artifact> transitiveResourceRoots, + NestedSetBuilder<Artifact> transitiveManifests, + NestedSetBuilder<Artifact> transitiveAapt2RTxt, + NestedSetBuilder<Artifact> transitiveSymbolsBin, + NestedSetBuilder<Artifact> transitiveStaticLib, + NestedSetBuilder<Artifact> transitiveRTxt) { AttributeMap attributes = ruleContext.attributes(); for (String attr : attributeNames) { if (!attributes.has(attr, BuildType.LABEL_LIST) && !attributes.has(attr, BuildType.LABEL)) { @@ -110,6 +217,12 @@ public final class ResourceDependencies { ruleContext.getPrerequisites(attr, Mode.TARGET, AndroidResourcesProvider.class)) { builderForTransitive.addTransitive(resources.getTransitiveAndroidResources()); builderForDirect.addTransitive(resources.getDirectAndroidResources()); + transitiveResourceRoots.addTransitive(resources.getTransitiveResourceRoots()); + transitiveManifests.addTransitive(resources.getTransitiveManifests()); + transitiveAapt2RTxt.addTransitive(resources.getTransitiveAapt2RTxt()); + transitiveSymbolsBin.addTransitive(resources.getTransitiveSymbolsBin()); + transitiveStaticLib.addTransitive(resources.getTransitiveStaticLib()); + transitiveRTxt.addTransitive(resources.getTransitiveRTxt()); } } } @@ -138,26 +251,54 @@ public final class ResourceDependencies { * is the only resource dependency. The most common case is the AndroidTest rule. */ public static ResourceDependencies empty() { - return new ResourceDependencies(false, - NestedSetBuilder.<ResourceContainer>emptySet(Order.NAIVE_LINK_ORDER), - NestedSetBuilder.<ResourceContainer>emptySet(Order.NAIVE_LINK_ORDER)); + return new ResourceDependencies( + false, + NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER), + NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER), + NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER), + NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER), + NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER), + NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER), + NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER), + NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER)); } private ResourceDependencies( boolean neverlink, NestedSet<ResourceContainer> transitiveResources, - NestedSet<ResourceContainer> directResources) { + NestedSet<ResourceContainer> directResources, + NestedSet<Artifact> transitiveResourceRoots, + NestedSet<Artifact> transitiveManifests, + NestedSet<Artifact> transitiveAapt2RTxt, + NestedSet<Artifact> transitiveSymbolsBin, + NestedSet<Artifact> transitiveStaticLib, + NestedSet<Artifact> transitiveRTxt) { this.neverlink = neverlink; this.transitiveResources = transitiveResources; this.directResources = directResources; + this.transitiveResourceRoots = transitiveResourceRoots; + this.transitiveManifests = transitiveManifests; + this.transitiveAapt2RTxt = transitiveAapt2RTxt; + this.transitiveSymbolsBin = transitiveSymbolsBin; + this.transitiveStaticLib = transitiveStaticLib; + this.transitiveRTxt = transitiveRTxt; } /** Returns a copy of this instance with filtered resources. The original object is unchanged. */ public ResourceDependencies filter(RuleContext ruleContext, ResourceFilter filter) { + // Note that this doesn't filter any of the dependent artifacts. This + // means that if any resource changes, the corresponding actions will get + // re-executed return new ResourceDependencies( neverlink, filter.filterDependencies(ruleContext, transitiveResources), - filter.filterDependencies(ruleContext, directResources)); + filter.filterDependencies(ruleContext, directResources), + transitiveResourceRoots, + transitiveManifests, + transitiveAapt2RTxt, + transitiveSymbolsBin, + transitiveStaticLib, + transitiveRTxt); } /** @@ -180,6 +321,34 @@ public final class ResourceDependencies { if (neverlink) { return ResourceDependencies.empty().toProvider(label, isResourcesOnly); } + NestedSetBuilder<Artifact> transitiveResourceRoots = NestedSetBuilder.naiveLinkOrder(); + transitiveResourceRoots.addTransitive(this.transitiveResourceRoots); + transitiveResourceRoots.addAll(newDirectResource.getArtifacts()); + NestedSetBuilder<Artifact> transitiveManifests = NestedSetBuilder.naiveLinkOrder(); + transitiveManifests.addTransitive(this.transitiveManifests); + if (newDirectResource.getManifest() != null) { + transitiveManifests.add(newDirectResource.getManifest()); + } + NestedSetBuilder<Artifact> transitiveAapt2RTxt = NestedSetBuilder.naiveLinkOrder(); + transitiveAapt2RTxt.addTransitive(this.transitiveAapt2RTxt); + if (newDirectResource.getAapt2RTxt() != null) { + transitiveAapt2RTxt.add(newDirectResource.getAapt2RTxt()); + } + NestedSetBuilder<Artifact> transitiveSymbolsBin = NestedSetBuilder.naiveLinkOrder(); + transitiveSymbolsBin.addTransitive(this.transitiveSymbolsBin); + if (newDirectResource.getSymbols() != null) { + transitiveSymbolsBin.add(newDirectResource.getSymbols()); + } + NestedSetBuilder<Artifact> transitiveStaticLib = NestedSetBuilder.naiveLinkOrder(); + transitiveStaticLib.addTransitive(this.transitiveStaticLib); + if (newDirectResource.getStaticLibrary() != null) { + transitiveStaticLib.add(newDirectResource.getStaticLibrary()); + } + NestedSetBuilder<Artifact> transitiveRTxt = NestedSetBuilder.naiveLinkOrder(); + transitiveRTxt.addTransitive(this.transitiveRTxt); + if (newDirectResource.getRTxt() != null) { + transitiveRTxt.add(newDirectResource.getRTxt()); + } return AndroidResourcesProvider.create( label, NestedSetBuilder.<ResourceContainer>naiveLinkOrder() @@ -187,6 +356,12 @@ public final class ResourceDependencies { .addTransitive(directResources) .build(), NestedSetBuilder.<ResourceContainer>naiveLinkOrder().add(newDirectResource).build(), + transitiveResourceRoots.build(), + transitiveManifests.build(), + transitiveAapt2RTxt.build(), + transitiveSymbolsBin.build(), + transitiveStaticLib.build(), + transitiveRTxt.build(), isResourcesOnly); } @@ -208,7 +383,16 @@ public final class ResourceDependencies { return ResourceDependencies.empty().toProvider(label, isResourcesOnly); } return AndroidResourcesProvider.create( - label, transitiveResources, directResources, isResourcesOnly); + label, + transitiveResources, + directResources, + transitiveResourceRoots, + transitiveManifests, + transitiveAapt2RTxt, + transitiveSymbolsBin, + transitiveStaticLib, + transitiveRTxt, + isResourcesOnly); } /** Provides an NestedSet of the direct and transitive resources. */ @@ -226,4 +410,28 @@ public final class ResourceDependencies { public NestedSet<ResourceContainer> getDirectResources() { return directResources; } + + public NestedSet<Artifact> getTransitiveResourceRoots() { + return transitiveResourceRoots; + } + + public NestedSet<Artifact> getTransitiveManifests() { + return transitiveManifests; + } + + public NestedSet<Artifact> getTransitiveAapt2RTxt() { + return transitiveAapt2RTxt; + } + + public NestedSet<Artifact> getTransitiveSymbolsBin() { + return transitiveSymbolsBin; + } + + public NestedSet<Artifact> getTransitiveStaticLib() { + return transitiveStaticLib; + } + + public NestedSet<Artifact> getTransitiveRTxt() { + return transitiveRTxt; + } } |