diff options
4 files changed, 42 insertions, 51 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesInfo.java index f08b2ceb91..6f1d665be4 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesInfo.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesInfo.java @@ -22,7 +22,6 @@ import com.google.devtools.build.lib.packages.NativeProvider; import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; -import javax.annotation.Nullable; /** A provider that supplies ResourceContainers from its transitive closure. */ @SkylarkModule( @@ -54,23 +53,6 @@ public class AndroidResourcesInfo extends NativeInfo { private final Artifact rTxt; /* - * An R.class file for this target that can be used to build Java source. - * - * This class file should not be used for any targets besides the one that exposes this provider - * instance - even similar targets can have very different R.class files. In particular, final - * R.class files (for android_binary and similar rules) are generated very differently than - * R.class files for android_library - the latter are meant to be thrown away after building local - * Java classes. - * - * An R.class file is exposed rather than an R.java file because generating the R.class from the - * R.txt file is quicker than compiling the R.java file. - * - * An R.class file will not be produced for android_library targets that do not specify a manifest - * or resource files. - */ - @Nullable private final Artifact rClassJar; - - /* * Transitive information used for resource processing */ @@ -89,7 +71,6 @@ public class AndroidResourcesInfo extends NativeInfo { Label label, ProcessedAndroidManifest manifest, Artifact rTxt, - @Nullable Artifact rClassJar, NestedSet<ValidatedAndroidData> transitiveAndroidResources, NestedSet<ValidatedAndroidData> directAndroidResources, NestedSet<Artifact> transitiveResources, @@ -104,7 +85,6 @@ public class AndroidResourcesInfo extends NativeInfo { this.label = label; this.manifest = manifest; this.rTxt = rTxt; - this.rClassJar = rClassJar; this.transitiveAndroidResources = transitiveAndroidResources; this.directAndroidResources = directAndroidResources; this.transitiveResources = transitiveResources; @@ -131,19 +111,6 @@ public class AndroidResourcesInfo extends NativeInfo { return rTxt; } - @SkylarkCallable( - name = "r_class_jar", - structField = true, - allowReturnNones = true, - doc = - "Returns a JAR of R.class files for this target, for use in compiling this target's Java" - + " code. This JAR is only accurate for this target, and should not be used in any" - + " way for other targets. The JAR will not be available for android_library targets" - + " that do not specify resources or manifest.") - public Artifact getRClassJar() { - return rClassJar; - } - /** Returns the transitive ResourceContainers for the label. */ @SkylarkCallable( name = "transitive_android_resources", diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java index 38238f836d..d0c3819e41 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java @@ -21,13 +21,18 @@ import com.google.devtools.build.lib.analysis.skylark.SkylarkRuleContext; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.events.Location; +import com.google.devtools.build.lib.packages.NativeInfo; +import com.google.devtools.build.lib.packages.NativeProvider; import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.android.AndroidLibraryAarInfo.Aar; +import com.google.devtools.build.lib.rules.java.JavaCompilationInfoProvider; +import com.google.devtools.build.lib.rules.java.JavaInfo; import com.google.devtools.build.lib.skylarkinterface.Param; import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.syntax.EvalException; import com.google.devtools.build.lib.syntax.Runtime; +import com.google.devtools.build.lib.syntax.SkylarkDict; import com.google.devtools.build.lib.syntax.SkylarkList; import com.google.devtools.build.lib.vfs.PathFragment; import java.util.List; @@ -312,12 +317,15 @@ public class AndroidSkylarkData { + " targets that depend on this one."), }, doc = - "Merges this target's resources together with resources inherited from dependencies. The" - + " passed manifest provider is used to get Android package information and to" - + " validate that all resources it refers to are available. Note that this method" - + " might do additional processing to this manifest, so in the future, you may want" - + " to use the manifest contained in this method's output instead of this one.") - public AndroidResourcesInfo mergeResources( + "Merges this target's resources together with resources inherited from dependencies." + + " Returns a dict of provider type to actual info, with elements for" + + " AndroidResourcesInfo (various resource information) and JavaInfo (wrapping the" + + " R.class jar, for use in Java compilation). The passed manifest provider is used" + + " to get Android package information and to validate that all resources it refers" + + " to are available. Note that this method might do additional processing to this" + + " manifest, so in the future, you may want to use the manifest contained in this" + + " method's output instead of this one.") + public SkylarkDict<NativeProvider<?>, NativeInfo> mergeResources( SkylarkRuleContext ctx, AndroidManifestInfo manifest, SkylarkList<ConfiguredTarget> resources, @@ -333,11 +341,30 @@ public class AndroidSkylarkData { .collect(ImmutableList.toImmutableList()); try { - return AndroidResources.from(ctx.getRuleContext(), fileProviders, "resources") - .parse(ctx.getRuleContext(), manifest.asStampedManifest()) - .merge(ctx.getRuleContext(), ResourceDependencies.fromProviders(deps, neverlink)) - .validate(ctx.getRuleContext()) - .toProvider(); + ValidatedAndroidResources validated = + AndroidResources.from(ctx.getRuleContext(), fileProviders, "resources") + .parse(ctx.getRuleContext(), manifest.asStampedManifest()) + .merge(ctx.getRuleContext(), ResourceDependencies.fromProviders(deps, neverlink)) + .validate(ctx.getRuleContext()); + + JavaInfo javaInfo = + JavaInfo.Builder.create() + .setNeverlink(true) + .addProvider( + JavaCompilationInfoProvider.class, + new JavaCompilationInfoProvider.Builder() + .setCompilationClasspath( + NestedSetBuilder.create(Order.NAIVE_LINK_ORDER, validated.getClassJar())) + .build()) + .build(); + + return SkylarkDict.of( + /* env = */ null, + AndroidResourcesInfo.PROVIDER, + validated.toProvider(), + JavaInfo.PROVIDER, + javaInfo); + } catch (RuleErrorException e) { throw new EvalException(Location.BUILTIN, e); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java index ffef2d5d0e..324766d323 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java @@ -223,7 +223,7 @@ public final class ResourceApk { */ AndroidResourcesInfo toResourceInfo(Label label) { if (validatedResources == null) { - return resourceDeps.toInfo(label, manifest, rTxt, resourceJavaClassJar); + return resourceDeps.toInfo(label, manifest, rTxt); } return resourceDeps.toInfo(validatedResources); } 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 1631db5992..0a62aea8d2 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 @@ -254,14 +254,12 @@ public final class ResourceDependencies { .toInfo( newDirectResource.getLabel(), newDirectResource.getProcessedManifest(), - newDirectResource.getRTxt(), - newDirectResource.getJavaClassJar()); + newDirectResource.getRTxt()); } return new AndroidResourcesInfo( newDirectResource.getLabel(), newDirectResource.getProcessedManifest(), newDirectResource.getRTxt(), - newDirectResource.getJavaClassJar(), NestedSetBuilder.<ValidatedAndroidData>naiveLinkOrder() .addTransitive(transitiveResourceContainers) .addTransitive(directResourceContainers) @@ -294,15 +292,14 @@ public final class ResourceDependencies { * @return A provider with the current resources and label. */ public AndroidResourcesInfo toInfo( - Label label, ProcessedAndroidManifest manifest, Artifact rTxt, @Nullable Artifact rClassJar) { + Label label, ProcessedAndroidManifest manifest, Artifact rTxt) { if (neverlink) { - return ResourceDependencies.empty().toInfo(label, manifest, rTxt, rClassJar); + return ResourceDependencies.empty().toInfo(label, manifest, rTxt); } return new AndroidResourcesInfo( label, manifest, rTxt, - rClassJar, transitiveResourceContainers, directResourceContainers, transitiveResources, |