124 lines
3.2 KiB
Nix
124 lines
3.2 KiB
Nix
{ 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}
|
|
'';
|
|
|
|
};
|
|
|
|
}
|