sigil/flake.nix

249 lines
8.1 KiB
Nix

{
description = "Genode packages";
inputs.nixpkgs.url = "github:ehmry/nixpkgs/genodepkgs";
outputs = { self, nixpkgs, nimble }:
let
systems = {
localSystem = [ "x86_64-linux" ];
crossSystem = [ "aarch64-genode" "x86_64-genode" ];
};
systemSpace = nixpkgs.lib.cartesianProductOfSets systems;
forAllLocalSystems = f:
nixpkgs.lib.genAttrs systems.localSystem (system: f system);
forAllCrossSystems = f:
with builtins;
let
f' = { localSystem, crossSystem }:
let system = localSystem + "-" + crossSystem;
in {
name = system;
value = f { inherit system localSystem crossSystem; };
};
list = map f' systemSpace;
attrSet = listToAttrs list;
in attrSet;
forAllSystems = f:
(forAllCrossSystems f) // (forAllLocalSystems (system:
f {
inherit system;
localSystem = system;
crossSystem = system;
}));
nixpkgsFor = forAllSystems ({ system, localSystem, crossSystem }:
if localSystem == crossSystem then
import nixpkgs {
inherit system;
overlays = [ self.overlay nimble.overlay ];
}
else
import nixpkgs {
inherit localSystem;
crossSystem = {
system = crossSystem;
useLLVM = true;
};
config.allowUnsupportedSystem = true;
overlays = [ self.overlay nimble.overlay ];
});
in rec {
overlay =
# Overlay of fixes applied to Nixpkgs
import ./overlay { flake = self; };
lib =
# Local utilities merged with the Nixpkgs lib
nixpkgs.lib.extend (final: prev: {
inherit forAllSystems forAllLocalSystems forAllCrossSystems;
/* For a the name of a derivation output and a derivation,
generate a set of { cap, closure, and path } for a singular
file found within the subdirectory of the output with the
same name as that output. In the case that the derivation
does not have this named output, the subdirectory will be
taken from the default output. This subdirectory must
contain a single file, and the output must contain an
ERIS manifest file.
*/
getEris = output: pkg:
with builtins;
let
pkg' = prev.getOutput output pkg;
erisInfo =
fromJSON (readFile "${pkg'}/nix-support/eris-manifest.json");
caps = filter
({ path, ... }: prev.strings.hasPrefix "${pkg'}/${output}" path)
(prev.attrsets.mapAttrsToList (path:
{ cap, closure }: {
path = "${pkg'}${
substring (stringLength pkg') (stringLength path) path
}"; # hack to build a string with context
inherit cap closure;
}) erisInfo);
in assert length caps == 1; head caps;
nixosSystem = { modules, ... }@args:
import "${nixpkgs}/nixos/lib/eval-config.nix" (args // {
lib = final;
baseModules =
# TODO: do not blacklist modules for the Linux guests
with builtins;
let
isNotModule = suffix:
let x = "${nixpkgs}/nixos/modules/${suffix}";
in y: x != y;
filters = map isNotModule
(import ./nixos-modules/base-modules-blacklist.nix);
isCompatible = p:
let p' = toString p;
in all (f: f p') filters;
in filter isCompatible
(import "${nixpkgs}/nixos/modules/module-list.nix");
modules = modules ++ [
({ config, lib, ... }: {
options = with lib; {
system.boot.loader.id = mkOption {
internal = true;
default = "";
};
system.boot.loader.kernelFile = mkOption {
internal = true;
default = pkgs.stdenv.hostPlatform.platform.kernelTarget;
type = types.str;
};
system.boot.loader.initrdFile = mkOption {
internal = true;
default = "initrd";
type = types.str;
};
systemd.defaultUnit = mkOption {
default = "multi-user.target";
type = types.str;
};
};
config = {
boot.loader.grub.enable = lib.mkDefault false;
fileSystems."/" = { };
networking.enableIPv6 = lib.mkForce false;
systemd.network.enable = lib.mkForce false;
system.nixos.versionSuffix = ".${
final.substring 0 8
(self.lastModifiedDate or self.lastModified or "19700101")
}.${self.shortRev or "dirty"}";
system.nixos.revision = final.mkIf (self ? rev) self.rev;
system.build.toplevel = config.system.build.initXml;
};
})
];
});
});
legacyPackages =
# The nixpkgs.legacyPackages after overlaying
# and with some additional Genode packages
forAllSystems
({ system, localSystem, crossSystem }: nixpkgsFor.${system});
# pass thru Nixpkgs
packages =
# Genode native packages, not packages in the traditional
# sense in that these cannot be installed within a profile
forAllCrossSystems ({ system, localSystem, crossSystem }:
nixpkgs.lib.filterAttrs (n: v: v != null)
nixpkgsFor.${system}.genodePackages);
devShell =
# Development shell for working with the
# upstream Genode source repositories
forAllLocalSystems (system:
let
pkgs = nixpkgs.legacyPackages.${system};
fhs = pkgs.buildFHSUserEnv {
name = "genode-env";
targetPkgs = pkgs:
(with pkgs; [
binutils
bison
expect
flex
git
glibc.dev
gnumake
libxml2
qemu
rpcsvc-proto
subversion
tcl
wget
which
xorriso
]);
runScript = "bash";
extraBuildCommands = let
toolchain = pkgs.fetchzip {
url =
"file://${packages.x86_64-linux-x86_64-genode.genodeSources.toolchain.src}";
hash = "sha256-26rPvLUPEJm40zLSqTquwuFTJ1idTB0T4VXgaHRN+4o=";
};
in "ln -s ${toolchain}/local usr/local";
};
in pkgs.stdenv.mkDerivation {
name = "genode-fhs-shell";
nativeBuildInputs = [ fhs ];
shellHook = "exec genode-env";
});
nixosModules =
# Modules for composing Genode and NixOS
import ./nixos-modules { flake = self; };
checks =
# Checks for continous testing
let tests = import ./tests;
in with (forAllCrossSystems ({ system, localSystem, crossSystem }:
tests {
flake = self;
inherit system localSystem crossSystem;
pkgs = self.legacyPackages.${system};
} // {
ports = nixpkgsFor.${localSystem}.symlinkJoin {
name = "ports";
paths = (builtins.attrValues
self.packages.${system}.genodeSources.ports);
};
})); {
x86_64-linux = x86_64-linux-aarch64-genode
// x86_64-linux-x86_64-genode;
};
hydraJobs = self.checks;
};
}