refactor the crappy sbom generator as an aspect
diff --git a/tools/sbom/BUILD b/tools/sbom/BUILD index 71a4d5e..ff86ba5 100644 --- a/tools/sbom/BUILD +++ b/tools/sbom/BUILD
@@ -1,5 +1,19 @@ -# SBOM generator -load("@rules_python//python:defs.bzl", "py_binary") +# BUILD file defining @rules_license/tools/sbom +# +# Copyright 2020 Google LLC +# +# 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. +"""Sample SBOM generator.""" package( default_package_metadata = ["//:license"], @@ -7,10 +21,19 @@ ) filegroup( - name = "srcs", + name = "standard_package", srcs = glob(["**"]), ) +# Do not create a bzl_library(). That would create a dependency loop back +# to bazel-skylib. We export the .bzl files to the documentation maker. +exports_files( + glob([ + "*.bzl", + ]), + visibility = ["//doc_build:__pkg__"], +) + py_binary( name = "write_sbom_internal", srcs = ["write_sbom.py"],
diff --git a/tools/sbom/sbom.bzl b/tools/sbom/sbom.bzl index 48d9eac..ae95c2d 100644 --- a/tools/sbom/sbom.bzl +++ b/tools/sbom/sbom.bzl
@@ -13,7 +13,13 @@ # limitations under the License. """Generate an SBOM for a target.""" -load("//rules_gathering:gather_packages.bzl", "gather_package_info", "packages_used") +load( + "//rules_gathering:gather_packages.bzl", + "gather_package_info", + "packages_used", + "write_packages_info", + "TransitivePackageInfo" +) def _spdx_common(ctx, target, spdx_output, _gen_spdx_tool): # Gather all licenses and write information to one place @@ -49,11 +55,12 @@ return [ DefaultInfo(files = depset(outputs)), OutputGroupInfo( - spdx = depset(outputs), + sbom_spdx = depset(outputs), ), ] def _sbom_impl(ctx): + print("TOAST1") _create_sbom(ctx, ctx.file.packages_used, ctx.outputs.out, ctx.executable._sbom_generator) _sbom = rule( @@ -111,33 +118,29 @@ maven_install = maven_install, ) -def _gen_spdx_impl(target, ctx): - """ +def _gen_sbom_spdx_impl(target, ctx): + print("TOAST") + info_aspect_output = ctx.actions.declare_file("%s_info.json" % ctx.label.name) + # traverse output from aspect and assemble it for writing... + write_packages_info( + ctx, + top_level_target = target, + transitive_package_info = target[TransitivePackageInfo], + output = info_aspect_output, + ) spdx_output = ctx.actions.declare_file("%s.spdx.json" % ctx.label.name) - - name = "%s_info.json" % ctx.label.name - aspect_output = ctx.actions.declare_file(name) - - # ... possibly traverse output from aspect and assemble it for writing... - info = target[TransitiveLicensesInfo] - - # If the result doesn't contain licenses, we simply return the provider - #if not hasattr(info, "target_under_license"): - # return [OutputGroupInfo()] - - content = "[\n%s\n]\n" % ",\n".join(info_to_json(info)) - """ - - #return _spdx_common(ctx, target, spdx_output, ctx.executable._gen_spdx) - return _create_sbom(ctx, ctx.file.packages_used, ctx.output.out, ctx.executable._sbom_generator) + print("WRITE TO", spdx_output.path) + return _create_sbom(ctx, info_aspect_output, spdx_output, ctx.executable._gen_spdx) gen_sbom_spdx = aspect( - implementation = _gen_spdx_impl, + doc = """Generates an SPDX sbom for a target.""", + implementation = _gen_sbom_spdx_impl, requires = [gather_package_info], attrs = { "_gen_spdx": attr.label( default = Label("//tools/sbom:write_sbom_internal"), + allow_files = True, executable = True, cfg = "exec", ),
diff --git a/tools/sbom/write_sbom.py b/tools/sbom/write_sbom.py index 1982124..3373379 100644 --- a/tools/sbom/write_sbom.py +++ b/tools/sbom/write_sbom.py
@@ -243,7 +243,7 @@ # Useful for debugging - maven_packages = None + maven_packages = {} if opts.maven_install: with open(opts.maven_install, "rt", encoding="utf-8") as inp: maven_install = json.loads(inp.read())