diff options
author | Andrew Pellegrini <apell@google.com> | 2015-11-18 22:01:15 +0000 |
---|---|---|
committer | Damien Martin-Guillerez <dmarting@google.com> | 2015-11-19 10:04:28 +0000 |
commit | 6f09a5d5e4b9b7b508542a5d62d961e3a077868e (patch) | |
tree | 2a42906d0f187bad90fc8125311dd7a88e9a90ef /src | |
parent | d59c7618d359e8dedca45fbbd7a172ccf5953775 (diff) |
Makes resources defined locally on an android_library rule respect the neverlink attribute.
RELNOTES: Resources defined locally on an android_library rule will respect the neverlink attribute.
--
MOS_MIGRATED_REVID=108178381
Diffstat (limited to 'src')
3 files changed, 33 insertions, 17 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java index 9d9be90ac2..14d98ca2ad 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java @@ -100,8 +100,8 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { try { ResourceDependencies resourceDeps = LocalResourceContainer.definesAndroidResources( ruleContext.attributes()) - ? ResourceDependencies.fromRuleDeps(ruleContext) - : ResourceDependencies.fromRuleResourceAndDeps(ruleContext); + ? ResourceDependencies.fromRuleDeps(ruleContext, false /* neverlink */) + : ResourceDependencies.fromRuleResourceAndDeps(ruleContext, false /* neverlink */); RuleConfiguredTargetBuilder builder = init( ruleContext, filesBuilder, diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java index 45ee650bb4..5abce9af36 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java @@ -84,7 +84,7 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { resourceApk = applicationManifest.packWithDataAndResources( ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_APK), ruleContext, - ResourceDependencies.fromRuleDeps(ruleContext), + ResourceDependencies.fromRuleDeps(ruleContext, JavaCommon.isNeverLink(ruleContext)), ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_R_TXT), ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_SYMBOLS_TXT), ImmutableList.<String>of(), /* configurationFilters */ @@ -103,7 +103,7 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { } } else { resourceApk = ResourceApk.fromTransitiveResources( - ResourceDependencies.fromRuleResourceAndDeps(ruleContext)); + ResourceDependencies.fromRuleResourceAndDeps(ruleContext, false /* neverlink */)); } JavaTargetAttributes javaTargetAttributes = androidCommon.init( 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 a0766e32df..808490cc52 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 @@ -26,7 +26,7 @@ import com.google.devtools.build.lib.rules.android.AndroidResourcesProvider.Reso * Represents a container for the {@link ResourceContainer}s for a given library. This is * abstraction simplifies the process of managing and exporting the direct and transitive resource * dependencies of an android rule, as well as providing type safety. - * + * * <p>The transitive and direct dependencies are not guaranteed to be disjoint. If a * library is included in both the transitive and direct dependencies, it will appear twice. This * requires consumers to manage duplicated resources gracefully. @@ -44,8 +44,12 @@ public 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 boolean neverlink; - public static ResourceDependencies fromRuleResources(RuleContext ruleContext) { + public static ResourceDependencies fromRuleResources(RuleContext ruleContext, boolean neverlink) { if (!hasResourceAttribute(ruleContext)) { return empty(); } @@ -53,33 +57,37 @@ public class ResourceDependencies { NestedSetBuilder<ResourceContainer> transitiveDependencies = NestedSetBuilder.naiveLinkOrder(); NestedSetBuilder<ResourceContainer> directDependencies = NestedSetBuilder.naiveLinkOrder(); extractFromAttribute("resources", ruleContext, transitiveDependencies, directDependencies); - return new ResourceDependencies(transitiveDependencies.build(), directDependencies.build()); + return new ResourceDependencies(neverlink, + transitiveDependencies.build(), directDependencies.build()); } - public static ResourceDependencies fromRuleDeps(RuleContext ruleContext) { + public static ResourceDependencies fromRuleDeps(RuleContext ruleContext, boolean neverlink) { NestedSetBuilder<ResourceContainer> transitiveDependencies = NestedSetBuilder.naiveLinkOrder(); NestedSetBuilder<ResourceContainer> directDependencies = NestedSetBuilder.naiveLinkOrder(); extractFromAttribute("deps", ruleContext, transitiveDependencies, directDependencies); - return new ResourceDependencies(transitiveDependencies.build(), directDependencies.build()); + return new ResourceDependencies(neverlink, + transitiveDependencies.build(), directDependencies.build()); } - public static ResourceDependencies fromRuleResourceAndDeps(RuleContext ruleContext) { + public static ResourceDependencies fromRuleResourceAndDeps(RuleContext ruleContext, + boolean neverlink) { NestedSetBuilder<ResourceContainer> transitiveDependencies = NestedSetBuilder.naiveLinkOrder(); NestedSetBuilder<ResourceContainer> directDependencies = NestedSetBuilder.naiveLinkOrder(); if (hasResourceAttribute(ruleContext)) { - extractFromAttribute("resources",ruleContext, transitiveDependencies, directDependencies); + extractFromAttribute("resources",ruleContext, transitiveDependencies, directDependencies); } if (directDependencies.isEmpty()) { // There are no resources, so this library will forward the direct and transitive dependencies // without changes. extractFromAttribute("deps", ruleContext, transitiveDependencies, directDependencies); } else { - // There are resources, so the direct dependencies and the transitive will be merged into + // 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. extractFromAttribute("deps", ruleContext, transitiveDependencies, transitiveDependencies); } - return new ResourceDependencies(transitiveDependencies.build(), directDependencies.build()); + return new ResourceDependencies(neverlink, + transitiveDependencies.build(), directDependencies.build()); } private static void extractFromAttribute(String attribute, @@ -94,10 +102,10 @@ public class ResourceDependencies { /** * Check for the existence of a "resources" attribute. - * + * * <p>The existence of the resources attribute is not guaranteed on for all android rules, so it * is necessary to check for it. - * + * * @param ruleContext The context to check. * @return True if the ruleContext has resources, otherwise, false. */ @@ -116,14 +124,16 @@ public class ResourceDependencies { * is the only resource dependency. The most common case is the AndroidTest rule. */ public static ResourceDependencies empty() { - return new ResourceDependencies( + return new ResourceDependencies(false, NestedSetBuilder.<ResourceContainer>emptySet(Order.NAIVE_LINK_ORDER), NestedSetBuilder.<ResourceContainer>emptySet(Order.NAIVE_LINK_ORDER)); } - public ResourceDependencies( + private ResourceDependencies( + boolean neverlink, NestedSet<ResourceContainer> transitiveResources, NestedSet<ResourceContainer> directResources) { + this.neverlink = neverlink; this.transitiveResources = transitiveResources; this.directResources = directResources; } @@ -141,6 +151,9 @@ public class ResourceDependencies { * @return A provider with the current resources and label. */ public AndroidResourcesProvider toProvider(Label label, ResourceContainer newDirectResource) { + if (neverlink) { + return ResourceDependencies.empty().toProvider(label); + } return new AndroidResourcesProvider( label, NestedSetBuilder.<ResourceContainer>naiveLinkOrder() @@ -161,6 +174,9 @@ public class ResourceDependencies { * @return A provider with the current resources and label. */ public AndroidResourcesProvider toProvider(Label label) { + if (neverlink) { + return ResourceDependencies.empty().toProvider(label); + } return new AndroidResourcesProvider(label, transitiveResources, directResources); } |