| # Copyright 2023 The Bazel Authors. All rights reserved. | 
 | # | 
 | # Licensed under the Apache License, Version 2.0 (the "License"); | 
 | # you may not use this file except in compliance with the License. | 
 | # You may obtain a copy of the License at | 
 | # | 
 | # https://www.apache.org/licenses/LICENSE-2.0 | 
 | # | 
 | # Unless required by applicable law or agreed to in writing, software | 
 | # distributed under the License is distributed on an "AS IS" BASIS, | 
 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | # See the License for the specific language governing permissions and | 
 | # limitations under the License. | 
 | """Generate an SBOM for a target.""" | 
 |  | 
 | load(":gather_packages.bzl", "packages_used") | 
 |  | 
 | def _sbom_impl(ctx): | 
 |     # Gather all licenses and write information to one place | 
 |  | 
 |     # Now turn the big blob of data into something consumable. | 
 |     outputs = [ctx.outputs.out] | 
 |     args = ctx.actions.args() | 
 |     inputs = [ctx.file.packages_used] | 
 |     args.add("--packages_used", ctx.file.packages_used.path) | 
 |     args.add("--out", ctx.outputs.out.path) | 
 |     if ctx.attr.maven_install: | 
 |         args.add("--maven_install", ctx.file.maven_install.path) | 
 |         inputs.append(ctx.file.maven_install) | 
 |     ctx.actions.run( | 
 |         mnemonic = "CreateSBOM", | 
 |         progress_message = "Creating SBOM for %s" % ctx.label, | 
 |         inputs = inputs, | 
 |         outputs = outputs, | 
 |         executable = ctx.executable._sbom_generator, | 
 |         arguments = [args], | 
 |     ) | 
 |     return [DefaultInfo(files = depset(outputs))] | 
 |  | 
 | _sbom = rule( | 
 |     implementation = _sbom_impl, | 
 |     attrs = { | 
 |         "packages_used": attr.label( | 
 |             allow_single_file = True, | 
 |             mandatory = True, | 
 |         ), | 
 |         "out": attr.output(mandatory = True), | 
 |         "_sbom_generator": attr.label( | 
 |             default = Label("//tools/compliance:write_sbom_private"), | 
 |             executable = True, | 
 |             allow_files = True, | 
 |             cfg = "exec", | 
 |         ), | 
 |         "maven_install": attr.label( | 
 |             mandatory = False, | 
 |             allow_single_file = True, | 
 |         ), | 
 |     }, | 
 | ) | 
 |  | 
 | def sbom( | 
 |         name, | 
 |         target, | 
 |         out = None, | 
 |         maven_install = "//:maven_install.json"): | 
 |     """Wrapper for sbom rule. | 
 |  | 
 |     Args: | 
 |         name: name | 
 |         target: Target to create sbom for | 
 |         out: output file name | 
 |         maven_install: maven lock file | 
 |     """ | 
 |     packages = "_packages_" + name | 
 |     packages_used( | 
 |         name = packages, | 
 |         target = target, | 
 |         out = packages + ".json", | 
 |     ) | 
 |     if not out: | 
 |         out = name + "_sbom.json" | 
 |     _sbom( | 
 |         name = name, | 
 |         out = out, | 
 |         packages_used = ":" + packages + ".json", | 
 |         maven_install = maven_install, | 
 |     ) |