62 lines
2.0 KiB
Python
62 lines
2.0 KiB
Python
load("@rules_license//rules:compliance.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
|
|
)
|