lib/customization: propagate function arguments in callPackagesWith
makeOverridable is very careful to ensure the arguments to the overridden function are the same as the input function. As a result, the arguments of hello.override are exactly the same as the original arguments of the hello function that produced the derivation. However, callPackagesWith calls makeOverridable with a lambda that does not propagate the arguments. The override function for a package instantiated with callPackagesWith will not have the original arguments. For example: nix-repl> lib.functionArgs hello.override { callPackage = false; fetchurl = false; hello = false; lib = false; nixos = false; stdenv = false; testers = false; } nix-repl> lib.functionArgs openssl.override { } By copying the arguments onto the inner lambda before passing it to makeOverridable, we can make callPackage and callPackages behave the same. nix-repl> lib.functionArgs openssl.override { buildPackages = false; coreutils = false; cryptodev = false; enableSSL2 = true; enableSSL3 = true; fetchurl = false; lib = false; perl = false; removeReferencesTo = false; static = true; stdenv = false; withCryptodev = true; withPerl = true; }
This commit is contained in:
parent
6780926802
commit
741377b300
2 changed files with 20 additions and 1 deletions
|
@ -221,9 +221,10 @@ rec {
|
|||
let
|
||||
f = if isFunction fn then fn else import fn;
|
||||
auto = intersectAttrs (functionArgs f) autoArgs;
|
||||
mirrorArgs = mirrorFunctionArgs f;
|
||||
origArgs = auto // args;
|
||||
pkgs = f origArgs;
|
||||
mkAttrOverridable = name: _: makeOverridable (newArgs: (f newArgs).${name}) origArgs;
|
||||
mkAttrOverridable = name: _: makeOverridable (mirrorArgs (newArgs: (f newArgs).${name})) origArgs;
|
||||
in
|
||||
if isDerivation pkgs then throw
|
||||
("function `callPackages` was called on a *single* derivation "
|
||||
|
|
|
@ -55,6 +55,24 @@ runTests {
|
|||
expected = { a = false; b = false; c = true; };
|
||||
};
|
||||
|
||||
testCallPackageWithOverridePreservesArguments =
|
||||
let
|
||||
f = { a ? 0, b }: {};
|
||||
f' = callPackageWith { a = 1; b = 2; } f {};
|
||||
in {
|
||||
expr = functionArgs f'.override;
|
||||
expected = functionArgs f;
|
||||
};
|
||||
|
||||
testCallPackagesWithOverridePreservesArguments =
|
||||
let
|
||||
f = { a ? 0, b }: { nested = {}; };
|
||||
f' = callPackagesWith { a = 1; b = 2; } f {};
|
||||
in {
|
||||
expr = functionArgs f'.nested.override;
|
||||
expected = functionArgs f;
|
||||
};
|
||||
|
||||
# TRIVIAL
|
||||
|
||||
testId = {
|
||||
|
|
Loading…
Reference in a new issue