diff --git a/export/hmModule.nix b/export/hmModule.nix index 165dbac..8bac504 100644 --- a/export/hmModule.nix +++ b/export/hmModule.nix @@ -1,3 +1,6 @@ -{ ... }@flake: { ... }@inputs: { ... }@imports: { - imports = builtins.attrValues (flake.hmModules or {}); +{ ... }@flake: +{ ... }@inputs: +{ ... }@imports: +{ + imports = builtins.attrValues (flake.hmModules or { }); } diff --git a/export/hmModules.nix b/export/hmModules.nix index ff37dd1..22a47bf 100644 --- a/export/hmModules.nix +++ b/export/hmModules.nix @@ -1,4 +1,8 @@ -flake: { ... }@inputs: { ... }@imports: let +flake: +{ ... }@inputs: +{ ... }@imports: +let module' = name: imports: builtins.trace "user module: ${name}" { inherit imports; }; modules = builtins.mapAttrs module' imports."user/module"; -in { default = module' "default" (builtins.attrValues modules); } // modules +in +{ default = module' "default" (builtins.attrValues modules); } // modules diff --git a/export/hmProfiles.nix b/export/hmProfiles.nix index 192bda7..0ce4160 100644 --- a/export/hmProfiles.nix +++ b/export/hmProfiles.nix @@ -1,4 +1,7 @@ -{ ... }@flake: { ... }@inputs: { profile, ... }@imports: let +{ ... }@flake: +{ ... }@inputs: +{ profile, ... }@imports: +let profile' = name: snippets: builtins.trace "home-manager: profile: ${name}" { imports = snippets; }; -in builtins.mapAttrs profile' profile - +in +builtins.mapAttrs profile' profile diff --git a/export/iso.nix b/export/iso.nix index 153bd59..68c076d 100644 --- a/export/iso.nix +++ b/export/iso.nix @@ -1,32 +1,50 @@ -{ nixosUsers ? {}, nixosGroups ? {}, nixosModules, hmModules ? { default = {}; }, ...}@flake: { ... }@inputs: { host, ... }@imports: let - host' = name: snippets: let +{ + nixosUsers ? { }, + nixosGroups ? { }, + nixosModules, + hmModules ? { + default = { }; + }, + ... +}@flake: +{ ... }@inputs: +{ host, ... }@imports: +let + host' = + name: snippets: + let - overlay = self: super: { - makeModulesClosure = x: super.makeModulesClosure (x // { allowMissing = true; }); - }; - - common = { modulesPath, lib, ... }: { - config.nixpkgs.overlays = [ overlay ]; - config.networking.hostName = lib.mkForce name; - config.home-manager = { - sharedModules = [ hmModules.default ] ; + overlay = self: super: { + makeModulesClosure = x: super.makeModulesClosure (x // { allowMissing = true; }); }; - imports = [ - (modulesPath + "/installer/cd-dvd/installation-cd-minimal-new-kernel-no-zfs.nix") - nixosModules.default - inputs.home-manager.nixosModules.default - ]; - }; + common = + { modulesPath, lib, ... }: + { + config.nixpkgs.overlays = [ overlay ]; + config.networking.hostName = lib.mkForce name; + config.home-manager = { + sharedModules = [ hmModules.default ]; + }; - system = inputs.nixpkgs.lib.nixosSystem { - specialArgs = { inherit inputs flake; }; - modules = [ common ] + imports = [ + (modulesPath + "/installer/cd-dvd/installation-cd-minimal-new-kernel-no-zfs.nix") + nixosModules.default + inputs.home-manager.nixosModules.default + ]; + }; + + system = inputs.nixpkgs.lib.nixosSystem { + specialArgs = { inherit inputs flake; }; + modules = [ + common + ] ++ snippets ++ builtins.attrValues nixosUsers - ++ builtins.attrValues nixosGroups - ; - }; - in system.config.system.build.isoImage; + ++ builtins.attrValues nixosGroups; + }; + in + system.config.system.build.isoImage; -in builtins.mapAttrs host' host +in +builtins.mapAttrs host' host diff --git a/export/nixosConfigurations.nix b/export/nixosConfigurations.nix index e712097..70f9e2c 100644 --- a/export/nixosConfigurations.nix +++ b/export/nixosConfigurations.nix @@ -1,19 +1,45 @@ -{ nixosUsers ? {}, nixosGroups ? {}, nixosModules, hmModules ? { default = {}; }, ...}@flake: { ... }@inputs: { host, ... }@imports: let - host' = name: snippets: let - system = { namespace?"fbs42", nixpkgs?"nixpkgs" }: inputs.${nixpkgs}.lib.nixosSystem { - specialArgs = { inherit inputs flake namespace; }; - modules = builtins.concatLists (map (base: builtins.attrValues (flake.lib.scan { base = "${base}/host/${name}"; })) flake.lib.schema.base) - ++ [ { config.networking.hostName = name; } ] - ++ [ nixosModules.default ] - ++ [ inputs.home-manager.nixosModules.default ] - ++ [ { config.home-manager.sharedModules = [ hmModules.default ]; } ] - ++ [ { config.home-manager.extraSpecialArgs = { inherit flake namespace; }; } ] - ++ builtins.attrValues nixosUsers - ++ builtins.attrValues nixosGroups - ; - }; +{ + nixosUsers ? { }, + nixosGroups ? { }, + nixosModules, + hmModules ? { + default = { }; + }, + ... +}@flake: +{ ... }@inputs: +{ host, ... }@imports: +let + host' = + name: snippets: + let + system = + { + namespace ? "fbs42", + nixpkgs ? "nixpkgs", + }: + inputs.${nixpkgs}.lib.nixosSystem { + specialArgs = { inherit inputs flake namespace; }; + modules = + builtins.concatLists ( + map ( + base: builtins.attrValues (flake.lib.scan { base = "${base}/host/${name}"; }) + ) flake.lib.schema.base + ) + ++ [ { config.networking.hostName = name; } ] + ++ [ nixosModules.default ] + ++ [ inputs.home-manager.nixosModules.default ] + ++ [ { config.home-manager.sharedModules = [ hmModules.default ]; } ] + ++ [ { config.home-manager.extraSpecialArgs = { inherit flake namespace; }; } ] + ++ builtins.attrValues nixosUsers + ++ builtins.attrValues nixosGroups; + }; - cfg = assert builtins.length snippets == 1; builtins.head snippets; - in system cfg; + cfg = + assert builtins.length snippets == 1; + builtins.head snippets; + in + system cfg; -in builtins.mapAttrs host' host +in +builtins.mapAttrs host' host diff --git a/export/nixosGroup.nix b/export/nixosGroup.nix index 159b8c1..5deaea2 100644 --- a/export/nixosGroup.nix +++ b/export/nixosGroup.nix @@ -1,10 +1,25 @@ -flake: { ... }@inputs: { group, ... }@imports: let - group' = name: snippets: { pkgs, lib, options, config, ... }@args: let - invoke = x: if builtins.isFunction x then x args else x; - in { - options.fbs42.group.${name} = lib.mkEnableOption name; - config.users.groups.${name} = lib.mkIf - (config.fbs42.group.${name} || builtins.any (usr: usr.group == name) (builtins.attrValues config.users.users)) - (lib.mkMerge (map invoke snippets)); - }; -in builtins.mapAttrs group' group +flake: +{ ... }@inputs: +{ group, ... }@imports: +let + group' = + name: snippets: + { + pkgs, + lib, + options, + config, + ... + }@args: + let + invoke = x: if builtins.isFunction x then x args else x; + in + { + options.fbs42.group.${name} = lib.mkEnableOption name; + config.users.groups.${name} = lib.mkIf ( + config.fbs42.group.${name} + || builtins.any (usr: usr.group == name) (builtins.attrValues config.users.users) + ) (lib.mkMerge (map invoke snippets)); + }; +in +builtins.mapAttrs group' group diff --git a/export/nixosModules.nix b/export/nixosModules.nix index c5dae22..e91361c 100644 --- a/export/nixosModules.nix +++ b/export/nixosModules.nix @@ -1,3 +1,14 @@ -flake: { ... }@inputs: { module, ... }@imports: let - modules = builtins.mapAttrs (name: imports: builtins.trace "module: ${name}" { inherit imports; }) module; -in { default = { imports = builtins.attrValues modules; }; } // modules +flake: +{ ... }@inputs: +{ module, ... }@imports: +let + modules = builtins.mapAttrs ( + name: imports: builtins.trace "module: ${name}" { inherit imports; } + ) module; +in +{ + default = { + imports = builtins.attrValues modules; + }; +} +// modules diff --git a/export/nixosProfiles.nix b/export/nixosProfiles.nix index 1655190..8b22fd4 100644 --- a/export/nixosProfiles.nix +++ b/export/nixosProfiles.nix @@ -1,2 +1,4 @@ -{ ... }@flake: { ... }@inputs: { profile, ... }@imports: - builtins.mapAttrs (name: imports: builtins.trace "profile: ${name}" { inherit imports; }) profile +{ ... }@flake: +{ ... }@inputs: +{ profile, ... }@imports: +builtins.mapAttrs (name: imports: builtins.trace "profile: ${name}" { inherit imports; }) profile diff --git a/export/nixosUsers.nix b/export/nixosUsers.nix index f0ff763..ca13dbd 100644 --- a/export/nixosUsers.nix +++ b/export/nixosUsers.nix @@ -1,5 +1,15 @@ -self: { ... }@inputs: { user, ... }@imports: let - user' = name: snippets: { pkgs, lib, config, ... }@args: +self: +{ ... }@inputs: +{ user, ... }@imports: +let + user' = + name: snippets: + { + pkgs, + lib, + config, + ... + }@args: builtins.trace "user: ${name}" { options.fbs42.user.${name} = lib.mkEnableOption name; ## no longer with nixos-24.11 @@ -7,11 +17,15 @@ self: { ... }@inputs: { user, ... }@imports: let # group = lib.mkDefault name; #}; - imports = map ({ user, home-manager}: { - config = lib.mkIf config.fbs42.user.${name} { - users.users.${name} = (user args); - home-manager.users.${name} = home-manager; - }; - }) snippets; + imports = map ( + { user, home-manager }: + { + config = lib.mkIf config.fbs42.user.${name} { + users.users.${name} = (user args); + home-manager.users.${name} = home-manager; + }; + } + ) snippets; }; -in builtins.mapAttrs user' user +in +builtins.mapAttrs user' user diff --git a/export/sdcard-rpi4.nix b/export/sdcard-rpi4.nix index 24a1a9d..8c8359a 100644 --- a/export/sdcard-rpi4.nix +++ b/export/sdcard-rpi4.nix @@ -1,34 +1,52 @@ -{ nixosUsers ? {}, nixosGroups ? {}, nixosModules, hmModules ? { default = {}; }, ...}@flake: { ... }@inputs: { host, ... }@imports: let - host' = name: snippets: let +{ + nixosUsers ? { }, + nixosGroups ? { }, + nixosModules, + hmModules ? { + default = { }; + }, + ... +}@flake: +{ ... }@inputs: +{ host, ... }@imports: +let + host' = + name: snippets: + let - overlay = self: super: { - makeModulesClosure = x: super.makeModulesClosure (x // { allowMissing = true; }); - }; - - common = { modulesPath, lib, ... }: { - config.nixpkgs.overlays = [ overlay ]; - config.networking.hostName = lib.mkForce name; - config.home-manager = { - sharedModules = [ hmModules.default ] ; + overlay = self: super: { + makeModulesClosure = x: super.makeModulesClosure (x // { allowMissing = true; }); }; - imports = [ - #(modulesPath + "/installer/cd-dvd/installation-cd-minimal-new-kernel-no-zfs.nix") - #(modulesPath + "/installer/sd-card/sd-image-aarch64.nix") - (modulesPath + "/installer/sd-card/sd-image-raspberrypi.nix") - nixosModules.default - inputs.home-manager.nixosModules.default - ]; - }; + common = + { modulesPath, lib, ... }: + { + config.nixpkgs.overlays = [ overlay ]; + config.networking.hostName = lib.mkForce name; + config.home-manager = { + sharedModules = [ hmModules.default ]; + }; - system = inputs.nixpkgs.lib.nixosSystem { - specialArgs = { inherit inputs flake; }; - modules = [ common ] + imports = [ + #(modulesPath + "/installer/cd-dvd/installation-cd-minimal-new-kernel-no-zfs.nix") + #(modulesPath + "/installer/sd-card/sd-image-aarch64.nix") + (modulesPath + "/installer/sd-card/sd-image-raspberrypi.nix") + nixosModules.default + inputs.home-manager.nixosModules.default + ]; + }; + + system = inputs.nixpkgs.lib.nixosSystem { + specialArgs = { inherit inputs flake; }; + modules = [ + common + ] ++ snippets ++ builtins.attrValues nixosUsers - ++ builtins.attrValues nixosGroups - ; - }; - in system.config.system.build.sdImage; + ++ builtins.attrValues nixosGroups; + }; + in + system.config.system.build.sdImage; -in builtins.mapAttrs host' host +in +builtins.mapAttrs host' host diff --git a/flake.lock b/flake.lock index b70a3c3..71dbc34 100644 --- a/flake.lock +++ b/flake.lock @@ -22,32 +22,32 @@ ] }, "locked": { - "lastModified": 1747688870, - "narHash": "sha256-ypL9WAZfmJr5V70jEVzqGjjQzF0uCkz+AFQF7n9NmNc=", + "lastModified": 1757808926, + "narHash": "sha256-K6PEI5PYY94TVMH0mX3MbZNYFme7oNRKml/85BpRRAo=", "owner": "nix-community", "repo": "home-manager", - "rev": "d5f1f641b289553927b3801580598d200a501863", + "rev": "f21d9167782c086a33ad53e2311854a8f13c281e", "type": "github" }, "original": { "owner": "nix-community", - "ref": "release-24.11", + "ref": "release-25.05", "repo": "home-manager", "type": "github" } }, "nixpkgs": { "locked": { - "lastModified": 1751274312, - "narHash": "sha256-/bVBlRpECLVzjV19t5KMdMFWSwKLtb5RyXdjz3LJT+g=", + "lastModified": 1757810152, + "narHash": "sha256-Vp9K5ol6h0J90jG7Rm4RWZsCB3x7v5VPx588TQ1dkfs=", "owner": "nixos", "repo": "nixpkgs", - "rev": "50ab793786d9de88ee30ec4e4c24fb4236fc2674", + "rev": "9a094440e02a699be5c57453a092a8baf569bdad", "type": "github" }, "original": { "owner": "nixos", - "ref": "nixos-24.11", + "ref": "nixos-25.05", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index 5f5c238..48864cb 100644 --- a/flake.nix +++ b/flake.nix @@ -1,9 +1,9 @@ { inputs = { - nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11"; + nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05"; hardware.url = "github:nixos/nixos-hardware"; home-manager = { - url = "github:nix-community/home-manager/release-24.11"; + url = "github:nix-community/home-manager/release-25.05"; inputs.nixpkgs.follows = "nixpkgs"; }; }; diff --git a/group/nix.nix b/group/nix.nix index 0967ef4..ffcd441 100644 --- a/group/nix.nix +++ b/group/nix.nix @@ -1 +1 @@ -{} +{ } diff --git a/import/user.nix b/import/user.nix index 0e5562d..dd76452 100644 --- a/import/user.nix +++ b/import/user.nix @@ -1,21 +1,34 @@ let - function = name: value: let - result = if builtins.isAttrs value then {...}: value else value; - result' = builtins.trace "result ${name}=${builtins.typeOf result}" result; - in + function = + name: value: + let + result = if builtins.isAttrs value then { ... }: value else value; + result' = builtins.trace "result ${name}=${builtins.typeOf result}" result; + in assert builtins.isFunction result'; result; - config = { user?{}, home-manager?{} }@set: + config = + { + user ? { }, + home-manager ? { }, + }@set: builtins.mapAttrs function { inherit user home-manager; }; -in name: value: let - result = if builtins.isFunction value - then - config { user = value; } - else if builtins.any (attr: builtins.hasAttr attr value) [ "user" "home-manager" ] - then - config value - else - config { user = value; }; -in result +in +name: value: +let + result = + if builtins.isFunction value then + config { user = value; } + else if + builtins.any (attr: builtins.hasAttr attr value) [ + "user" + "home-manager" + ] + then + config value + else + config { user = value; }; +in +result diff --git a/import/user/profile.nix b/import/user/profile.nix index db2953a..bdf2229 100644 --- a/import/user/profile.nix +++ b/import/user/profile.nix @@ -1,2 +1 @@ name: profile: profile - diff --git a/lib/flake.nix b/lib/flake.nix index 4655a5d..d607d90 100644 --- a/lib/flake.nix +++ b/lib/flake.nix @@ -1,34 +1,81 @@ let scan = import ./scan.nix; - flake' = self: { imports, exports , base }@schema: { ... }@inputs: { ... }@imports: let - lib = { - inherit scan schema inputs imports; - extend = flake schema inputs imports; - new = flake {} {} {}; - # TODO: override - }; - convert = attr: value: value self inputs imports; + flake' = + self: + { + imports, + exports, + base, + }@schema: + { ... }@inputs: + { ... }@imports: + let + lib = { + inherit + scan + schema + inputs + imports + ; + extend = flake schema inputs imports; + new = flake { } { } { }; + # TODO: override + }; + convert = attr: value: value self inputs imports; - result = (builtins.mapAttrs convert schema.exports); - in result // { lib = lib // (result.lib or {}); }; - - flake = { imports?{}, exports?{}, base?[] }@schema'old: { ... }@inputs'old: { ... }@imports'old: { ... }@inputs'new: base: let - schema = { - imports = (schema'old.imports or {}) // scan { base = base + "/import"; recursive = true; }; - exports = (schema'old.exports or {}) // scan { base = base + "/export"; }; - base = [ base ] ++ (schema'old.base or []); + result = (builtins.mapAttrs convert schema.exports); + in + { + formatter = builtins.mapAttrs (_: pkgs: pkgs.nixfmt-tree) inputs.nixpkgs.legacyPackages; + } + // result + // { + lib = lib // (result.lib or { }); }; - merge = attr: let - old = imports'old.${attr} or {}; - new = imports'new.${attr} or {}; - in builtins.mapAttrs (attr: _: (old.${attr} or []) ++ (new.${attr} or [])) (old//new); + flake = + { + imports ? { }, + exports ? { }, + base ? [ ], + }@schema'old: + { ... }@inputs'old: + { ... }@imports'old: + { ... }@inputs'new: + base: + let + schema = { + imports = + (schema'old.imports or { }) + // scan { + base = base + "/import"; + recursive = true; + }; + exports = (schema'old.exports or { }) // scan { base = base + "/export"; }; + base = [ base ] ++ (schema'old.base or [ ]); + }; - imports'new = builtins.mapAttrs (name: value: scan { base = base + "/${name}"; convert = name: content: [ (value name content) ]; }) schema.imports; - result = flake' result schema - (inputs'old // (builtins.removeAttrs inputs'new ["self"])) - (builtins.mapAttrs (attr: _: merge attr) schema.imports); - in result; + merge = + attr: + let + old = imports'old.${attr} or { }; + new = imports'new.${attr} or { }; + in + builtins.mapAttrs (attr: _: (old.${attr} or [ ]) ++ (new.${attr} or [ ])) (old // new); -in flake {} {} {} + imports'new = builtins.mapAttrs ( + name: value: + scan { + base = base + "/${name}"; + convert = name: content: [ (value name content) ]; + } + ) schema.imports; + result = flake' result schema (inputs'old // (builtins.removeAttrs inputs'new [ "self" ])) ( + builtins.mapAttrs (attr: _: merge attr) schema.imports + ); + in + result; + +in +flake { } { } { } diff --git a/lib/host.nix b/lib/host.nix deleted file mode 100644 index b387ebc..0000000 --- a/lib/host.nix +++ /dev/null @@ -1 +0,0 @@ -self: diff --git a/lib/scan.nix b/lib/scan.nix index d664df9..dfb9eb1 100644 --- a/lib/scan.nix +++ b/lib/scan.nix @@ -1,23 +1,42 @@ -{ base, convert ? name: value: value, recursive ? false }: +{ + base, + convert ? name: value: value, + recursive ? false, +}: let - scan = sub: let - all = builtins.readDir (base + "/${builtins.concatStringsSep "/" sub}"); - names = filter: builtins.filter filter (builtins.attrNames all); - nix = name: all.${name} == "regular" && builtins.stringLength name > 4 && builtins.substring (builtins.stringLength name - 4) 4 name == ".nix"; - dir = name: all.${name} == "directory"; - files = map (name: sub ++ [ (builtins.substring 0 (builtins.stringLength name - 4) name) ]) (names nix); - dirs = builtins.concatLists (map (name: scan (sub ++ [name])) (names dir)); - in if recursive then files ++ dirs else files; + scan = + sub: + let + all = builtins.readDir (base + "/${builtins.concatStringsSep "/" sub}"); + names = filter: builtins.filter filter (builtins.attrNames all); + nix = + name: + all.${name} == "regular" + && builtins.stringLength name > 4 + && builtins.substring (builtins.stringLength name - 4) 4 name == ".nix"; + dir = name: all.${name} == "directory"; + files = map (name: sub ++ [ (builtins.substring 0 (builtins.stringLength name - 4) name) ]) ( + names nix + ); + dirs = builtins.concatLists (map (name: scan (sub ++ [ name ])) (names dir)); + in + if recursive then files ++ dirs else files; - root = scan []; + root = scan [ ]; - item = relative: let - name = builtins.concatStringsSep "/" relative; - absolute = base + "/${name}.nix"; - content = import absolute; - value = convert name content; - in { inherit name value; }; + item = + relative: + let + name = builtins.concatStringsSep "/" relative; + absolute = base + "/${name}.nix"; + content = import absolute; + value = convert name content; + in + { + inherit name value; + }; items = map item root; -in if builtins.pathExists base then builtins.listToAttrs (map item root) else {} +in +if builtins.pathExists base then builtins.listToAttrs (map item root) else { } diff --git a/user/root.nix b/user/root.nix index 0967ef4..ffcd441 100644 --- a/user/root.nix +++ b/user/root.nix @@ -1 +1 @@ -{} +{ }