diff options
author | cushon <cushon@google.com> | 2018-05-11 10:11:44 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-05-11 10:13:52 -0700 |
commit | 4926eaf573589d063544b48462544b556c5b408e (patch) | |
tree | 9e06dfdaf25386469390d3d75bddd38a11e2fd25 | |
parent | cfc64a3910ed7c144763f4156a9b4979c5f15d96 (diff) |
Allow java_toolchain.header_compiler to be an arbitrary executable
RELNOTES: Allow java_toolchain.header_compiler to be an arbitrary executable
PiperOrigin-RevId: 196270007
3 files changed, 44 insertions, 21 deletions
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 bf3c2988ae..0c29b59382 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 @@ -38,6 +38,7 @@ import com.google.devtools.build.lib.actions.ParamFileInfo; import com.google.devtools.build.lib.actions.ParameterFile; import com.google.devtools.build.lib.actions.ParameterFile.ParameterFileType; import com.google.devtools.build.lib.actions.ResourceSet; +import com.google.devtools.build.lib.actions.RunfilesSupplier; import com.google.devtools.build.lib.actions.Spawn; import com.google.devtools.build.lib.actions.SpawnActionContext; import com.google.devtools.build.lib.actions.SpawnResult; @@ -114,7 +115,8 @@ public class JavaHeaderCompileAction extends SpawnAction { CommandLines commandLines, CommandLine directCommandLine, CommandLineLimits commandLineLimits, - CharSequence progressMessage) { + CharSequence progressMessage, + RunfilesSupplier runfilesSupplier) { super( owner, tools, @@ -127,8 +129,12 @@ public class JavaHeaderCompileAction extends SpawnAction { false, // TODO(#3320): This is missing the config's action environment. JavaCompileAction.UTF8_ACTION_ENVIRONMENT, + /* executionInfo= */ ImmutableMap.of(), progressMessage, - "Turbine"); + runfilesSupplier, + "Turbine", + /* executeUnconditionally= */ false, + /* extraActionInfoSupplier= */ null); this.directInputs = checkNotNull(directInputs); this.directCommandLine = checkNotNull(directCommandLine); } @@ -372,7 +378,7 @@ public class JavaHeaderCompileAction extends SpawnAction { NestedSet<Artifact> tools = NestedSetBuilder.<Artifact>stableOrder() .add(javacJar) - .add(javaToolchain.getHeaderCompiler()) + .addTransitive(javaToolchain.getHeaderCompiler().getFilesToRun()) .addTransitive(toolsJars) .build(); ImmutableList<Artifact> outputs = ImmutableList.of(outputJar, outputDepsProto); @@ -409,17 +415,23 @@ public class JavaHeaderCompileAction extends SpawnAction { if (noFallback) { commandLine.add("--nojavac_fallback"); } + Artifact headerCompiler = javaToolchain.getHeaderCompiler().getExecutable(); + // The header compiler is either a jar file that needs to be executed using + // `java -jar <path>`, or an executable that can be run directly. + if (!headerCompiler.getExtension().equals("jar")) { + builder.setExecutable(headerCompiler); + builder.addTool(javaToolchain.getHeaderCompiler()); + } else { + builder.setJarExecutable( + hostJavabase.javaBinaryExecPath(), headerCompiler, javaToolchain.getJvmOptions()); + } ruleContext.registerAction( builder - .addTools(tools) + .addTransitiveTools(tools) .addTransitiveInputs(baseInputs) .addTransitiveInputs(classpath) .addOutputs(outputs) .addCommandLine(commandLine.build(), paramFileInfo) - .setJarExecutable( - hostJavabase.javaBinaryExecPath(), - javaToolchain.getHeaderCompiler(), - javaToolchain.getJvmOptions()) .setMnemonic("Turbine") .setProgressMessage(getProgressMessage()) .build(ruleContext)); @@ -482,8 +494,12 @@ public class JavaHeaderCompileAction extends SpawnAction { false, // TODO(b/63280599): This is missing the config's action environment. JavaCompileAction.UTF8_ACTION_ENVIRONMENT, + /* executionInfo= */ ImmutableMap.of(), getProgressMessageWithAnnotationProcessors(), - "JavacTurbine")); + javaToolchain.getHeaderCompiler().getRunfilesSupplier(), + "JavacTurbine", + /* executeUnconditionally= */ false, + /* extraActionInfoSupplier= */ null)); return; } @@ -510,7 +526,8 @@ public class JavaHeaderCompileAction extends SpawnAction { commandLines, directCommandLine, ruleContext.getConfiguration().getCommandLineLimits(), - getProgressMessage())); + getProgressMessage(), + javaToolchain.getHeaderCompiler().getRunfilesSupplier())); } private LazyString getProgressMessageWithAnnotationProcessors() { @@ -540,11 +557,16 @@ public class JavaHeaderCompileAction extends SpawnAction { private CustomCommandLine.Builder getBaseArgs( JavaToolchainProvider javaToolchain, JavaRuntimeInfo hostJavabase) { - return CustomCommandLine.builder() - .addPath(hostJavabase.javaBinaryExecPath()) - .add("-Xverify:none") - .addAll(javaToolchain.getJvmOptions()) - .addExecPath("-jar", javaToolchain.getHeaderCompiler()); + Artifact headerCompiler = javaToolchain.getHeaderCompiler().getExecutable(); + if (!headerCompiler.getExtension().equals("jar")) { + return CustomCommandLine.builder().addExecPath(headerCompiler); + } else { + return CustomCommandLine.builder() + .addPath(hostJavabase.javaBinaryExecPath()) + .add("-Xverify:none") + .addAll(javaToolchain.getJvmOptions()) + .addExecPath("-jar", headerCompiler); + } } /** 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 c571948e46..736b01da92 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 @@ -65,7 +65,8 @@ public class JavaToolchain implements RuleConfiguredTargetFactory { Artifact javac = ruleContext.getPrerequisiteArtifact("javac", Mode.HOST); FilesToRunProvider javabuilder = ruleContext.getExecutablePrerequisite("javabuilder", Mode.HOST); - Artifact headerCompiler = ruleContext.getPrerequisiteArtifact("header_compiler", Mode.HOST); + FilesToRunProvider headerCompiler = + ruleContext.getExecutablePrerequisite("header_compiler", Mode.HOST); boolean forciblyDisableHeaderCompilation = ruleContext.attributes().get("forcibly_disable_header_compilation", Type.BOOLEAN); Artifact singleJar = ruleContext.getPrerequisiteArtifact("singlejar", Mode.HOST); 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 a3962818ff..2938c4e5d6 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 @@ -76,7 +76,7 @@ public class JavaToolchainProvider extends ToolchainInfo { Artifact javac, NestedSet<Artifact> tools, FilesToRunProvider javaBuilder, - @Nullable Artifact headerCompiler, + @Nullable FilesToRunProvider headerCompiler, boolean forciblyDisableHeaderCompilation, Artifact singleJar, @Nullable Artifact oneVersion, @@ -120,7 +120,7 @@ public class JavaToolchainProvider extends ToolchainInfo { private final Artifact javac; private final NestedSet<Artifact> tools; private final FilesToRunProvider javaBuilder; - @Nullable private final Artifact headerCompiler; + @Nullable private final FilesToRunProvider headerCompiler; private final boolean forciblyDisableHeaderCompilation; private final Artifact singleJar; @Nullable private final Artifact oneVersion; @@ -144,7 +144,7 @@ public class JavaToolchainProvider extends ToolchainInfo { Artifact javac, NestedSet<Artifact> tools, FilesToRunProvider javaBuilder, - @Nullable Artifact headerCompiler, + @Nullable FilesToRunProvider headerCompiler, boolean forciblyDisableHeaderCompilation, Artifact singleJar, @Nullable Artifact oneVersion, @@ -214,9 +214,9 @@ public class JavaToolchainProvider extends ToolchainInfo { return javaBuilder; } - /** @return the {@link Artifact} of the Header Compiler deploy jar */ + /** @return the {@link FilesToRunProvider} of the Header Compiler deploy jar */ @Nullable - public Artifact getHeaderCompiler() { + public FilesToRunProvider getHeaderCompiler() { return headerCompiler; } |