# 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,
    )
