diff options
author | Irina Iancu <elenairina@google.com> | 2017-03-08 08:00:09 +0000 |
---|---|---|
committer | Vladimir Moskva <vladmos@google.com> | 2017-03-08 10:51:28 +0000 |
commit | ef651712e9bee512967d8ec6ac6d63fda41addab (patch) | |
tree | b81b798c476181aa3a7ce826fae9960cf8fde6bc /src/main/java/com/google/devtools/build/lib | |
parent | 4950111c591f5d7352c83898e35a5f18ff92a0cc (diff) |
Add a source_jars variable to OutputJar.
Having a correlation between an output jar and a source jar is not enough.
There may be situations when an output jar is generated from more source jars,
not just one. We need this flexibility especially in Skylark for the java
sandwich, when the user can compile multiple source jars.
--
PiperOrigin-RevId: 149510534
MOS_MIGRATED_REVID=149510534
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
12 files changed, 54 insertions, 21 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java b/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java index e1f31fa84f..a29dead152 100644 --- a/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java +++ b/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java @@ -62,6 +62,7 @@ import com.google.devtools.build.lib.rules.cpp.CppCompilationContext; import com.google.devtools.build.lib.rules.cpp.CppConfiguration; import com.google.devtools.build.lib.rules.java.JavaExportsProvider; import com.google.devtools.build.lib.rules.java.JavaGenJarsProvider; +import com.google.devtools.build.lib.rules.java.JavaProvider; import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider; import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.OutputJar; import com.google.devtools.build.lib.rules.java.JavaSourceInfoProvider; @@ -335,7 +336,7 @@ public class AndroidStudioInfoAspect extends NativeAspectClass implements Config // Java rules JavaRuleOutputJarsProvider outputJarsProvider = - base.getProvider(JavaRuleOutputJarsProvider.class); + JavaProvider.getProvider(JavaRuleOutputJarsProvider.class, base); if (outputJarsProvider != null && !androidStudioInfoSemantics.suppressJavaRuleInfo(base)) { JavaIdeInfo javaIdeInfo = makeJavaIdeInfo(base, ruleContext, outputJarsProvider, providerBuilder); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java index 256966f917..7c340694cb 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java @@ -31,6 +31,7 @@ import com.google.devtools.build.lib.rules.java.JavaCommon; import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider; import com.google.devtools.build.lib.rules.java.JavaCompilationArtifacts; import com.google.devtools.build.lib.rules.java.JavaHelper; +import com.google.devtools.build.lib.rules.java.JavaProvider; import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider; import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.OutputJar; import com.google.devtools.build.lib.rules.java.JavaRuntimeJarProvider; @@ -121,9 +122,10 @@ public class AarImport implements RuleConfiguredTargetFactory { ruleContext.registerAction(createAarNativeLibsFilterActions(ruleContext, aar, nativeLibs)); JavaRuleOutputJarsProvider.Builder jarProviderBuilder = new JavaRuleOutputJarsProvider.Builder() - .addOutputJar(mergedJar, null, null); + .addOutputJar(mergedJar, null, ImmutableList.<Artifact>of()); for (TransitiveInfoCollection export : ruleContext.getPrerequisites("exports", Mode.TARGET)) { - for (OutputJar jar : export.getProvider(JavaRuleOutputJarsProvider.class).getOutputJars()) { + for (OutputJar jar : + JavaProvider.getProvider(JavaRuleOutputJarsProvider.class, export).getOutputJars()) { jarProviderBuilder.addOutputJar(jar); filesToBuildBuilder.add(jar.getClassJar()); } 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 d12728a79d..2ea11f5da6 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 @@ -746,13 +746,13 @@ public class AndroidCommon { } OutputJar resourceJar = null; if (resourceClassJar != null && resourceSourceJar != null) { - resourceJar = new OutputJar(resourceClassJar, null, resourceSourceJar); + resourceJar = new OutputJar(resourceClassJar, null, ImmutableList.of(resourceSourceJar)); javaRuleOutputJarsProviderBuilder.addOutputJar(resourceJar); } JavaRuleOutputJarsProvider ruleOutputJarsProvider = javaRuleOutputJarsProviderBuilder - .addOutputJar(classJar, iJar, srcJar) + .addOutputJar(classJar, iJar, ImmutableList.of(srcJar)) .setJdeps(outputDepsProto) .build(); JavaSourceJarsProvider sourceJarsProvider = javaSourceJarsProviderBuilder.build(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java index fd21c16f9d..85d24500eb 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.rules.android; import com.google.common.base.Function; import com.google.common.collect.ImmutableCollection; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.collect.nestedset.NestedSet; @@ -215,10 +216,11 @@ public class AndroidSkylarkApiProvider extends SkylarkApiProvider { return null; } + Artifact idlSourceJar = getIdeInfoProvider().getIdlSourceJar(); return new OutputJar( getIdeInfoProvider().getIdlClassJar(), null, - getIdeInfoProvider().getIdlSourceJar() + idlSourceJar == null ? ImmutableList.<Artifact>of() : ImmutableList.of(idlSourceJar) ); } } 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 03c6a594a3..0e3b27283b 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 @@ -128,7 +128,8 @@ public class JavaBinary implements RuleConfiguredTargetFactory { .addAllTransitiveSourceJars(common.collectTransitiveSourceJars(srcJar)); Artifact classJar = ruleContext.getImplicitOutputArtifact(JavaSemantics.JAVA_BINARY_CLASS_JAR); JavaRuleOutputJarsProvider.Builder ruleOutputJarsProviderBuilder = - JavaRuleOutputJarsProvider.builder().addOutputJar(classJar, null /* iJar */, srcJar); + JavaRuleOutputJarsProvider.builder().addOutputJar( + classJar, null /* iJar */, ImmutableList.of(srcJar)); CppConfiguration cppConfiguration = ruleContext.getConfiguration().getFragment( CppConfiguration.class); diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java index 2d31f531f0..20b6eba8ca 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java @@ -145,7 +145,7 @@ public class JavaImport implements RuleConfiguredTargetFactory { JavaRuleOutputJarsProvider.builder(); for (Artifact jar : jars) { ruleOutputJarsProviderBuilder.addOutputJar( - jar, compilationToRuntimeJarMap.inverse().get(jar), srcJar); + jar, compilationToRuntimeJarMap.inverse().get(jar), srcJars); } NestedSet<Artifact> proguardSpecs = new ProguardLibrary(ruleContext).collectProguardSpecs(); 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 b9fcd8da27..408e4c23fc 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 @@ -174,7 +174,7 @@ public class JavaLibrary implements RuleConfiguredTargetFactory { JavaRuleOutputJarsProvider ruleOutputJarsProvider = JavaRuleOutputJarsProvider.builder() - .addOutputJar(classJar, iJar, srcJar) + .addOutputJar(classJar, iJar, ImmutableList.of(srcJar)) .setJdeps(outputDepsProto) .build(); JavaCompilationArgsProvider compilationArgsProvider = diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaProvider.java index d66d4404bb..e4f6c55668 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaProvider.java @@ -41,7 +41,9 @@ public final class JavaProvider extends SkylarkClassObject implements Transitive ImmutableSet.of( JavaCompilationArgsProvider.class, JavaSourceJarsProvider.class, - ProtoJavaApiInfoAspectProvider.class); + ProtoJavaApiInfoAspectProvider.class, + JavaRuleOutputJarsProvider.class + ); private final TransitiveInfoProviderMap providers; @@ -77,6 +79,9 @@ public final class JavaProvider extends SkylarkClassObject implements Transitive .addProvider( ProtoJavaApiInfoAspectProvider.class, ProtoJavaApiInfoAspectProvider.merge(protoJavaApiInfoAspectProviders)) + // When a rule merges multiple JavaProviders, its purpose is to pass on information, so + // it doesn't have any output jars. + .addProvider(JavaRuleOutputJarsProvider.class, JavaRuleOutputJarsProvider.builder().build()) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java index c254f80a42..c5fc21b21e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java @@ -15,12 +15,14 @@ package com.google.devtools.build.lib.rules.java; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; 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 com.google.devtools.build.lib.syntax.SkylarkList; import com.google.devtools.build.lib.util.Preconditions; import javax.annotation.Nullable; @@ -46,13 +48,15 @@ public final class JavaRuleOutputJarsProvider implements TransitiveInfoProvider public static class OutputJar { @Nullable private final Artifact classJar; @Nullable private final Artifact iJar; - @Nullable private final Artifact srcJar; + @Nullable private final ImmutableList<Artifact> srcJars; public OutputJar( - @Nullable Artifact classJar, @Nullable Artifact iJar, @Nullable Artifact srcJar) { + @Nullable Artifact classJar, + @Nullable Artifact iJar, + @Nullable Iterable<Artifact> srcJars) { this.classJar = classJar; this.iJar = iJar; - this.srcJar = srcJar; + this.srcJars = ImmutableList.copyOf(srcJars); } @Nullable @@ -80,12 +84,25 @@ public final class JavaRuleOutputJarsProvider implements TransitiveInfoProvider @Nullable @SkylarkCallable( name = "source_jar", - doc = "A sources archive file.", + doc = "A sources archive file. Deprecated. Kept for migration reasons. " + + "Please use source_jars instead.", allowReturnNones = true, structField = true ) + @Deprecated public Artifact getSrcJar() { - return srcJar; + return Iterables.getOnlyElement(srcJars, null); + } + + @Nullable + @SkylarkCallable( + name = "source_jars", + doc = "A list of sources archive files.", + allowReturnNones = true, + structField = true + ) + public SkylarkList<Artifact> getSrcJars() { + return SkylarkList.createImmutable(srcJars); } } @@ -128,9 +145,9 @@ public final class JavaRuleOutputJarsProvider implements TransitiveInfoProvider public Builder addOutputJar( @Nullable Artifact classJar, @Nullable Artifact iJar, - @Nullable Artifact sourceJar) { - Preconditions.checkState(classJar != null || iJar != null || sourceJar != null); - outputJars.add(new OutputJar(classJar, iJar, sourceJar)); + @Nullable ImmutableList<Artifact> sourceJars) { + Preconditions.checkState(classJar != null || iJar != null || !sourceJars.isEmpty()); + outputJars.add(new OutputJar(classJar, iJar, sourceJars)); return this; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java index c7b413437c..f8c37f143b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java @@ -133,7 +133,7 @@ public class JavaSkylarkCommon { MiddlemanProvider hostJavabaseProvider = hostJavabase.getProvider(MiddlemanProvider.class); NestedSet<Artifact> hostJavabaseArtifacts = - hostJavabase == null + hostJavabaseProvider == null ? NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER) : hostJavabaseProvider.getMiddlemanArtifact(); JavaToolchainProvider javaToolchainProvider = @@ -144,11 +144,16 @@ public class JavaSkylarkCommon { javaToolchainProvider, hostJavabaseArtifacts, SkylarkList.createImmutable(ImmutableList.<Artifact>of())); + JavaRuleOutputJarsProvider javaRuleOutputJarsProvider = + JavaRuleOutputJarsProvider.builder().addOutputJar( + new JavaRuleOutputJarsProvider.OutputJar(outputJar, /* ijar */ null, sourceJars)) + .build(); return JavaProvider.Builder.create() .addProvider( JavaCompilationArgsProvider.class, helper.buildCompilationArgsProvider(artifacts, true)) .addProvider(JavaSourceJarsProvider.class, createJavaSourceJarsProvider(sourceJars)) + .addProvider(JavaRuleOutputJarsProvider.class, javaRuleOutputJarsProvider) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java index 9eef47a53c..967756c490 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java @@ -199,7 +199,7 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured // TODO(carmi): Expose to native rules JavaRuleOutputJarsProvider ruleOutputJarsProvider = JavaRuleOutputJarsProvider.builder() - .addOutputJar(outputJar, compileTimeJar, sourceJar) + .addOutputJar(outputJar, compileTimeJar, ImmutableList.of(sourceJar)) .build(); JavaSourceJarsProvider sourceJarsProvider = JavaSourceJarsProvider.create( diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java index e702f27fc9..e2ba1bd868 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java @@ -212,7 +212,7 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe // TODO(carmi): Expose to native rules JavaRuleOutputJarsProvider ruleOutputJarsProvider = JavaRuleOutputJarsProvider.builder() - .addOutputJar(outputJar, compileTimeJar, sourceJar) + .addOutputJar(outputJar, compileTimeJar, ImmutableList.of(sourceJar)) .build(); JavaSourceJarsProvider sourceJarsProvider = JavaSourceJarsProvider.create( |