sigil/flake.nix

279 lines
9.1 KiB
Nix
Raw Normal View History

2019-10-28 20:19:52 +01:00
{
2021-03-28 15:20:19 +02:00
description = "Nix flavored Genode distribution";
2019-10-28 20:19:52 +01:00
inputs = {
eris = {
url = "git+https://codeberg.org/eris/nix-eris";
inputs.nixpkgs.follows = "nixpkgs";
};
nimble.follows = "eris/nimble";
nixpkgs.url = "github:ehmry/nixpkgs/sigil-21.11";
};
outputs = { self, eris, nixpkgs, nimble }:
2019-11-05 17:38:47 +01:00
let
systems = {
2021-03-09 21:43:23 +01:00
localSystem = [ "x86_64-linux" ]; # build platforms
crossSystem = [ "aarch64-genode" "x86_64-genode" ]; # target platforms
};
2021-03-09 21:43:23 +01:00
systemSpace =
# All combinations of build and target systems
nixpkgs.lib.cartesianProductOfSets systems;
forAllLocalSystems =
# Apply a function over all self-hosting (Linux) systems.
f:
nixpkgs.lib.genAttrs systems.localSystem (system: f system);
2021-03-09 21:43:23 +01:00
forAllCrossSystems =
# Apply a function over all cross-compiled systems (Genode).
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;
2021-03-09 21:43:23 +01:00
forAllSystems =
# Apply a function over all Linux and Genode systems.
f:
(forAllCrossSystems f) // (forAllLocalSystems (system:
f {
inherit system;
localSystem = system;
crossSystem = system;
}));
overlays = [ nimble.overlay eris.overlays.default self.overlay ];
in rec {
2020-08-02 16:46:34 +02:00
overlay =
2021-03-09 21:43:23 +01:00
# Overlay of adjustments applied to Nixpkgs as well as
# the "genodePackages" set which the "packages"
# output of this flake is taken.
import ./overlay;
2020-08-02 16:46:34 +02:00
lib =
# Local utilities merged with the Nixpkgs lib
2021-01-05 15:11:42 +01:00
nixpkgs.lib.extend (final: prev: {
inherit forAllSystems forAllLocalSystems forAllCrossSystems;
2022-05-25 06:10:38 +02:00
getMainProgram = pkg:
with builtins;
2022-05-25 06:10:38 +02:00
if hasAttr "mainProgram" pkg.meta then
pkg.meta.mainProgram
else
trace "${pkg.name} is missing meta.mainProgram" pkg.pname;
2022-05-25 06:10:38 +02:00
getEris = filename: pkg:
2021-03-04 15:02:39 +01:00
with builtins;
let
2022-05-25 06:10:38 +02:00
manifest = fromJSON (unsafeDiscardStringContext
(readFile "${pkg}/nix-support/eris-manifest.json"));
entry = manifest.${filename};
in entry // {
cap = "(${pkg}/nix-support/eris-manifest.dhall).${filename}.cap";
path = "${pkg}${
substring (stringLength pkg) (stringLength entry.path)
entry.path
}"; # hack to build a string with context
};
getErisMainProgram = pkg:
final.getEris (final.getMainProgram pkg) (prev.getOutput "bin" pkg);
getErisLib = filename: pkg:
final.getEris filename (prev.getOutput "lib" pkg);
2021-03-04 15:02:39 +01:00
uuidFrom = seed:
let digest = builtins.hashString "sha256" seed;
in (lib.lists.foldl ({ str, off }:
n:
let chunk = builtins.substring off n digest;
in {
str = if off == 0 then chunk else "${str}-${chunk}";
off = off + n;
}) {
str = "";
off = 0;
} [ 8 4 4 4 12 ]).str;
2021-03-09 21:43:23 +01:00
nixosSystem =
# A derivative of the function for generating Linux NixOS systems.
# This one is not so well tested…
{ modules, ... }@args:
2021-01-05 15:11:42 +01:00
import "${nixpkgs}/nixos/lib/eval-config.nix" (args // {
lib = final;
2021-01-05 15:11:42 +01:00
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;
};
})
];
});
});
2022-10-06 21:03:52 +02:00
legacyPackages = forAllSystems ({ system, localSystem, crossSystem }:
if builtins.hasAttr system nixpkgs.legacyPackages then
nixpkgs.legacyPackages.${system}.appendOverlays overlays
else
import nixpkgs {
inherit localSystem;
crossSystem = {
system = crossSystem;
useLLVM = true;
};
config.allowUnsupportedSystem = true;
inherit overlays;
});
2020-08-02 16:46:34 +02:00
packages =
# Genode native packages, not packages in the traditional
2021-03-09 21:43:23 +01:00
# sense in that these cannot be installed within a profile.
2020-08-02 16:46:34 +02:00
forAllCrossSystems ({ system, localSystem, crossSystem }:
nixpkgs.lib.filterAttrs (_: v: v != null)
2021-03-02 23:35:55 +01:00
self.legacyPackages.${system}.genodePackages);
2020-08-02 16:46:34 +02:00
devShell =
# Development shell for working with the
2021-03-09 21:43:23 +01:00
# upstream Genode source repositories. Some
# things are missing but everything referred
# to by way of #!/usr/bin/ should be here.
2020-08-02 16:46:34 +02:00
forAllLocalSystems (system:
let
pkgs = nixpkgs.legacyPackages.${system};
2020-08-02 16:46:34 +02:00
fhs = pkgs.buildFHSUserEnv {
name = "genode-env";
targetPkgs = pkgs:
(with pkgs; [
binutils
bison
expect
flex
git
glibc.dev
gnumake
libxml2
qemu
rpcsvc-proto
subversion
2020-08-02 16:46:34 +02:00
tcl
wget
2020-08-02 16:46:34 +02:00
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";
};
2020-08-02 16:46:34 +02:00
in pkgs.stdenv.mkDerivation {
name = "genode-fhs-shell";
nativeBuildInputs = [ fhs ];
shellHook = "exec genode-env";
2020-03-24 13:47:30 +01:00
});
2020-12-10 20:23:53 +01:00
nixosModules =
2021-03-09 21:43:23 +01:00
# Modules for composing Genode and NixOS.
import ./nixos-modules { inherit (self) legacyPackages; };
2020-12-10 20:23:53 +01:00
2020-08-02 16:46:34 +02:00
checks =
2021-03-09 21:43:23 +01:00
# Checks for continous testing.
let tests = import ./tests;
in with (forAllCrossSystems ({ system, localSystem, crossSystem }:
tests {
inherit lib system localSystem crossSystem;
hostPkgs = nixpkgs.legacyPackages.${localSystem};
testPkgs = self.legacyPackages.${system};
modulesPath = "${nixpkgs}/nixos/modules";
2020-08-15 19:54:01 +02:00
} // {
2021-03-02 23:35:55 +01:00
ports = self.legacyPackages.${localSystem}.symlinkJoin {
2020-08-15 19:54:01 +02:00
name = "ports";
paths = (builtins.attrValues
self.packages.${system}.genodeSources.ports);
};
2020-09-18 00:56:24 +02:00
})); {
x86_64-linux = x86_64-linux-aarch64-genode
// x86_64-linux-x86_64-genode;
};
2020-12-02 13:06:00 +01:00
hydraJobs = self.checks;
};
2019-10-28 20:19:52 +01:00
}