diff options
author | Googler <noreply@google.com> | 2015-09-23 14:44:32 +0000 |
---|---|---|
committer | Philipp Wollermann <philwo@google.com> | 2015-09-24 14:16:16 +0000 |
commit | 7fb76a1e378b988858c1274e8b6009e8489a4873 (patch) | |
tree | f8f449472ec2158441e239306d01aca4d670006f /src | |
parent | 0e31295e9eae12814f0d9f2364a725d17c49a1c4 (diff) |
Make gen jars output group transitive.
Also add gen jar provider, which we'll need for ide support.
--
MOS_MIGRATED_REVID=103744649
Diffstat (limited to 'src')
7 files changed, 163 insertions, 41 deletions
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 8a26cbf35f..8f7e51b857 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 @@ -100,8 +100,8 @@ public class AndroidCommon { private JackCompilationHelper jackCompilationHelper; private Artifact classJar; private Artifact srcJar; - private Artifact genJar; - private Artifact gensrcJar; + private Artifact genClassJar; + private Artifact genSourceJar; private Collection<Artifact> idls; private AndroidIdlProvider transitiveIdlImportData; @@ -324,7 +324,7 @@ public class AndroidCommon { javacHelper.createCompileActionWithInstrumentation( binaryResourcesJar, null /* manifestProtoOutput */, - null /* gensrcJar */, + null /* genSourceJar */, outputDepsProto, javaArtifactsBuilder); } @@ -548,22 +548,22 @@ public class AndroidCommon { // The gensrc jar is created only if the target uses annotation processing. Otherwise, // it is null, and the source jar action will not depend on the compile action. - gensrcJar = helper.createGensrcJar(classJar); + genSourceJar = helper.createGensrcJar(classJar); Artifact manifestProtoOutput = helper.createManifestProtoOutput(classJar); // AndroidBinary will pass its -gen.jar output, and AndroidLibrary will pass its own. - genJar = ruleContext.getImplicitOutputArtifact(genClassJarImplicitOutput); - helper.createGenJarAction(classJar, manifestProtoOutput, genJar); + genClassJar = ruleContext.getImplicitOutputArtifact(genClassJarImplicitOutput); + helper.createGenJarAction(classJar, manifestProtoOutput, genClassJar); srcJar = ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_LIBRARY_SOURCE_JAR); - helper.createSourceJarAction(srcJar, gensrcJar); + helper.createSourceJarAction(srcJar, genSourceJar); NestedSetBuilder<Artifact> compileTimeDependenciesBuilder = NestedSetBuilder.stableOrder(); Artifact outputDepsProto = helper.createOutputDepsProtoArtifact(classJar, javaArtifactsBuilder); if (outputDepsProto != null) { compileTimeDependenciesBuilder.add(outputDepsProto); } - helper.createCompileActionWithInstrumentation(classJar, manifestProtoOutput, gensrcJar, + helper.createCompileActionWithInstrumentation(classJar, manifestProtoOutput, genSourceJar, outputDepsProto, javaArtifactsBuilder); compileTimeDependencyArtifacts = compileTimeDependenciesBuilder.build(); @@ -613,9 +613,10 @@ public class AndroidCommon { .build(); javaCommon.addTransitiveInfoProviders(builder, filesToBuild, classJar); + javaCommon.addGenJarsProvider(builder, genClassJar, genSourceJar); builder.add( JavaRuleOutputJarsProvider.class, - new JavaRuleOutputJarsProvider(classJar, srcJar, genJar, gensrcJar)); + new JavaRuleOutputJarsProvider(classJar, srcJar, genClassJar, genSourceJar)); return builder .setFilesToBuild(filesToBuild) @@ -645,8 +646,7 @@ public class AndroidCommon { : jackCompilationHelper.compileAsLibrary()) .addOutputGroup( OutputGroupProvider.HIDDEN_TOP_LEVEL, collectHiddenTopLevelArtifacts(ruleContext)) - .addOutputGroup(JavaSemantics.SOURCE_JARS_OUTPUT_GROUP, transitiveSourceJars) - .addOutputGroup(JavaSemantics.GENERATED_JARS_OUTPUT_GROUP, genJar); + .addOutputGroup(JavaSemantics.SOURCE_JARS_OUTPUT_GROUP, transitiveSourceJars); } public static PathFragment getAssetDir(RuleContext ruleContext) { @@ -854,12 +854,12 @@ public class AndroidCommon { return javaCommon.getJavacOpts(); } - public Artifact getGenJar() { - return genJar; + public Artifact getGenClassJar() { + return genClassJar; } - @Nullable public Artifact getGensrcJar() { - return gensrcJar; + @Nullable public Artifact getGenSourceJar() { + return genSourceJar; } public ImmutableList<Artifact> getRuntimeJars() { 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 bbbe3df7a9..d01895b0f7 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 @@ -197,9 +197,9 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { .add(JavaRuleOutputJarsProvider.class, new JavaRuleOutputJarsProvider( classesJar, - androidCommon.getGensrcJar(), - androidCommon.getGenJar(), - androidCommon.getGensrcJar())) + androidCommon.getGenSourceJar(), + androidCommon.getGenClassJar(), + androidCommon.getGenSourceJar())) .add(JavaSourceInfoProvider.class, JavaSourceInfoProvider.fromJavaTargetAttributes(javaTargetAttributes, javaSemantics)) .add(JavaSourceJarsProvider.class, androidCommon.getJavaSourceJarsProvider()) diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java index 072b9f6474..4ec774494e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java @@ -167,12 +167,12 @@ public class JavaBinary implements RuleConfiguredTargetFactory { // The gensrc jar is created only if the target uses annotation processing. Otherwise, // it is null, and the source jar action will not depend on the compile action. - Artifact gensrcJar = helper.createGensrcJar(classJar); + Artifact genSourceJar = helper.createGensrcJar(classJar); Artifact manifestProtoOutput = helper.createManifestProtoOutput(classJar); helper.createCompileAction( - classJar, manifestProtoOutput, gensrcJar, outputDepsProto, instrumentationMetadata); - helper.createSourceJarAction(srcJar, gensrcJar); + classJar, manifestProtoOutput, genSourceJar, outputDepsProto, instrumentationMetadata); + helper.createSourceJarAction(srcJar, genSourceJar); Artifact genClassJar = ruleContext.getImplicitOutputArtifact(JavaSemantics.JAVA_BINARY_GEN_JAR); helper.createGenJarAction(classJar, manifestProtoOutput, genClassJar); @@ -208,12 +208,13 @@ public class JavaBinary implements RuleConfiguredTargetFactory { RuleConfiguredTargetBuilder builder = new RuleConfiguredTargetBuilder(ruleContext); - semantics.addProviders(ruleContext, common, jvmFlags, classJar, srcJar, genClassJar, gensrcJar, - ImmutableMap.<Artifact, Artifact>of(), helper, filesBuilder, builder); + semantics.addProviders(ruleContext, common, jvmFlags, classJar, srcJar, + genClassJar, genSourceJar, ImmutableMap.<Artifact, Artifact>of(), + helper, filesBuilder, builder); builder.add( JavaRuleOutputJarsProvider.class, - new JavaRuleOutputJarsProvider(classJar, srcJar, genClassJar, gensrcJar)); + new JavaRuleOutputJarsProvider(classJar, srcJar, genClassJar, genSourceJar)); NestedSet<Artifact> filesToBuild = filesBuilder.build(); @@ -276,6 +277,7 @@ public class JavaBinary implements RuleConfiguredTargetFactory { } common.addTransitiveInfoProviders(builder, filesToBuild, classJar); + common.addGenJarsProvider(builder, genClassJar, genSourceJar); return builder .setFilesToBuild(filesToBuild) @@ -290,7 +292,6 @@ public class JavaBinary implements RuleConfiguredTargetFactory { .add( JavaSourceJarsProvider.class, new JavaSourceJarsProvider(transitiveSourceJars, srcJars)) .addOutputGroup(JavaSemantics.SOURCE_JARS_OUTPUT_GROUP, transitiveSourceJars) - .addOutputGroup(JavaSemantics.GENERATED_JARS_OUTPUT_GROUP, genClassJar) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java index e894037541..ce7954c7fb 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java @@ -111,6 +111,7 @@ public class JavaCommon { private final RuleContext ruleContext; private final JavaSemantics semantics; + private JavaCompilationHelper javaCompilationHelper; public JavaCommon(RuleContext ruleContext, JavaSemantics semantics) { this(ruleContext, semantics, @@ -332,6 +333,35 @@ public class JavaCommon { return builder.build(); } + /** + * Collects transitive gen jars for the current rule. + */ + private JavaGenJarsProvider collectTransitiveGenJars( + boolean usesAnnotationProcessing, + @Nullable Artifact genClassJar, + @Nullable Artifact genSourceJar) { + NestedSetBuilder<Artifact> classJarsBuilder = NestedSetBuilder.stableOrder(); + NestedSetBuilder<Artifact> sourceJarsBuilder = NestedSetBuilder.stableOrder(); + + if (genClassJar != null) { + classJarsBuilder.add(genClassJar); + } + if (genSourceJar != null) { + sourceJarsBuilder.add(genSourceJar); + } + for (JavaGenJarsProvider dep : getDependencies(JavaGenJarsProvider.class)) { + classJarsBuilder.addTransitive(dep.getTransitiveGenClassJars()); + sourceJarsBuilder.addTransitive(dep.getTransitiveGenSourceJars()); + } + return new JavaGenJarsProvider( + usesAnnotationProcessing, + genClassJar, + genSourceJar, + classJarsBuilder.build(), + sourceJarsBuilder.build() + ); + } + /** * Collects transitive C++ dependencies. */ @@ -462,7 +492,10 @@ public class JavaCommon { activePlugins = collectPlugins(); JavaTargetAttributes.Builder javaTargetAttributes = new JavaTargetAttributes.Builder(semantics); - processSrcs(javaTargetAttributes, javacOpts); + javaCompilationHelper = new JavaCompilationHelper( + ruleContext, semantics, javacOpts, javaTargetAttributes); + + processSrcs(javaCompilationHelper, javaTargetAttributes); javaTargetAttributes.addSourceArtifacts(extraSrcs); processRuntimeDeps(javaTargetAttributes); @@ -542,12 +575,28 @@ public class JavaCommon { .addOutputGroup(OutputGroupProvider.FILES_TO_COMPILE, getFilesToCompile(classJar)); } + public void addGenJarsProvider(RuleConfiguredTargetBuilder builder, + @Nullable Artifact genClassJar, @Nullable Artifact genSourceJar) { + JavaGenJarsProvider genJarsProvider = collectTransitiveGenJars( + javaCompilationHelper.usesAnnotationProcessing(), + genClassJar, genSourceJar); + + NestedSetBuilder<Artifact> genJarsBuilder = NestedSetBuilder.stableOrder(); + genJarsBuilder.addTransitive(genJarsProvider.getTransitiveGenClassJars()); + genJarsBuilder.addTransitive(genJarsProvider.getTransitiveGenSourceJars()); + + builder + .add(JavaGenJarsProvider.class, genJarsProvider) + .addOutputGroup(JavaSemantics.GENERATED_JARS_OUTPUT_GROUP, genJarsBuilder.build()); + } + + /** * Processes the sources of this target, adding them as messages, proper * sources or to the list of targets treated as deps as required. */ - private void processSrcs(JavaTargetAttributes.Builder attributes, - ImmutableList<String> javacOpts) { + private void processSrcs(JavaCompilationHelper helper, + JavaTargetAttributes.Builder attributes) { for (MessageBundleProvider srcItem : ruleContext.getPrerequisites( "srcs", Mode.TARGET, MessageBundleProvider.class)) { attributes.addMessages(srcItem.getMessages()); @@ -555,7 +604,7 @@ public class JavaCommon { attributes.addSourceArtifacts(sources); - addCompileTimeClassPathEntriesMaybeThroughIjar(attributes, javacOpts); + addCompileTimeClassPathEntriesMaybeThroughIjar(helper, attributes); } /** @@ -581,9 +630,8 @@ public class JavaCommon { * using ijar to create jar interfaces for the generated jars. */ private void addCompileTimeClassPathEntriesMaybeThroughIjar( - JavaTargetAttributes.Builder attributes, ImmutableList<String> javacOpts) { - JavaCompilationHelper helper = new JavaCompilationHelper( - ruleContext, semantics, javacOpts, attributes); + JavaCompilationHelper helper, + JavaTargetAttributes.Builder attributes) { for (FileProvider provider : ruleContext .getPrerequisites("srcs", Mode.TARGET, FileProvider.class)) { Iterable<Artifact> jarFiles = helper.filterGeneratedJarsThroughIjar( 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 818e12c646..6ed154241b 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 @@ -212,7 +212,7 @@ public class JavaCompilationHelper extends BaseJavaCompilationHelper { /** * Returns whether this target uses annotation processing. */ - private boolean usesAnnotationProcessing() { + public boolean usesAnnotationProcessing() { JavaTargetAttributes attributes = getAttributes(); return getJavacOpts().contains("-processor") || !attributes.getProcessorNames().isEmpty(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaGenJarsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaGenJarsProvider.java new file mode 100644 index 0000000000..d96a4aea4c --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaGenJarsProvider.java @@ -0,0 +1,72 @@ +// Copyright 2014 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.rules.java; + +import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; +import com.google.devtools.build.lib.collect.nestedset.NestedSet; +import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; + +import javax.annotation.Nullable; + +/** + * The collection of gen jars from the transitive closure. + */ +@Immutable +public final class JavaGenJarsProvider implements TransitiveInfoProvider { + + private final boolean usesAnnotationProcessing; + @Nullable + private final Artifact genClassJar; + @Nullable + private final Artifact genSourceJar; + private final NestedSet<Artifact> transitiveGenClassJars; + private final NestedSet<Artifact> transitiveGenSourceJars; + + public JavaGenJarsProvider( + boolean usesAnnotationProcessing, + @Nullable Artifact genClassJar, + @Nullable Artifact genSourceJar, + NestedSet<Artifact> transitiveGenClassJars, + NestedSet<Artifact> transitiveGenSourceJars) { + this.usesAnnotationProcessing = usesAnnotationProcessing; + this.genClassJar = genClassJar; + this.genSourceJar = genSourceJar; + this.transitiveGenClassJars = transitiveGenClassJars; + this.transitiveGenSourceJars = transitiveGenSourceJars; + } + + public boolean usesAnnotationProcessing() { + return usesAnnotationProcessing; + } + + @Nullable + public Artifact getGenClassJar() { + return genClassJar; + } + + @Nullable + public Artifact getGenSourceJar() { + return genSourceJar; + } + + public NestedSet<Artifact> getTransitiveGenClassJars() { + return transitiveGenClassJars; + } + + public NestedSet<Artifact> getTransitiveGenSourceJars() { + return transitiveGenSourceJars; + } +} diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java index 85630d6787..11f9ebbf46 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java @@ -120,7 +120,7 @@ public class JavaLibrary implements RuleConfiguredTargetFactory { // The gensrc jar is created only if the target uses annotation processing. // Otherwise, it is null, and the source jar action will not depend on the compile action. - Artifact gensrcJar = helper.createGensrcJar(classJar); + Artifact genSourceJar = helper.createGensrcJar(classJar); Artifact manifestProtoOutput = helper.createManifestProtoOutput(classJar); Artifact genClassJar = ruleContext.getImplicitOutputArtifact( @@ -129,9 +129,9 @@ public class JavaLibrary implements RuleConfiguredTargetFactory { Artifact outputDepsProto = helper.createOutputDepsProtoArtifact(classJar, javaArtifactsBuilder); - helper.createCompileActionWithInstrumentation(classJar, manifestProtoOutput, gensrcJar, + helper.createCompileActionWithInstrumentation(classJar, manifestProtoOutput, genSourceJar, outputDepsProto, javaArtifactsBuilder); - helper.createSourceJarAction(srcJar, gensrcJar); + helper.createSourceJarAction(srcJar, genSourceJar); if ((attributes.hasSourceFiles() || attributes.hasSourceJars()) && jar != null) { helper.createCompileTimeJarAction(jar, outputDepsProto, @@ -213,15 +213,17 @@ public class JavaLibrary implements RuleConfiguredTargetFactory { new RuleConfiguredTargetBuilder(ruleContext); semantics.addProviders( - ruleContext, common, ImmutableList.<String>of(), classJar, srcJar, genClassJar, gensrcJar, - ImmutableMap.<Artifact, Artifact>of(), helper, filesBuilder, builder); + ruleContext, common, ImmutableList.<String>of(), classJar, srcJar, + genClassJar, genSourceJar, ImmutableMap.<Artifact, Artifact>of(), + helper, filesBuilder, builder); builder.add( JavaRuleOutputJarsProvider.class, - new JavaRuleOutputJarsProvider(classJar, srcJar, genClassJar, gensrcJar)); + new JavaRuleOutputJarsProvider(classJar, srcJar, genClassJar, genSourceJar)); NestedSet<Artifact> filesToBuild = filesBuilder.build(); common.addTransitiveInfoProviders(builder, filesToBuild, classJar); + common.addGenJarsProvider(builder, genClassJar, genSourceJar); builder .add(JavaRuntimeJarProvider.class, @@ -244,8 +246,7 @@ public class JavaLibrary implements RuleConfiguredTargetFactory { // TODO(bazel-team): this should only happen for java_plugin .add(JavaPluginInfoProvider.class, new JavaPluginInfoProvider( exportedProcessorClasses, exportedProcessorClasspath)) - .addOutputGroup(JavaSemantics.SOURCE_JARS_OUTPUT_GROUP, transitiveSourceJars) - .addOutputGroup(JavaSemantics.GENERATED_JARS_OUTPUT_GROUP, genClassJar); + .addOutputGroup(JavaSemantics.SOURCE_JARS_OUTPUT_GROUP, transitiveSourceJars); if (ruleContext.hasErrors()) { return null; |