{ config, lib, pkgs, modulesPath, ... }: let cfg = config.debug.closure; inherit (lib.types) package; inherit (config.system.build) toplevel; ps = pkgs.callPackage ../pkgs { }; inherit (ps) writeErofsLayers; emptySystem = import (pkgs.path + "/nixos/lib/eval-config.nix") { modules = [ (modulesPath + "/profiles/minimal.nix") { system.stateVersion = config.system.stateVersion; fileSystems."/".fsType = "tmpfs"; boot.loader.grub.enable = false; networking.hostName = "base"; networking.nftables.enable = true; networking.useNetworkd = true; systemd.network.enable = true; } ]; }; in { options.debug.closure = { info = lib.mkOption { type = package; description = "closureInfo { rootPaths = [ toplevel ]; }"; }; write = lib.mkOption { type = package; description = "writeClosure [ toplevel ]"; }; extraLayers = lib.mkOption { type = lib.types.listOf package; description = "Roots from which to generate `erofs.layers`"; defaultText = '' [ (nixosSystem { modules = [ ]; }).config.system.build.toplevel # implicitly appended: config.system.build.toplevel ] ''; }; erofs.layers = lib.mkOption { type = lib.types.listOf package; description = "writeErofs [ ... ]"; readOnly = true; }; erofs.list = lib.mkOption { type = package; description = "writeClosure [ (writeErofs [ ... ])... ]"; }; }; config.debug.closure = { info = pkgs.closureInfo { rootPaths = [ toplevel ]; }; write = pkgs.writeClosure [ toplevel ]; erofs.list = pkgs.runCommand "layers" { __structuredAttrs = true; inherit (cfg.erofs) layers; } '' printf "%s\n" "''${layers[@]}" > "$out" ''; extraLayers = lib.mkMerge [ (lib.mkBefore [ emptySystem.config.system.build.toplevel ]) # (lib.mkAfter [config.system.build.toplevel]) ]; erofs.layers = writeErofsLayers { layers = cfg.extraLayers ++ [ toplevel ]; labelUpper = config.networking.hostName; }; }; }