dotfiles/lib/default.nix

208 lines
5.5 KiB
Nix
Raw Normal View History

2025-03-10 03:37:48 +00:00
inputs:
let
lib = inputs.nixpkgs.lib;
in
lib
// rec {
2025-03-12 01:51:12 +00:00
# Returns all files in a directory matching a suffix
2025-03-10 03:37:48 +00:00
filesInDirectoryWithSuffix =
directory: suffix:
lib.pipe (lib.filesystem.listFilesRecursive directory) [
# Get only files ending in .nix
(builtins.filter (name: lib.hasSuffix suffix name))
];
# Returns all files ending in .nix for a directory
nixFiles = directory: filesInDirectoryWithSuffix directory ".nix";
# Returns all files ending in default.nix for a directory
defaultFiles = directory: filesInDirectoryWithSuffix directory "default.nix";
# Imports all files in a directory and passes inputs
importOverlays =
directory:
lib.pipe (nixFiles directory) [
# Import each overlay file
(map (file: (import file) inputs))
];
# Import default files as attrset with keys provided by parent directory
defaultFilesToAttrset =
directory:
lib.pipe (defaultFiles directory) [
# Import each file
(map (file: {
name = builtins.baseNameOf (builtins.dirOf file);
value = import file;
}))
# Convert to an attrset of parent dir name -> file
(builtins.listToAttrs)
];
# [ package1/package.nix package2/package.nix package2/hello.sh ]
buildPkgsFromDirectoryAndPkgs =
directory: pkgs:
lib.pipe (filesInDirectoryWithSuffix directory "package.nix") [
# Apply callPackage to create a derivation
# Must use final.callPackage to avoid infinite recursion
# [ package1.drv package2.drv ]
(builtins.map (name: pkgs.callPackage name { }))
# Convert the list to an attrset with keys from pname or name attr
# { package1 = package1.drv, package2 = package2.drv }
(builtins.listToAttrs (
map (v: {
name = v."pname" or v."name";
value = v;
})
))
];
2025-03-11 02:31:22 +00:00
# Common overlays to always use
overlays = [
inputs.nur.overlays.default
inputs.nix2vim.overlay
] ++ (importOverlays ../overlays);
# System types to support.
supportedSystems = [
"x86_64-linux"
"x86_64-darwin"
"aarch64-linux"
"aarch64-darwin"
];
# Split system types by operating system
linuxSystems = builtins.filter (lib.hasSuffix "linux") supportedSystems;
darwinSystems = builtins.filter (lib.hasSuffix "darwin") supportedSystems;
# Helper function to generate an attrset '{ x86_64-linux = f "x86_64-linux"; ... }'.
forSystems = systems: lib.genAttrs systems;
forAllSystems = lib.genAttrs supportedSystems;
# { x86_64-linux = { tempest = { settings = ...; }; }; };
hosts = forAllSystems (system: defaultFilesToAttrset ../hosts/${system});
linuxHosts = lib.filterAttrs (name: value: builtins.elem name linuxSystems) hosts;
darwinHosts = lib.filterAttrs (name: value: builtins.elem name darwinSystems) hosts;
# { system -> pkgs }
pkgsBySystem = forAllSystems (
system:
import inputs.nixpkgs {
inherit system overlays;
config.permittedInsecurePackages = [ "litestream-0.3.13" ];
config.allowUnfree = true;
}
);
colorscheme = defaultFilesToAttrset ../colorscheme;
homeModule = {
home-manager = {
# Include home-manager config in NixOS
sharedModules = nixFiles ../platforms/home-manager;
# Use the system-level nixpkgs instead of Home Manager's
useGlobalPkgs = lib.mkDefault true;
# Install packages to /etc/profiles instead of ~/.nix-profile, useful when
# using multiple profiles for one user
useUserPackages = lib.mkDefault true;
};
};
2025-03-11 02:31:22 +00:00
buildHome =
{
2025-03-12 01:51:12 +00:00
system,
module,
specialArgs,
2025-03-11 02:31:22 +00:00
}:
inputs.home-manager.lib.homeManagerConfiguration {
2025-03-12 01:51:12 +00:00
pkgs = pkgsBySystem.${system};
modules = [
{ imports = (nixFiles ../platforms/home-manager); }
2025-03-12 01:51:12 +00:00
module
2025-03-11 02:31:22 +00:00
];
2025-03-12 01:51:12 +00:00
extraSpecialArgs = {
inherit colorscheme;
} // specialArgs;
2025-03-11 02:31:22 +00:00
};
buildNixos =
{
2025-03-12 01:51:12 +00:00
system,
module,
2025-03-11 02:31:22 +00:00
specialArgs,
}:
inputs.nixpkgs.lib.nixosSystem {
2025-03-12 01:51:12 +00:00
pkgs = pkgsBySystem.${system};
modules = [
2025-03-11 02:31:22 +00:00
inputs.home-manager.nixosModules.home-manager
inputs.disko.nixosModules.disko
inputs.wsl.nixosModules.wsl
{ imports = (nixFiles ../platforms/nixos); }
2025-03-12 01:51:12 +00:00
module
2025-03-11 02:31:22 +00:00
{
home-manager.extraSpecialArgs = {
inherit colorscheme;
2025-03-12 01:51:12 +00:00
} // specialArgs;
2025-03-11 02:31:22 +00:00
}
];
specialArgs = {
2025-03-12 01:51:12 +00:00
} // specialArgs;
2025-03-11 02:31:22 +00:00
};
buildDarwin =
2025-03-12 01:51:12 +00:00
{ system, module }:
2025-03-11 02:31:22 +00:00
inputs.darwin.lib.darwinSystem {
2025-03-12 01:51:12 +00:00
pkgs = pkgsBySystem.${system};
modules = [
2025-03-11 02:31:22 +00:00
inputs.home-manager.darwinModules.home-manager
inputs.mac-app-util.darwinModules.default
{ imports = (nixFiles ../platforms/nix-darwin); }
2025-03-12 01:51:12 +00:00
module
2025-03-11 02:31:22 +00:00
];
};
generatorOptions = {
amazon = {
aws.enable = true;
};
iso = { };
};
generateImage =
{
system,
module,
format,
specialArgs,
}:
inputs.nixos-generators.nixosGenerate {
inherit system format;
modules = [
inputs.home-manager.nixosModules.home-manager
inputs.disko.nixosModules.disko
inputs.wsl.nixosModules.wsl
{
imports = (nixFiles ../platforms/nixos) ++ (nixFiles ../platforms/generators);
}
generatorOptions.${format}
module
{
home-manager = {
extraSpecialArgs = {
inherit colorscheme;
} // specialArgs;
} // homeModule.home-manager;
}
];
specialArgs = {
} // specialArgs;
};
2025-03-10 03:37:48 +00:00
}