Make mkFlake extensible with additional modules

This is intended to allow flakes implementing a flakelight module to
export a mkFlake that automatically includes its module.
This commit is contained in:
Archit Gupta 2023-09-13 22:39:20 -07:00
parent 62083df539
commit 53f35dc91c

View File

@ -6,7 +6,7 @@ nixpkgs:
let let
inherit (builtins) isAttrs isPath readDir; inherit (builtins) isAttrs isPath readDir;
inherit (nixpkgs.lib) attrNames composeManyExtensions inherit (nixpkgs.lib) attrNames composeManyExtensions
filter findFirst genAttrs getValues hasSuffix isFunction isList filter findFirst fix genAttrs getValues hasSuffix isFunction isList
mapAttrsToList pathExists pipe removePrefix removeSuffix evalModules mapAttrsToList pathExists pipe removePrefix removeSuffix evalModules
mkDefault mkOptionType singleton; mkDefault mkOptionType singleton;
inherit (nixpkgs.lib.types) coercedTo functionTo listOf; inherit (nixpkgs.lib.types) coercedTo functionTo listOf;
@ -14,14 +14,23 @@ let
builtinModules = mapAttrsToList (k: _: ./builtinModules + ("/" + k)) builtinModules = mapAttrsToList (k: _: ./builtinModules + ("/" + k))
(readDir ./builtinModules); (readDir ./builtinModules);
mkFlake = src: root: (evalModules { mkFlake = {
specialArgs.modulesPath = ./builtinModules; __functor = self: src: root: (evalModules {
modules = builtinModules ++ [ specialArgs.modulesPath = ./builtinModules;
{ inputs.nixpkgs = mkDefault nixpkgs; } modules = builtinModules ++ self.extraModules ++ [
{ _module.args = { inherit src flakelight; }; } { inputs.nixpkgs = mkDefault nixpkgs; }
root { _module.args = { inherit src flakelight; }; }
]; root
}).config.outputs; ];
}).config.outputs;
# Attributes to allow module flakes to extend mkFlake
extraModules = [ ];
extend = (fix (extend': mkFlake': modules: fix (self: mkFlake' // {
extraModules = mkFlake'.extraModules ++ modules;
extend = extend' self;
}))) mkFlake;
};
flakelight = { flakelight = {
inherit mkFlake supportedSystem autoImport autoImportArgs; inherit mkFlake supportedSystem autoImport autoImportArgs;