diff options
author | Lukacs Berki <lberki@google.com> | 2016-07-04 12:57:25 +0000 |
---|---|---|
committer | Klaus Aehlig <aehlig@google.com> | 2016-07-04 14:02:50 +0000 |
commit | 74dcfee2daa23934178579b2e5987178c51c73e2 (patch) | |
tree | 0ca6abfcf43359103d0006ad0f61ac0a70e3f3dc | |
parent | c4aeb0424f5882c7f3b6497a1e4c21c285d6fd0a (diff) |
Use the subprocess factory that uses the Win32 API on Windows.
We should really do something about the mess that is loading our JNI libraries -- io.bazel.EnableJNI is mentioned eight times in the code in various diverse contexts. This change is not the right place to do it, though.
--
MOS_MIGRATED_REVID=126570481
5 files changed, 37 insertions, 3 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD index 567a65b2b0..f56f688d72 100644 --- a/src/main/java/com/google/devtools/build/lib/BUILD +++ b/src/main/java/com/google/devtools/build/lib/BUILD @@ -864,6 +864,7 @@ java_library( ":unix", ":util", ":vfs", + ":windows", "//src/main/java/com/google/devtools/build/docgen:docgen_javalib", "//src/main/java/com/google/devtools/build/lib/actions", "//src/main/java/com/google/devtools/build/lib/query2", diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java index f11b51a05f..f95aecd3e3 100644 --- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java +++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java @@ -71,6 +71,9 @@ import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.In import com.google.devtools.build.lib.server.AfUnixServer; import com.google.devtools.build.lib.server.RPCServer; import com.google.devtools.build.lib.server.signal.InterruptSignalHandler; +import com.google.devtools.build.lib.shell.JavaSubprocessFactory; +import com.google.devtools.build.lib.shell.Subprocess; +import com.google.devtools.build.lib.shell.SubprocessBuilder; import com.google.devtools.build.lib.skyframe.DiffAwareness; import com.google.devtools.build.lib.skyframe.PrecomputedValue; import com.google.devtools.build.lib.skyframe.SequencedSkyframeExecutorFactory; @@ -93,6 +96,7 @@ import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.UnixFileSystem; import com.google.devtools.build.lib.vfs.WindowsFileSystem; +import com.google.devtools.build.lib.windows.WindowsSubprocessFactory; import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.common.options.Option; @@ -893,6 +897,14 @@ public final class BlazeRuntime { return OS.getCurrent() == OS.WINDOWS ? new WindowsFileSystem() : new UnixFileSystem(); } + private static Subprocess.Factory subprocessFactoryImplementation() { + if (!"0".equals(System.getProperty("io.bazel.EnableJni")) && OS.getCurrent() == OS.WINDOWS) { + return WindowsSubprocessFactory.INSTANCE; + } else { + return JavaSubprocessFactory.INSTANCE; + } + } + /** * Creates and returns a new Blaze RPCServer. Call {@link RPCServer#serve()} to start the server. */ @@ -1028,7 +1040,9 @@ public final class BlazeRuntime { if (fs == null) { fs = fileSystemImplementation(); } + Path.setFileSystemForSerialization(fs); + SubprocessBuilder.setSubprocessFactory(subprocessFactoryImplementation()); Path installBasePath = fs.getPath(installBase); Path outputBasePath = fs.getPath(outputBase); diff --git a/src/main/java/com/google/devtools/build/lib/shell/SubprocessBuilder.java b/src/main/java/com/google/devtools/build/lib/shell/SubprocessBuilder.java index 0b6ecfb2f5..b89cf9644b 100644 --- a/src/main/java/com/google/devtools/build/lib/shell/SubprocessBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/shell/SubprocessBuilder.java @@ -46,6 +46,12 @@ public class SubprocessBuilder { private File stderrFile; private File workingDirectory; + private static Subprocess.Factory factory = JavaSubprocessFactory.INSTANCE; + + public static void setSubprocessFactory(Subprocess.Factory factory) { + SubprocessBuilder.factory = factory; + } + public SubprocessBuilder() { stdoutAction = StreamAction.STREAM; stderrAction = StreamAction.STREAM; @@ -154,6 +160,6 @@ public class SubprocessBuilder { } public Subprocess start() throws IOException { - return JavaSubprocessFactory.INSTANCE.create(this); + return factory.create(this); } } diff --git a/src/main/java/com/google/devtools/build/lib/windows/WindowsJniLoader.java b/src/main/java/com/google/devtools/build/lib/windows/WindowsJniLoader.java index b95aa615ef..2fe564e678 100644 --- a/src/main/java/com/google/devtools/build/lib/windows/WindowsJniLoader.java +++ b/src/main/java/com/google/devtools/build/lib/windows/WindowsJniLoader.java @@ -18,11 +18,22 @@ package com.google.devtools.build.lib.windows; * Loads native code under Windows. */ public class WindowsJniLoader { - public static void loadJni() { + private static boolean jniLoaded = false; + public static synchronized void loadJni() { + if (jniLoaded) { + return; + } + System.loadLibrary("windows_jni"); + jniLoaded = true; } - public static void loadJniForTesting(String jniDll) { + public static synchronized void loadJniForTesting(String jniDll) { + if (jniLoaded) { + return; + } + System.load(jniDll); + jniLoaded = true; } } diff --git a/src/main/java/com/google/devtools/build/lib/windows/WindowsSubprocessFactory.java b/src/main/java/com/google/devtools/build/lib/windows/WindowsSubprocessFactory.java index 3a79477ddd..6e7f5290ea 100644 --- a/src/main/java/com/google/devtools/build/lib/windows/WindowsSubprocessFactory.java +++ b/src/main/java/com/google/devtools/build/lib/windows/WindowsSubprocessFactory.java @@ -36,6 +36,8 @@ public class WindowsSubprocessFactory implements Subprocess.Factory { @Override public Subprocess create(SubprocessBuilder builder) throws IOException { + WindowsJniLoader.loadJni(); + String commandLine = WindowsProcesses.quoteCommandLine(builder.getArgv()); byte[] env = builder.getEnv() == null ? null : convertEnvToNative(builder.getEnv()); |