overrideDerivation
lib.overrideDerivation
overrideDerivation drv f
takes a derivation (i.e., the result
of a call to the builtin function derivation
) and returns a new
derivation in which the attributes of the original are overridden
according to the function f
. The function f
is called with
the original derivation attributes.
overrideDerivation
allows certain "ad-hoc" customisation
scenarios (e.g. in ~/.config/nixpkgs/config.nix). For instance,
if you want to "patch" the derivation returned by a package
function in Nixpkgs to build another version than what the
function itself provides.
For another application, see build-support/vm, where this function is used to build arbitrary derivations inside a QEMU virtual machine.
Note that in order to preserve evaluation errors, the new derivation's outPath depends on the old one's, which means that this function cannot be used in circular situations when the old derivation also depends on the new one.
You should in general prefer drv.overrideAttrs
over this function;
see the nixpkgs manual for more information on overriding.
Inputs
drv
-
1. Function argument
f
-
2. Function argument
Type
overrideDerivation :: Derivation -> ( Derivation -> AttrSet ) -> Derivation
Examples
lib.customisation.overrideDerivation
usage example
mySed = overrideDerivation pkgs.gnused (oldAttrs: {
name = "sed-4.2.2-pre";
src = fetchurl {
url = ftp://alpha.gnu.org/gnu/sed/sed-4.2.2-pre.tar.bz2;
hash = "sha256-MxBJRcM2rYzQYwJ5XKxhXTQByvSg5jZc5cSHEZoB2IY=";
};
patches = [];
});
Noogle detected
Implementation
The following is the current implementation of this function.
overrideDerivation =
drv: f:
let
newDrv = derivation (drv.drvAttrs // (f drv));
in
flip (extendDerivation (seq drv.drvPath true)) newDrv (
{
meta = drv.meta or { };
passthru = if drv ? passthru then drv.passthru else { };
}
// (drv.passthru or { })
// optionalAttrs (drv ? __spliced) {
__spliced = { } // (mapAttrs (_: sDrv: overrideDerivation sDrv f) drv.__spliced);
}
);