Zip Java tools for windows
Create a zip archive for the remote Java tools for Windows instead of a tar, which can not be parsed on some other platforms.
Bazel doesn't have the equivalent of a `pkg_zip` rule and this PR introduces two new scripts that use `zip` directly:
`third_party/merge_zip_files.sh`: merges all the given `zip` files into a single `zip`
`third_party/zip_files.sh`: archives all the inputs files under the given directory structure in the output `zip` file
Partial merge of #7708.
PiperOrigin-RevId: 238969545
diff --git a/src/BUILD b/src/BUILD
index 034e2c8..111a1e2 100644
--- a/src/BUILD
+++ b/src/BUILD
@@ -547,3 +547,15 @@
actual = "//src/conditions:windows",
visibility = ["//visibility:public"],
)
+
+sh_binary(
+ name = "zip_files",
+ srcs = ["zip_files.sh"],
+ visibility = ["//visibility:public"],
+)
+
+sh_binary(
+ name = "merge_zip_files",
+ srcs = ["merge_zip_files.sh"],
+ visibility = ["//visibility:public"],
+)
diff --git a/src/main/cpp/util/BUILD b/src/main/cpp/util/BUILD
index 81bb12f..0eb331d 100644
--- a/src/main/cpp/util/BUILD
+++ b/src/main/cpp/util/BUILD
@@ -196,23 +196,24 @@
visibility = ["//visibility:public"],
)
-pkg_tar(
- name = "cpp_util_with_deps_archive",
- extension = "tar.gz",
- mode = "755",
- visibility = ["//third_party/ijar:__pkg__"],
- deps = [
- ":cpp_util_archive",
- "//src/main/native/windows:src_main_native_windows",
+# A zip containing source files used by ijar.
+genrule(
+ name = "cpp_util_with_deps_zip",
+ srcs = [
+ ":cpp_util_zip",
+ "//src/main/native/windows:native_windows_zip",
],
+ outs = ["cpp_util_with_deps.zip"],
+ cmd = "$(location //src:merge_zip_files) - $@ $(SRCS)",
+ tools = ["//src:merge_zip_files"],
+ visibility = ["//third_party/ijar:__pkg__"],
)
-pkg_tar(
- name = "cpp_util_archive",
+genrule(
+ name = "cpp_util_zip",
srcs = glob(["*.cc"]) + glob(["*.h"]),
- extension = "tar.gz",
- mode = "755",
- # Create a pkg_tar to preserve the directory structure src/main/cpp/util.
- package_dir = "src/main/cpp/util",
+ outs = ["cpp_util.zip"],
+ cmd = "$(location //src:zip_files) src/main/cpp/util $@ $(SRCS)",
+ tools = ["//src:zip_files"],
visibility = ["//visibility:private"],
)
diff --git a/src/main/native/windows/BUILD b/src/main/native/windows/BUILD
index eaf559f..79192b2 100644
--- a/src/main/native/windows/BUILD
+++ b/src/main/native/windows/BUILD
@@ -8,21 +8,6 @@
visibility = ["//src/main/native:__pkg__"],
)
-pkg_tar(
- name = "src_main_native_windows",
- srcs = [
- "file.cc",
- "file.h",
- "util.cc",
- "util.h",
- ],
- extension = "tar.gz",
- mode = "755",
- # Create a pkg_tar to preserve the directory structure src/main/native/windows.
- package_dir = "src/main/native/windows",
- visibility = ["//src/main/cpp/util:__pkg__"],
-)
-
filegroup(
name = "embedded_tools",
srcs = glob([
@@ -86,3 +71,18 @@
linkstatic = 1,
visibility = ["//src/main/cpp:__pkg__"],
)
+
+# A zip containing source files used by ijar.
+genrule(
+ name = "native_windows_zip",
+ srcs = [
+ "file.cc",
+ "file.h",
+ "util.cc",
+ "util.h",
+ ],
+ outs = ["native_windows.zip"],
+ cmd = "$(location //src:zip_files) src/main/native/windows $@ $(SRCS)",
+ tools = ["//src:zip_files"],
+ visibility = ["//src/main/cpp/util:__pkg__"],
+)
diff --git a/src/merge_zip_files.sh b/src/merge_zip_files.sh
new file mode 100755
index 0000000..9907bca
--- /dev/null
+++ b/src/merge_zip_files.sh
@@ -0,0 +1,76 @@
+#!/bin/bash
+
+# Copyright 2019 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# A script that zips the content of the inputs zip files under a given directory
+# structure in the output zip file. "-" can be passed if no top-level directory
+# structure is required.
+
+# Usage: third_party/merge_zip_files.sh directory_prefix output_zip [input_zip_files]
+#
+# For example, if we have the following zips and their content:
+# a.zip:
+# dir1/a1.cc
+# a2.cc
+# b.zip:
+# dir2/b1.cc
+# b2.cc
+#
+# third_party_zip_files.sh src/main/cpp my_archive.zip a.zip b.zip
+# will create the archive my_archive.zip containing:
+# src/main/cpp/a2.cc
+# src/main/cpp/b2.cc
+# src/main/cpp/dir1/a1.cc
+# src/main/cpp/dir2/b1.cc
+#
+# third_party_zip_files.sh - my_archive.zip a.zip b.zip
+# will create the archive my_archive.zip containing:
+# a2.cc
+# b2.cc
+# dir1/a1.cc
+# dir2/b1.cc
+
+set -euo pipefail
+
+directory_prefix="$1"; shift
+output="$1"; shift
+
+initial_pwd="$(pwd)"
+
+tmp_dir=$(mktemp -d -t 'tmp_bazel_zip_files_XXXXX')
+trap "rm -fr $tmp_dir" EXIT
+tmp_zip="$tmp_dir/archive.zip"
+
+if [[ "$directory_prefix" == "-" ]]; then
+ for curr_zip in "$@"
+ do
+ unzip -q "$curr_zip" -d "$tmp_dir"
+ done
+
+ cd "$tmp_dir"
+ zip -9 -r -q "$tmp_zip" "."
+else
+ mkdir -p "$tmp_dir/$directory_prefix"
+ for curr_zip in "$@"
+ do
+ unzip -q "$curr_zip" -d "$tmp_dir/$directory_prefix"
+ done
+
+ cd "$tmp_dir"
+ zip -9 -r -q "$tmp_zip" "$directory_prefix"
+fi
+
+cd "$initial_pwd"
+mv -f "$tmp_zip" "$output"
diff --git a/src/zip_files.sh b/src/zip_files.sh
new file mode 100755
index 0000000..abcc48a
--- /dev/null
+++ b/src/zip_files.sh
@@ -0,0 +1,50 @@
+#!/bin/bash
+
+# Copyright 2019 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# A script that zips all the inputs files under the given directory structure
+# in the output zip file.
+
+# Usage: third_party/zip_files.sh directory_prefix output_zip [input_files]
+#
+# For example: third_party_zip_files.sh src/main/cpp my_archive.zip a.cc b.cc
+# will create the archive my_archive.zip containing:
+# src/main/cpp/a.cc
+# src/main/cpp/b.cc
+
+set -euo pipefail
+
+directory_prefix="$1"; shift
+output="$1"; shift
+
+initial_pwd="$(pwd)"
+
+tmp_dir=$(mktemp -d -t 'tmp_bazel_zip_files_XXXXX')
+trap "rm -fr $tmp_dir" EXIT
+tmp_zip="$tmp_dir/archive.zip"
+
+zip -j -q "$tmp_zip" "$@"
+
+mkdir -p "$tmp_dir/$directory_prefix"
+cd "$tmp_dir/$directory_prefix"
+unzip -q "$tmp_zip"
+rm -f "$tmp_zip"
+cd "$tmp_dir"
+zip -r -q "$tmp_zip" "$directory_prefix"
+
+cd "$initial_pwd"
+mv -f "$tmp_zip" "$output"
+rm -r "$tmp_dir"
+