2
0
Fork 0
genodepkgs/nixos-modules/buildBootDescription.nix

66 lines
1.8 KiB
Nix

# Generate a total boot description by matching the binaries referred to by an init
# configuration with a list of input packages.
{ lib, writeText, dhall-json }:
{ initConfig, imageInputs, extraBinaries ? [ ], extraRoms ? { } }:
with builtins;
let
extractDrv = lib.runDhallCommand "binaries.json" {
nativeBuildInputs = [ dhall-json ];
} ''
dhall-to-json << EOF > $out
let Genode = env:DHALL_GENODE
let init = ${initConfig}
in Genode.Init.Child.binaries (Genode.Init.toChild init Genode.Init.Attributes::{=})
EOF
'';
binariesJSON = readFile (toString extractDrv);
binaries = lib.unique (fromJSON binariesJSON ++ extraBinaries);
matches = let
f = binary: {
name = binary;
value = let
f = drv:
if lib.hasPrefix "lib" binary && lib.hasSuffix ".so" binary
&& pathExists "${drv.lib or drv}/lib" then
toPath "${drv.lib or drv}/lib/${binary}"
else
toPath (if pathExists "${drv}/bin" then
"${drv}/bin/${binary}"
else
"${drv}/${binary}");
in filter pathExists (map f imageInputs);
};
in map f binaries;
binaryPaths = let
f = { name, value }:
let l = length value;
in if l == 1 then {
inherit name;
value = elemAt value 0;
} else if l == 0 then
throw "${name} not found in imageInputs"
else
throw "${name} found in multiple imageInputs, ${toString value}";
in map f matches;
extraList =
lib.mapAttrsToList (name: value: { inherit name value; }) extraRoms;
in writeText "boot.dhall" ''
let Genode = env:DHALL_GENODE
in { config = ${initConfig}
, rom = Genode.BootModules.toRomPaths ([
${
toString (map ({ name, value }: ''
, { mapKey = "${name}", mapValue = "${value}" }
'') (binaryPaths ++ extraList))
}
])
}
''