diff --git a/lib/customisation.nix b/lib/customisation.nix index cb3a4b561151f..a7fbbaf0965e1 100644 --- a/lib/customisation.nix +++ b/lib/customisation.nix @@ -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; @@ -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 " diff --git a/lib/default.nix b/lib/default.nix index 0424db36b2e99..c368d70da54c0 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -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 diff --git a/pkgs/development/beam-modules/lib.nix b/pkgs/development/beam-modules/lib.nix index 2d93b28cda6ba..f4eeeb59d5621 100644 --- a/pkgs/development/beam-modules/lib.nix +++ b/pkgs/development/beam-modules/lib.nix @@ -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. @@ -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 @@ -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 @@ -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; }; } diff --git a/pkgs/top-level/splice.nix b/pkgs/top-level/splice.nix index ce536aa1fd2f8..048a173105c44 100644 --- a/pkgs/top-level/splice.nix +++ b/pkgs/top-level/splice.nix @@ -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;