|  | # 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, | 
|  | ) |