{ config, pkgs, lib, ... }: with lib; let cfg = config.genode.init; inputs = mkOption { description = "List of packages to build a ROM store with."; default = [ ]; type = types.listOf types.package; }; in { options.genode.init = { configFile = mkOption { description = '' Dhall configuration of this init instance after children have been merged. ''; type = types.path; }; baseConfig = mkOption { description = "Dhall configuration of this init instance before merging children."; type = types.str; default = '' let Genode = env:DHALL_GENODE in Genode.Init::{ , routes = [ Genode.Init.ServiceRoute.parent "File_system" , Genode.Init.ServiceRoute.parent "Rtc" , Genode.Init.ServiceRoute.parent "Timer" , Genode.Init.ServiceRoute.parent "IRQ" , Genode.Init.ServiceRoute.parent "IO_MEM" , Genode.Init.ServiceRoute.parent "IO_PORT" ] } ''; }; children = mkOption { default = { }; type = with types; attrsOf (submodule { options = { inherit inputs; configFile = mkOption { type = types.path; description = '' Dhall configuration of child. See https://git.sr.ht/~ehmry/dhall-genode/tree/master/Init/Child/Type ''; }; }; }); }; subinits = # Subinits are just a different kind of children. # Eventually this will be nested "genode.init" instances. mkOption { default = { }; type = with types; attrsOf (submodule { options = { inherit inputs; configFile = mkOption { type = types.path; description = '' Dhall configuration of child init. See https://git.sr.ht/~ehmry/dhall-genode/tree/master/Init/Type ''; }; }; }); }; }; config.genode.init = { # TODO: convert the subinits to children children = mapAttrs (name: value: { inherit (value) inputs; configFile = pkgs.writeText "${name}.child.dhall" '' let Genode = env:DHALL_GENODE in Genode.Init.toChild ${value.configFile} Genode.Init.Attributes.default ''; }) cfg.subinits; configFile = pkgs.writeText "init.dhall" '' let Genode = env:DHALL_GENODE let baseConfig = ${cfg.baseConfig} in baseConfig with children = baseConfig.children # toMap {${ concatMapStrings (name: ", `${name}` = (${cfg.children.${name}.configFile}) ") (builtins.attrNames cfg.children) } } ''; }; }