diff options
author | 2015-06-09 12:47:32 +0000 | |
---|---|---|
committer | 2015-06-10 16:02:08 +0000 | |
commit | b7ce7a84484e877fab21e5e5f2fc1befb55a5384 (patch) | |
tree | 3fc6af5420f25a697f2accf91a6f72f74a81a797 /src/java_tools/buildjar | |
parent | 6c5688d121cba9e68259be13a0ce39dc4f026f9a (diff) |
JavaBuilder can run as a Blaze worker process now.
--
MOS_MIGRATED_REVID=95527889
Diffstat (limited to 'src/java_tools/buildjar')
-rw-r--r-- | src/java_tools/buildjar/BUILD | 6 | ||||
-rw-r--r-- | src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BazelJavaBuilder.java | 93 |
2 files changed, 89 insertions, 10 deletions
diff --git a/src/java_tools/buildjar/BUILD b/src/java_tools/buildjar/BUILD index eabf9d53b1..5e41759ba1 100644 --- a/src/java_tools/buildjar/BUILD +++ b/src/java_tools/buildjar/BUILD @@ -6,6 +6,7 @@ java_binary( main_class = "com.google.devtools.build.buildjar.BazelJavaBuilder", deps = [ "//src/main/protobuf:proto_deps", + "//src/main/protobuf:proto_worker_protocol", "//third_party:error_prone", "//third_party:guava", "//third_party:jsr305", @@ -176,7 +177,10 @@ bootstrap_java_library( "//third_party:protobuf-jars", ], neverlink_jars = ["//tools/defaults:java_langtools"], - srcjars = ["//src/main/protobuf:proto_deps_srcjar"], + srcjars = [ + "//src/main/protobuf:proto_deps_srcjar", + "//src/main/protobuf:proto_worker_protocol_srcjar", + ], ) bootstrap_java_binary( diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BazelJavaBuilder.java b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BazelJavaBuilder.java index 4531098a77..0ba15cd4fd 100644 --- a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BazelJavaBuilder.java +++ b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BazelJavaBuilder.java @@ -20,9 +20,14 @@ import com.google.devtools.build.buildjar.javac.plugins.BlazeJavaCompilerPlugin; import com.google.devtools.build.buildjar.javac.plugins.dependency.DependencyModule; import com.google.devtools.build.buildjar.javac.plugins.errorprone.ErrorProneOptionsPlugin; import com.google.devtools.build.buildjar.javac.plugins.filemanager.FileManagerInitializationPlugin; +import com.google.devtools.build.lib.worker.WorkerProtocol.WorkRequest; +import com.google.devtools.build.lib.worker.WorkerProtocol.WorkResponse; +import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.PrintStream; import java.util.Arrays; +import java.util.List; /** * The JavaBuilder main called by bazel. @@ -35,22 +40,92 @@ public abstract class BazelJavaBuilder { * The main method of the BazelJavaBuilder. */ public static void main(String[] args) { + if (args.length == 1 && args[0].equals("--persistent_worker")) { + System.exit(runPersistentWorker()); + } else { + // This is a single invocation of JavaBuilder that exits after it processed the request. + System.exit(processRequest(Arrays.asList(args))); + } + } + + private static int runPersistentWorker() { + PrintStream originalStdOut = System.out; + PrintStream originalStdErr = System.err; + + while (true) { + try { + WorkRequest request = WorkRequest.parseDelimitedFrom(System.in); + + if (request == null) { + break; + } + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + PrintStream ps = new PrintStream(baos, true); + // Make sure that we exit nonzero in case an exception occurs during processRequest. + int exitCode = 1; + // TODO(philwo) - change this so that a PrintWriter can be passed in and will be used + // instead of redirect stdout / stderr. + System.setOut(ps); + System.setErr(ps); + try { + exitCode = processRequest(request.getArgumentsList()); + } finally { + System.setOut(originalStdOut); + System.setErr(originalStdErr); + } + + WorkResponse.newBuilder() + .setOutput(baos.toString()) + .setExitCode(exitCode) + .build() + .writeDelimitedTo(System.out); + System.out.flush(); + } catch (IOException e) { + e.printStackTrace(); + return 1; + } finally { + // JavaBuilder doesn't close certain file handles. We have to migrate to using the real + // Jsr199 API instead of just calling the Main method of Javac in order to fix this, for + // now let's just invoke GC. + System.gc(); + } + } + + return 0; + } + + private static int processRequest(List<String> args) { try { - ImmutableList<BlazeJavaCompilerPlugin> plugins = - ImmutableList.<BlazeJavaCompilerPlugin>of( - new FileManagerInitializationPlugin(), - new ErrorProneOptionsPlugin()); - JavaLibraryBuildRequest build = - new JavaLibraryBuildRequest( - Arrays.asList(args), plugins, new DependencyModule.Builder()); - build.setJavacOpts(JavacOptions.normalizeOptions(build.getJavacOpts())); + JavaLibraryBuildRequest build = parse(args); AbstractJavaBuilder builder = build.getDependencyModule().reduceClasspath() ? new ReducedClasspathJavaLibraryBuilder() : new SimpleJavaLibraryBuilder(); builder.run(build, System.err); } catch (IOException | InvalidCommandLineException e) { System.err.println(CMDNAME + " threw exception : " + e.getMessage()); - System.exit(1); + return 1; } + return 0; + } + + /** + * Parses the list of arguments into a {@link JavaLibraryBuildRequest}. The returned + * {@link JavaLibraryBuildRequest} object can be then used to configure the compilation itself. + * + * @throws IOException if the argument list contains a file (with the @ prefix) and reading that + * file failed + * @throws InvalidCommandLineException on any command line error + */ + private static JavaLibraryBuildRequest parse(List<String> args) throws IOException, + InvalidCommandLineException { + ImmutableList<BlazeJavaCompilerPlugin> plugins = + ImmutableList.<BlazeJavaCompilerPlugin>of( + new FileManagerInitializationPlugin(), + new ErrorProneOptionsPlugin()); + JavaLibraryBuildRequest build = + new JavaLibraryBuildRequest(args, plugins, new DependencyModule.Builder()); + build.setJavacOpts(JavacOptions.normalizeOptions(build.getJavacOpts())); + return build; } } |