aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build
diff options
context:
space:
mode:
authorGravatar elenairina <elenairina@google.com>2017-11-24 07:23:55 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2017-11-24 07:25:22 -0800
commita6ed4c01d374bcf98bf39c1efc12a0f4f20fe313 (patch)
treeb0a6f8ffb7d9efd8b9f1ca3f3224366319f1a3fa /src/main/java/com/google/devtools/build
parent263c5e07dd2860a866fd361cd29c03afaf3e019f (diff)
Create the output source jar in java_common.compile
and expose transitive source jars to Skylark. Slightly refactor java classes to take in specific host javabase inputs and host java executable for creating the source jar, instead of always relying on fetching them from native java rules specific attributes. Creating the output source jar in java_common.compile makes the behavior more similar to java_library. Exposing the transitive_source_jars to Skylark helps with the Skylark migration from the old 'java' provider to JavaInfo. Progress on #2614. RELNOTES: transitive_source_jars is now exposed on JavaInfo. PiperOrigin-RevId: 176844750
Diffstat (limited to 'src/main/java/com/google/devtools/build')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java18
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java21
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaHelper.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java20
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java47
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java52
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/SingleJarActionBuilder.java73
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java5
9 files changed, 208 insertions, 56 deletions
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 dbcccb88d0..10610aa4cf 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
@@ -473,6 +473,24 @@ public class JavaCommon {
: ruleContext.getHostConfiguration().getFragment(Jvm.class).getJavaExecutable();
}
+ /**
+ * Returns the host java executable.
+ *
+ * <p>The method looks for the executable in the following
+ * locations (in the specified order) and returns it immediately after it's found:
+ * <ol>
+ * <li> The JavaRuntimeInfo in the given hostJavabase target
+ * <li> The JVM fragment of the host configuration, retrieved from the given rule context
+ * </ol>
+ */
+ public static PathFragment getHostJavaExecutable(
+ RuleContext ruleContext, TransitiveInfoCollection hostJavabase) {
+ JavaRuntimeInfo javaRuntime = hostJavabase.get(JavaRuntimeInfo.PROVIDER);
+ return javaRuntime != null
+ ? javaRuntime.javaBinaryExecPath()
+ : ruleContext.getHostConfiguration().getFragment(Jvm.class).getJavaExecutable();
+ }
+
public static PathFragment getJavaExecutable(RuleContext ruleContext) {
JavaRuntimeInfo javaRuntime = JavaHelper.getJavaRuntime(ruleContext);
return javaRuntime != null
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 d0fd5b862b..64140170cf 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
@@ -582,7 +582,28 @@ public final class JavaCompilationHelper {
* @param outputJar the Artifact to create with the Action
* @param gensrcJar the generated sources jar Artifact that should be included with the
* sources in the output Artifact. May be null.
+ * @param javaToolchainProvider is used by SingleJarActionBuilder to retrieve jvm options
+ * @param hostJavabaseInputs Artifacts required to invoke java executable in the SingleJar action
+ * @param hostJavaExecutable the jar executable of the SingleJar action
*/
+ public void createSourceJarAction(
+ Artifact outputJar,
+ @Nullable Artifact gensrcJar,
+ JavaToolchainProvider javaToolchainProvider,
+ NestedSet<Artifact> hostJavabaseInputs,
+ PathFragment hostJavaExecutable) {
+ JavaTargetAttributes attributes = getAttributes();
+ NestedSetBuilder<Artifact> resourceJars = NestedSetBuilder.stableOrder();
+ resourceJars.addAll(attributes.getSourceJars());
+ if (gensrcJar != null) {
+ resourceJars.add(gensrcJar);
+ }
+ SingleJarActionBuilder.createSourceJarAction(
+ ruleContext, semantics, attributes.getSourceFiles(),
+ resourceJars.build(), outputJar, javaToolchainProvider,
+ hostJavabaseInputs, hostJavaExecutable);
+ }
+
public void createSourceJarAction(Artifact outputJar, @Nullable Artifact gensrcJar) {
JavaTargetAttributes attributes = getAttributes();
NestedSetBuilder<Artifact> resourceJars = NestedSetBuilder.stableOrder();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaHelper.java
index 91dbb09897..d9a2bc456e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaHelper.java
@@ -137,6 +137,20 @@ public abstract class JavaHelper {
return rootRelativePath.relativeTo(prefix);
}
+ /** Returns the configured target found under the {@code :host_jdk} attribute of a given rule. */
+ public static TransitiveInfoCollection getHostJavabaseTarget(RuleContext ruleContext) {
+ return getHostJavabaseTarget(ruleContext, "");
+ }
+
+ /**
+ * Returns the configured target found under the {@code :host_jdk + implicitAttributesSuffix}
+ * attribute of a given rule.
+ * */
+ public static TransitiveInfoCollection getHostJavabaseTarget(
+ RuleContext ruleContext, String implicitAttributesSuffix) {
+ return ruleContext.getPrerequisite(":host_jdk" + implicitAttributesSuffix, Mode.HOST);
+ }
+
/** Returns the artifacts required to invoke {@code javahome} relative binary in the action. */
public static NestedSet<Artifact> getHostJavabaseInputs(RuleContext ruleContext) {
return getHostJavabaseInputs(ruleContext, "");
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java
index 9384d0cbdf..d93f4ba52c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java
@@ -22,6 +22,9 @@ import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap;
import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMapBuilder;
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
+import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.packages.NativeInfo;
import com.google.devtools.build.lib.packages.NativeProvider;
@@ -31,7 +34,6 @@ import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
import com.google.devtools.build.lib.syntax.SkylarkList;
import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
import java.util.ArrayList;
-import java.util.LinkedList;
import java.util.List;
import javax.annotation.Nullable;
@@ -119,7 +121,7 @@ public final class JavaInfo extends NativeInfo {
*/
public static <C extends TransitiveInfoProvider> List<C> fetchProvidersFromList(
Iterable<JavaInfo> javaProviders, Class<C> providersClass) {
- List<C> fetchedProviders = new LinkedList<>();
+ List<C> fetchedProviders = new ArrayList<>();
for (JavaInfo javaInfo : javaProviders) {
C provider = javaInfo.getProvider(providersClass);
if (provider != null) {
@@ -272,6 +274,20 @@ public final class JavaInfo extends NativeInfo {
}
@SkylarkCallable(
+ name = "transitive_source_jars",
+ doc = "Returns the Jars containing Java source files for the target and all of its "
+ + "transitive dependencies.",
+ structField = true
+ )
+ public NestedSet<Artifact> getTransitiveSourceJars() {
+ JavaSourceJarsProvider sourceJarsProvider = getProvider(JavaSourceJarsProvider.class);
+ if (sourceJarsProvider == null) {
+ return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
+ }
+ return sourceJarsProvider.getTransitiveSourceJars();
+ }
+
+ @SkylarkCallable(
name = "outputs",
doc = "Returns information about outputs of this Java target.",
structField = true,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java
index 941e7b6e98..ae0e58a437 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java
@@ -22,7 +22,9 @@ import com.google.common.base.Preconditions;
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.MiddlemanProvider;
import com.google.devtools.build.lib.analysis.RuleContext;
+import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration.StrictDepsMode;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -32,6 +34,7 @@ import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.Outpu
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import javax.annotation.Nullable;
/**
* A class to create Java compile actions in a way that is consistent with java_library. Rules that
@@ -156,15 +159,24 @@ public final class JavaLibraryHelper {
}
/**
- * Creates the compile actions. Also fills in the {@link JavaRuleOutputJarsProvider.Builder} with
- * the corresponding compilation outputs.
+ * Creates the compile actions (including the ones for ijar and source jar). Also fills in the
+ * {@link JavaRuleOutputJarsProvider.Builder} with the corresponding compilation outputs.
+ *
+ * @param semantics implementation specific java rules semantics
+ * @param javaToolchainProvider used for retrieving misc java tools
+ * @param hostJavabase the target of the host javabase used to retrieve the java executable and
+ * its necessary inputs
+ * @param jacocoInstrumental jacoco jars needed when running coverage
+ * @param outputJarsBuilder populated with the outputs of the created actions
+ * @param outputSourceJar if not-null, the output of an source jar action that will be created
*/
public JavaCompilationArtifacts build(
JavaSemantics semantics,
JavaToolchainProvider javaToolchainProvider,
- NestedSet<Artifact> hostJavabase,
+ TransitiveInfoCollection hostJavabase,
Iterable<Artifact> jacocoInstrumental,
- JavaRuleOutputJarsProvider.Builder outputJarsBuilder) {
+ JavaRuleOutputJarsProvider.Builder outputJarsBuilder,
+ @Nullable Artifact outputSourceJar) {
Preconditions.checkState(output != null, "must have an output file; use setOutput()");
JavaTargetAttributes.Builder attributes = new JavaTargetAttributes.Builder(semantics);
attributes.addSourceJars(sourceJars);
@@ -185,11 +197,12 @@ public final class JavaLibraryHelper {
attributes, deps);
}
+ NestedSet<Artifact> hostJavabaseArtifacts = getMiddleManFor(hostJavabase);
JavaCompilationArtifacts.Builder artifactsBuilder = new JavaCompilationArtifacts.Builder();
JavaCompilationHelper helper =
new JavaCompilationHelper(ruleContext, semantics, javacOpts, attributes,
javaToolchainProvider,
- hostJavabase,
+ hostJavabaseArtifacts,
jacocoInstrumental);
Artifact outputDepsProto = helper.createOutputDepsProtoArtifact(output, artifactsBuilder);
helper.createCompileAction(
@@ -198,17 +211,35 @@ public final class JavaLibraryHelper {
null /* gensrcOutputJar */,
outputDepsProto,
null /* outputMetadata */);
+
Artifact iJar = helper.createCompileTimeJarAction(output, artifactsBuilder);
artifactsBuilder.addRuntimeJar(output);
- outputJarsBuilder
- .addOutputJar(new OutputJar(output, iJar, sourceJars))
- .setJdeps(outputDepsProto);
+ if (outputSourceJar != null) {
+ helper.createSourceJarAction(outputSourceJar, null,
+ javaToolchainProvider, hostJavabaseArtifacts,
+ JavaCommon.getHostJavaExecutable(ruleContext, hostJavabase));
+ ImmutableList<Artifact> outputSourceJars = ImmutableList.of(outputSourceJar);
+ outputJarsBuilder
+ .addOutputJar(new OutputJar(output, iJar, outputSourceJars))
+ .setJdeps(outputDepsProto);
+ }
return artifactsBuilder.build();
}
+ private static NestedSet<Artifact> getMiddleManFor(TransitiveInfoCollection prereq) {
+ if (prereq == null) {
+ return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
+ }
+ MiddlemanProvider provider = prereq.getProvider(MiddlemanProvider.class);
+ if (provider == null) {
+ return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
+ }
+ return provider.getMiddlemanArtifact();
+ }
+
/**
* Returns a JavaCompilationArgsProvider that fully encapsulates this compilation, based on the
* result of a call to build(). (that is, it contains the compile-time and runtime jars, separated
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 a061157513..a79f498c59 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
@@ -20,7 +20,6 @@ import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.FilesToRunProvider;
-import com.google.devtools.build.lib.analysis.MiddlemanProvider;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.Runfiles;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
@@ -403,7 +402,11 @@ public class JavaSkylarkCommon {
ConfiguredTarget javaToolchain,
ConfiguredTarget hostJavabase,
SkylarkList<Artifact> sourcepathEntries,
- SkylarkList<Artifact> resources) throws EvalException {
+ SkylarkList<Artifact> resources) throws EvalException, InterruptedException {
+ if (sourceJars.isEmpty() && sourceFiles.isEmpty() && exports.isEmpty()) {
+ throw new EvalException(
+ null, "source_jars, sources and exports cannot be simultaneous empty");
+ }
JavaLibraryHelper helper =
new JavaLibraryHelper(skylarkRuleContext.getRuleContext())
@@ -421,25 +424,27 @@ public class JavaSkylarkCommon {
helper.addAllDeps(depsCompilationArgsProviders);
helper.addAllExports(exportsCompilationArgsProviders);
helper.setCompilationStrictDepsMode(getStrictDepsMode(strictDepsMode.toUpperCase()));
- MiddlemanProvider hostJavabaseProvider = hostJavabase.getProvider(MiddlemanProvider.class);
helper.addAllPlugins(
JavaInfo.fetchProvidersFromList(plugins, JavaPluginInfoProvider.class));
helper.addAllPlugins(JavaInfo.fetchProvidersFromList(deps, JavaPluginInfoProvider.class));
- NestedSet<Artifact> hostJavabaseArtifacts =
- hostJavabaseProvider == null
- ? NestedSetBuilder.emptySet(Order.STABLE_ORDER)
- : hostJavabaseProvider.getMiddlemanArtifact();
- JavaToolchainProvider javaToolchainProvider = getJavaToolchainProvider(javaToolchain);
JavaRuleOutputJarsProvider.Builder outputJarsBuilder = JavaRuleOutputJarsProvider.builder();
+
+ boolean generateMergedSourceJar = (sourceJars.size() > 1 || !sourceFiles.isEmpty())
+ || (sourceJars.isEmpty() && sourceFiles.isEmpty() && !exports.isEmpty());
+ Artifact outputSourceJar =
+ generateMergedSourceJar ? getSourceJar(skylarkRuleContext) : sourceJars.get(0);
+
JavaCompilationArtifacts artifacts =
helper.build(
javaSemantics,
- javaToolchainProvider,
- hostJavabaseArtifacts,
+ getJavaToolchainProvider(javaToolchain),
+ hostJavabase,
SkylarkList.createImmutable(ImmutableList.of()),
- outputJarsBuilder);
+ outputJarsBuilder,
+ generateMergedSourceJar ? outputSourceJar : null);
+
JavaCompilationArgsProvider javaCompilationArgsProvider =
helper.buildCompilationArgsProvider(artifacts, true);
Runfiles runfiles =
@@ -456,15 +461,30 @@ public class JavaSkylarkCommon {
JavaPluginInfoProvider.class, exports)
));
+ ImmutableList<Artifact> outputSourceJars = ImmutableList.of(outputSourceJar);
+
+ NestedSetBuilder<Artifact> transitiveSourceJars =
+ NestedSetBuilder.<Artifact>stableOrder().addAll(outputSourceJars);
+ for (JavaSourceJarsProvider sourceJarsProvider :
+ JavaInfo.getProvidersFromListOfJavaProviders(JavaSourceJarsProvider.class, deps)) {
+ transitiveSourceJars.addTransitive(sourceJarsProvider.getTransitiveSourceJars());
+ }
+
return JavaInfo.Builder.create()
.addProvider(JavaCompilationArgsProvider.class, javaCompilationArgsProvider)
- .addProvider(JavaSourceJarsProvider.class, createJavaSourceJarsProvider(sourceJars))
+ .addProvider(JavaSourceJarsProvider.class,
+ createJavaSourceJarsProvider(outputSourceJars, transitiveSourceJars.build()))
.addProvider(JavaRuleOutputJarsProvider.class, outputJarsBuilder.build())
.addProvider(JavaRunfilesProvider.class, new JavaRunfilesProvider(runfiles))
.addProvider(JavaPluginInfoProvider.class, transitivePluginsProvider)
.build();
}
+ private static Artifact getSourceJar(SkylarkRuleContext skylarkRuleContext) throws EvalException {
+ return skylarkRuleContext.getRuleContext()
+ .getBinArtifact("lib" + skylarkRuleContext.getLabel().getName() + "-src.jar");
+ }
+
private static Artifact buildIjar(
SkylarkActionFactory actions,
Artifact inputJar,
@@ -487,13 +507,13 @@ public class JavaSkylarkCommon {
return interfaceJar;
}
/**
- * Creates a {@link JavaSourceJarsProvider} from the given list of source jars.
+ * Creates a {@link JavaSourceJarsProvider} from the given lists of source jars.
*/
- private static JavaSourceJarsProvider createJavaSourceJarsProvider(List<Artifact> sourceJars) {
+ private static JavaSourceJarsProvider createJavaSourceJarsProvider(
+ List<Artifact> sourceJars, NestedSet<Artifact> transitiveSourceJars) {
NestedSet<Artifact> javaSourceJars =
NestedSetBuilder.<Artifact>stableOrder().addAll(sourceJars).build();
- return JavaSourceJarsProvider.create(
- NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), javaSourceJars);
+ return JavaSourceJarsProvider.create(transitiveSourceJars, javaSourceJars);
}
@SkylarkCallable(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/SingleJarActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/java/SingleJarActionBuilder.java
index 61ee42d124..1897453608 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/SingleJarActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/SingleJarActionBuilder.java
@@ -28,7 +28,7 @@ import com.google.devtools.build.lib.analysis.actions.ParamFileInfo;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import javax.annotation.Nullable;
+import com.google.devtools.build.lib.vfs.PathFragment;
/**
* Helper class to create singlejar actions - singlejar can merge multiple zip files without
@@ -45,19 +45,22 @@ public final class SingleJarActionBuilder {
"--warn_duplicate_resources");
/** Constructs the base spawn for a singlejar action. */
- private static SpawnAction.Builder singleJarActionBuilder(RuleContext ruleContext) {
- Artifact singleJar = JavaToolchainProvider.from(ruleContext).getSingleJar();
+ private static SpawnAction.Builder singleJarActionBuilder(
+ JavaToolchainProvider provider,
+ NestedSet<Artifact> hostJavabaseInputs,
+ PathFragment hostJavaExecutable) {
+ Artifact singleJar = provider.getSingleJar();;
SpawnAction.Builder builder = new SpawnAction.Builder();
// If singlejar's name ends with .jar, it is Java application, otherwise it is native.
// TODO(asmundak): once https://github.com/bazelbuild/bazel/issues/2241 is fixed (that is,
// the native singlejar is used on windows) remove support for the Java implementation
if (singleJar.getFilename().endsWith(".jar")) {
builder
- .addTransitiveInputs(JavaHelper.getHostJavabaseInputs(ruleContext))
+ .addTransitiveInputs(hostJavabaseInputs)
.setJarExecutable(
- JavaCommon.getHostJavaExecutable(ruleContext),
+ hostJavaExecutable,
singleJar,
- JavaToolchainProvider.from(ruleContext).getJvmOptions())
+ provider.getJvmOptions())
.setExecutionInfo(ExecutionRequirements.WORKER_MODE_ENABLED);
} else {
builder.setExecutable(singleJar);
@@ -68,26 +71,50 @@ public final class SingleJarActionBuilder {
/**
* Creates an Action that packages files into a Jar file.
*
- * @param semantics the current Java semantics, which must be non-{@code null} if {@code
- * resources} is non-empty
- * @param resources the resources to put into the Jar
+ * @param resources the resources to put into the Jar.
* @param resourceJars the resource jars to merge into the jar
* @param outputJar the Jar to create
*/
public static void createSourceJarAction(
RuleContext ruleContext,
- @Nullable JavaSemantics semantics,
+ JavaSemantics semantics,
ImmutableCollection<Artifact> resources,
NestedSet<Artifact> resourceJars,
Artifact outputJar) {
+ createSourceJarAction(
+ ruleContext, semantics, resources, resourceJars, outputJar,
+ JavaToolchainProvider.from(ruleContext),
+ JavaHelper.getHostJavabaseInputs(ruleContext),
+ JavaCommon.getHostJavaExecutable(ruleContext));
+ }
+
+ /**
+ * Creates an Action that packages files into a Jar file.
+ *
+ * @param resources the resources to put into the Jar.
+ * @param resourceJars the resource jars to merge into the jar
+ * @param outputJar the Jar to create
+ * @param toolchainProvider is used to retrieve jvm options
+ * @param hostJavabaseInputs Artifacts required to invoke java executable in the created action
+ * @param hostJavaExecutable the jar executable of the created action
+ */
+ public static void createSourceJarAction(
+ RuleContext ruleContext,
+ JavaSemantics semantics,
+ ImmutableCollection<Artifact> resources,
+ NestedSet<Artifact> resourceJars,
+ Artifact outputJar,
+ JavaToolchainProvider toolchainProvider,
+ NestedSet<Artifact> hostJavabaseInputs,
+ PathFragment hostJavaExecutable) {
requireNonNull(ruleContext);
requireNonNull(resourceJars);
requireNonNull(outputJar);
if (!resources.isEmpty()) {
requireNonNull(semantics);
}
- SpawnAction.Builder builder =
- singleJarActionBuilder(ruleContext)
+ SpawnAction.Builder builder = singleJarActionBuilder(
+ toolchainProvider, hostJavabaseInputs, hostJavaExecutable)
.addOutput(outputJar)
.addInputs(resources)
.addTransitiveInputs(resourceJars)
@@ -111,15 +138,18 @@ public final class SingleJarActionBuilder {
requireNonNull(jars);
requireNonNull(output);
SpawnAction.Builder builder =
- singleJarActionBuilder(ruleContext)
- .addOutput(output)
- .addInputs(jars)
- .addCommandLine(
- sourceJarCommandLine(
- output, /* semantics= */ null, /* resources= */ ImmutableList.of(), jars),
- ParamFileInfo.builder(ParameterFileType.SHELL_QUOTED).setUseAlways(true).build())
- .setProgressMessage("Building singlejar jar %s", output.prettyPrint())
- .setMnemonic("JavaSingleJar");
+ singleJarActionBuilder(
+ JavaToolchainProvider.from(ruleContext),
+ JavaHelper.getHostJavabaseInputs(ruleContext),
+ JavaCommon.getHostJavaExecutable(ruleContext))
+ .addOutput(output)
+ .addInputs(jars)
+ .addCommandLine(
+ sourceJarCommandLine(
+ output, /* semantics= */ null, /* resources= */ ImmutableList.of(), jars),
+ ParamFileInfo.builder(ParameterFileType.SHELL_QUOTED).setUseAlways(true).build())
+ .setProgressMessage("Building singlejar jar %s", output.prettyPrint())
+ .setMnemonic("JavaSingleJar");
ruleContext.registerAction(builder.build(ruleContext));
}
@@ -146,3 +176,4 @@ public final class SingleJarActionBuilder {
semantics.getDefaultJavaResourcePath(resource.getRootRelativePath()));
}
}
+
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 7d87f9891d..2392d68af5 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
@@ -264,13 +264,13 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured
}
}
- JavaCompilationArtifacts artifacts =
- helper.build(
- javaSemantics,
- JavaCompilationHelper.getJavaToolchainProvider(ruleContext),
- JavaHelper.getHostJavabaseInputs(ruleContext),
- JavaCompilationHelper.getInstrumentationJars(ruleContext),
- JavaRuleOutputJarsProvider.builder());
+ JavaCompilationArtifacts artifacts = helper.build(
+ javaSemantics,
+ JavaCompilationHelper.getJavaToolchainProvider(ruleContext),
+ JavaHelper.getHostJavabaseTarget(ruleContext),
+ JavaCompilationHelper.getInstrumentationJars(ruleContext),
+ JavaRuleOutputJarsProvider.builder(),
+ /*outputSourceJar=*/ null);
return helper.buildCompilationArgsProvider(artifacts, true /* isReportedAsStrict */);
}
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 4603add72f..7185d2e302 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
@@ -306,9 +306,10 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe
helper.build(
javaSemantics,
JavaCompilationHelper.getJavaToolchainProvider(ruleContext),
- JavaHelper.getHostJavabaseInputs(ruleContext),
+ JavaHelper.getHostJavabaseTarget(ruleContext),
JavaCompilationHelper.getInstrumentationJars(ruleContext),
- JavaRuleOutputJarsProvider.builder()),
+ JavaRuleOutputJarsProvider.builder(),
+ /*outputSourceJar=*/ null),
true /* isReportedAsStrict */);
}