| """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 = "python3 $(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], | 
 |     ) |