"""This file contains rules to generate and test the license map""" def normalize_target_name(target): return target.replace("//", "").replace("/", "__").replace(":", "___") def license_map(name, targets = [], opts = [], json_maps = [], **kwargs): """Generate text represantation for pacakges' and libs' licenses Args: name: of the rule targets: list of targets for which licenses should be added the output file. The list must not include targets, for which json_map is passed in json_maps parameter opts: command line options for license-map.py tool json_maps: list of json files. Such files can be produced by node_modules_licenses rule for node_modules licenses. **kwargs: Args passed through to genrule Generate: text file with the name gen_license_txt_{name} """ # Generate XML for all targets that depend directly on a LICENSE file xmls = [] tools = ["//tools/bzl:license-map.py", "//lib:all-licenses"] for target in targets: subname = name + "_" + normalize_target_name(target) + ".xml" xmls.append("$(location :%s)" % subname) tools.append(subname) native.genquery( name = subname, scope = [target], # Find everything that depends on a license file, but remove # the license files themselves from this list. expression = 'rdeps(%s, filter("//lib:LICENSE.*", deps(%s)),1) - filter("//lib:LICENSE.*", deps(%s))' % (target, target, target), # We are interested in the edges of the graph ({java_library, # license-file} tuples). 'query' provides this in the XML output. opts = ["--output=xml"], ) # Add all files from the json_maps list to license-map.py command-line arguments json_maps_locations = [] for json_map in json_maps: json_maps_locations.append("--json-map=$(location %s)" % json_map) tools.append(json_map) # post process the XML into our favorite format. native.genrule( name = "gen_license_txt_" + name, cmd = "python $(location //tools/bzl:license-map.py) %s %s %s > $@" % (" ".join(opts), " ".join(json_maps_locations), " ".join(xmls)), outs = [name + ".gen.txt"], tools = tools, **kwargs ) def license_test(name, target): """Make sure a target doesn't depend on DO_NOT_DISTRIBUTE license""" txt = name + "-forbidden.txt" # fully qualify target name. if target[0] not in ":/": target = ":" + target if target[0] != "/": target = "//" + native.package_name() + target forbidden = "//lib:LICENSE-DO_NOT_DISTRIBUTE" native.genquery( name = txt, scope = [target, forbidden], # Find everything that depends on a license file, but remove # the license files themselves from this list. expression = 'rdeps(%s, "%s", 1) - rdeps(%s, "%s", 0)' % (target, forbidden, target, forbidden), ) native.sh_test( name = name, srcs = ["//tools/bzl:test_license.sh"], args = ["$(location :%s)" % txt], data = [txt], )