|  | def _cpio_ucode_impl(ctx): | 
|  | ucode_spec = ctx.actions.declare_file(ctx.label.name + "_spec.prototxt") | 
|  |  | 
|  | vendors = [] | 
|  | inputs = [] | 
|  | for label, vendor in ctx.attr.ucode.items(): | 
|  | files = label[DefaultInfo].files.to_list() | 
|  | inputs += files | 
|  | vendors.append(struct(id = vendor, file = [f.path for f in files])) | 
|  |  | 
|  | ctx.actions.write(ucode_spec, proto.encode_text(struct(vendor = vendors))) | 
|  |  | 
|  | output_file = ctx.actions.declare_file(ctx.label.name + ".cpio") | 
|  | ctx.actions.run( | 
|  | outputs = [output_file], | 
|  | inputs = [ucode_spec] + inputs, | 
|  | tools = [ctx.executable._mkucode], | 
|  | executable = ctx.executable._mkucode, | 
|  | arguments = ["-out", output_file.path, "-spec", ucode_spec.path], | 
|  | ) | 
|  | return [DefaultInfo(files = depset([output_file]))] | 
|  |  | 
|  | cpio_ucode = rule( | 
|  | implementation = _cpio_ucode_impl, | 
|  | doc = """ | 
|  | Builds a cpio archive with microcode for the Linux early microcode loader. | 
|  | """, | 
|  | attrs = { | 
|  | "ucode": attr.label_keyed_string_dict( | 
|  | mandatory = True, | 
|  | allow_files = True, | 
|  | doc = """ | 
|  | Dictionary of Labels to String. Each label is a list of microcode files and the string label | 
|  | is the vendor ID corresponding to that microcode. | 
|  | """, | 
|  | ), | 
|  |  | 
|  | # Tool | 
|  | "_mkucode": attr.label( | 
|  | default = Label("//metropolis/node/build/mkucode"), | 
|  | executable = True, | 
|  | cfg = "exec", | 
|  | ), | 
|  | }, | 
|  | ) |