From b89b6b2a7b397a087149f01a9fd27876edfc6986 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 28 Jul 2015 21:35:17 +0200 Subject: [PATCH] Add function callPackagesWith This is like callPackageWith, except that it expects the supplied function to return a *set* of packages. It will then make the individual packages overridable. --- lib/customisation.nix | 22 ++++++++++++++++++++-- pkgs/top-level/all-packages.nix | 2 ++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/lib/customisation.nix b/lib/customisation.nix index b3c73c39be4..eaec46276b2 100644 --- a/lib/customisation.nix +++ b/lib/customisation.nix @@ -1,6 +1,8 @@ let + lib = import ./default.nix; inherit (builtins) attrNames isFunction; + in rec { @@ -90,12 +92,28 @@ rec { */ callPackageWith = autoArgs: fn: args: let - f = if builtins.isFunction fn then fn else import fn; + f = if builtins.isFunction fn then fn else import fn; auto = builtins.intersectAttrs (builtins.functionArgs f) autoArgs; in makeOverridable f (auto // args); - /* Add attributes to each output of a derivation without changing the derivation itself */ + /* Like callPackage, but for a function that returns an attribute + set of derivations. The override function is added to the + individual attributes. */ + callPackagesWith = autoArgs: fn: args: + let + f = if builtins.isFunction fn then fn else import fn; + auto = builtins.intersectAttrs (builtins.functionArgs f) autoArgs; + finalArgs = auto // args; + pkgs = f finalArgs; + mkAttrOverridable = name: pkg: pkg // { + override = newArgs: mkAttrOverridable name (f (finalArgs // newArgs)).${name}; + }; + in lib.mapAttrs mkAttrOverridable pkgs; + + + /* Add attributes to each output of a derivation without changing + the derivation itself. */ addPassthru = drv: passthru: let outputs = drv.outputs or [ "out" ]; diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index b8a389aa70f..db99800a8da 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -141,6 +141,8 @@ let # below). callPackage = newScope {}; + callPackages = lib.callPackagesWith defaultScope; + newScope = extra: lib.callPackageWith (defaultScope // extra); # Easily override this package set.