| load("//metropolis/node/build:def.bzl", "FSSpecInfo") | 
 |  | 
 | def _fsspec_linux_firmware(ctx): | 
 |     fsspec_out = ctx.actions.declare_file(ctx.label.name + ".prototxt") | 
 |  | 
 |     fwlist = ctx.actions.declare_file(ctx.label.name + "-fwlist.txt") | 
 |     ctx.actions.write( | 
 |         output = fwlist, | 
 |         content = "\n".join([f.path for f in ctx.files.firmware_files]), | 
 |     ) | 
 |  | 
 |     modinfo = ctx.attr.kernel[OutputGroupInfo].modinfo.to_list()[0] | 
 |  | 
 |     ctx.actions.run( | 
 |         outputs = [fsspec_out], | 
 |         inputs = [fwlist, modinfo, ctx.file.metadata] + ctx.files.firmware_files, | 
 |         tools = [ctx.executable._fwprune], | 
 |         executable = ctx.executable._fwprune, | 
 |         arguments = [modinfo.path, fwlist.path, ctx.file.metadata.path, fsspec_out.path], | 
 |     ) | 
 |  | 
 |     return [DefaultInfo(files = depset([fsspec_out])), FSSpecInfo(spec = fsspec_out, referenced = ctx.files.firmware_files)] | 
 |  | 
 | fsspec_linux_firmware = rule( | 
 |     implementation = _fsspec_linux_firmware, | 
 |     doc = """ | 
 |          Generates a partial filesystem spec containing all firmware files required by a given kernel at the | 
 |          default firmware load path (/lib/firmware). | 
 |     """, | 
 |     attrs = { | 
 |         "firmware_files": attr.label_list( | 
 |             mandatory = True, | 
 |             allow_files = True, | 
 |             doc = """ | 
 |                List of firmware files. Generally at least a filegroup of the linux-firmware repository should | 
 |                be in here. | 
 |             """, | 
 |         ), | 
 |         "metadata": attr.label( | 
 |             mandatory = True, | 
 |             allow_single_file = True, | 
 |             doc = """ | 
 |                 The metadata file for the Linux firmware. Currently this is the WHENCE file at the root of the | 
 |                 linux-firmware repository. Used for resolving additional links. | 
 |             """, | 
 |         ), | 
 |         "kernel": attr.label( | 
 |             doc = """ | 
 |                 Kernel for which firmware should be selected. Needs to have a modinfo OutputGroup. | 
 |             """, | 
 |         ), | 
 |  | 
 |         # Tool | 
 |         "_fwprune": attr.label( | 
 |             default = Label("//metropolis/node/build/fwprune"), | 
 |             executable = True, | 
 |             cfg = "exec", | 
 |         ), | 
 |     }, | 
 | ) |