{ config, pkgs, lib, ... }: with lib; let localPackages = pkgs.buildPackages; in { options.genode = { core = { prefix = mkOption { type = types.str; example = "hw-pc-"; }; supportedSystems = mkOption { type = types.listOf types.str; example = [ "i686-genode" "x86_64-genode" ]; }; basePackages = mkOption { type = types.listOf types.package; }; }; boot = { kernel = mkOption { type = types.path; default = "${pkgs.genodePackages.bender}/bender"; }; initrd = mkOption { type = types.str; default = "${pkgs.genodePackages.bender}/bender"; description = "Path to an image or a command-line arguments"; }; config = mkOption { type = types.str; description = '' Dhall boot configuration. See https://git.sr.ht/~ehmry/dhall-genode/tree/master/Boot/package.dhall ''; }; image = mkOption { type = types.path; description = "Boot image containing the base component binaries and configuration."; }; romModules = mkOption { type = types.attrsOf types.path; description = "Attr set of initial ROM modules"; }; }; }; config = { assertions = [{ assertion = builtins.any (s: s == config.nixpkgs.system) config.genode.core.supportedSystems; message = "invalid Genode core for this system"; }]; genode.boot.config = let addManifest = drv: drv // { manifest = localPackages.runCommand "${drv.name}.dhall" { inherit drv; } '' set -eu echo -n '[' >> $out find $drv/ -type f -printf ',{mapKey= "%f",mapValue="%p"}' >> $out ${if builtins.elem "lib" drv.outputs then '' find ${drv.lib}/ -type f -printf ',{mapKey= "%f",mapValue="%p"}' >> $out'' else ""} echo -n ']' >> $out ''; }; mergeManifests = inputs: localPackages.writeTextFile { name = "manifest.dhall"; text = with builtins; let f = head: input: if hasAttr "manifest" input then '' ${head}, { mapKey = "${ lib.getName input }", mapValue = ${input.manifest} }'' else abort "${input.pname} does not have a manifest"; in (foldl' f "[" inputs) + "]"; }; storeManifest = mergeManifests (map addManifest config.genode.init.inputs); storeTarball = localPackages.runCommand "store" { } '' mkdir -p $out tar cf "$out/store.tar" --absolute-names ${ toString config.genode.init.inputs } ''; manifest = mergeManifests (map addManifest (config.genode.core.basePackages ++ [ storeTarball ] ++ (with pkgs.genodePackages; [ init vfs cached_fs_rom ]))); in '' ${./store-wrapper.dhall} (${config.genode.init.config}) $(stat --format '%s' ${storeTarball}/store.tar) ${storeManifest} ${manifest} ''; }; }