137 lines
4.4 KiB
Python
Executable File
137 lines
4.4 KiB
Python
Executable File
# SPDX-License-Identifier: GPL-2.0 OR Apache-2.0
|
|
# Copyright (C) 2023 The Android Open Source Project
|
|
|
|
"""
|
|
ABI aware build rules.
|
|
"""
|
|
|
|
load("@bazel_skylib//lib:paths.bzl", "paths")
|
|
load("@bazel_skylib//rules:copy_file.bzl", "copy_file")
|
|
load("@bazel_skylib//rules:native_binary.bzl", "native_binary")
|
|
|
|
visibility("private")
|
|
|
|
_ALL_ABIS = ["arm", "arm64", "x86", "x86_64"]
|
|
|
|
def _copy_with_abi(
|
|
name,
|
|
visibility = None,
|
|
path_prefix = None,
|
|
abis = None,
|
|
out = None):
|
|
if not path_prefix:
|
|
path_prefix = ""
|
|
if not abis:
|
|
abis = _ALL_ABIS
|
|
if not out:
|
|
out = name
|
|
|
|
for abi in abis:
|
|
copy_file(
|
|
name = "{name}_{abi}".format(name = name, abi = abi),
|
|
src = ":{name}".format(name = name),
|
|
out = paths.join(path_prefix, abi, out),
|
|
allow_symlink = True,
|
|
visibility = visibility,
|
|
)
|
|
|
|
def cc_binary_with_abi(
|
|
name,
|
|
path_prefix = None,
|
|
abis = None,
|
|
visibility = None,
|
|
out = None,
|
|
**kwargs):
|
|
"""A cc_binary replacement that generates output in each subdirectory named by abi.
|
|
|
|
For example:
|
|
```
|
|
cc_binary_with_abi(
|
|
name = "a_binary",
|
|
abis = ["x86_64", "arm64"],
|
|
path_prefix = "my/path",
|
|
)
|
|
```
|
|
generates 2 rules:
|
|
* Rule a_binary_x86_64: Builds the cc_binary and put output in my/path/x86_64/a_binary.
|
|
* Rule a_binary_arm64: Builds the cc_binary and put output in my/path/arm64/a_binary.
|
|
|
|
Args:
|
|
name: the name of the build rule.
|
|
path_prefix: [Nonconfigurable](https://bazel.build/reference/be/common-definitions#configurable-attributes).
|
|
The path prefix to attach to output.
|
|
abis: [Nonconfigurable](https://bazel.build/reference/be/common-definitions#configurable-attributes).
|
|
The intended abis to generate. Default is arm64 & x86_64.
|
|
visibility: [Nonconfigurable](https://bazel.build/reference/be/common-definitions#configurable-attributes).
|
|
The visibility attribute on a target controls whether the target can be used in other packages.
|
|
out: [Nonconfigurable](https://bazel.build/reference/be/common-definitions#configurable-attributes).
|
|
The output filename. Default is `name`.
|
|
**kwargs: the rest args that cc_binary uses.
|
|
"""
|
|
native.cc_binary(
|
|
name = name,
|
|
visibility = visibility,
|
|
**kwargs
|
|
)
|
|
|
|
_copy_with_abi(
|
|
name = name,
|
|
path_prefix = path_prefix,
|
|
abis = abis,
|
|
visibility = visibility,
|
|
out = out,
|
|
)
|
|
|
|
def sh_binary_with_abi(
|
|
name,
|
|
path_prefix = None,
|
|
abis = None,
|
|
visibility = None,
|
|
out = None,
|
|
**kwargs):
|
|
"""A sh_binary replacement that generates output in each subdirectory named by abi.
|
|
|
|
For example:
|
|
```
|
|
sh_binary_with_abi(
|
|
name = "a_binary",
|
|
abis = ["x86_64", "arm64"],
|
|
path_prefix = "my/path",
|
|
)
|
|
```
|
|
generates 2 rules:
|
|
* Rule a_binary_x86_64: Copies a_binary and put output in my/path/x86_64/a_binary.
|
|
* Rule a_binary_arm64: Copies a_binary and put output in my/path/arm64/a_binary.
|
|
|
|
Args:
|
|
name: the name of the build rule.
|
|
path_prefix: [Nonconfigurable](https://bazel.build/reference/be/common-definitions#configurable-attributes).
|
|
The path prefix to attach to output.
|
|
abis: [Nonconfigurable](https://bazel.build/reference/be/common-definitions#configurable-attributes).
|
|
The intended abis to generate. Default is arm64 & x86_64.
|
|
visibility: [Nonconfigurable](https://bazel.build/reference/be/common-definitions#configurable-attributes).
|
|
The visibility attribute on a target controls whether the target can be used in other packages.
|
|
out: [Nonconfigurable](https://bazel.build/reference/be/common-definitions#configurable-attributes).
|
|
The output filename. Default is `name`.
|
|
**kwargs: the rest args that native_binary uses.
|
|
"""
|
|
if not out:
|
|
out = name
|
|
|
|
# Uses native_binary instead of sh_binary because sh_binary is not
|
|
# compatible with copy_file (sh_binary generates more than 1 outs).
|
|
native_binary(
|
|
name = name,
|
|
visibility = visibility,
|
|
out = out,
|
|
**kwargs
|
|
)
|
|
|
|
_copy_with_abi(
|
|
name = name,
|
|
path_prefix = path_prefix,
|
|
abis = abis,
|
|
visibility = visibility,
|
|
out = out,
|
|
)
|