aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rwxr-xr-xscripts/bootstrap/compile.sh42
-rw-r--r--src/main/java/com/google/devtools/build/lib/BUILD1
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/WindowsFileSystem.java11
-rw-r--r--src/main/native/BUILD2
4 files changed, 47 insertions, 9 deletions
diff --git a/scripts/bootstrap/compile.sh b/scripts/bootstrap/compile.sh
index 1948943e1f..03064e75d2 100755
--- a/scripts/bootstrap/compile.sh
+++ b/scripts/bootstrap/compile.sh
@@ -251,6 +251,45 @@ exit $?
EOF
chmod 0755 ${ARCHIVE_DIR}/_embedded_binaries/process-wrapper${EXE_EXT}
+function build_jni() {
+ local output_dir=$1
+ local jni_lib_name="windows_jni.dll"
+ local output="${output_dir}/${jni_lib_name}"
+ local tmp_output="${NEW_TMPDIR}/jni/${jni_lib_name}"
+ mkdir -p "$(dirname "$tmp_output")"
+
+ case "${PLATFORM}" in
+ msys*|mingw*)
+ log "Building Windows JNI library..."
+
+ # We have to enable JNI on Windows because some filesystem operations are
+ # not (and cannot be) implemented in Java.
+ ENABLE_JNI=1
+
+ # Let the JVM know where to find the JNI library. This flag overrides the
+ # default value for java.library.path, but since JNI is disabled by default,
+ # that path would be ignored anyway.
+ JNI_PATH="$output_dir"
+
+ # Keep this `find` command in sync with the `srcs` of
+ # //src/main/native:windows_jni
+ local srcs=$(find src/main/native \
+ -name 'windows_*.cc' -o -name 'windows_*.h')
+ [ -n "$srcs" ] || fail "Could not find sources for Windows JNI library"
+
+ # do not quote $srcs because we need to expand it to multiple args
+ src/main/native/build_windows_jni.sh "$tmp_output" ${srcs}
+
+ cp "$tmp_output" "$output"
+ chmod 0755 "$output"
+ ;;
+ esac
+}
+
+ENABLE_JNI=0
+JNI_PATH=""
+build_jni "${ARCHIVE_DIR}/_embedded_binaries"
+
cp src/main/tools/build_interface_so ${ARCHIVE_DIR}/_embedded_binaries/build_interface_so
cp src/main/tools/jdk.BUILD ${ARCHIVE_DIR}/_embedded_binaries/jdk.BUILD
cp $OUTPUT_DIR/libblaze.jar ${ARCHIVE_DIR}
@@ -269,7 +308,8 @@ function bootstrap_build() {
-XX:+HeapDumpOnOutOfMemoryError -Xverify:none -Dfile.encoding=ISO-8859-1 \
-XX:HeapDumpPath=${OUTPUT_DIR} \
-Djava.util.logging.config.file=${OUTPUT_DIR}/javalog.properties \
- -Dio.bazel.EnableJni=0 \
+ -Dio.bazel.EnableJni=${ENABLE_JNI} \
+ -Djava.library.path="$JNI_PATH" \
-jar ${ARCHIVE_DIR}/libblaze.jar \
--batch \
--install_base=${ARCHIVE_DIR} \
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index b474265937..d15c3f2aec 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -135,6 +135,7 @@ java_library(
":os_util",
":preconditions",
":unix",
+ ":windows",
"//third_party:guava",
"//third_party:jsr305",
],
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/WindowsFileSystem.java b/src/main/java/com/google/devtools/build/lib/vfs/WindowsFileSystem.java
index b74b279573..020ef69cd4 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/WindowsFileSystem.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/WindowsFileSystem.java
@@ -14,7 +14,7 @@
package com.google.devtools.build.lib.vfs;
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
-
+import com.google.devtools.build.lib.windows.WindowsFileOperations;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
@@ -88,7 +88,7 @@ public class WindowsFileSystem extends JavaIoFileSystem {
@Override
protected boolean fileIsSymbolicLink(File file) {
try {
- if (file.isDirectory() && isJunction(file.toPath())) {
+ if (file.isDirectory() && WindowsFileOperations.isJunction(file.getPath())) {
return true;
}
} catch (IOException e) {
@@ -164,7 +164,7 @@ public class WindowsFileSystem extends JavaIoFileSystem {
protected boolean isDirectory(Path path, boolean followSymlinks) {
if (!followSymlinks) {
try {
- if (isJunction(getIoFile(path).toPath())) {
+ if (WindowsFileOperations.isJunction(getIoFile(path).getPath())) {
return false;
}
} catch (IOException e) {
@@ -173,9 +173,4 @@ public class WindowsFileSystem extends JavaIoFileSystem {
}
return super.isDirectory(path, followSymlinks);
}
-
- private static boolean isJunction(java.nio.file.Path p) throws IOException {
- // Jury-rigged
- return p.compareTo(p.toRealPath()) != 0;
- }
}
diff --git a/src/main/native/BUILD b/src/main/native/BUILD
index eed0d7edc6..2ae8927bce 100644
--- a/src/main/native/BUILD
+++ b/src/main/native/BUILD
@@ -65,6 +65,8 @@ cc_binary(
genrule(
name = "windows_jni",
+ # Keep this `glob` in sync with scripts/bootstrap/compile.sh:build_jni
+ # function's msys*|mingw* case.
srcs = glob([
"windows_*.cc",
"windows_*.h",