nixfiles/modules/system/host.nix

167 lines
4 KiB
Nix
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
name,
config,
tree,
std,
lib,
pkgs,
inputs,
...
}: let
inherit (lib.modules) mkIf mkOptionDefault mkMerge;
inherit (lib.trivial) mapNullable;
inherit (std) string set;
in {
options = let
inherit (lib.types) str listOf attrs nullOr unspecified enum bool;
inherit (lib.options) mkOption;
in {
name = mkOption {
type = str;
default = name;
readOnly = true;
};
arch = mkOption {
description = "Processor architecture of the host";
type = str;
default = "x86_64";
};
type = mkOption {
description = "Operating system type of the host";
type = enum ["NixOS" "MacOS" "Darwin" "Linux" "Windows" "Home"];
default = "NixOS";
};
folder = mkOption {
type = str;
internal = true;
};
system = mkOption {
type = str;
internal = true;
};
modules = mkOption {
type = listOf unspecified;
default = [];
};
specialArgs = mkOption {
type = attrs;
internal = true;
};
pkgs = mkOption {
type = unspecified;
internal = true;
};
builder = mkOption {
type = unspecified;
internal = true;
};
built = mkOption {
type = unspecified;
internal = true;
};
microVM = {
state = mkOption {
description = "Does this system exist as a guest MicroVM?";
type = bool;
default = false;
};
host = mkOption {
description = "The hostname that is the host of this guest MicroVM";
type = nullOr str;
default = null;
};
};
};
config = {
system = let
kernel =
{
nixos = "linux";
macos = "darwin";
darwin = "darwin";
linux = "linux";
home = "linux";
}
.${
string.toLower config.type
};
in "${config.arch}-${kernel}";
folder =
{
nixos = "nixos";
macos = "darwin";
darwin = "darwin";
linux = "linux";
windows = "windows";
home = "home";
}
.${
string.toLower config.type
};
modules = mkMerge [
(mkIf (config.folder != "linux") [
# per-OS modules
tree.modules.${config.folder}
# per-OS user definition
tree.home.user.${config.folder}
])
(mkIf (config.folder != "linux" && config.folder != "home") [
# per-OS configuration
tree.${config.folder}.common
# true base module
tree.common
])
];
builder =
{
nixos = let
lib = inputs.nixpkgs.lib.extend (self: super:
import (inputs.arcexprs + "/lib") {
inherit super;
lib = self;
isOverlayLib = true;
});
sys = args:
lib.nixosSystem ({
inherit lib;
}
// args);
in
sys;
home = args: let
renamedArgs = set.rename "specialArgs" "extraSpecialArgs" args;
renamedArgsWithPkgs =
renamedArgs
// {
inherit lib;
pkgs = pkgs.${args.system};
};
attrsToRemove = ["configuration" "username" "homeDirectory" "stateVersion" "extraModules" "system"];
safeArgs = removeAttrs renamedArgsWithPkgs attrsToRemove;
in
inputs.home-manager.lib.homeManagerConfiguration safeArgs;
darwin = inputs.darwin.lib.darwinSystem;
macos = inputs.darwin.lib.darwinSystem;
}
.${
string.toLower config.type
}
or null;
built = mkOptionDefault (mapNullable (builder:
builder {
inherit (config) system modules specialArgs;
})
config.builder);
pkgs = pkgs.${config.system};
specialArgs = {
inherit name inputs std tree;
systemType = config.folder;
nur = import inputs.nur {
pkgs = pkgs.${config.system};
nurpkgs = pkgs.${config.system};
};
machine = name;
system = config;
};
};
}