aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
authorGravatar dbabkin <dbabkin@google.com>2018-03-06 08:28:26 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-03-06 08:30:40 -0800
commitbb64d2f299e39788f7d1e80fb1e3c92536e498a2 (patch)
tree693f720372f98b0fbb9ccdb12345303ccf15fa9a /src/main/java/com/google/devtools/build/lib
parent27b8cc3f4a06e781a92cf2087476af5d51c06b1b (diff)
Implement support for sourceFiles parameter in JavaInfo constructor.
RELNOTES:none PiperOrigin-RevId: 188026038
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java15
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java33
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java141
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/SingleJarActionBuilder.java12
4 files changed, 157 insertions, 44 deletions
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 d47fe0dbdb..faab225a5e 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
@@ -28,6 +28,7 @@ import com.google.devtools.build.lib.analysis.FileProvider;
import com.google.devtools.build.lib.analysis.FilesToRunProvider;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
+import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
@@ -631,8 +632,14 @@ public final class JavaCompilationHelper {
resourceJars.add(gensrcJar);
}
SingleJarActionBuilder.createSourceJarAction(
- ruleContext, semantics, attributes.getSourceFiles(),
- resourceJars.build(), outputJar, javaToolchainProvider, hostJavabase);
+ ruleContext,
+ ruleContext,
+ semantics,
+ attributes.getSourceFiles(),
+ resourceJars.build(),
+ outputJar,
+ javaToolchainProvider,
+ hostJavabase);
}
public void createSourceJarAction(Artifact outputJar, @Nullable Artifact gensrcJar) {
@@ -908,10 +915,10 @@ public final class JavaCompilationHelper {
* The new artifact will have the same root as the given one.
*/
static Artifact derivedArtifact(
- RuleContext ruleContext, Artifact artifact, String prefix, String suffix) {
+ ActionConstructionContext context, Artifact artifact, String prefix, String suffix) {
PathFragment path = artifact.getRootRelativePath();
String basename = FileSystemUtils.removeExtension(path.getBaseName()) + suffix;
path = path.replaceName(prefix + basename);
- return ruleContext.getDerivedArtifact(path, artifact.getRoot());
+ return context.getDerivedArtifact(path, artifact.getRoot());
}
}
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 8319681d8a..f42d65bd77 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
@@ -88,7 +88,8 @@ public final class JavaInfo extends NativeInfo {
"runtime_deps",
"exports",
"actions",
- "java_toolchain"),
+ "java_toolchain",
+ "host_javabase"),
/*defaultValues=*/ Arrays.asList(
SkylarkList.createImmutable(Collections.emptyList()), // sources
@@ -99,8 +100,10 @@ public final class JavaInfo extends NativeInfo {
SkylarkList.createImmutable(Collections.emptyList()), // runtime_deps
SkylarkList.createImmutable(Collections.emptyList()), // exports
Runtime.NONE, // actions
- Runtime.NONE), // java_toolchain
- /*types=*/ ImmutableList.of(
+ Runtime.NONE, // java_toolchain
+ Runtime.NONE), // hostJavabase
+
+ /*types=*/ ImmutableList.<SkylarkType>of(
SkylarkType.of(Artifact.class), // output_jar
SkylarkType.Union.of(SEQUENCE_OF_ARTIFACTS, LIST_OF_ARTIFACTS), // sources
SkylarkType.Union.of(SEQUENCE_OF_ARTIFACTS, LIST_OF_ARTIFACTS), // source_jars
@@ -110,7 +113,8 @@ public final class JavaInfo extends NativeInfo {
SEQUENCE_OF_JAVA_INFO, // runtime_deps
SEQUENCE_OF_JAVA_INFO, // exports
SkylarkType.of(SkylarkActionFactory.class), // actions
- SkylarkType.of(ConfiguredTarget.class))); // java_toolchain
+ SkylarkType.of(ConfiguredTarget.class), // java_toolchain
+ SkylarkType.of(ConfiguredTarget.class))); // hostJavabase
public static final NativeProvider<JavaInfo> PROVIDER =
new NativeProvider<JavaInfo>(JavaInfo.class, SKYLARK_NAME, SIGNATURE) {
@@ -123,16 +127,17 @@ public final class JavaInfo extends NativeInfo {
JavaInfo javaInfo =
JavaInfoBuildHelper.getInstance()
.createJavaInfo(
- (Artifact) args[0],
- (SkylarkList<Artifact>) args[1],
- (SkylarkList<Artifact>) args[2],
- (Boolean) args[3],
- (Boolean) args[4],
- (SkylarkList<JavaInfo>) args[5],
- (SkylarkList<JavaInfo>) args[6],
- (SkylarkList<JavaInfo>) args[7],
- args[8],
- args[9],
+ (Artifact) args[0], // output_jar
+ (SkylarkList<Artifact>) args[1], // sources
+ (SkylarkList<Artifact>) args[2], // source_jars
+ (Boolean) args[3], // use_ijar
+ (Boolean) args[4], // neverlink
+ (SkylarkList<JavaInfo>) args[5], // deps
+ (SkylarkList<JavaInfo>) args[6], // runtime_deps
+ (SkylarkList<JavaInfo>) args[7], // exports
+ args[8], // actions
+ args[9], // java_toolchain
+ args[10], // hostJavabase
loc);
return javaInfo;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java
index 6c9c5b65cb..df28e7cc9c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java
@@ -20,11 +20,15 @@ import static com.google.devtools.build.lib.rules.java.JavaCompilationArgs.Class
import static java.util.stream.Stream.concat;
import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
+import com.google.devtools.build.lib.actions.ActionRegistry;
import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.actions.ArtifactOwner;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.FilesToRunProvider;
import com.google.devtools.build.lib.analysis.Runfiles;
import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
+import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.analysis.actions.SpawnAction.Builder;
@@ -84,12 +88,31 @@ final class JavaInfoBuildHelper {
Boolean neverlink,
SkylarkList<JavaInfo> compileTimeDeps,
SkylarkList<JavaInfo> runtimeDeps,
- SkylarkList<JavaInfo> exports, // TODO(b/69780248): handle exports. See #3769
+ SkylarkList<JavaInfo> exports,
Object action,
Object javaToolchain,
+ Object hostJavabase,
Location location)
throws EvalException {
+ if (sourceFiles.isEmpty() && sourceJars.isEmpty() && exports.isEmpty()) {
+ throw new EvalException(
+ null, "source_jars, sources and exports cannot be simultaneous empty");
+ }
+
+
+ ImmutableList<Artifact> outputSourceJars;
+
+ if (sourceFiles.isEmpty() && sourceJars.size() == 1){
+ outputSourceJars = ImmutableList.copyOf(sourceJars);
+ } else if (!sourceFiles.isEmpty() || !sourceJars.isEmpty()){
+ Artifact source = packSourceFiles(
+ outputJar, sourceFiles, sourceJars, action, javaToolchain, hostJavabase, location);
+ outputSourceJars = ImmutableList.of(source);
+ } else {
+ outputSourceJars = ImmutableList.of();
+ }
+
JavaInfo.Builder javaInfoBuilder = JavaInfo.Builder.create();
javaInfoBuilder.setLocation(location);
@@ -104,15 +127,14 @@ final class JavaInfoBuildHelper {
Artifact iJar = outputJar;
if (useIjar) {
SkylarkActionFactory skylarkActionFactory = checkActionType(action, location);
- ConfiguredTarget configuredTarget = checkConfiguredTargetType(javaToolchain, location);
- iJar = buildIjar(outputJar, skylarkActionFactory, configuredTarget);
+ ConfiguredTarget javaToolchainConfiguredTarget =
+ checkConfiguredTargetType(javaToolchain, "java_toolchain", location);
+ iJar = buildIjar(outputJar, skylarkActionFactory, javaToolchainConfiguredTarget);
}
javaCompilationArgsBuilder.addCompileTimeJar(iJar);
- JavaRuleOutputJarsProvider javaRuleOutputJarsProvider =
- JavaRuleOutputJarsProvider.builder()
- .addOutputJar(outputJar, iJar, ImmutableList.copyOf(sourceJars))
- .build();
+ JavaRuleOutputJarsProvider javaRuleOutputJarsProvider = JavaRuleOutputJarsProvider.builder()
+ .addOutputJar(outputJar, iJar, outputSourceJars).build();
javaInfoBuilder.addProvider(JavaRuleOutputJarsProvider.class, javaRuleOutputJarsProvider);
JavaCompilationArgs.Builder recursiveJavaCompilationArgsBuilder =
@@ -138,14 +160,81 @@ final class JavaInfoBuildHelper {
javaInfoBuilder.addProvider(JavaExportsProvider.class, createJavaExportsProvider(exports));
- javaInfoBuilder.addProvider(JavaSourceJarsProvider.class,
- createJavaSourceJarsProvider(sourceJars, concat(compileTimeDeps, runtimeDeps, exports)));
-
- // TODO(b/69780248): add other providers. See #3769
+ javaInfoBuilder.addProvider(
+ JavaSourceJarsProvider.class,
+ createJavaSourceJarsProvider(
+ outputSourceJars, concat(compileTimeDeps, runtimeDeps, exports)));
return javaInfoBuilder.build();
}
+ /**
+ * Creates action which creates archive with all source files inside.
+ * Takes all filer from sourceFiles collection and all files from every sourceJars.
+ * Name of Artifact generated based on outputJar.
+ *
+ * @param outputJar name of output Jar artifact.
+ * @return generated artifact
+ */
+ private Artifact packSourceFiles(
+ Artifact outputJar,
+ SkylarkList<Artifact> sourceFiles,
+ SkylarkList<Artifact> sourceJars,
+ Object action,
+ Object javaToolchain,
+ Object hostJavabase,
+ Location location)
+ throws EvalException {
+
+ SkylarkActionFactory skylarkActionFactory = checkActionType(action, location);
+ ActionRegistry actionRegistry = createActionRegistry(skylarkActionFactory);
+
+ Artifact outputSrcJar =
+ getSourceJar(
+ skylarkActionFactory.getActionConstructionContext(), outputJar);
+
+ ConfiguredTarget hostJavabaseConfiguredTarget =
+ checkConfiguredTargetType(hostJavabase, "host_javabase", location);
+ JavaRuntimeInfo javaRuntimeInfo = JavaRuntimeInfo.from(hostJavabaseConfiguredTarget, null);
+
+ ConfiguredTarget javaToolchainConfiguredTarget =
+ checkConfiguredTargetType(javaToolchain, "java_toolchain", location);
+ JavaToolchainProvider javaToolchainProvider =
+ getJavaToolchainProvider(javaToolchainConfiguredTarget);
+
+ JavaSemantics javaSemantics = javaToolchainProvider.getJavaSemantics();
+
+ SingleJarActionBuilder.createSourceJarAction(
+ actionRegistry,
+ skylarkActionFactory.getActionConstructionContext(),
+ javaSemantics,
+ ImmutableList.copyOf(sourceFiles),
+ NestedSetBuilder.<Artifact>stableOrder().addAll(sourceJars).build(),
+ outputSrcJar,
+ javaToolchainProvider,
+ javaRuntimeInfo);
+
+ return outputSrcJar;
+ }
+
+ private ActionRegistry createActionRegistry(SkylarkActionFactory skylarkActionFactory) {
+ return new ActionRegistry() {
+
+ @Override
+ public void registerAction(ActionAnalysisMetadata... actions) {
+ skylarkActionFactory.registerAction(actions);
+ }
+
+ @Override
+ public ArtifactOwner getOwner() {
+ return skylarkActionFactory
+ .getActionConstructionContext()
+ .getAnalysisEnvironment()
+ .getOwner();
+ }
+ };
+ }
+
/** Creates a {@link JavaSourceJarsProvider} from the given lists of source jars. */
private static JavaSourceJarsProvider createJavaSourceJarsProvider(
List<Artifact> sourceJars, NestedSet<Artifact> transitiveSourceJars) {
@@ -228,7 +317,7 @@ final class JavaInfoBuildHelper {
SkylarkActionFactory skylarkActionFactory =
checkActionType(actionsUnchecked);
ConfiguredTarget configuredTarget =
- checkConfiguredTargetType(javaToolchainUnchecked);
+ checkConfiguredTargetType(javaToolchainUnchecked, "java_toolchain");
for (Artifact compileJar : compileTimeJars) {
javaCompilationArgsBuilder.addCompileTimeJar(
buildIjar(compileJar, skylarkActionFactory, configuredTarget));
@@ -326,7 +415,9 @@ final class JavaInfoBuildHelper {
(sourceJars.size() > 1 || !sourceFiles.isEmpty())
|| (sourceJars.isEmpty() && sourceFiles.isEmpty() && !exports.isEmpty());
Artifact outputSourceJar =
- generateMergedSourceJar ? getSourceJar(skylarkRuleContext, outputJar) : sourceJars.get(0);
+ generateMergedSourceJar
+ ? getSourceJar(skylarkRuleContext.getRuleContext(), outputJar)
+ : sourceJars.get(0);
JavaCompilationArtifacts artifacts =
helper.build(
@@ -388,25 +479,30 @@ final class JavaInfoBuildHelper {
"The value of use_ijar is True. Make sure the ctx.actions argument is valid.");
}
- private ConfiguredTarget checkConfiguredTargetType(Object javaToolchain) throws EvalException {
- return checkConfiguredTargetType(javaToolchain, /*location=*/ null);
+ private ConfiguredTarget checkConfiguredTargetType(Object javaToolchain, String typeName)
+ throws EvalException {
+ return checkConfiguredTargetType(javaToolchain, typeName, /*location=*/ null);
}
- private ConfiguredTarget checkConfiguredTargetType(Object javaToolchain, Location location)
- throws EvalException {
+ private ConfiguredTarget checkConfiguredTargetType(
+ Object javaToolchain, String typeName, Location location) throws EvalException {
+ Objects.requireNonNull(typeName);
return SkylarkType.cast(
javaToolchain,
ConfiguredTarget.class,
location,
- "The value of use_ijar is True. Make sure the java_toolchain argument is a valid.");
+ "The value of use_ijar is True. Make sure the " + typeName + " argument is a valid.");
}
private Artifact buildIjar(
- Artifact inputJar, SkylarkActionFactory actions, ConfiguredTarget javaToolchain)
+ Artifact inputJar,
+ SkylarkActionFactory actions,
+ ConfiguredTarget javaToolchainConfiguredTarget)
throws EvalException {
String ijarBasename = FileSystemUtils.removeExtension(inputJar.getFilename()) + "-ijar.jar";
Artifact interfaceJar = actions.declareFile(ijarBasename, inputJar);
- FilesToRunProvider ijarTarget = getJavaToolchainProvider(javaToolchain).getIjar();
+ FilesToRunProvider ijarTarget =
+ getJavaToolchainProvider(javaToolchainConfiguredTarget).getIjar();
SpawnAction.Builder actionBuilder =
new Builder()
.addInput(inputJar)
@@ -449,8 +545,7 @@ final class JavaInfoBuildHelper {
}
}
- private static Artifact getSourceJar(SkylarkRuleContext skylarkRuleContext, Artifact outputJar) {
- return JavaCompilationHelper.derivedArtifact(
- skylarkRuleContext.getRuleContext(), outputJar, "", "-src.jar");
+ private static Artifact getSourceJar(ActionConstructionContext context, Artifact outputJar) {
+ return JavaCompilationHelper.derivedArtifact(context, outputJar, "", "-src.jar");
}
}
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 3fb0862e54..90f9252524 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
@@ -18,6 +18,7 @@ import static java.util.Objects.requireNonNull;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.actions.ActionRegistry;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.CommandLine;
import com.google.devtools.build.lib.actions.CommandLineItem;
@@ -25,6 +26,7 @@ import com.google.devtools.build.lib.actions.ExecutionRequirements;
import com.google.devtools.build.lib.actions.ParamFileInfo;
import com.google.devtools.build.lib.actions.ParameterFile.ParameterFileType;
import com.google.devtools.build.lib.analysis.RuleContext;
+import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine.VectorArg;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
@@ -83,6 +85,7 @@ public final class SingleJarActionBuilder {
Artifact outputJar) {
createSourceJarAction(
ruleContext,
+ ruleContext,
semantics,
resources,
resourceJars,
@@ -94,6 +97,8 @@ public final class SingleJarActionBuilder {
/**
* Creates an Action that packages files into a Jar file.
*
+ * @param actionRegistry serves for registering action,,
+ * @param actionConstructionContext bundles items commonly needed to construct action instances,
* @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
@@ -101,14 +106,14 @@ public final class SingleJarActionBuilder {
* @param hostJavabase the Java runtime to run the tools under
*/
public static void createSourceJarAction(
- RuleContext ruleContext,
+ ActionRegistry actionRegistry,
+ ActionConstructionContext actionConstructionContext,
JavaSemantics semantics,
ImmutableCollection<Artifact> resources,
NestedSet<Artifact> resourceJars,
Artifact outputJar,
JavaToolchainProvider toolchainProvider,
JavaRuntimeInfo hostJavabase) {
- requireNonNull(ruleContext);
requireNonNull(resourceJars);
requireNonNull(outputJar);
if (!resources.isEmpty()) {
@@ -124,7 +129,8 @@ public final class SingleJarActionBuilder {
ParamFileInfo.builder(ParameterFileType.SHELL_QUOTED).setUseAlways(true).build())
.setProgressMessage("Building source jar %s", outputJar.prettyPrint())
.setMnemonic("JavaSourceJar");
- ruleContext.registerAction(builder.build(ruleContext));
+
+ actionRegistry.registerAction(builder.build(actionConstructionContext));
}
/**