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