diff --git a/flake.lock b/flake.lock index 87bf043..0bc246f 100644 --- a/flake.lock +++ b/flake.lock @@ -135,6 +135,22 @@ "type": "github" } }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1751685974, + "narHash": "sha256-NKw96t+BgHIYzHUjkTK95FqYRVKB8DHpVhefWSz/kTw=", + "ref": "refs/heads/main", + "rev": "549f2762aebeff29a2e5ece7a7dc0f955281a1d1", + "revCount": 92, + "type": "git", + "url": "https://git.lix.systems/lix-project/flake-compat.git" + }, + "original": { + "type": "git", + "url": "https://git.lix.systems/lix-project/flake-compat.git" + } + }, "flake-parts": { "inputs": { "nixpkgs-lib": [ @@ -157,6 +173,27 @@ } }, "flake-parts_2": { + "inputs": { + "nixpkgs-lib": [ + "nvf", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1760948891, + "narHash": "sha256-TmWcdiUUaWk8J4lpjzu4gCGxWY6/Ok7mOK4fIFfBuU4=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "864599284fc7c0ba6357ed89ed5e2cd5040f0c04", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_3": { "inputs": { "nixpkgs-lib": [ "stylix", @@ -239,11 +276,11 @@ ] }, "locked": { - "lastModified": 1762787259, - "narHash": "sha256-t2U/GLLXHa2+kJkwnFNRVc2fEJ/lUfyZXBE5iKzJdcs=", + "lastModified": 1762964643, + "narHash": "sha256-RYHN8O/Aja59XDji6WSJZPkJpYVUfpSkyH+PEupBJqM=", "owner": "nix-community", "repo": "home-manager", - "rev": "37a3d97f2873e0f68711117c34d04b7c7ead8f4e", + "rev": "827f2a23373a774a8805f84ca5344654c31f354b", "type": "github" }, "original": { @@ -278,13 +315,28 @@ "type": "github" } }, + "mnw": { + "locked": { + "lastModified": 1758834834, + "narHash": "sha256-Y7IvY4F8vajZyp3WGf+KaiIVwondEkMFkt92Cr9NZmg=", + "owner": "Gerg-L", + "repo": "mnw", + "rev": "cfbc7d1cc832e318d0863a5fc91d940a96034001", + "type": "github" + }, + "original": { + "owner": "Gerg-L", + "repo": "mnw", + "type": "github" + } + }, "nixos-hardware": { "locked": { - "lastModified": 1762463231, - "narHash": "sha256-hv1mG5j5PTbnWbtHHomzTus77pIxsc4x8VrMjc7+/YE=", + "lastModified": 1762847253, + "narHash": "sha256-BWWnUUT01lPwCWUvS0p6Px5UOBFeXJ8jR+ZdLX8IbrU=", "owner": "nixos", "repo": "nixos-hardware", - "rev": "52113c4f5cfd1e823001310e56d9c8d0699a6226", + "rev": "899dc449bc6428b9ee6b3b8f771ca2b0ef945ab9", "type": "github" }, "original": { @@ -295,11 +347,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1762596750, - "narHash": "sha256-rXXuz51Bq7DHBlfIjN7jO8Bu3du5TV+3DSADBX7/9YQ=", + "lastModified": 1762977756, + "narHash": "sha256-4PqRErxfe+2toFJFgcRKZ0UI9NSIOJa+7RXVtBhy4KE=", "owner": "nixos", "repo": "nixpkgs", - "rev": "b6a8526db03f735b89dd5ff348f53f752e7ddc8e", + "rev": "c5ae371f1a6a7fd27823bc500d9390b38c05fa55", "type": "github" }, "original": { @@ -334,6 +386,30 @@ "type": "github" } }, + "nvf": { + "inputs": { + "flake-compat": "flake-compat_2", + "flake-parts": "flake-parts_2", + "mnw": "mnw", + "nixpkgs": [ + "nixpkgs" + ], + "systems": "systems" + }, + "locked": { + "lastModified": 1762622004, + "narHash": "sha256-NpzzgaoMK8aRHnndHWbYNKLcZN0r1y6icCoJvGoBsoE=", + "owner": "notashelf", + "repo": "nvf", + "rev": "09470524a214ed26633ddc2b6ec0c9bf31a8b909", + "type": "github" + }, + "original": { + "owner": "notashelf", + "repo": "nvf", + "type": "github" + } + }, "pre-commit-hooks-nix": { "inputs": { "flake-compat": [ @@ -367,6 +443,7 @@ "lanzaboote": "lanzaboote", "nixos-hardware": "nixos-hardware", "nixpkgs": "nixpkgs", + "nvf": "nvf", "sops-nix": "sops-nix", "stylix": "stylix" } @@ -399,11 +476,11 @@ ] }, "locked": { - "lastModified": 1762659808, - "narHash": "sha256-2Kv2mANf+FRisqhpfeZ8j9firBxb23ZvEXwdcunbpGI=", + "lastModified": 1763069729, + "narHash": "sha256-A91a+K0Q9wfdPLwL06e/kbHeAWSzPYy2EGdTDsyfb+s=", "owner": "Mic92", "repo": "sops-nix", - "rev": "524312bc62e3f34bd9231a2f66622663d3355133", + "rev": "a2bcd1c25c1d29e22756ccae094032ab4ada2268", "type": "github" }, "original": { @@ -419,13 +496,13 @@ "base16-helix": "base16-helix", "base16-vim": "base16-vim", "firefox-gnome-theme": "firefox-gnome-theme", - "flake-parts": "flake-parts_2", + "flake-parts": "flake-parts_3", "gnome-shell": "gnome-shell", "nixpkgs": [ "nixpkgs" ], "nur": "nur", - "systems": "systems", + "systems": "systems_2", "tinted-foot": "tinted-foot", "tinted-kitty": "tinted-kitty", "tinted-schemes": "tinted-schemes", @@ -461,6 +538,21 @@ "type": "github" } }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, "tinted-foot": { "flake": false, "locked": { diff --git a/flake.nix b/flake.nix index 1bfd0d4..9af0fff 100644 --- a/flake.nix +++ b/flake.nix @@ -13,73 +13,96 @@ disko.inputs.nixpkgs.follows = "nixpkgs"; stylix.url = "github:nix-community/stylix"; stylix.inputs.nixpkgs.follows = "nixpkgs"; + + #obsidian-nvim.url = "github:epwalsh/obsidian.nvim"; + nvf = { + url = "github:notashelf/nvf"; + inputs.nixpkgs.follows = "nixpkgs"; + #inputs.obsidian-nvim.follows = "obsidian-nvim"; + }; }; # https://nix.dev/tutorials/nix-language.html#named-attribute-set-argument - outputs = inputs@{self, nixpkgs, nixos-hardware, home-manager, sops-nix, lanzaboote, disko, stylix, ...}: - let - mkSystem = (import ./lib { - inherit nixpkgs home-manager inputs; - }).mkSystem; - in - { - lib = { - mkSystem = mkSystem; + outputs = + inputs@{ + self, + nixpkgs, + nixos-hardware, + home-manager, + sops-nix, + lanzaboote, + disko, + stylix, + nvf, + ... + }: + let + zwLib = import ./lib { + inherit nixpkgs home-manager inputs; + }; + mkSystem = zwLib.mkSystem; + mkHome = zwLib.mkHome; + mkHomeConfigs = zwLib.mkHomeConfigs; + + # NOTE: Currently these are exclusively user-profiles which use home-manager. + # Their home-manager specific declarations are at ../users/${username}/home.nix + system = "x86_64-linux"; # TODO: Improve this from only static x86 to dynamic. + homeUserProfiles = { + jml = mkHome { + inherit system; # inputs; + username = "jml"; + extraModules = [ nvf.homeManagerModules.default ]; + }; + }; + in + { + lib = { + mkSystem = mkSystem; + }; + # NOTE: Run `nix flake show` to see what this flake has to offer. + # TODO: Enable automated formatting with something like numtide/treefmt-nix + nixosConfigurations = { + neon = mkSystem { + hostname = "neon"; + users = [ "jml" ]; + }; + lithium = mkSystem { + hostname = "lithium"; + # extraModules = [ inputs.sops-nix.nixosModules.sops ]; + users = [ + "jml" + "breakglass" + ]; + }; + titanium = mkSystem { + hostname = "titanium"; + users = [ + "jml" + ]; + homeUsers = { + jml = homeUserProfiles.jml.module; + }; + #extraModules = [ (import ./overlays) ]; + # NOTE: If I'm using a home-manager configuration on a given host, + # I also need to include the relevant modules. + # TODO: Can I instead self-reference the homeConfigurations in this flake? + extraModules = [ + stylix.nixosModules.stylix + ]; + }; + # `nix build .#nixosConfigurations.installIso.config.system.build.isoImage` + # https://github.com/nix-community/nixos-generators + installIso = nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + modules = [ + "${nixpkgs}/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix" + ]; + specialArgs = { inherit inputs; }; + }; + }; + + # For Debugging: `home-manager build --flake .` or `nix build .#homeConfigurations."jml".activationPackage` + # `home-manager switch --flake .#jml` + # https://nix-community.github.io/home-manager/options.xhtml + homeConfigurations = mkHomeConfigs homeUserProfiles; }; - # NOTE: Run `nix flake show` to see what this flake has to offer. - # TODO: Enable automated formatting with something like numtide/treefmt-nix - nixosConfigurations = { - neon = mkSystem { - hostname = "neon"; - users = [ "jml" ]; - }; - lithium = mkSystem { - hostname = "lithium"; - # extraModules = [ inputs.sops-nix.nixosModules.sops ]; - users = [ - "jml" - "breakglass" - ]; - }; - titanium = mkSystem { - hostname = "titanium"; - users = [ - "jml" - ]; - extraModules = [ - #(import ./overlays) - #stylix.nixosModules.stylix - { nixpkgs.config.allowUnfree = true; } - lanzaboote.nixosModules.lanzaboote - disko.nixosModules.disko - ./hosts/titanium/disko.nix - ({ pkgs, lib, ... }: { - environment.systemPackages = [ pkgs.sbctl ]; - boot.loader.systemd-boot.enable = lib.mkForce false; - boot.lanzaboote.enable = true; - boot.lanzaboote.pkiBundle = "/var/lib/sbctl"; - }) - ]; - }; - cobalt = mkSystem { - hostname = "cobalt"; - users = [ "jml" ]; - }; - # `nix build .#nixosConfigurations.installIso.config.system.build.isoImage` - # https://github.com/nix-community/nixos-generators - installIso = nixpkgs.lib.nixosSystem { - system = "x86_64-linux"; - modules = [ - "${nixpkgs}/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix" - ]; - specialArgs = {inherit inputs;}; - }; - }; - homeConfigurations = { - "jml" = home-manager.lib.homeManagerConfiguration { - modules = [ - ./users/jml/home.nix - ]; - }; - }; - }; } diff --git a/lib/default.nix b/lib/default.nix index 65ee05a..f3d2ac9 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -1,68 +1,113 @@ -{ nixpkgs, home-manager, inputs, ... }: +{ + nixpkgs, + home-manager, + inputs, + ... +}: let allOverlays = import (../overlays) { inherit nixpkgs; }; -in -{ - # It's not really that I care about whether a system is a desktop system or - # a server system, but moreso that I care about whether a system is headless or not. - # I also care about things like if it's darwin, or wsl. - # TODO: Expand this to actually make use of extraSpecialArgs and pass special - # args to the relevant places. - mkSystem = { - hostname, - system ? "x86_64-linux", - users ? [], - extraModules ? [], - extraSpecialArgs ? {} - }: - let - pkgs_with_overlays = import nixpkgs { + getPkgs = + system: + import nixpkgs { inherit system; overlays = allOverlays; }; - hostModule = import ../hosts/${hostname} { - inherit inputs; - pkgs = pkgs_with_overlays; - }; - userModules = map (name: - import ../users/${name} { - pkgs = pkgs_with_overlays; - lib = nixpkgs.lib; - } - ) users; - - homeUserNames = builtins.filter (name: - builtins.pathExists ../users/${name}/home.nix - ) users; - - homeUsers = nixpkgs.lib.listToAttrs (map (name: { - name = name; - value = import ../users/${name}/home.nix { - username = name; - pkgs = pkgs_with_overlays; - lib = nixpkgs.lib; +in +{ + mkSystem = + { + hostname, + system ? "x86_64-linux", + users ? [ ], + extraModules ? [ ], + homeUsers ? { }, + extraSpecialArgs ? { }, + }: + let + pkgs_with_overlays = import nixpkgs { + inherit system; + overlays = allOverlays; }; - }) homeUserNames); - in + hostModule = import ../hosts/${hostname} { + inherit inputs; + pkgs = pkgs_with_overlays; + }; + userModules = map ( + name: + import ../users/${name} { + pkgs = pkgs_with_overlays; + lib = nixpkgs.lib; + } + ) users; + + formattedHomeUsers = nixpkgs.lib.mapAttrs (username: moduleList: { + imports = moduleList; + }) homeUsers; + in nixpkgs.lib.nixosSystem { inherit system; - # pkgs = import inputs.nixpkgs { - # inherit system; - # overlays = allOverlays; - # config = { allowUnfree = true; nvidia.acceptLicense = true; }; - # }; - modules = [ hostModule ] - ++ userModules - ++ extraModules - ++ (if homeUserNames != [] then [ - home-manager.nixosModules.home-manager - { - home-manager.backupFileExtension = "hm-bak"; - home-manager.users = homeUsers; - } - ] else []); + modules = [ + hostModule + ] + ++ userModules + ++ extraModules + ++ ( + if homeUsers != { } then + [ + home-manager.nixosModules.home-manager + { + #home-manager.useGlobalPkgs = true; # NOTE: Incompatible with nixpkgs.{config,overlays} + home-manager.useUserPackages = true; + home-manager.backupFileExtension = "hm-bak"; + + # Directly inject the module lists? (isn't this the problem?) + home-manager.users = formattedHomeUsers; + home-manager.extraSpecialArgs = { inherit inputs; }; + } + ] + else + [ ] + ); specialArgs = { inherit inputs hostname; - } // extraSpecialArgs; + } + // extraSpecialArgs; }; + + getUserHomeModule = + username: pkgs: inputs: + import ../users/${username}/home.nix { + inherit username pkgs inputs; + lib = nixpkgs.lib; + }; + + /** + This function returns an attribute set { module, config }. + */ + mkHome = + { + username, + system ? "x86_64-linux", + extraModules ? [ ], + }: + let + pkgs_with_overlays = getPkgs system; + moduleList = [ + (import ../users/${username}/home.nix { + inherit inputs username; + pkgs = pkgs_with_overlays; + lib = nixpkgs.lib; + }) + ] + ++ extraModules; + in + { + module = moduleList; + config = home-manager.lib.homeManagerConfiguration { + pkgs = pkgs_with_overlays; + modules = moduleList; + }; + }; + + mkHomeConfigs = userProfiles: nixpkgs.lib.mapAttrs (username: profile: profile.config) userProfiles; }