aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2015-12-06 18:31:53 +0000
committerGravatar David Chen <dzc@google.com>2015-12-07 21:15:45 +0000
commit03083858837c804f7992e6f5d27f39acdb66d61a (patch)
tree611b3815243c92c8d90499b96b681627410bdda3 /src/main
parent2ec1b0ae403345b9a9add4d84fe65d6f92bc375b (diff)
Fix android_library resources handling
RELNOTES: Fix resource handling for exported android_library rules -- MOS_MIGRATED_REVID=109532253
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java30
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlHelper.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ResourceDependencies.java31
5 files changed, 52 insertions, 24 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index d95e95cb2e..77ad11727c 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -561,7 +561,12 @@ public final class RuleContext extends TargetContext
return getDerivedArtifact(getUniqueDirectory(uniqueDirectory).getRelative(relative), root);
}
- private Attribute getAttribute(String attributeName) {
+ /**
+ * Returns the Attribute associated with this name, if it's a valid attribute for this rule,
+ * or is associated with an attached aspect. Otherwise returns null.
+ */
+ @Nullable
+ public Attribute getAttribute(String attributeName) {
Attribute result = getRule().getAttributeDefinition(attributeName);
if (result != null) {
return result;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
index 7c4d3e9b32..11c9b0b7e0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
@@ -19,6 +19,7 @@ import static com.google.devtools.build.lib.analysis.config.BuildConfiguration.S
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.ResourceSet;
import com.google.devtools.build.lib.analysis.AnalysisUtils;
@@ -30,9 +31,11 @@ import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.Runfiles;
import com.google.devtools.build.lib.analysis.RunfilesProvider;
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
import com.google.devtools.build.lib.analysis.actions.FileWriteAction;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration.StrictDepsMode;
+import com.google.devtools.build.lib.collect.IterablesChain;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
@@ -69,6 +72,7 @@ import com.google.devtools.build.lib.vfs.PathFragment;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
+import java.util.Set;
import javax.annotation.Nullable;
@@ -83,6 +87,22 @@ public class AndroidCommon {
public static final InstrumentationSpec ANDROID_COLLECTION_SPEC = JavaCommon.JAVA_COLLECTION_SPEC
.withDependencyAttributes("deps", "data", "exports", "runtime_deps", "binary_under_test");
+ public static final Set<String> TRANSITIVE_ATTRIBUTES = ImmutableSet.of(
+ "deps",
+ "exports"
+ );
+
+ public static final <T extends TransitiveInfoProvider> Iterable<T> getTransitivePrerequisites(
+ RuleContext ruleContext, Mode mode, final Class<T> classType) {
+ IterablesChain.Builder<T> builder = IterablesChain.builder();
+ for (String attr : TRANSITIVE_ATTRIBUTES) {
+ if (ruleContext.getAttribute(attr) != null) {
+ builder.add(ruleContext.getPrerequisites(attr, mode, classType));
+ }
+ }
+ return builder.build();
+ }
+
private final RuleContext ruleContext;
private final JavaCommon javaCommon;
private final boolean asNeverLink;
@@ -642,14 +662,6 @@ public class AndroidCommon {
return prerequisite.getProvider(AndroidResourcesProvider.class);
}
- public static NestedSet<Artifact> getApplicationApks(RuleContext ruleContext) {
- NestedSetBuilder<Artifact> applicationApksBuilder = NestedSetBuilder.stableOrder();
- for (ApkProvider dep : ruleContext.getPrerequisites("deps", Mode.TARGET, ApkProvider.class)) {
- applicationApksBuilder.addTransitive(dep.getTransitiveApks());
- }
- return applicationApksBuilder.build();
- }
-
/**
* Collects Java compilation arguments for this target.
*
@@ -728,7 +740,7 @@ public class AndroidCommon {
private NestedSet<Artifact> collectHiddenTopLevelArtifacts(RuleContext ruleContext) {
NestedSetBuilder<Artifact> builder = NestedSetBuilder.stableOrder();
for (OutputGroupProvider provider :
- ruleContext.getPrerequisites("deps", Mode.TARGET, OutputGroupProvider.class)) {
+ getTransitivePrerequisites(ruleContext, Mode.TARGET, OutputGroupProvider.class)) {
builder.addTransitive(provider.getOutputGroup(OutputGroupProvider.HIDDEN_TOP_LEVEL));
}
return builder.build();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlHelper.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlHelper.java
index 3547eef1e7..dc00cbb369 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlHelper.java
@@ -313,8 +313,8 @@ public class AndroidIdlHelper {
jarsBuilder.add(idlSourceJar);
}
- for (AndroidIdlProvider dep : ruleContext.getPrerequisites(
- "deps", Mode.TARGET, AndroidIdlProvider.class)) {
+ for (AndroidIdlProvider dep : AndroidCommon.getTransitivePrerequisites(
+ ruleContext, Mode.TARGET, AndroidIdlProvider.class)) {
rootsBuilder.addTransitive(dep.getTransitiveIdlImportRoots());
importsBuilder.addTransitive(dep.getTransitiveIdlImports());
jarsBuilder.addTransitive(dep.getTransitiveIdlJars());
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 3474032759..f2658c9b9e 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
@@ -219,8 +219,8 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory {
private NestedSetBuilder<Aar> collectTransitiveAars(RuleContext ruleContext) {
NestedSetBuilder<Aar> builder = NestedSetBuilder.naiveLinkOrder();
- for (AndroidLibraryAarProvider library :
- ruleContext.getPrerequisites("deps", Mode.TARGET, AndroidLibraryAarProvider.class)) {
+ for (AndroidLibraryAarProvider library : AndroidCommon.getTransitivePrerequisites(
+ ruleContext, Mode.TARGET, AndroidLibraryAarProvider.class)) {
builder.addTransitive(library.getTransitiveAars());
}
return builder;
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 808490cc52..dfd4df3f79 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
@@ -13,6 +13,7 @@
// limitations under the License.
package com.google.devtools.build.lib.rules.android;
+import com.google.common.collect.ImmutableList;
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;
@@ -56,7 +57,8 @@ public class ResourceDependencies {
NestedSetBuilder<ResourceContainer> transitiveDependencies = NestedSetBuilder.naiveLinkOrder();
NestedSetBuilder<ResourceContainer> directDependencies = NestedSetBuilder.naiveLinkOrder();
- extractFromAttribute("resources", ruleContext, transitiveDependencies, directDependencies);
+ extractFromAttributes(
+ ImmutableList.of("resources"), ruleContext, transitiveDependencies, directDependencies);
return new ResourceDependencies(neverlink,
transitiveDependencies.build(), directDependencies.build());
}
@@ -64,7 +66,8 @@ public class ResourceDependencies {
public static ResourceDependencies fromRuleDeps(RuleContext ruleContext, boolean neverlink) {
NestedSetBuilder<ResourceContainer> transitiveDependencies = NestedSetBuilder.naiveLinkOrder();
NestedSetBuilder<ResourceContainer> directDependencies = NestedSetBuilder.naiveLinkOrder();
- extractFromAttribute("deps", ruleContext, transitiveDependencies, directDependencies);
+ extractFromAttributes(AndroidCommon.TRANSITIVE_ATTRIBUTES, ruleContext, transitiveDependencies,
+ directDependencies);
return new ResourceDependencies(neverlink,
transitiveDependencies.build(), directDependencies.build());
}
@@ -74,29 +77,37 @@ public class ResourceDependencies {
NestedSetBuilder<ResourceContainer> transitiveDependencies = NestedSetBuilder.naiveLinkOrder();
NestedSetBuilder<ResourceContainer> directDependencies = NestedSetBuilder.naiveLinkOrder();
if (hasResourceAttribute(ruleContext)) {
- extractFromAttribute("resources",ruleContext, transitiveDependencies, directDependencies);
+ extractFromAttributes(
+ ImmutableList.of("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);
+ extractFromAttributes(AndroidCommon.TRANSITIVE_ATTRIBUTES, ruleContext,
+ transitiveDependencies, directDependencies);
} 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.
- extractFromAttribute("deps", ruleContext, transitiveDependencies, transitiveDependencies);
+ extractFromAttributes(AndroidCommon.TRANSITIVE_ATTRIBUTES, ruleContext,
+ transitiveDependencies, transitiveDependencies);
}
return new ResourceDependencies(neverlink,
transitiveDependencies.build(), directDependencies.build());
}
- private static void extractFromAttribute(String attribute,
+ private static void extractFromAttributes(Iterable<String> attributes,
RuleContext ruleContext, NestedSetBuilder<ResourceContainer> builderForTransitive,
NestedSetBuilder<ResourceContainer> builderForDirect) {
- for (AndroidResourcesProvider resources :
- ruleContext.getPrerequisites(attribute, Mode.TARGET, AndroidResourcesProvider.class)) {
- builderForTransitive.addTransitive(resources.getTransitiveAndroidResources());
- builderForDirect.addTransitive(resources.getDirectAndroidResources());
+ for (String attr : attributes) {
+ if (ruleContext.getAttribute(attr) == null) {
+ continue;
+ }
+ for (AndroidResourcesProvider resources :
+ ruleContext.getPrerequisites(attr, Mode.TARGET, AndroidResourcesProvider.class)) {
+ builderForTransitive.addTransitive(resources.getTransitiveAndroidResources());
+ builderForDirect.addTransitive(resources.getDirectAndroidResources());
+ }
}
}