mirror of
https://github.com/kittywitch/nixfiles.git
synced 2026-02-09 04:19:19 -08:00
168 lines
4 KiB
Nix
168 lines
4 KiB
Nix
{
|
||
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.system;
|
||
#system = config;
|
||
};
|
||
};
|
||
}
|