From d448b64ac995efbedd5d0f61fa150f55d3992678 Mon Sep 17 00:00:00 2001 From: cushon Date: Sat, 15 Jul 2017 03:45:41 +0200 Subject: Add a java_toolchain.tools attribute for configuring additional Java compilation tools, which are added as inputs to javac and turbine actions and available for jvm_opts location expansion. PiperOrigin-RevId: 162036912 --- .../lib/rules/java/JavaCompilationHelper.java | 2 ++ .../build/lib/rules/java/JavaCompileAction.java | 27 ++++++++++------ .../lib/rules/java/JavaHeaderCompileAction.java | 18 +++++++++-- .../build/lib/rules/java/JavaToolchain.java | 3 ++ .../lib/rules/java/JavaToolchainProvider.java | 5 +++ .../build/lib/rules/java/JavaToolchainRule.java | 37 +++++++++++++--------- 6 files changed, 65 insertions(+), 27 deletions(-) (limited to 'src') 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 e6cdecf6d4..dc2672bfcf 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 @@ -205,6 +205,7 @@ public final class JavaCompilationHelper { builder.setSourcePathEntries(attributes.getSourcePath()); builder.setExtdirInputs(getExtdirInputs()); builder.setLangtoolsJar(javaToolchain.getJavac()); + builder.setToolsJars(javaToolchain.getTools()); builder.setJavaBuilderJar(javaToolchain.getJavaBuilder()); builder.setOutputJar(classJar); builder.setManifestProtoOutput(manifestProtoOutput); @@ -393,6 +394,7 @@ public final class JavaCompilationHelper { .addAll(additionalJavaBaseInputs) .build()); builder.setJavacJar(javaToolchain.getJavac()); + builder.setToolsJars(javaToolchain.getTools()); builder.build(javaToolchain); artifactBuilder.setCompileTimeDependencies(headerDeps); diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java index 0fbe097fcf..12c99a38ea 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java @@ -414,7 +414,6 @@ public final class JavaCompileAction extends SpawnAction { private static CustomMultiArgv spawnCommandLineBase( final PathFragment javaExecutable, final Artifact javaBuilderJar, - final Artifact langtoolsJar, final ImmutableList instrumentationJars, final ImmutableList javaBuilderJvmFlags, final String javaBuilderMainClass, @@ -422,7 +421,6 @@ public final class JavaCompileAction extends SpawnAction { return new CustomMultiArgv() { @Override public Iterable argv() { - checkNotNull(langtoolsJar); checkNotNull(javaBuilderJar); CustomCommandLine.Builder builder = @@ -502,6 +500,7 @@ public final class JavaCompileAction extends SpawnAction { private ImmutableList extdirInputs = ImmutableList.of(); private Artifact javaBuilderJar; private Artifact langtoolsJar; + private NestedSet toolsJars = NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER); private ImmutableList instrumentationJars = ImmutableList.of(); private PathFragment sourceGenDirectory; private PathFragment tempDirectory; @@ -590,14 +589,14 @@ public final class JavaCompileAction extends SpawnAction { paramFileContents, ParameterFile.ParameterFileType.UNQUOTED, ISO_8859_1); analysisEnvironment.registerAction(parameterFileWriteAction); - CustomMultiArgv spawnCommandLineBase = spawnCommandLineBase( - javaExecutable, - javaBuilderJar, - langtoolsJar, - instrumentationJars, - javacJvmOpts, - semantics.getJavaBuilderMainClass(), - pathSeparator); + CustomMultiArgv spawnCommandLineBase = + spawnCommandLineBase( + javaExecutable, + javaBuilderJar, + instrumentationJars, + javacJvmOpts, + semantics.getJavaBuilderMainClass(), + pathSeparator); // The actual params-file-based command line executed for a compile action. CommandLine javaBuilderCommandLine = CustomCommandLine.builder() @@ -608,6 +607,7 @@ public final class JavaCompileAction extends SpawnAction { NestedSet tools = NestedSetBuilder.stableOrder() .add(langtoolsJar) + .addTransitive(toolsJars) .add(javaBuilderJar) .addAll(instrumentationJars) .build(); @@ -943,6 +943,13 @@ public final class JavaCompileAction extends SpawnAction { return this; } + /** Sets the tools jars. */ + public Builder setToolsJars(NestedSet toolsJars) { + checkNotNull(toolsJars, "toolsJars must not be null"); + this.toolsJars = toolsJars; + return this; + } + public Builder setJavaBuilderJar(Artifact javaBuilderJar) { this.javaBuilderJar = javaBuilderJar; return this; diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaHeaderCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaHeaderCompileAction.java index 046149453f..25fff15b9e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaHeaderCompileAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaHeaderCompileAction.java @@ -188,6 +188,7 @@ public class JavaHeaderCompileAction extends SpawnAction { private NestedSet javabaseInputs; private Artifact javacJar; + private NestedSet toolsJars = NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER); public Builder(RuleContext ruleContext) { this.ruleContext = ruleContext; @@ -318,6 +319,14 @@ public class JavaHeaderCompileAction extends SpawnAction { this.javacJar = javacJar; return this; } + + /** Sets the tools jars. */ + public Builder setToolsJars(NestedSet toolsJars) { + checkNotNull(toolsJars, "toolsJars must not be null"); + this.toolsJars = toolsJars; + return this; + } + /** Builds and registers the {@link JavaHeaderCompileAction} for a header compilation. */ public void build(JavaToolchainProvider javaToolchain) { ruleContext.registerAction(buildInternal(javaToolchain)); @@ -349,7 +358,12 @@ public class JavaHeaderCompileAction extends SpawnAction { // javac-turbine. boolean requiresAnnotationProcessing = !processorNames.isEmpty(); - Iterable tools = ImmutableList.of(javacJar, javaToolchain.getHeaderCompiler()); + NestedSet tools = + NestedSetBuilder.stableOrder() + .add(javacJar) + .add(javaToolchain.getHeaderCompiler()) + .addTransitive(toolsJars) + .build(); ImmutableList outputs = ImmutableList.of(outputJar, outputDepsProto); NestedSet baseInputs = NestedSetBuilder.stableOrder() @@ -357,7 +371,7 @@ public class JavaHeaderCompileAction extends SpawnAction { .addAll(bootclasspathEntries) .addAll(sourceJars) .addAll(sourceFiles) - .addAll(tools) + .addTransitive(tools) .build(); boolean noFallback = diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java index a2068f6375..65169ab536 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java @@ -72,6 +72,8 @@ public final class JavaToolchain implements RuleConfiguredTargetFactory { ImmutableListMultimap compatibleJavacOptions = getCompatibleJavacOptions(ruleContext); + NestedSet tools = PrerequisiteArtifacts.nestedSet(ruleContext, "tools", Mode.HOST); + TransitiveInfoCollection javacDep = ruleContext.getPrerequisite("javac", Mode.HOST); List jvmOpts = getJvmOpts( ruleContext, @@ -98,6 +100,7 @@ public final class JavaToolchain implements RuleConfiguredTargetFactory { extclasspath, configuration.getDefaultJavacFlags(), javac, + tools, javabuilder, headerCompiler, forciblyDisableHeaderCompilation, diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java index 3d621a3715..cbb0159c07 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java @@ -46,6 +46,7 @@ public abstract class JavaToolchainProvider implements TransitiveInfoProvider { NestedSet extclasspath, List defaultJavacFlags, Artifact javac, + NestedSet tools, Artifact javaBuilder, @Nullable Artifact headerCompiler, boolean forciblyDisableHeaderCompilation, @@ -65,6 +66,7 @@ public abstract class JavaToolchainProvider implements TransitiveInfoProvider { extclasspath, data.getEncoding(), javac, + tools, javaBuilder, headerCompiler, forciblyDisableHeaderCompilation, @@ -107,6 +109,9 @@ public abstract class JavaToolchainProvider implements TransitiveInfoProvider { /** Returns the {@link Artifact} of the javac jar */ public abstract Artifact getJavac(); + /** Returns the {@link Artifact}s of compilation tools. */ + public abstract NestedSet getTools(); + /** Returns the {@link Artifact} of the JavaBuilder deploy jar */ public abstract Artifact getJavaBuilder(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java index 5fabbdf6bd..4068aa4671 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java @@ -98,11 +98,16 @@ public final class JavaToolchainRule implements RuleDefinition { /* Label of the javac jar. */ - .add(attr("javac", LABEL_LIST) - .mandatory() - .cfg(HOST) - .singleArtifact() - .allowedFileTypes(FileTypeSet.ANY_FILE)) + .add( + attr("javac", LABEL_LIST) + .mandatory() + .cfg(HOST) + .singleArtifact() + .allowedFileTypes(FileTypeSet.ANY_FILE)) + /* + Labels of tools available for label-expansion in jvm_opts. + */ + .add(attr("tools", LABEL_LIST).cfg(HOST).allowedFileTypes(FileTypeSet.ANY_FILE)) /* Label of the JavaBuilder deploy jar. */ @@ -146,11 +151,12 @@ public final class JavaToolchainRule implements RuleDefinition { Label of a resource jar containing timezone data. If set, the timezone data is added as an implicitly runtime dependency of all java_binary rules. */ - .add(attr("timezone_data", LABEL) - .cfg(HOST) - .singleArtifact() - .allowedFileTypes(FileTypeSet.ANY_FILE) - .exec()) + .add( + attr("timezone_data", LABEL) + .cfg(HOST) + .singleArtifact() + .allowedFileTypes(FileTypeSet.ANY_FILE) + .exec()) /* Label of the ijar executable. */ @@ -172,11 +178,12 @@ public final class JavaToolchainRule implements RuleDefinition { /* Label of the one-version enforcement binary. */ - .add(attr("oneversion", LABEL) - .cfg(HOST) - .singleArtifact() - .allowedFileTypes(FileTypeSet.ANY_FILE) - .exec()) + .add( + attr("oneversion", LABEL) + .cfg(HOST) + .singleArtifact() + .allowedFileTypes(FileTypeSet.ANY_FILE) + .exec()) /* Label of the one-version whitelist. */ -- cgit v1.2.3