Unify JNI libraries handling.
JNI libraries are now coming with corresponding Java libraries - no need to explicitly include them everywhere. As a result UnixJniLoader significantly simplified.
RELNOTES: None.
PiperOrigin-RevId: 293323937
diff --git a/src/BUILD b/src/BUILD
index 425c588..2c32624 100644
--- a/src/BUILD
+++ b/src/BUILD
@@ -10,27 +10,11 @@
# OpenBSD; here we use `dd` instead.
md5_cmd = "set -e -o pipefail && echo $(SRCS) | sort | xargs %s | %s | dd bs=32 count=1 > $@"
-# TODO(bazel-team): find a better way to handle dylib extensions.
-filegroup(
- name = "libunix",
- srcs = select({
- "//src/conditions:darwin": ["//src/main/native:libunix.dylib"],
- "//src/conditions:darwin_x86_64": ["//src/main/native:libunix.dylib"],
- "//src/conditions:windows": ["//src/main/native/windows:windows_jni.dll"],
- "//conditions:default": ["//src/main/native:libunix.so"],
- }),
- visibility = [
- "//src/test/java:__pkg__",
- "//src/tools/remote:__subpackages__",
- ],
-)
-
[genrule(
name = "install_base_key-file" + suffix,
srcs = [
"//src/main/java/com/google/devtools/build/lib:bazel/BazelServer_deploy.jar",
"//src/main/cpp:client",
- ":libunix",
"//src/main/tools:build-runfiles",
"//src/main/tools:process-wrapper",
"//src/main/tools:linux-sandbox",
@@ -343,7 +327,8 @@
"//src/main/java/com/google/devtools/build/lib:bazel/BazelServer_deploy.jar",
"install_base_key" + suffix,
":platforms_archive",
- ":libunix",
+ "//src/main/native:target-os-unix-native-lib",
+ "//src/main/native/windows:target-os-native-lib",
"//src/main/tools:build-runfiles",
"//src/main/tools:process-wrapper",
"//src/main/tools:jdk-support",
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index 2002dc0..b50b9b7 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -93,16 +93,17 @@
)
# Java interfaces to various native UNIX system services.
+#
+# All programs that depend on libraries in this package will have
+# JNI (native code) dependencies.
java_library(
name = "unix",
srcs = glob([
"unix/*.java",
]) + ["UnixJniLoader.java"],
- resources = select({
- # todo(dslomov): Get rid of this whole library on Windows.
- "//src/conditions:windows": [],
- "//conditions:default": ["//src/main/native:libunix.so"],
- }),
+ # Enable tests to pick up the native lib if using this library.
+ # See JavaBinary#collectNativeLibraries.
+ data = ["//src/main/native:target-os-unix-native-lib"],
deps = [
":os_util",
"//src/main/java/com/google/devtools/build/lib/concurrent",
diff --git a/src/main/java/com/google/devtools/build/lib/UnixJniLoader.java b/src/main/java/com/google/devtools/build/lib/UnixJniLoader.java
index 5646256..126bc93 100644
--- a/src/main/java/com/google/devtools/build/lib/UnixJniLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/UnixJniLoader.java
@@ -14,30 +14,11 @@
package com.google.devtools.build.lib;
-import com.google.devtools.build.lib.util.OS;
-
-import java.io.File;
-
/**
* A class to load JNI dependencies for Bazel.
*/
public class UnixJniLoader {
public static void loadJni() {
- try {
- if (OS.getCurrent() != OS.WINDOWS) {
- System.loadLibrary("unix");
- }
- } catch (UnsatisfiedLinkError ex) {
- // We are probably in tests, let's try to find the library relative to where we are.
- File cwd = new File(System.getProperty("user.dir"));
- String libunix = "src" + File.separator + "main" + File.separator + "native" + File.separator
- + System.mapLibraryName("unix");
- File toTest = new File(cwd, libunix);
- if (toTest.exists()) {
- System.load(toTest.toString());
- } else {
- throw ex;
- }
- }
+ System.loadLibrary("unix");
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/windows/jni/BUILD b/src/main/java/com/google/devtools/build/lib/windows/jni/BUILD
index 6f5f841..fe30698 100644
--- a/src/main/java/com/google/devtools/build/lib/windows/jni/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/windows/jni/BUILD
@@ -55,8 +55,13 @@
deps = [":jni-loader"],
)
+# Java interfaces to various native Windows system services.
+#
+# All programs that depend on libraries in this package will have
+# JNI (native code) dependencies.
java_library(
name = "jni-loader",
srcs = ["WindowsJniLoader.java"],
+ data = ["//src/main/native/windows:target-os-native-lib"],
deps = ["@bazel_tools//tools/java/runfiles"],
)
diff --git a/src/main/native/BUILD b/src/main/native/BUILD
index 329e9c0..604284b 100644
--- a/src/main/native/BUILD
+++ b/src/main/native/BUILD
@@ -73,7 +73,8 @@
"//conditions:default": [],
}),
linkshared = 1,
- visibility = ["//src:__subpackages__"],
+ # :target-os-unix-native-lib should be used outside of this package
+ visibility = ["//visibility:private"],
deps = [
":latin1_jni_path",
"//src/main/cpp/util",
@@ -89,7 +90,24 @@
outs = ["libunix.dylib"],
cmd = "cp $< $@",
output_to_bindir = 1,
- visibility = ["//src:__subpackages__"],
+ # :target-os-unix-native-lib should be used outside of this package
+ visibility = ["//visibility:private"],
+)
+
+# Platform-independent holder for native JNI libraries (empty for non-UNIX systems).
+# Targets should depend on this filegroup rather then on Platform-dependent libraries directly!
+filegroup(
+ name = "target-os-unix-native-lib",
+ srcs = select({
+ "//src/conditions:darwin": ["//src/main/native:libunix.dylib"],
+ "//src/conditions:darwin_x86_64": ["//src/main/native:libunix.dylib"],
+ "//src/conditions:windows": [],
+ "//conditions:default": ["//src/main/native:libunix.so"],
+ }),
+ visibility = [
+ "//src:__pkg__",
+ "//src/main/java/com/google/devtools/build/lib:__pkg__",
+ ],
)
filegroup(
diff --git a/src/main/native/windows/BUILD b/src/main/native/windows/BUILD
index 6ee8b01..410792b 100644
--- a/src/main/native/windows/BUILD
+++ b/src/main/native/windows/BUILD
@@ -1,7 +1,5 @@
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
-package(default_visibility = ["//visibility:private"])
-
filegroup(
name = "srcs",
srcs = glob(["**"]),
@@ -66,17 +64,28 @@
"//src/main/native:jni_md.h",
],
linkshared = 1,
- visibility = [
- "//src:__pkg__",
- "//src/test/java/com/google/devtools/build/lib:__subpackages__",
- "//src/tools/android/java/com/google/devtools/build/android:__subpackages__",
- ],
+ # :target-os-native-lib should be used outside of this package
+ visibility = ["//visibility:private"],
deps = [
":lib-file",
":lib-process",
],
)
+# Platform-independent holder for native JNI libraries (empty for non-Windows systems).
+# Targets should depend on this filegroup rather then on Platform-dependent libraries directly!
+filegroup(
+ name = "target-os-native-lib",
+ srcs = select({
+ "//src/conditions:windows": ["//src/main/native/windows:windows_jni.dll"],
+ "//conditions:default": [],
+ }),
+ visibility = [
+ "//src:__pkg__",
+ "//src/main/java/com/google/devtools/build/lib/windows/jni:__pkg__",
+ ],
+)
+
filegroup(
name = "embedded_java_tools",
srcs = [
diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD
index 8e2c339..16f6a30 100644
--- a/src/test/java/com/google/devtools/build/lib/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/BUILD
@@ -28,14 +28,6 @@
# All Windows-specific tests. Use this to exclude Windows tests from globs.
ALL_WINDOWS_TESTS = CROSS_PLATFORM_WINDOWS_TESTS + WINDOWS_ON_WINDOWS_TESTS
-JNI_LIB = select({
- "//src/conditions:windows": ["//src/main/native/windows:windows_jni.dll"],
- "//conditions:default": [
- "//src/main/native:libunix.dylib",
- "//src/main/native:libunix.so",
- ],
-})
-
# Generate list of all srcs via:
# bazel query 'filter("srcs", kind("filegroup rule", //src/test/java/com/google/devtools/build/lib/...))' | sort | sed -e "s/^/\"/" | sed -e "s/$/\",/" | fgrep -v "build/lib:srcs"
filegroup(
@@ -151,7 +143,6 @@
"vfs/util/*.java",
"events/util/*.java",
]),
- data = JNI_LIB,
deps = [
":guava_junit_truth",
":testutil",
@@ -537,7 +528,7 @@
data = [
":MockSubprocess_deploy.jar",
":printarg",
- ] + JNI_LIB,
+ ],
jvm_flags = [
"-Dbazel.windows_unix_root=C:/fake/msys",
],
diff --git a/src/tools/android/java/com/google/devtools/build/android/BUILD.tools b/src/tools/android/java/com/google/devtools/build/android/BUILD.tools
index 44d932a..dec8b41 100644
--- a/src/tools/android/java/com/google/devtools/build/android/BUILD.tools
+++ b/src/tools/android/java/com/google/devtools/build/android/BUILD.tools
@@ -7,10 +7,6 @@
java_binary(
name = "ResourceProcessorBusyBox",
- data = select({
- "//src/conditions:windows": ["//src/main/native/windows:windows_jni.dll"],
- "//conditions:default": [],
- }),
jvm_flags = [
# quiet warnings from com.google.protobuf.UnsafeUtil,
# see: https://github.com/google/protobuf/issues/3781
diff --git a/src/tools/android/java/com/google/devtools/build/android/junctions/BUILD b/src/tools/android/java/com/google/devtools/build/android/junctions/BUILD
index 172f9ec..272204f 100644
--- a/src/tools/android/java/com/google/devtools/build/android/junctions/BUILD
+++ b/src/tools/android/java/com/google/devtools/build/android/junctions/BUILD
@@ -31,10 +31,6 @@
java_library(
name = "junctions",
srcs = glob(["*.java"]),
- data = select({
- "//src/conditions:windows": ["//src/main/native/windows:windows_jni.dll"],
- "//conditions:default": [],
- }),
visibility = [
":android-prod",
":android-tests",
diff --git a/src/tools/remote/src/main/java/com/google/devtools/build/remote/worker/BUILD b/src/tools/remote/src/main/java/com/google/devtools/build/remote/worker/BUILD
index 8bbcd3d..20d58c5 100644
--- a/src/tools/remote/src/main/java/com/google/devtools/build/remote/worker/BUILD
+++ b/src/tools/remote/src/main/java/com/google/devtools/build/remote/worker/BUILD
@@ -11,7 +11,6 @@
java_library(
name = "worker",
srcs = glob(["*.java"]),
- data = ["//src:libunix"],
resources = ["//src/main/tools:linux-sandbox"],
visibility = ["//src/tools/remote:__subpackages__"],
deps = [