summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--pkgs/lib/options.nix21
1 files changed, 18 insertions, 3 deletions
diff --git a/pkgs/lib/options.nix b/pkgs/lib/options.nix
index 713c8f0b372d..bd42b1dcf34e 100644
--- a/pkgs/lib/options.nix
+++ b/pkgs/lib/options.nix
@@ -146,6 +146,7 @@ rec {
   || builtins.isList x
   );
 
+
   # Evaluate a list of option sets that would be merged with the
   # function "merge" which expects two arguments.  The attribute named
   # "require" is used to imports option declarations and bindings.
@@ -192,13 +193,27 @@ rec {
             cfg3 = noImportConditions cfg2;
         in cfg3;
 
-      getRequire = x:
-        toList (getAttr ["require"] [] (preprocess x));
+      getRequire = x: toList (getAttr ["require"] [] (preprocess x));
+      getRecusiveRequire = x:
+        fold (cfg: l:
+          if isPath cfg then
+            [ cfg ] ++ l
+          else
+            [ cfg ] ++ (getRecusiveRequire cfg) ++ l
+        ) [] (getRequire x);
+
+      getRequireSets = x: filter (x: ! isPath x) (getRecusiveRequire x);
+      getRequirePaths = x: filter isPath (getRecusiveRequire x);
       rmRequire = x: removeAttrs (preprocess x) ["require"];
+
+      inlineRequiredSets = cfgs:
+        fold (cfg: l: [ cfg ] ++ (getRequireSets cfg) ++ l) [] cfgs;
     in
       merge "" (
         map rmRequire (
-          lib.uniqFlatten getRequire [] [] (toList opts)
+          inlineRequiredSets (
+            lib.uniqFlatten getRequirePaths [] [] (toList opts)
+          )
         )
       );