diff --git a/flake.nix b/flake.nix index 6c6e0a75..2af75209 100644 --- a/flake.nix +++ b/flake.nix @@ -40,15 +40,19 @@ inherit extern overrides; }; + suites = os.mkSuites { + suites = import ./suites; + users = os.mkProfileAttrs "${self}/users"; + profiles = os.mkProfileAttrs "${self}/profiles"; + userProfiles = os.mkProfileAttrs "${self}/users/profiles"; + }; + outputs = { - nixosConfigurations = - import ./hosts (nixos.lib.recursiveUpdate inputs { - inherit multiPkgs extern; - defaultSystem = "x86_64-linux"; - lib = nixos.lib.extend (final: prev: { - dev = self.lib; - }); - }); + nixosConfigurations = os.mkHosts { + dir = "${self}/hosts"; + overrides = import ./overrides; + inherit multiPkgs suites extern; + }; homeConfigurations = os.mkHomeConfigurations; diff --git a/lib/devos/default.nix b/lib/devos/default.nix index bf109ba3..e580ef00 100644 --- a/lib/devos/default.nix +++ b/lib/devos/default.nix @@ -11,6 +11,10 @@ mkNodes = dev.callLibs ./mkNodes.nix; + mkHosts = dev.callLibs ./mkHosts.nix; + + mkSuites = dev.callLibs ./mkSuites.nix; + mkProfileAttrs = dev.callLibs ./mkProfileAttrs.nix; mkPkgs = dev.callLibs ./mkPkgs.nix; diff --git a/lib/devos/devosSystem.nix b/lib/devos/devosSystem.nix index 99c217b3..b0f53fd8 100644 --- a/lib/devos/devosSystem.nix +++ b/lib/devos/devosSystem.nix @@ -18,7 +18,10 @@ lib.nixosSystem (args // { ({ config, suites, ... }: { # avoid unwanted systemd service startups - disabledModules = lib.remove modules.core suites.allProfiles; + # all strings in disabledModules get appended to modulesPath + # so convert each to list which can be coerced to string + disabledModules = map (x: [ x ]) + (lib.remove modules.core suites.allProfiles); nix.registry = lib.mapAttrs (n: v: { flake = v; }) inputs; diff --git a/hosts/default.nix b/lib/devos/mkHosts.nix similarity index 85% rename from hosts/default.nix rename to lib/devos/mkHosts.nix index 2a874e86..1d1bfce0 100644 --- a/hosts/default.nix +++ b/lib/devos/mkHosts.nix @@ -1,17 +1,8 @@ -{ extern -, home -, lib -, nixos -, override -, multiPkgs -, self -, defaultSystem -, ... -}: -let - inherit (lib) dev; +{ lib, dev, nixos, inputs, self, ... }: - suites = import ../suites { inherit lib; }; +{ dir, extern, suites, overrides, multiPkgs, ... }: +let + defaultSystem = "x86_64-linux"; experimentalFeatures = [ "flakes" @@ -21,10 +12,9 @@ let ]; modules = { - core = ../profiles/core; + core = "${self}/profiles/core"; modOverrides = { config, overrideModulesPath, ... }: let - overrides = import ../overrides; inherit (overrides) modules disabledModules; in { @@ -48,7 +38,7 @@ let nix.nixPath = [ "nixpkgs=${nixos}" "nixos-config=${self}/compat/nixos" - "home-manager=${home}" + "home-manager=${inputs.home}" ]; nixpkgs.pkgs = lib.mkDefault multiPkgs.${config.nixpkgs.system}; @@ -56,7 +46,7 @@ let nix.registry = { devos.flake = self; nixos.flake = nixos; - override.flake = override; + override.flake = inputs.override; }; nix.extraOptions = '' @@ -71,7 +61,7 @@ let # Everything in `./modules/list.nix`. flakeModules = { imports = builtins.attrValues self.nixosModules ++ extern.modules; }; - cachix = ../cachix.nix; + cachix = ../../cachix.nix; }; specialArgs = extern.specialArgs // { suites = suites.system; }; @@ -80,7 +70,7 @@ let let local = { require = [ - "${toString ./.}/${hostName}.nix" + "${dir}/${hostName}.nix" ]; networking = { inherit hostName; }; @@ -106,7 +96,7 @@ let hosts = dev.os.recImport { - dir = ./.; + inherit dir; _import = mkHostConfig; }; in diff --git a/lib/devos/mkProfileAttrs.nix b/lib/devos/mkProfileAttrs.nix index b502629b..214df261 100644 --- a/lib/devos/mkProfileAttrs.nix +++ b/lib/devos/mkProfileAttrs.nix @@ -27,7 +27,7 @@ let mkProfileAttrs = f = n: _: lib.optionalAttrs (lib.pathExists "${dir}/${n}/default.nix") - { default = /. + "${dir}/${n}"; } + { default = "${dir}/${n}"; } // mkProfileAttrs "${dir}/${n}"; in lib.mapAttrs f imports; diff --git a/lib/devos/mkSuites.nix b/lib/devos/mkSuites.nix new file mode 100644 index 00000000..a3a32944 --- /dev/null +++ b/lib/devos/mkSuites.nix @@ -0,0 +1,24 @@ +{ lib, dev, ... }: + +{ users, profiles, userProfiles, suites } @ args: +let + inherit (dev) os; + + definedSuites = suites { + inherit (args) users profiles userProfiles; + }; + + allProfiles = + let defaults = lib.collect (x: x ? default) profiles; + in map (x: x.default) defaults; + + allUsers = + let defaults = lib.collect (x: x ? default) users; + in map (x: x.default) defaults; + + createSuites = _: suites: lib.mapAttrs (_: v: os.profileMap v) suites // { + inherit allProfiles allUsers; + }; + +in +lib.mapAttrs createSuites definedSuites diff --git a/suites/default.nix b/suites/default.nix index e1b7d668..4a65b55d 100644 --- a/suites/default.nix +++ b/suites/default.nix @@ -1,35 +1,10 @@ -{ lib }: -let - inherit (lib) dev; +{ users, profiles, userProfiles, ... }: - profiles = dev.os.mkProfileAttrs (toString ../profiles); - userProfiles = dev.os.mkProfileAttrs (toString ../users/profiles); - users = dev.os.mkProfileAttrs (toString ../users); - - allProfiles = - let defaults = lib.collect (x: x ? default) profiles; - in map (x: x.default) defaults; - - allUsers = - let defaults = lib.collect (x: x ? default) users; - in map (x: x.default) defaults; - - - suites = with profiles; rec { +{ + system = with profiles; rec { base = [ users.nixos users.root ]; }; - - # available as 'suites' within the home-manager configuration - userSuites = with userProfiles; rec { + user = with userProfiles; rec { base = [ direnv git ]; }; - -in -{ - system = lib.mapAttrs (_: v: dev.os.profileMap v) suites // { - inherit allProfiles allUsers; - }; - user = lib.mapAttrs (_: v: dev.os.profileMap v) userSuites // { - allProfiles = userProfiles; - }; } diff --git a/tests/lib.nix b/tests/lib.nix index 65559f8d..3b181ccb 100644 --- a/tests/lib.nix +++ b/tests/lib.nix @@ -66,4 +66,24 @@ lib.runTests { (rgxToString "a?" "a" == "a") (rgxToString "hat" "foohatbar" == "hat") ]; + + testSuites = + let + profiles = os.mkProfileAttrs (toString ./profiles); + users = ""; + userProfiles = ""; + suites = { profiles, ... }: { + system.bar = [ profiles.foo ]; + }; + in + { + expr = os.mkSuites { inherit profiles users userProfiles suites; }; + expected = { + system = { + bar = [ profiles.foo.default ]; + allProfiles = [ profiles.foo.default profiles.t.default ]; + allUsers = []; + }; + }; + }; } diff --git a/tests/profiles/foo/default.nix b/tests/profiles/foo/default.nix new file mode 100644 index 00000000..2181e561 --- /dev/null +++ b/tests/profiles/foo/default.nix @@ -0,0 +1,3 @@ +{ + bar = 5; +} diff --git a/tests/profiles/t/default.nix b/tests/profiles/t/default.nix new file mode 100644 index 00000000..e69de29b