| def _node_image_impl(ctx): | 
 |     img_file = ctx.actions.declare_file(ctx.label.name + ".img") | 
 |     ctx.actions.run( | 
 |         mnemonic = "MkImage", | 
 |         executable = ctx.executable._mkimage, | 
 |         arguments = [ | 
 |             "-efi", | 
 |             ctx.file.kernel.path, | 
 |             "-system", | 
 |             ctx.file.system.path, | 
 |             "-out", | 
 |             img_file.path, | 
 |         ], | 
 |         inputs = [ | 
 |             ctx.file.kernel, | 
 |             ctx.file.system, | 
 |         ], | 
 |         outputs = [img_file], | 
 |     ) | 
 |  | 
 |     return [DefaultInfo(files = depset([img_file]), runfiles = ctx.runfiles(files = [img_file]))] | 
 |  | 
 | node_image = rule( | 
 |     implementation = _node_image_impl, | 
 |     doc = """ | 
 |         Build a disk image from an EFI kernel payload and system partition | 
 |         contents. See //metropolis/node/build/mkimage for more information. | 
 |     """, | 
 |     attrs = { | 
 |         "kernel": attr.label( | 
 |             doc = "EFI binary containing a kernel.", | 
 |             mandatory = True, | 
 |             allow_single_file = True, | 
 |         ), | 
 |         "system": attr.label( | 
 |             doc = "Contents of the system partition.", | 
 |             mandatory = True, | 
 |             allow_single_file = True, | 
 |         ), | 
 |         "_mkimage": attr.label( | 
 |             doc = "The mkimage executable.", | 
 |             default = "//metropolis/node/build/mkimage", | 
 |             allow_single_file = True, | 
 |             executable = True, | 
 |             cfg = "exec", | 
 |         ), | 
 |     }, | 
 | ) |