Android,Windows: wrap SingleJar in a java_binary
On Unix-like platforms, we can execute deploy jars
just like normal binaries, but on Windows we
cannot because ".jar" is not an executable
extension. Therefore we cannot run
SingleJar_deploy.jar in a genrule.cmd.
In this change I do the following changes to:
//tools/android/BUILD.tools:
- add a java_import rule that wraps the SingleJar
deploy jar
- add a java_binary that runtime-depends on the
jar
- fix the ":gen_java_lang_extras_jar" genrule to
run the java_binary instead of the deploy jar
See https://github.com/bazelbuild/bazel/issues/3659
Change-Id: Ie035e721deb696bbd4130b3612695a10dd9c2b4d
PiperOrigin-RevId: 167281195
diff --git a/tools/android/BUILD.tools b/tools/android/BUILD.tools
index 2f43435..fde4587 100644
--- a/tools/android/BUILD.tools
+++ b/tools/android/BUILD.tools
@@ -53,6 +53,42 @@
visibility = ["//visibility:public"],
)
+java_import(
+ name = "singlejar_deploy",
+ jars = select({
+ "//src:windows": ["@bazel_tools//tools/jdk:singlejar"],
+ "//src:windows_msvc": ["@bazel_tools//tools/jdk:singlejar"],
+ "//conditions:default": [],
+ }),
+ visibility = ["//visibility:private"],
+)
+
+java_binary(
+ name = "singlejar_javabin",
+ main_class = "com.google.devtools.build.singlejar.SingleJar",
+ runtime_deps = select({
+ "//src:windows": [":singlejar_deploy"],
+ "//src:windows_msvc": [":singlejar_deploy"],
+ "//conditions:default": [],
+ }),
+ visibility = ["//visibility:private"],
+)
+
+gen_java_lang_extras_jar_cmd = """
+ for jar in $(locations @local_jdk//:bootclasspath); do
+ if [[ "$${jar}" == *"/rt.jar" ]]; then
+ $(location %s) \
+ --exclude_build_data \
+ --dont_change_compression \
+ --sources $${jar} \
+ --include_prefixes "java/lang/invoke/" \
+ --include_prefixes "java/lang/annotation/" \
+ --output $@
+ break
+ fi
+ done
+ """
+
# javac needs this Jar to compile lambdas, method references, and type annotations.
# These classes are not part of the android.jar.
genrule(
@@ -60,24 +96,17 @@
srcs = [
"@local_jdk//:bootclasspath"
],
- tools = [
- "@bazel_tools//tools/jdk:singlejar",
- ],
+ tools = select({
+ "//src:windows": [":singlejar_javabin"],
+ "//src:windows_msvc": [":singlejar_javabin"],
+ "//conditions:default": ["@bazel_tools//tools/jdk:singlejar"],
+ }),
outs = ["java_lang_extras.jar"],
- cmd = """
- for jar in $(locations @local_jdk//:bootclasspath); do
- if [[ "$${jar}" == *"/rt.jar" ]]; then
- $(location @bazel_tools//tools/jdk:singlejar) \
- --exclude_build_data \
- --dont_change_compression \
- --sources $${jar} \
- --include_prefixes "java/lang/invoke/" \
- --include_prefixes "java/lang/annotation/" \
- --output $@
- break
- fi
- done
- """,
+ cmd = select({
+ "//src:windows": gen_java_lang_extras_jar_cmd % ":singlejar_javabin",
+ "//src:windows_msvc": gen_java_lang_extras_jar_cmd % ":singlejar_javabin",
+ "//conditions:default": gen_java_lang_extras_jar_cmd % "@bazel_tools//tools/jdk:singlejar",
+ }),
visibility = ["//visibility:private"],
)