Grab java artifacts from application_resources attribute is it does java compilation. PiperOrigin-RevId: 413544678
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 9a3cdc9..dac217c 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
@@ -17,6 +17,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; import com.google.common.collect.Streams; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.ResourceSet; @@ -442,7 +443,19 @@ boolean generateExtensionRegistry) throws InterruptedException, RuleErrorException { - classJar = ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_LIBRARY_CLASS_JAR); + if (shouldCompileJavaSrcs) { + classJar = + ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_LIBRARY_CLASS_JAR); + } else { + // When java compilation happens in application_resources, grab the class jar from its + // JavaInfo. + classJar = + Iterables.getOnlyElement( + JavaInfo.getJavaInfo(ruleContext.getPrerequisite("application_resources")) + .getOutputJars() + .getJavaOutputs()) + .getClassJar(); + } idlHelper = new AndroidIdlHelper(ruleContext, classJar); BootClassPathInfo bootClassPathInfo; @@ -538,21 +551,71 @@ } JavaTargetAttributes attributes = attributesBuilder.build(); - initJava( - javaSemantics, - helper, - attributes, - artifactsBuilder, - collectJavaCompilationArgs, - filesBuilder, - generateExtensionRegistry); - if (ruleContext.hasErrors()) { - return null; + if (shouldCompileJavaSrcs) { + initJava( + javaSemantics, + helper, + attributes, + artifactsBuilder, + collectJavaCompilationArgs, + filesBuilder, + generateExtensionRegistry); + if (ruleContext.hasErrors()) { + return null; + } + if (generatedExtensionRegistryProvider != null) { + jarsProducedForRuntime.add(generatedExtensionRegistryProvider.getClassJar()); + } + this.jarsProducedForRuntime = jarsProducedForRuntime.add(classJar).build(); + } else { + // Getting java artifacts from application_resources + JavaInfo javaInfo = + JavaInfo.getJavaInfo(ruleContext.getPrerequisite("application_resources")); + JavaOutput javaOutput = Iterables.getOnlyElement(javaInfo.getOutputJars().getJavaOutputs()); + outputs = helper.createOutputs(javaOutput); + + // The macro creating both the Starlark android_binary_internal and android_binary ensures + // that they share the same attributes, which is why we can still check the android_binary + // attributes when Javac happens in android_binary_internal. + if (attributes.hasSources() || attributes.hasResources()) { + // We only want to add a jar to the classpath of a dependent rule if it has content. + artifactsBuilder.addRuntimeJar(classJar); + } + + artifactsBuilder.addCompileTimeJarAsFullJar(classJar); + javaSourceJarsProviderBuilder + .addAllSourceJars(javaInfo.getSourceJars()) + .addAllTransitiveSourceJars( + javaCommon.collectTransitiveSourceJars(javaInfo.getSourceJars())); + + if (generateExtensionRegistry) { + generatedExtensionRegistryProvider = + javaSemantics.createGeneratedExtensionRegistry( + ruleContext, + javaCommon, + filesBuilder, + artifactsBuilder, + javaRuleOutputJarsProviderBuilder, + javaSourceJarsProviderBuilder); + } + + JavaCompilationArtifacts javaArtifacts = artifactsBuilder.build(); + javaCommon.setJavaCompilationArtifacts(javaArtifacts); + filesToBuild = filesBuilder.build(); + NestedSetBuilder<Artifact> runtimeJars = + NestedSetBuilder.<Artifact>naiveLinkOrder().addAll(javaInfo.getDirectRuntimeJars()); + if (generatedExtensionRegistryProvider != null) { + jarsProducedForRuntime.add(generatedExtensionRegistryProvider.getClassJar()); + runtimeJars.add(generatedExtensionRegistryProvider.getClassJar()); + } + transitiveNeverlinkLibraries = + collectTransitiveNeverlinkLibraries( + ruleContext, javaCommon.getDependencies(), runtimeJars.build()); + this.jarsProducedForRuntime = jarsProducedForRuntime.add(classJar).build(); + if (collectJavaCompilationArgs) { + this.javaCompilationArgs = collectJavaCompilationArgs(asNeverLink, attributes.hasSources()); + } } - if (generatedExtensionRegistryProvider != null) { - jarsProducedForRuntime.add(generatedExtensionRegistryProvider.getClassJar()); - } - this.jarsProducedForRuntime = jarsProducedForRuntime.add(classJar).build(); return attributes; } @@ -872,9 +935,12 @@ boolean isLibrary, boolean shouldCompileJavaSrcs) { + ImmutableList<Artifact> ruleSources = ruleContext.getPrerequisiteArtifacts("srcs").list(); + /** * When within the context of an android_binary rule and shouldCompileJavaSrcs is False, the - * Java compilation happens within the Starlark rule. + * Java compilation happens within the Starlark rule. We still list the srcs to know if the + * class jar has content and should be included. */ if (!isLibrary && !shouldCompileJavaSrcs) { ImmutableList<TransitiveInfoCollection> runtimeDeps = @@ -882,17 +948,14 @@ return new JavaCommon( ruleContext, semantics, - ImmutableList.of(), + ruleSources, runtimeDeps, /* compileDeps */ runtimeDeps, runtimeDeps); /* bothDeps */ } - ImmutableList<Artifact> ruleSources = ruleContext.getPrerequisiteArtifacts("srcs").list(); - ImmutableList<Artifact> dataBindingSources = dataBindingContext.getAnnotationSourceFiles(ruleContext); - ImmutableList<Artifact> srcs = ImmutableList.<Artifact>builder().addAll(ruleSources).addAll(dataBindingSources).build();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Context.java b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Context.java index ac66506..c25e2a01 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Context.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Context.java
@@ -20,6 +20,7 @@ import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSetMultimap; +import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.FilesToRunProvider; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; @@ -228,6 +229,13 @@ for (DataBindingV2Provider provider : providers) { setterStoreFiles.addTransitive(provider.getSetterStores()); } + if (context.attributes().has("application_resources")) { + DataBindingV2Provider p = + context.getPrerequisite("application_resources", DataBindingV2Provider.PROVIDER); + if (p != null) { + setterStoreFiles.addAll(p.getSetterStores().toList()); + } + } } return setterStoreFiles.build(); } @@ -406,6 +414,13 @@ } private static Artifact getClassInfoFile(RuleContext context) { + if (shouldGetDatabindingArtifactsFromApplicationResources(context)) { + DataBindingV2Provider p = + context.getPrerequisite("application_resources", DataBindingV2Provider.PROVIDER); + if (p != null) { + return Iterables.getOnlyElement(p.getClassInfos().toList()); + } + } return context.getUniqueDirectoryArtifact("databinding", "class-info.zip"); } @@ -418,7 +433,8 @@ private static boolean shouldGetDatabindingArtifactsFromApplicationResources( RuleContext context) { - if (!context.attributes().isAttributeValueExplicitlySpecified("application_resources")) { + if (!context.attributes().has("application_resources") + || !context.attributes().isAttributeValueExplicitlySpecified("application_resources")) { return false; } AndroidApplicationResourceInfo androidApplicationResourceInfo =
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java index 86f0388..438246c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
@@ -40,6 +40,7 @@ import com.google.devtools.build.lib.packages.TargetUtils; import com.google.devtools.build.lib.rules.java.JavaConfiguration.JavaClasspathMode; import com.google.devtools.build.lib.rules.java.JavaPluginInfo.JavaPluginData; +import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.JavaOutput; import com.google.devtools.build.lib.rules.java.JavaToolchainProvider.JspecifyInfo; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.PathFragment; @@ -174,6 +175,21 @@ return result; } + public JavaCompileOutputs<Artifact> createOutputs(JavaOutput output) { + JavaCompileOutputs.Builder<Artifact> builder = + JavaCompileOutputs.builder() + .output(output.getClassJar()) + .manifestProto(output.getManifestProto()) + .nativeHeader(output.getNativeHeadersJar()); + if (generatesOutputDeps()) { + builder.depsProto(output.getJdeps()); + } + if (usesAnnotationProcessing()) { + builder.genClass(output.getGeneratedClassJar()).genSource(output.getGeneratedSourceJar()); + } + return builder.build(); + } + public void createCompileAction(JavaCompileOutputs<Artifact> outputs) throws InterruptedException { if (outputs.genClass() != null) {