aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
-rw-r--r--src/main/java/com/google/devtools/build/lib/windows/WindowsJniLoader.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/windows/WindowsRunfiles.java66
2 files changed, 79 insertions, 1 deletions
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 2fe564e678..6f42c1cf7f 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
@@ -14,6 +14,8 @@
package com.google.devtools.build.lib.windows;
+import java.io.IOException;
+
/**
* Loads native code under Windows.
*/
@@ -24,7 +26,17 @@ public class WindowsJniLoader {
return;
}
- System.loadLibrary("windows_jni");
+ try {
+ System.loadLibrary("windows_jni");
+ } catch (UnsatisfiedLinkError ex) {
+ // We are probably in tests, let's try to find the library in the runfiles
+ try {
+ System.load(WindowsRunfiles.getRunfile("io_bazel/src/main/native/windows_jni.dll"));
+ } catch (IOException e) {
+ // We throw the UnsatisfiedLinkError if we cannot find the runfiles
+ throw ex;
+ }
+ }
jniLoaded = true;
}
diff --git a/src/main/java/com/google/devtools/build/lib/windows/WindowsRunfiles.java b/src/main/java/com/google/devtools/build/lib/windows/WindowsRunfiles.java
new file mode 100644
index 0000000000..876531073a
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/windows/WindowsRunfiles.java
@@ -0,0 +1,66 @@
+// Copyright 2016 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.windows;
+
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.Charset;
+import java.util.HashMap;
+import java.util.Map;
+
+/** Utility class for getting runfiles in tests on Windows. */
+public final class WindowsRunfiles {
+
+ private static Map<String, String> runfiles;
+
+ /**
+ * Returns the actual path on the system corresponding to a given runfiles path. On Unix-like with
+ * the symlink tree, this function could just returns the runfiles path and let the symlinks do
+ * the actual resolution.
+ */
+ public static String getRunfile(String runfilesPath) throws IOException {
+ ensureRunfilesParsed();
+ return runfiles.get(runfilesPath);
+ }
+
+ private static synchronized void ensureRunfilesParsed() throws IOException {
+ if (runfiles != null) {
+ return;
+ }
+
+ runfiles = new HashMap<>();
+ InputStream fis = new FileInputStream(System.getenv("RUNFILES_MANIFEST_FILE"));
+ InputStreamReader isr = new InputStreamReader(fis, Charset.forName("UTF-8"));
+ try (BufferedReader br = new BufferedReader(isr)) {
+ String line;
+ while ((line = br.readLine()) != null) {
+ line = line.trim();
+ if (!line.isEmpty()) {
+ // TODO(bazel-team): This is buggy when the path contains spaces, we should fix the
+ // manifest format.
+ String[] splitLine = line.split(" ");
+ if (splitLine.length != 2) {
+ throw new IllegalStateException("Runfiles manifest entry contains more than one space");
+ }
+
+ runfiles.put(splitLine[0], splitLine[1]);
+ }
+ }
+ }
+ }
+}