xref: /aosp_15_r20/external/bazelbuild-rules_license/examples/manifest/android_mock.bzl (revision f578df4fd057ffe2023728444759535685631548)
1*f578df4fSJingwen Chenload("@rules_license//rules:compliance.bzl", "manifest")
2*f578df4fSJingwen Chen
3*f578df4fSJingwen Chen"""This is a proof of concept to show how to modify a macro definition to
4*f578df4fSJingwen Chencreate a sub-graph allowing for build time injection of license information. We
5*f578df4fSJingwen Chenuse Android-inspired rule names since these are a likely candidate for this
6*f578df4fSJingwen Chensort of injection."""
7*f578df4fSJingwen Chen
8*f578df4fSJingwen Chendef android_library(name, **kwargs):
9*f578df4fSJingwen Chen    # This is an approximation for demo purposes.
10*f578df4fSJingwen Chen
11*f578df4fSJingwen Chen    data = kwargs.pop("data", [])
12*f578df4fSJingwen Chen    native.filegroup(
13*f578df4fSJingwen Chen        name = name,
14*f578df4fSJingwen Chen        srcs = data + kwargs.get("srcs", []),
15*f578df4fSJingwen Chen    )
16*f578df4fSJingwen Chen
17*f578df4fSJingwen Chen    # Inject the data dependency into the library, preserving any other data it has.
18*f578df4fSJingwen Chen    native.sh_library(
19*f578df4fSJingwen Chen        name = name + "_w_licenses",
20*f578df4fSJingwen Chen        data = data + [name + "_manifest.txt"],
21*f578df4fSJingwen Chen        **kwargs
22*f578df4fSJingwen Chen    )
23*f578df4fSJingwen Chen
24*f578df4fSJingwen Chendef android_binary(name, **kwargs):
25*f578df4fSJingwen Chen    # Same observation about not being sloppy with mapping deps, but I think the only important attribute
26*f578df4fSJingwen Chen    # in android_binary is deps, but need to double-check.
27*f578df4fSJingwen Chen    native.filegroup(
28*f578df4fSJingwen Chen        name = name + "_no_licenses",
29*f578df4fSJingwen Chen        srcs = kwargs.get("data", []),
30*f578df4fSJingwen Chen    )
31*f578df4fSJingwen Chen
32*f578df4fSJingwen Chen    mf_name = name + "_manifest"
33*f578df4fSJingwen Chen    manifest(
34*f578df4fSJingwen Chen        name = mf_name,
35*f578df4fSJingwen Chen        deps = [":" + name + "_no_licenses"],
36*f578df4fSJingwen Chen    )
37*f578df4fSJingwen Chen
38*f578df4fSJingwen Chen    # This uses the conditions tool to generate an approximation of a compliance report
39*f578df4fSJingwen Chen    # to demonstrate how license data can be plumbed and made available at build time.
40*f578df4fSJingwen Chen    native.genrule(
41*f578df4fSJingwen Chen        name = "gen_" + name + "_manifest",
42*f578df4fSJingwen Chen        srcs = [":" + mf_name],
43*f578df4fSJingwen Chen        outs = ["licenses_manifest.txt"],
44*f578df4fSJingwen Chen        cmd = "cat $(locations :%s) > $@" % mf_name,
45*f578df4fSJingwen Chen    )
46*f578df4fSJingwen Chen
47*f578df4fSJingwen Chen    # Swap out the :licenses dep for our new :licenses_w_licenses dep
48*f578df4fSJingwen Chen    newdeps = []
49*f578df4fSJingwen Chen    deps = kwargs.get("data", [])
50*f578df4fSJingwen Chen    for dep in deps:
51*f578df4fSJingwen Chen        if dep == ":licenses":
52*f578df4fSJingwen Chen            newdeps.append(":licenses_w_licenses")
53*f578df4fSJingwen Chen        else:
54*f578df4fSJingwen Chen            newdeps.append(dep)
55*f578df4fSJingwen Chen    kwargs["data"] = newdeps
56*f578df4fSJingwen Chen
57*f578df4fSJingwen Chen    # Compile the executable with the user's originally supplied name, but with the new content.
58*f578df4fSJingwen Chen    native.sh_binary(
59*f578df4fSJingwen Chen        name = name,
60*f578df4fSJingwen Chen        **kwargs
61*f578df4fSJingwen Chen    )
62