about summary refs log tree commit diff
path: root/pkgs/lib/call-package-scope.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/lib/call-package-scope.nix')
-rw-r--r--pkgs/lib/call-package-scope.nix25
1 files changed, 25 insertions, 0 deletions
diff --git a/pkgs/lib/call-package-scope.nix b/pkgs/lib/call-package-scope.nix
new file mode 100644
index 00000000..75c19faf
--- /dev/null
+++ b/pkgs/lib/call-package-scope.nix
@@ -0,0 +1,25 @@
+{ pkgs, pkgsi686Linux }:
+
+fn: let
+  inherit (builtins) isFunction intersectAttrs functionArgs;
+
+  f = if isFunction fn then fn else import fn;
+
+  autoArgs = pkgs // {
+    callPackage = pkgs.lib.callPackageWith (pkgs // super);
+    callPackage_i686 = pkgs.lib.callPackageWith (pkgsi686Linux // super);
+  };
+  args = intersectAttrs (functionArgs f) autoArgs;
+
+  mkOverridable = overrideFun: origArgs: let
+    superSet = overrideFun origArgs;
+    overrideWith = newArgs: let
+      overridden = if isFunction newArgs then newArgs origArgs else newArgs;
+    in origArgs // overridden;
+  in superSet // {
+    override = newArgs: mkOverridable overrideFun (overrideWith newArgs);
+  };
+
+  super = mkOverridable f args;
+
+in pkgs.recurseIntoAttrs super