summary refs log tree commit diff
path: root/lib/modules.nix
diff options
context:
space:
mode:
Diffstat (limited to 'lib/modules.nix')
-rw-r--r--lib/modules.nix27
1 files changed, 22 insertions, 5 deletions
diff --git a/lib/modules.nix b/lib/modules.nix
index 46ae3f13631..c25972999df 100644
--- a/lib/modules.nix
+++ b/lib/modules.nix
@@ -60,7 +60,8 @@ rec {
      it is to transparently move a set of modules to be a submodule of another
      config (as the proper arguments need to be replicated at each call to
      evalModules) and the less declarative the module set is. */
-  evalModules = { modules
+  evalModules = evalModulesArgs@
+                { modules
                 , prefix ? []
                 , # This should only be used for special arguments that need to be evaluated
                   # when resolving module structure (like in imports). For everything else,
@@ -183,10 +184,26 @@ rec {
             else throw baseMsg
         else null;
 
-      result = builtins.seq checkUnmatched {
-        inherit options;
-        config = removeAttrs config [ "_module" ];
-        inherit (config) _module;
+      checked = builtins.seq checkUnmatched;
+
+      result = {
+        options = checked options;
+        config = checked (removeAttrs config [ "_module" ]);
+        _module = checked (config._module);
+
+        extendModules = extendArgs@{
+          modules ? [],
+          specialArgs ? {},
+          prefix ? [],
+          }:
+            evalModules (evalModulesArgs // {
+              modules = evalModulesArgs.modules ++ modules;
+              specialArgs = evalModulesArgs.specialArgs or {} // specialArgs;
+              prefix = extendArgs.prefix or evalModulesArgs.prefix;
+            });
+        type = lib.types.submoduleWith {
+          inherit modules specialArgs;
+        };
       };
     in result;