Add singlejar to the java tools zip.

Closes #7951.

PiperOrigin-RevId: 242421452
diff --git a/src/BUILD b/src/BUILD
index f435ebb..0416d65 100644
--- a/src/BUILD
+++ b/src/BUILD
@@ -591,9 +591,9 @@
         "//src/java_tools/buildjar:srcs",
         "//src/java_tools/junitrunner:srcs",
         "//src/java_tools/singlejar:srcs",
+        "//src/tools/singlejar:embedded_java_tools",
         "//third_party/jarjar:srcs",
         "//third_party/java/jdk/langtools:license-and-srcs",
-        "//third_party/zlib:embedded_tools",
         "//third_party/ijar:transitive_sources",
     ],
     outs = ["java_tools_dist.zip"],
@@ -606,9 +606,9 @@
 genrule(
     name = "java_tools_zip",
     srcs = [
-        "//third_party/ijar:ijar_with_deps_zip",
         ":jars_java_tools_zip",
-        ":zlib_zip",
+        "//src/tools/singlejar:singlejar_transitive_zip",
+        "//third_party/ijar:ijar_transitive_zip",
     ],
     outs = ["java_tools.zip"],
     cmd = "$(location //src:merge_zip_files) java_tools $@ $(SRCS)",
@@ -623,5 +623,8 @@
     outs = ["zlib.zip"],
     cmd = "$(location //src:zip_files) zlib $@ $(SRCS)",
     tools = ["//src:zip_files"],
-    visibility = ["//visibility:private"],
+    visibility = [
+        "//src/tools/singlejar:__pkg__",
+        "//third_party/ijar:__pkg__",
+    ],
 )
diff --git a/src/main/cpp/util/BUILD b/src/main/cpp/util/BUILD
index 9ae89d8..dede1a8 100644
--- a/src/main/cpp/util/BUILD
+++ b/src/main/cpp/util/BUILD
@@ -205,7 +205,10 @@
     outs = ["cpp_util_with_deps.zip"],
     cmd = "$(location //src:merge_zip_files) - $@ $(SRCS)",
     tools = ["//src:merge_zip_files"],
-    visibility = ["//third_party/ijar:__pkg__"],
+    visibility = [
+        "//src/tools/singlejar:__pkg__",
+        "//third_party/ijar:__pkg__",
+    ],
 )
 
 genrule(
diff --git a/src/main/protobuf/BUILD b/src/main/protobuf/BUILD
index 05c3224..f8e13ad 100644
--- a/src/main/protobuf/BUILD
+++ b/src/main/protobuf/BUILD
@@ -114,6 +114,21 @@
     deps = [":command_line_java_proto"],
 )
 
+# Proto needed by singlejar and embedded into the java tools archive.
+genrule(
+    name = "desugar_deps_zip",
+    srcs = ["desugar_deps.proto"],
+    outs = ["desugar_deps.zip"],
+    cmd = "zip -q $@ $<",
+    visibility = ["//src/tools/singlejar:__pkg__"],
+)
+
+filegroup(
+    name = "desugar_deps_filegroup",
+    srcs = ["desugar_deps.proto"],
+    visibility = ["//src/tools/singlejar:__pkg__"],
+)
+
 cc_proto_library(
     name = "desugar_deps_cc_proto",
     deps = [":desugar_deps_proto"],
diff --git a/src/merge_zip_files.sh b/src/merge_zip_files.sh
index 9907bca..c148a9a 100755
--- a/src/merge_zip_files.sh
+++ b/src/merge_zip_files.sh
@@ -56,7 +56,7 @@
 if [[ "$directory_prefix" == "-" ]]; then
   for curr_zip in "$@"
   do
-    unzip -q "$curr_zip" -d "$tmp_dir"
+    unzip -q -o "$curr_zip" -d "$tmp_dir"
   done
 
   cd "$tmp_dir"
@@ -65,7 +65,7 @@
   mkdir -p "$tmp_dir/$directory_prefix"
   for curr_zip in "$@"
   do
-    unzip -q "$curr_zip" -d "$tmp_dir/$directory_prefix"
+    unzip -q -o "$curr_zip" -d "$tmp_dir/$directory_prefix"
   done
 
   cd "$tmp_dir"
diff --git a/src/tools/singlejar/BUILD b/src/tools/singlejar/BUILD
index 6e72e4e..3dea231 100644
--- a/src/tools/singlejar/BUILD
+++ b/src/tools/singlejar/BUILD
@@ -8,33 +8,67 @@
     visibility = ["//src:__pkg__"],
 )
 
+SOURCES = [
+    "combiners.cc",
+    "combiners.h",
+    "diag.h",
+    "input_jar.cc",
+    "input_jar.h",
+    "mapped_file.cc",
+    "mapped_file.h",
+    "mapped_file_posix.inc",
+    "mapped_file_windows.inc",
+    "options.cc",
+    "options.h",
+    "output_jar.cc",
+    "output_jar.h",
+    "port.h",
+    "singlejar_main.cc",
+    "token_stream.h",
+    "transient_bytes.h",
+    "zip_headers.h",
+    "zlib_interface.h",
+]
+
 filegroup(
     name = "embedded_tools",
-    srcs = [
-        "BUILD",
-        "combiners.cc",
-        "combiners.h",
-        "diag.h",
-        "input_jar.cc",
-        "input_jar.h",
-        "mapped_file.cc",
-        "mapped_file.h",
-        "mapped_file_posix.inc",
-        "mapped_file_windows.inc",
-        "options.cc",
-        "options.h",
-        "output_jar.cc",
-        "output_jar.h",
-        "port.h",
-        "singlejar_main.cc",
-        "token_stream.h",
-        "transient_bytes.h",
-        "zip_headers.h",
-        "zlib_interface.h",
-    ],
+    srcs = SOURCES + ["BUILD"],
     visibility = ["//visibility:public"],
 )
 
+filegroup(
+    name = "embedded_java_tools",
+    srcs = SOURCES + [
+        "//src/main/cpp/util:embedded_java_tools",
+        "//third_party/zlib:embedded_tools",
+        "//src/main/protobuf:desugar_deps_filegroup",
+    ],
+    visibility = ["//src:__pkg__"],
+)
+
+genrule(
+    name = "singlejar_transitive_zip",
+    srcs = [
+        ":singlejar_zip",
+        "//src:zlib_zip",
+        "//src/main/cpp/util:cpp_util_with_deps_zip",
+        "//src/main/protobuf:desugar_deps_zip",
+    ],
+    outs = ["singlejar_transitive.zip"],
+    cmd = "$(location //src:merge_zip_files) - $@ $(SRCS)",
+    tools = ["//src:merge_zip_files"],
+    visibility = ["//src:__pkg__"],
+)
+
+genrule(
+    name = "singlejar_zip",
+    srcs = SOURCES + [":singlejar_local"],
+    outs = ["singlejar.zip"],
+    cmd = "$(location //src:zip_files) src/tools/singlejar $@ $$(echo $(SRCS) | sort)",
+    tools = ["//src:zip_files"],
+    visibility = ["//visibility:private"],
+)
+
 cc_binary(
     name = "singlejar",
     srcs = [
diff --git a/src/zip_files.sh b/src/zip_files.sh
index abcc48a..73926e5 100755
--- a/src/zip_files.sh
+++ b/src/zip_files.sh
@@ -39,7 +39,7 @@
 
 mkdir -p "$tmp_dir/$directory_prefix"
 cd "$tmp_dir/$directory_prefix"
-unzip -q "$tmp_zip"
+unzip -q -o "$tmp_zip"
 rm -f "$tmp_zip"
 cd "$tmp_dir"
 zip -r -q "$tmp_zip" "$directory_prefix"
diff --git a/third_party/ijar/BUILD b/third_party/ijar/BUILD
index 01efaa3..466c7d4 100644
--- a/third_party/ijar/BUILD
+++ b/third_party/ijar/BUILD
@@ -125,9 +125,10 @@
 )
 
 genrule(
-    name = "ijar_with_deps_zip",
+    name = "ijar_transitive_zip",
     srcs = [
         ":ijar_srcs_zip",
+        "//src:zlib_zip",
         "//src/main/cpp/util:cpp_util_with_deps_zip",
     ],
     outs = ["ijar_srcs_with_deps.zip"],
diff --git a/tools/jdk/BUILD.java_tools b/tools/jdk/BUILD.java_tools
index 28ebe72..2a56bf2 100644
--- a/tools/jdk/BUILD.java_tools
+++ b/tools/jdk/BUILD.java_tools
@@ -92,6 +92,12 @@
     values = {"cpu": "x64_windows"},
 )
 
+config_setting(
+    name = "freebsd",
+    values = {"cpu": "freebsd"},
+    visibility = ["//visibility:public"],
+)
+
 alias(
   name = "ijar",
   actual = select({
@@ -180,6 +186,46 @@
 )
 
 cc_library(
+    name = "cpp_util",
+    hdrs = [
+        "java_tools/src/main/cpp/util/errors.h",
+        "java_tools/src/main/cpp/util/file.h",
+        "java_tools/src/main/cpp/util/file_platform.h",
+        "java_tools/src/main/cpp/util/md5.h",
+        "java_tools/src/main/cpp/util/numbers.h",
+        "java_tools/src/main/cpp/util/path.h",
+        "java_tools/src/main/cpp/util/path_platform.h",
+        "java_tools/src/main/cpp/util/port.h",
+    ],
+    visibility = ["//visibility:public"],
+    deps = [
+        ":blaze_exit_code",
+        ":errors",
+        ":filesystem",
+        ":md5",
+        ":numbers",
+        ":port",
+        ":strings",
+    ],
+    strip_include_prefix = "java_tools",
+)
+
+cc_library(
+    name = "md5",
+    srcs = ["java_tools/src/main/cpp/util/md5.cc"],
+    hdrs = ["java_tools/src/main/cpp/util/md5.h"],
+    strip_include_prefix = "java_tools",
+)
+
+cc_library(
+    name = "numbers",
+    srcs = ["java_tools/src/main/cpp/util/numbers.cc"],
+    hdrs = ["java_tools/src/main/cpp/util/numbers.h"],
+    deps = [":strings"],
+    strip_include_prefix = "java_tools",
+)
+
+cc_library(
     name = "filesystem",
     srcs = [
         "java_tools/src/main/cpp/util/file.cc",
@@ -290,3 +336,181 @@
     strip_include_prefix = "java_tools",
     include_prefix = "third_party",
 )
+
+##################### singlejar
+
+cc_binary(
+    name = "singlejar",
+    srcs = [
+        "java_tools/src/tools/singlejar/singlejar_main.cc",
+    ],
+    linkopts = select({
+        ":freebsd": ["-lm"],
+        "//conditions:default": [],
+    }),
+    linkstatic = 1,
+    visibility = ["//visibility:public"],
+    deps = [
+        ":options",
+        ":output_jar",
+        "//java_tools/zlib",
+    ],
+)
+
+cc_binary(
+    name = "singlejar_local",
+    srcs = [
+        "java_tools/src/tools/singlejar/singlejar_local_main.cc",
+    ],
+    linkopts = select({
+        ":freebsd": ["-lm"],
+        "//conditions:default": [],
+    }),
+    linkstatic = 1,
+    visibility = ["//visibility:public"],
+    deps = [
+        ":combiners",
+        ":desugar_checking",
+        ":options",
+        ":output_jar",
+        "//java_tools/zlib",
+    ],
+)
+
+cc_library(
+    name = "combiners",
+    srcs = [
+        "java_tools/src/tools/singlejar/combiners.cc",
+        ":transient_bytes",
+        ":zip_headers",
+    ],
+    hdrs = ["java_tools/src/tools/singlejar/combiners.h"],
+    strip_include_prefix = "java_tools",
+    deps = [
+        "//java_tools/zlib",
+    ],
+)
+
+proto_library(
+  name = "desugar_deps_proto",
+  srcs = ["java_tools/src/main/protobuf/desugar_deps.proto"]
+)
+
+cc_proto_library(
+    name = "desugar_deps_cc_proto",
+    deps = [":desugar_deps_proto"],
+)
+
+cc_library(
+    name = "desugar_checking",
+    srcs = ["java_tools/src/tools/singlejar/desugar_checking.cc"],
+    hdrs = ["java_tools/src/tools/singlejar/desugar_checking.h"],
+    strip_include_prefix = "java_tools",
+    deps = [
+        ":combiners",
+        ":desugar_deps_cc_proto",
+    ],
+)
+
+cc_library(
+    name = "diag",
+    hdrs = ["java_tools/src/tools/singlejar/diag.h"],
+    strip_include_prefix = "java_tools",
+    visibility = ["//visibility:private"],
+)
+
+cc_library(
+    name = "singlejar_port",
+    hdrs = ["java_tools/src/tools/singlejar/port.h"],
+    strip_include_prefix = "java_tools",
+    visibility = ["//visibility:private"],
+)
+
+cc_library(
+    name = "mapped_file",
+    srcs = ["java_tools/src/tools/singlejar/mapped_file.cc"] + select({
+        ":windows": ["java_tools/src/tools/singlejar/mapped_file_windows.inc"],
+        "//conditions:default": ["java_tools/src/tools/singlejar/mapped_file_posix.inc"],
+    }),
+    hdrs = ["java_tools/src/tools/singlejar/mapped_file.h"],
+    visibility = ["//visibility:private"],
+    strip_include_prefix = "java_tools",
+    deps = [
+        ":diag",
+        ":singlejar_port",
+        "//src/main/cpp/util",
+    ],
+)
+
+cc_library(
+    name = "input_jar",
+    srcs = [
+        "java_tools/src/tools/singlejar/input_jar.cc",
+    ],
+    hdrs = [
+        "java_tools/src/tools/singlejar/input_jar.h",
+        "java_tools/src/tools/singlejar/zip_headers.h",
+    ],
+    deps = [
+        ":diag",
+        ":mapped_file",
+    ],
+    strip_include_prefix = "java_tools",
+)
+
+cc_library(
+    name = "options",
+    srcs = [
+        "java_tools/src/tools/singlejar/options.cc",
+        "java_tools/src/tools/singlejar/options.h",
+    ],
+    hdrs = ["java_tools/src/tools/singlejar/options.h"],
+    deps = [
+        ":diag",
+        ":token_stream",
+    ],
+    strip_include_prefix = "java_tools",
+)
+
+cc_library(
+    name = "output_jar",
+    srcs = [
+        "java_tools/src/tools/singlejar/output_jar.cc",
+        "java_tools/src/tools/singlejar/output_jar.h",
+        ":zip_headers",
+    ],
+    hdrs = ["java_tools/src/tools/singlejar/output_jar.h"],
+    deps = [
+        ":combiners",
+        ":diag",
+        ":input_jar",
+        ":mapped_file",
+        ":options",
+        ":singlejar_port",
+        "//src/main/cpp/util",
+        "//java_tools/zlib",
+    ],
+    strip_include_prefix = "java_tools",
+)
+
+cc_library(
+    name = "token_stream",
+    hdrs = ["java_tools/src/tools/singlejar/token_stream.h"],
+    deps = [":diag"],
+    strip_include_prefix = "java_tools",
+)
+
+filegroup(
+    name = "transient_bytes",
+    srcs = [
+        "java_tools/src/tools/singlejar/diag.h",
+        "java_tools/src/tools/singlejar/transient_bytes.h",
+        "java_tools/src/tools/singlejar/zlib_interface.h",
+        ":zip_headers",
+    ],
+)
+
+filegroup(
+    name = "zip_headers",
+    srcs = ["java_tools/src/tools/singlejar/zip_headers.h"],
+)