summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--lib/customisation.nix9
-rw-r--r--pkgs/top-level/splice.nix4
2 files changed, 13 insertions, 0 deletions
diff --git a/lib/customisation.nix b/lib/customisation.nix
index 124e8596f49..66260c8a486 100644
--- a/lib/customisation.nix
+++ b/lib/customisation.nix
@@ -183,6 +183,15 @@ rec {
       auto = builtins.intersectAttrs (builtins.functionArgs f) autoArgs;
     in makeOverridable f (auto // args);
 
+  # Like `callPackageWith`, but provides the function with the `self`
+  # argument. `fn` is called with the new `self` whenever an override
+  # or extension is added.
+  callPackageWithSelfWith = autoArgs: fn: args:
+    let
+      f = if builtins.isFunction fn then fn else import fn;
+      auto = builtins.intersectAttrs (builtins.functionArgs f) autoArgs;
+    in makeOverridableWithSelf f (auto // args);
+
 
   /* Like callPackage, but for a function that returns an attribute
      set of derivations. The override function is added to the
diff --git a/pkgs/top-level/splice.nix b/pkgs/top-level/splice.nix
index 43951100de3..329a83e5a31 100644
--- a/pkgs/top-level/splice.nix
+++ b/pkgs/top-level/splice.nix
@@ -79,7 +79,11 @@ in
   # `newScope' for sets of packages in `pkgs' (see e.g. `gnome' below).
   callPackage = pkgs.newScope {};
 
+  callPackageWithSelf = pkgs.newScopeWithSelf {};
+
   callPackages = lib.callPackagesWith splicedPackages;
 
   newScope = extra: lib.callPackageWith (splicedPackages // extra);
+
+  newScopeWithSelf = extra: lib.callPackageWithSelfWith (splicedPackages // extra);
 }