| load("manifest.bzl", "manifest") |
| |
| """This is a proof of concept to show how to modify a macro definition to |
| create a sub-graph allowing for build time injection of license information. We |
| use Android-inspired rule names since these are a likely candidate for this |
| sort of injection.""" |
| |
| def android_library(name, **kwargs): |
| # This is an approximation for demo purposes. |
| |
| data = kwargs.pop("data", []) |
| native.filegroup( |
| name = name, |
| srcs = data + kwargs.get("srcs", []), |
| ) |
| |
| # Inject the data dependency into the library, preserving any other data it has. |
| native.sh_library( |
| name = name + "_w_licenses", |
| data = data + [name + "_manifest.txt"], |
| **kwargs |
| ) |
| |
| def android_binary(name, **kwargs): |
| # Same observation about not being sloppy with mapping deps, but I think the only important attribute |
| # in android_binary is deps, but need to double-check. |
| native.filegroup( |
| name = name + "_no_licenses", |
| srcs = kwargs.get("data", []), |
| ) |
| |
| mf_name = name + "_manifest" |
| manifest( |
| name = mf_name, |
| deps = [":" + name + "_no_licenses"], |
| ) |
| |
| # This uses the conditions tool to generate an approximation of a compliance report |
| # to demonstrate how license data can be plumbed and made available at build time. |
| native.genrule( |
| name = "gen_" + name + "_manifest", |
| srcs = [":" + mf_name], |
| outs = ["licenses_manifest.txt"], |
| cmd = "cat $(locations :%s) > $@" % mf_name, |
| ) |
| |
| # Swap out the :licenses dep for our new :licenses_w_licenses dep |
| newdeps = [] |
| deps = kwargs.get("data", []) |
| for dep in deps: |
| if dep == ":licenses": |
| newdeps.append(":licenses_w_licenses") |
| else: |
| newdeps.append(dep) |
| kwargs["data"] = newdeps |
| |
| # Compile the executable with the user's originally supplied name, but with the new content. |
| native.sh_binary( |
| name = name, |
| **kwargs |
| ) |