Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 17 additions & 2 deletions lib/customisation.nix
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,12 @@ rec {
};
*/
callPackageWith = autoArgs: fn: args:
__callPackageWith { inherit autoArgs fn args; applyMakeOverridable = true; };

callPackageWithNoMkOverridable = autoArgs: fn: args:
__callPackageWith { inherit autoArgs fn args; applyMakeOverridable = false; };

__callPackageWith = { autoArgs, fn, args, applyMakeOverridable, }:
let
f = if lib.isFunction fn then fn else import fn;
fargs = lib.functionArgs f;
Expand Down Expand Up @@ -176,19 +182,28 @@ rec {
# Only show the error for the first missing argument
error = errorForArg (lib.head missingArgs);

in if missingArgs == [] then makeOverridable f allArgs else throw error;
in if missingArgs == [] then (if applyMakeOverridable then makeOverridable f allArgs else f allArgs) else throw error;


/* 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:
__callPackagesWith { inherit autoArgs fn args; applyMakeOverridable = true; };

callPackagesWithNoMkOverridable = autoArgs: fn: args:
__callPackagesWith { inherit autoArgs fn args; applyMakeOverridable = false; };

/* 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, applyMakeOverridable, }:
let
f = if lib.isFunction fn then fn else import fn;
auto = builtins.intersectAttrs (lib.functionArgs f) autoArgs;
origArgs = auto // args;
pkgs = f origArgs;
mkAttrOverridable = name: _: makeOverridable (newArgs: (f newArgs).${name}) origArgs;
mkAttrOverridable = name: _: if applyMakeOverridable then makeOverridable (newArgs: (f newArgs).${name}) origArgs else (newArgs: (f newArgs).${name}) origArgs;
in
if lib.isDerivation pkgs then throw
("function `callPackages` was called on a *single* derivation "
Expand Down
1 change: 1 addition & 0 deletions lib/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ let
noDepEntry fullDepEntry packEntry stringAfter;
inherit (self.customisation) overrideDerivation makeOverridable
callPackageWith callPackagesWith extendDerivation hydraJob
callPackageWithNoMkOverridable callPackagesWithNoMkOverridable
makeScope makeScopeWithSplicing;
inherit (self.derivations) lazyDerivation;
inherit (self.meta) addMetaAttrs dontDistribute setName updateName
Expand Down
35 changes: 11 additions & 24 deletions pkgs/development/beam-modules/lib.nix
Original file line number Diff line number Diff line change
@@ -1,19 +1,6 @@
{ __splicedPackages, lib }:
{ callPackageNoMkOverridable, makeOverridable }:

let
pkgs = __splicedPackages;
in
rec {

/* Similar to callPackageWith/callPackage, but without makeOverridable
*/
callPackageWith = autoArgs: fn: args:
let
f = if pkgs.lib.isFunction fn then fn else import fn;
auto = builtins.intersectAttrs (lib.functionArgs f) autoArgs;
in f (auto // args);

callPackage = callPackageWith pkgs;
{

/* Uses generic-builder to evaluate provided drv containing OTP-version
specific data.
Expand All @@ -31,10 +18,10 @@ rec {
*/
callErlang = drv: args:
let
builder = callPackage ../../development/interpreters/erlang/generic-builder.nix args;
builder = callPackageNoMkOverridable ../../development/interpreters/erlang/generic-builder.nix args;
in
callPackage drv {
mkDerivation = pkgs.makeOverridable builder;
callPackageNoMkOverridable drv {
mkDerivation = makeOverridable builder;
};

/* Uses generic-builder to evaluate provided drv containing Elixir version
Expand All @@ -52,10 +39,10 @@ rec {
*/
callElixir = drv: args:
let
builder = callPackage ../interpreters/elixir/generic-builder.nix args;
builder = callPackageNoMkOverridable ../interpreters/elixir/generic-builder.nix args;
in
callPackage drv {
mkDerivation = pkgs.makeOverridable builder;
callPackageNoMkOverridable drv {
mkDerivation = makeOverridable builder;
};

/* Uses generic-builder to evaluate provided drv containing Elixir version
Expand All @@ -73,10 +60,10 @@ rec {
*/
callLFE = drv: args:
let
builder = callPackage ../interpreters/lfe/generic-builder.nix args;
builder = callPackageNoMkOverridable ../interpreters/lfe/generic-builder.nix args;
in
callPackage drv {
mkDerivation = pkgs.makeOverridable builder;
callPackageNoMkOverridable drv {
mkDerivation = makeOverridable builder;
};

}
6 changes: 6 additions & 0 deletions pkgs/top-level/splice.nix
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,12 @@ in

newScope = extra: lib.callPackageWith (splicedPackagesWithXorg // extra);

callPackageNoMkOverridable = pkgs.newScopeNoMkOverridable { };

callPackagesNoMkOverridable = lib.callPackagesWithNoMkOverridable splicedPackagesWithXorg;

newScopeNoMkOverridable = extra: lib.callPackageWithNoMkOverridable (splicedPackagesWithXorg // extra);

# prefill 2 fields of the function for convenience
makeScopeWithSplicing = lib.makeScopeWithSplicing splicePackages pkgs.newScope;

Expand Down