| """ Defines a rule to package multi-arch binaries for darwin in a single fat binary |
| |
| 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 |
| """ |
| |
| def _universal_split_transition_impl(_ctx, _attr): |
| return { |
| "x86_64": { |
| "//command_line_option:cpu": "darwin_x86_64", |
| }, |
| "arm64": { |
| "//command_line_option:cpu": "darwin_arm64", |
| }, |
| } |
| |
| _universal_split_transition = transition( |
| implementation = _universal_split_transition_impl, |
| inputs = [], |
| outputs = ["//command_line_option:cpu"], |
| ) |
| |
| def _impl(ctx): |
| binaries = [ |
| attr.files.to_list()[0] |
| for attr in ctx.split_attr.binary.values() |
| ] |
| out = ctx.actions.declare_file(ctx.label.name + "/" + ctx.attr.output_name) |
| args = ctx.actions.args() |
| args.add("-create") |
| args.add_all(binaries) |
| args.add("-output", out) |
| apple_env = {} |
| xcode_config = ctx.attr._xcode_config[apple_common.XcodeVersionConfig] |
| apple_env.update(apple_common.apple_host_system_env(xcode_config)) |
| apple_env.update( |
| apple_common.target_apple_env( |
| xcode_config, |
| ctx.fragments.apple.multi_arch_platform(apple_common.platform_type.macos), |
| ), |
| ) |
| ctx.actions.run( |
| executable = "/usr/bin/lipo", |
| arguments = [args], |
| inputs = binaries, |
| outputs = [out], |
| execution_requirements = xcode_config.execution_info(), |
| env = apple_env, |
| ) |
| return DefaultInfo(executable = out) |
| |
| darwin_universal_binary = rule( |
| implementation = _impl, |
| attrs = { |
| "output_name": attr.string(), |
| "binary": attr.label(cfg = _universal_split_transition), |
| "_xcode_config": attr.label(default = "@bazel_tools//tools/osx:current_xcode_config"), |
| "_allowlist_function_transition": attr.label(default = "@bazel_tools//tools/allowlists/function_transition_allowlist"), |
| }, |
| fragments = ["apple"], |
| exec_compatible_with = ["@platforms//os:macos"], |
| ) |