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"],
 )