diff options
Diffstat (limited to 'flake.nix')
| -rw-r--r-- | flake.nix | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/flake.nix b/flake.nix new file mode 100644 index 00000000..fa1e81d6 --- /dev/null +++ b/flake.nix | |||
| @@ -0,0 +1,94 @@ | |||
| 1 | { | ||
| 2 | description = "gkleen's machines"; | ||
| 3 | |||
| 4 | inputs = { | ||
| 5 | nixpkgs = { | ||
| 6 | type = "github"; | ||
| 7 | owner = "NixOS"; | ||
| 8 | repo = "nixpkgs"; | ||
| 9 | ref = "master"; | ||
| 10 | }; | ||
| 11 | home-manager = { | ||
| 12 | type = "github"; | ||
| 13 | owner = "nix-community"; | ||
| 14 | repo = "home-manager"; | ||
| 15 | ref = "master"; | ||
| 16 | inputs.nixpkgs.follows = "nixpkgs"; | ||
| 17 | }; | ||
| 18 | }; | ||
| 19 | |||
| 20 | outputs = { self, nixpkgs, home-manager }@inputs: | ||
| 21 | let | ||
| 22 | inherit (builtins) attrNames attrValues elemAt; | ||
| 23 | inherit (nixpkgs) lib; | ||
| 24 | utils = import ./utils { inherit lib; }; | ||
| 25 | inherit (utils) recImport overrideModule; | ||
| 26 | inherit (lib) nixosSystem mkIf splitString filterAttrs listToAttrs mapAttrsToList nameValuePair concatMap composeManyExtensions mapAttrs mapAttrs' recursiveUpdate; | ||
| 27 | |||
| 28 | mkNixosConfiguration = dir: path: hostName: nixosSystem rec { | ||
| 29 | specialArgs = { | ||
| 30 | flake = self; | ||
| 31 | flakeInputs = inputs; | ||
| 32 | path = toString ./.; | ||
| 33 | }; | ||
| 34 | modules = | ||
| 35 | let | ||
| 36 | defaultProfiles = with self.nixosModules.systemProfiles; [core]; | ||
| 37 | local = "${toString dir}/${path}"; | ||
| 38 | global._module.args = { | ||
| 39 | customUtils = utils; | ||
| 40 | inherit hostName; | ||
| 41 | }; | ||
| 42 | accountModules = attrValues (filterAttrs accountMatchesHost self.nixosModules.accounts); | ||
| 43 | accountMatchesHost = n: _v: | ||
| 44 | let | ||
| 45 | accountName' = splitString "@" n; | ||
| 46 | hostName' = elemAt accountName' 1; | ||
| 47 | in hostName' == hostName; | ||
| 48 | in [ home-manager.nixosModules.home-manager global ] ++ defaultProfiles ++ [ local ] ++ accountModules; | ||
| 49 | }; | ||
| 50 | |||
| 51 | mkSystemProfile = dir: path: profileName: { | ||
| 52 | imports = [ "${toString dir}/${path}" ]; | ||
| 53 | config = { | ||
| 54 | system.profiles = [profileName]; | ||
| 55 | }; | ||
| 56 | }; | ||
| 57 | |||
| 58 | mkUserModule = dir: path: userName: overrideModule (import "${toString dir}/${path}") (inputs: inputs // { inherit userName; }) (outputs: { _file = "${toString dir}/${path}"; } // outputs); | ||
| 59 | |||
| 60 | mkAccountModule = dir: path: accountName: | ||
| 61 | let | ||
| 62 | accountName' = splitString "@" accountName; | ||
| 63 | userName = elemAt accountName' 0; | ||
| 64 | in overrideModule (import "${toString dir}/${path}") (inputs: inputs // { inherit userName; }) (outputs: { _file = "${toString dir}/${path}"; } // outputs // { imports = [self.nixosModules.users.${userName}] ++ (outputs.imports or []); }); | ||
| 65 | |||
| 66 | forAllSystems = f: mapAttrs f nixpkgs.legacyPackages; | ||
| 67 | |||
| 68 | activateHomeManagerConfigurations = forAllSystems (system: _pkgs: mapAttrs' (configName: hmConfig: nameValuePair "${configName}-activate" { type = "app"; program = "${hmConfig.activationPackage}/bin/activate"; }) self.homeManagerConfigurations); | ||
| 69 | activateNixosConfigurations = forAllSystems (system: _pkgs: mapAttrs' (hostName: nixosConfig: nameValuePair "${hostName}-activate" { type = "app"; program = "${nixosConfig.config.system.build.toplevel}/bin/switch-to-configuration"; }) self.nixosConfigurations); | ||
| 70 | in | ||
| 71 | { | ||
| 72 | nixosModules = | ||
| 73 | let modulesAttrs = recImport { dir = ./modules; }; | ||
| 74 | systemProfiles = recImport rec { dir = ./system-profiles; _import = mkSystemProfile dir; }; | ||
| 75 | userProfiles = recImport rec { dir = ./user-profiles; }; | ||
| 76 | users = recImport rec { dir = ./users; _import = mkUserModule dir; }; | ||
| 77 | accounts = recImport rec { dir = ./accounts; _import = mkAccountModule dir; }; | ||
| 78 | in modulesAttrs // { inherit systemProfiles userProfiles users accounts; }; | ||
| 79 | nixosConfigurations = recImport rec { dir = ./hosts; _import = mkNixosConfiguration dir; }; | ||
| 80 | |||
| 81 | homeManagerConfigurations = listToAttrs (concatMap ({hostName, users}: mapAttrsToList (userName: homeConfig: nameValuePair "${userName}@${hostName}" homeConfig) users) (mapAttrsToList (hostName: nixosConfig: { inherit hostName; users = nixosConfig.config.home-manager.users; }) (self.nixosConfigurations))); | ||
| 82 | |||
| 83 | overlay = import ./pkgs; | ||
| 84 | overlays = recImport { dir = ./overlays; } // { pkgs = self.overlay; }; | ||
| 85 | |||
| 86 | packages = forAllSystems (system: systemPkgs: composeManyExtensions (attrValues self.overlays) (self.legacyPackages.${system}) systemPkgs); | ||
| 87 | |||
| 88 | legacyPackages = forAllSystems (system: systemPkgs: recursiveUpdate systemPkgs self.packages.${system}); | ||
| 89 | |||
| 90 | apps = recursiveUpdate activateNixosConfigurations activateHomeManagerConfigurations; | ||
| 91 | |||
| 92 | devShell = forAllSystems (system: systemPkgs: import ./shell.nix { pkgs = self.legacyPackages.${system}; }); | ||
| 93 | }; | ||
| 94 | } | ||
