{ config, pkgs, lib, ... }: with lib; let cfg = config.corenix; fileOptions.options = { src = mkOption { type = types.nullOr types.path; }; type = mkOption { type = types.str; default = "raw"; }; }; in { options.corenix = { installCommands = mkOption { type = types.lines; }; extraFiles = mkOption { type = types.attrsOf (types.submodule fileOptions); }; corebootConfig = mkOption { type = types.attrsOf (types.nullOr types.str); default = { }; }; package = mkOption { type = types.package; default = pkgs.coreboot; }; rom = mkOption { readOnly = true; type = types.path; }; }; config = { corenix.installCommands = let filteredFiles = filterAttrs (k: v: v.src != null) cfg.extraFiles; filesList = mapAttrsToList (k: v: v // { name = k; }) filteredFiles; in concatMapStringsSep "\n" (file: if file.type == "payload" then '' cbfstool $out/coreboot.rom add-payload \ -f "${file.src}" \ -n "${file.name}" \ '' else '' cbfstool $out/coreboot.rom add \ -f "${file.src}" \ -n "${file.name}" \ -t "${file.type}" '') filesList; corenix.rom = let base = cfg.package.override { inherit (cfg) corebootConfig; }; in pkgs.runCommand "coreboot-rom" { buildInputs = with pkgs; [ cbfstool ]; } '' install -D ${base}/coreboot.rom -t $out ${cfg.installCommands} ''; }; }