Skip to content

Commit 5324de4

Browse files
hvadehrafweikert
authored andcommitted
Add darwin_arm64 java_tools
Build a fat universal binary for java_tools_prebuilt on darwin Work towards: bazelbuild/java_tools#57 and bazelbuild#13944 Closes bazelbuild#16960. PiperOrigin-RevId: 512683379 Change-Id: Ie9db26c729a301fbb22f17dd15065861f3198f57
1 parent d2c99b6 commit 5324de4

File tree

3 files changed

+107
-5
lines changed

3 files changed

+107
-5
lines changed

src/tools/singlejar/BUILD

+16-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
load("@rules_java//java:defs.bzl", "java_library")
22
load("//src:release_archive.bzl", "release_archive")
3+
load("//third_party/ijar:darwin_universal_binary.bzl", "darwin_universal_binary")
34

45
# Description:
56
# singlejar C++ implementation.
@@ -64,7 +65,7 @@ release_archive(
6465

6566
release_archive(
6667
name = "singlejar_deploy_zip",
67-
srcs = [":singlejar_local"],
68+
srcs = [":singlejar_local_binary_for_deploy"],
6869
package_dir = "java_tools/src/tools/singlejar",
6970
visibility = ["//src:__pkg__"],
7071
)
@@ -88,6 +89,20 @@ cc_binary(
8889
],
8990
)
9091

92+
alias(
93+
name = "singlejar_local_binary_for_deploy",
94+
actual = select({
95+
"//src/conditions:darwin": ":singlejar_local_darwin",
96+
"//conditions:default": ":singlejar_local",
97+
}),
98+
)
99+
100+
darwin_universal_binary(
101+
name = "singlejar_local_darwin",
102+
binary = ":singlejar_local",
103+
output_name = "singlejar_local",
104+
)
105+
91106
cc_binary(
92107
name = "singlejar_local",
93108
srcs = [

third_party/ijar/BUILD

+30-4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
load(":darwin_universal_binary.bzl", "darwin_universal_binary")
2+
13
package(
24
default_visibility = [
35
"//src:__subpackages__",
@@ -76,6 +78,12 @@ cc_binary(
7678
deps = [":zip"],
7779
)
7880

81+
darwin_universal_binary(
82+
name = "zipper_darwin",
83+
binary = ":zipper",
84+
output_name = "zipper",
85+
)
86+
7987
cc_binary(
8088
name = "ijar",
8189
srcs = [
@@ -86,6 +94,12 @@ cc_binary(
8694
deps = [":zip"],
8795
)
8896

97+
darwin_universal_binary(
98+
name = "ijar_darwin",
99+
binary = ":ijar",
100+
output_name = "ijar",
101+
)
102+
89103
filegroup(
90104
name = "srcs",
91105
srcs = glob(["**"]) + ["//third_party/ijar/test:srcs"],
@@ -105,6 +119,7 @@ filegroup(
105119
"zlib_client.cc",
106120
"zlib_client.h",
107121
"BUILD",
122+
"darwin_universal_binary.bzl",
108123
] + select({
109124
"//src:windows": [
110125
"mapped_file_windows.cc",
@@ -137,10 +152,16 @@ genrule(
137152

138153
genrule(
139154
name = "ijar_deploy_zip",
140-
srcs = [
141-
":ijar",
142-
":zipper",
143-
],
155+
srcs = select({
156+
"//src/conditions:darwin": [
157+
":ijar_darwin",
158+
":zipper_darwin",
159+
],
160+
"//conditions:default": [
161+
":ijar",
162+
":zipper",
163+
],
164+
}),
144165
outs = ["ijar_deploy.zip"],
145166
cmd = "$(location //src:zip_files) java_tools/ijar $@ $(SRCS)",
146167
tools = ["//src:zip_files"],
@@ -158,3 +179,8 @@ genrule(
158179
tools = ["//src:zip_files"],
159180
visibility = ["//visibility:private"],
160181
)
182+
183+
exports_files(
184+
["darwin_universal_binary.bzl"],
185+
visibility = ["//src/tools/singlejar:__pkg__"],
186+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
""" Defines a rule to package multi-arch binaries for darwin in a single fat binary
2+
3+
Uses the lipo tool as described here: https://developer.apple.com/documentation/apple-silicon/building-a-universal-macos-binary#Update-the-Architecture-List-of-Custom-Makefiles
4+
"""
5+
6+
def _universal_split_transition_impl(_ctx, _attr):
7+
return {
8+
"x86_64": {
9+
"//command_line_option:cpu": "darwin_x86_64",
10+
},
11+
"arm64": {
12+
"//command_line_option:cpu": "darwin_arm64",
13+
},
14+
}
15+
16+
_universal_split_transition = transition(
17+
implementation = _universal_split_transition_impl,
18+
inputs = [],
19+
outputs = ["//command_line_option:cpu"],
20+
)
21+
22+
def _impl(ctx):
23+
binaries = [
24+
attr.files.to_list()[0]
25+
for attr in ctx.split_attr.binary.values()
26+
]
27+
out = ctx.actions.declare_file(ctx.label.name + "/" + ctx.attr.output_name)
28+
args = ctx.actions.args()
29+
args.add("-create")
30+
args.add_all(binaries)
31+
args.add("-output", out)
32+
apple_env = {}
33+
xcode_config = ctx.attr._xcode_config[apple_common.XcodeVersionConfig]
34+
apple_env.update(apple_common.apple_host_system_env(xcode_config))
35+
apple_env.update(
36+
apple_common.target_apple_env(
37+
xcode_config,
38+
ctx.fragments.apple.multi_arch_platform(apple_common.platform_type.macos),
39+
),
40+
)
41+
ctx.actions.run(
42+
executable = "/usr/bin/lipo",
43+
arguments = [args],
44+
inputs = binaries,
45+
outputs = [out],
46+
execution_requirements = xcode_config.execution_info(),
47+
env = apple_env,
48+
)
49+
return DefaultInfo(executable = out)
50+
51+
darwin_universal_binary = rule(
52+
implementation = _impl,
53+
attrs = {
54+
"output_name": attr.string(),
55+
"binary": attr.label(cfg = _universal_split_transition),
56+
"_xcode_config": attr.label(default = "@bazel_tools//tools/osx:current_xcode_config"),
57+
"_allowlist_function_transition": attr.label(default = "@bazel_tools//tools/allowlists/function_transition_allowlist"),
58+
},
59+
fragments = ["apple"],
60+
exec_compatible_with = ["@platforms//os:macos"],
61+
)

0 commit comments

Comments
 (0)