diff options
Diffstat (limited to 'src/main/java/com')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/windows/WindowsJniLoader.java | 14 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/windows/WindowsRunfiles.java | 66 |
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]); + } + } + } + } +} |