nixos-config/lib/extras/images.nix

93 lines
3.1 KiB
Nix
Raw Normal View History

# A set of functions intended for creating images. THis is meant to be imported
# for use in flake.nix and nowhere else.
{ inputs, lib }:
let
# A function that generates a lambda suitable for `lib.extend`.
extendLib = import ./extend-lib.nix;
in
{
2023-12-18 10:44:27 +00:00
# A thin wrapper around the NixOS configuration function.
mkHost = { extraModules ? [ ], nixpkgs-channel ? "nixpkgs" }:
let
nixpkgs = inputs.${nixpkgs-channel};
2023-12-18 10:44:27 +00:00
# Just to be sure, we'll use everything with the given nixpkgs' stdlib.
lib' = nixpkgs.lib.extend extendLib;
# A modified version of `nixosSystem` from nixpkgs flake. There is a
# recent change at nixpkgs (at 039f73f134546e59ec6f1b56b4aff5b81d889f64)
# that prevents setting our own custom functions so we'll have to
# evaluate the NixOS system ourselves.
nixosSystem = args: import "${nixpkgs}/nixos/lib/eval-config.nix" args;
in
(lib'.makeOverridable nixosSystem) {
lib = lib';
modules = extraModules;
# Since we're setting it through nixpkgs.hostPlatform, we'll have to pass
# this as null.
system = null;
2023-06-22 03:12:43 +00:00
};
2023-12-18 10:44:27 +00:00
# A thin wrapper around the home-manager configuration function.
mkHome = { pkgs, extraModules ? [ ], home-manager-channel ? "home-manager" }:
inputs.${home-manager-channel}.lib.homeManagerConfiguration {
inherit pkgs;
lib = pkgs.lib.extend extendLib;
modules = extraModules;
};
2023-12-18 10:44:27 +00:00
# A thin wrapper around the nixos-generators `nixosGenerate` function.
2024-01-01 05:56:10 +00:00
mkImage = { nixpkgs-channel ? "nixpkgs", extraModules ? [ ], format ? "iso" }:
let
nixpkgs = inputs.${nixpkgs-channel};
2024-01-01 05:56:10 +00:00
# A modified version of `nixosSystem` from nixpkgs flake similar to the
# one found in mkHost.
nixosSystem = args: import "${nixpkgs}/nixos/lib/eval-config.nix" args;
2024-01-01 05:56:10 +00:00
image = nixosSystem {
lib = nixpkgs.lib.extend extendLib;
modules = extraModules ++ [ inputs.nixos-generators.nixosModules.${format} ];
2024-01-01 05:56:10 +00:00
# We're also setting this up modularly so we'll have to pass these as
# null.
system = null;
};
in
image.config.system.build.${image.config.formatAttr};
2023-12-18 10:44:27 +00:00
# A function to modify the given table of declarative setups (i.e., hosts,
# users) to have its own system attribute and its name.
#
# If the given setup only has one system, its name will stay the same.
# Otherwise, it will be appended with the system as part of the name (e.g.,
# `$NAME-$SYSTEM`).
listImagesWithSystems = data:
lib.foldlAttrs
(acc: name: metadata:
2023-08-27 05:41:29 +00:00
let
name' = metadata.hostname or name;
in
if lib.length metadata.systems > 1 then
acc // (lib.foldl
(images: system: images // {
"${name'}-${system}" = metadata // {
_system = system;
_name = name';
};
})
2023-08-27 05:41:29 +00:00
{ }
metadata.systems)
else
acc // {
"${name'}" = metadata // {
_system = lib.head metadata.systems;
_name = name';
};
})
2023-08-27 05:41:29 +00:00
{ }
data;
}