diff options
author | 2018-03-06 08:28:26 -0800 | |
---|---|---|
committer | 2018-03-06 08:30:40 -0800 | |
commit | bb64d2f299e39788f7d1e80fb1e3c92536e498a2 (patch) | |
tree | 693f720372f98b0fbb9ccdb12345303ccf15fa9a /src/main/java/com/google/devtools/build/lib | |
parent | 27b8cc3f4a06e781a92cf2087476af5d51c06b1b (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')
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)); } /** |