aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2015-09-23 14:44:32 +0000
committerGravatar Philipp Wollermann <philwo@google.com>2015-09-24 14:16:16 +0000
commit7fb76a1e378b988858c1274e8b6009e8489a4873 (patch)
treef8f449472ec2158441e239306d01aca4d670006f /src
parent0e31295e9eae12814f0d9f2364a725d17c49a1c4 (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')
-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/AndroidLibrary.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java15
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java62
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaGenJarsProvider.java72
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java17
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;