diff --git a/lib/build-clan/default.nix b/lib/build-clan/default.nix new file mode 100644 index 00000000..888eb6b2 --- /dev/null +++ b/lib/build-clan/default.nix @@ -0,0 +1,28 @@ +{ nixpkgs, clan, lib }: +{ directory # The directory containing the machines subdirectory +, specialArgs ? { } # Extra arguments to pass to nixosSystem i.e. useful to make self available +, machines ? { } # allows to include machine-specific modules i.e. machines.${name} = { ... } +}: +let + machinesDirs = + if builtins.pathExists (directory + /machines) + then builtins.readDir (directory + /machines) + else { }; + + machineSettings = machineName: + if builtins.pathExists (directory + /machines/${machineName}/settings.json) + then builtins.fromJSON (builtins.readFile (directory + /machines/${machineName}/settings.json)) + else { }; + + nixosConfigurations = lib.mapAttrs + (name: _mod: + nixpkgs.lib.nixosSystem { + modules = [ + (machineSettings name) + (machines.${name} or { }) + ] ++ lib.attrValues clan.clanModules; + specialArgs = specialArgs; + }) + machinesDirs; +in +nixosConfigurations diff --git a/lib/default.nix b/lib/default.nix index 855c3d75..89ac0cc3 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -1,4 +1,4 @@ -{ lib, ... }: +{ lib, clan, nixpkgs, ... }: { findNixFiles = folder: lib.mapAttrs' @@ -13,4 +13,6 @@ (builtins.readDir folder); jsonschema = import ./jsonschema { inherit lib; }; + + buildClan = import ./build-clan { inherit lib clan nixpkgs; }; } diff --git a/lib/flake-module.nix b/lib/flake-module.nix index 2738bef8..48c682e2 100644 --- a/lib/flake-module.nix +++ b/lib/flake-module.nix @@ -1,8 +1,12 @@ { lib +, inputs , ... }: { imports = [ ./jsonschema/flake-module.nix ]; - flake.lib = import ./default.nix { inherit lib; }; + flake.lib = import ./default.nix { + inherit lib; + inherit (inputs) clan nixpkgs; + }; } diff --git a/templates/new-clan/clan-flake-module.nix b/templates/new-clan/clan-flake-module.nix deleted file mode 100644 index 9c862852..00000000 --- a/templates/new-clan/clan-flake-module.nix +++ /dev/null @@ -1,46 +0,0 @@ -# AUTOMATICALLY GENERATED by clan -# TODO: move this code to a flakeModule in clan-core and import it via flake input -{ self, lib, inputs, ... }: -let - evalConfig = import (self.inputs.nixpkgs + /lib/eval-config.nix); - - evalMachine = machineModule: evalConfig { - modules = [ machineModule ]; - }; - - machinesDirs = - if builtins.pathExists ./machines - then builtins.readDir ./machines - else { }; - - machineSettings = machineName: - if builtins.pathExists ./machines/${machineName}/settings.json - then (builtins.fromJSON (builtins.readFile ./machines/${machineName}/settings.json)) - else { }; - - # load all clan modules by default - machineModule = machineName: { - imports = - (lib.attrValues inputs.clan.clanModules) - ++ [ (machineSettings machineName) ]; - }; - - # autoamtically generate machine modules for all directories under ./machines - machineModulesGenerated = - lib.flip lib.mapAttrs' machinesDirs (name: _: { - name = "machine-${name}"; - value = machineModule name; - }); - - # re-read the machine modules from the flake outputs, to allow amchines being - # defined by custom mechanisms - machineModules = - lib.filterAttrs (name: _: lib.hasPrefix "machine-" name) self.nixosModules; - -in -{ - flake.nixosModules = machineModulesGenerated; - # generate nixosConfigurations for all machines under self.nixosModules.machines-{machine_name} - flake.nixosConfigurations = - lib.mapAttrs (_: mod: evalMachine mod) machineModules; -} diff --git a/templates/new-clan/flake.nix b/templates/new-clan/flake.nix index c9fa8272..c710d9ef 100644 --- a/templates/new-clan/flake.nix +++ b/templates/new-clan/flake.nix @@ -1,16 +1,11 @@ { description = ""; - inputs = { - clan-core.url = "git+https://git.clan.lol/clan/clan-core"; - flake-parts.url = "github:hercules-ci/flake-parts"; - }; + inputs.clan-core.url = "git+https://git.clan.lol/clan/clan-core"; - outputs = inputs @ { flake-parts, ... }: - flake-parts.lib.mkFlake { inherit inputs; } { - systems = [ "x86_64-linux" ]; - imports = [ - ./clan-flake-module.nix - ]; + outputs = { clan-core, ... }: { + nixosConfigurations = clan-core.lib.buildClan { + directory = ./.; }; + }; } diff --git a/templates/new-clan/systems.json b/templates/new-clan/systems.json deleted file mode 100644 index 4db535b9..00000000 --- a/templates/new-clan/systems.json +++ /dev/null @@ -1 +0,0 @@ -["x86_64-linux"]