| 
									
										
										
										
											2017-07-28 20:05:35 -04:00
										 |  |  | { lib }: | 
					
						
							| 
									
										
										
										
											2009-11-19 17:30:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | rec { | 
					
						
							| 
									
										
										
										
											2009-11-19 16:43:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* `overrideDerivation drv f' takes a derivation (i.e., the result
 | 
					
						
							|  |  |  |      of a call to the builtin function `derivation') and returns a new | 
					
						
							| 
									
										
										
										
											2017-04-19 14:41:28 -05:00
										 |  |  |      derivation in which the attributes of the original are overridden | 
					
						
							| 
									
										
										
										
											2009-11-19 17:30:21 +00:00
										 |  |  |      according to the function `f'.  The function `f' is called with | 
					
						
							|  |  |  |      the original derivation attributes. | 
					
						
							| 
									
										
										
										
											2009-11-19 16:43:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |      `overrideDerivation' allows certain "ad-hoc" customisation | 
					
						
							| 
									
										
										
										
											2017-02-01 16:03:42 +01:00
										 |  |  |      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, you can do something like this: | 
					
						
							| 
									
										
										
										
											2009-11-19 16:43:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |        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; | 
					
						
							|  |  |  |            sha256 = "11nq06d131y4wmf3drm0yk502d2xc6n5qy82cg88rb9nqd2lj41k"; | 
					
						
							|  |  |  |          }; | 
					
						
							|  |  |  |          patches = []; | 
					
						
							|  |  |  |        }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |      For another application, see build-support/vm, where this | 
					
						
							|  |  |  |      function is used to build arbitrary derivations inside a QEMU | 
					
						
							| 
									
										
										
										
											2015-03-19 15:48:54 +00:00
										 |  |  |      virtual machine. | 
					
						
							|  |  |  |   */ | 
					
						
							| 
									
										
										
										
											2009-11-19 16:43:58 +00:00
										 |  |  |   overrideDerivation = drv: f: | 
					
						
							|  |  |  |     let | 
					
						
							| 
									
										
										
										
											2013-05-15 00:38:03 -04:00
										 |  |  |       newDrv = derivation (drv.drvAttrs // (f drv)); | 
					
						
							| 
									
										
										
										
											2018-01-14 19:53:57 +00:00
										 |  |  |     in lib.flip (extendDerivation true) newDrv ( | 
					
						
							| 
									
										
										
										
											2013-05-15 00:38:03 -04:00
										 |  |  |       { meta = drv.meta or {}; | 
					
						
							| 
									
										
										
										
											2009-11-19 16:43:58 +00:00
										 |  |  |         passthru = if drv ? passthru then drv.passthru else {}; | 
					
						
							| 
									
										
										
										
											2012-01-19 22:29:26 +00:00
										 |  |  |       } | 
					
						
							|  |  |  |       // | 
					
						
							| 
									
										
										
										
											2013-05-15 00:38:03 -04:00
										 |  |  |       (drv.passthru or {}) | 
					
						
							|  |  |  |       // | 
					
						
							| 
									
										
										
										
											2012-12-28 19:08:19 +01:00
										 |  |  |       (if (drv ? crossDrv && drv ? nativeDrv) | 
					
						
							| 
									
										
										
										
											2012-01-19 22:29:26 +00:00
										 |  |  |        then { | 
					
						
							| 
									
										
										
										
											2012-12-28 19:08:19 +01:00
										 |  |  |          crossDrv = overrideDerivation drv.crossDrv f; | 
					
						
							|  |  |  |          nativeDrv = overrideDerivation drv.nativeDrv f; | 
					
						
							| 
									
										
										
										
											2012-01-19 22:29:26 +00:00
										 |  |  |        } | 
					
						
							| 
									
										
										
										
											2013-05-15 00:39:17 -04:00
										 |  |  |        else { })); | 
					
						
							| 
									
										
										
										
											2009-11-19 16:43:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-29 09:11:26 -04:00
										 |  |  |   /* `makeOverridable` takes a function from attribute set to attribute set and
 | 
					
						
							| 
									
										
										
										
											2019-09-02 13:39:40 +02:00
										 |  |  |      injects `override` attribute which can be used to override arguments of | 
					
						
							| 
									
										
										
										
											2017-09-29 09:11:26 -04:00
										 |  |  |      the function. | 
					
						
							| 
									
										
										
										
											2017-06-24 12:42:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |        nix-repl> x = {a, b}: { result = a + b; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        nix-repl> y = lib.makeOverridable x { a = 1; b = 2; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        nix-repl> y | 
					
						
							|  |  |  |        { override = «lambda»; overrideDerivation = «lambda»; result = 3; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        nix-repl> y.override { a = 10; } | 
					
						
							|  |  |  |        { override = «lambda»; overrideDerivation = «lambda»; result = 12; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-29 09:11:26 -04:00
										 |  |  |      Please refer to "Nixpkgs Contributors Guide" section | 
					
						
							|  |  |  |      "<pkg>.overrideDerivation" to learn about `overrideDerivation` and caveats | 
					
						
							|  |  |  |      related to its use. | 
					
						
							| 
									
										
										
										
											2017-06-24 12:42:56 +02:00
										 |  |  |   */ | 
					
						
							| 
									
										
										
										
											2017-09-29 09:11:26 -04:00
										 |  |  |   makeOverridable = f: origArgs: | 
					
						
							| 
									
										
										
										
											2010-08-19 22:52:53 +00:00
										 |  |  |     let | 
					
						
							| 
									
										
										
										
											2019-09-05 00:16:01 +02:00
										 |  |  |       result = f origArgs; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-05 00:13:24 +02:00
										 |  |  |       # Creates a functor with the same arguments as f | 
					
						
							|  |  |  |       copyArgs = g: lib.setFunctionArgs g (lib.functionArgs f); | 
					
						
							| 
									
										
										
										
											2019-09-05 00:16:01 +02:00
										 |  |  |       # Changes the original arguments with (potentially a function that returns) a set of new attributes | 
					
						
							| 
									
										
										
										
											2018-01-31 14:02:19 -05:00
										 |  |  |       overrideWith = newArgs: origArgs // (if lib.isFunction newArgs then newArgs origArgs else newArgs); | 
					
						
							| 
									
										
										
										
											2019-09-05 00:06:22 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       # Re-call the function but with different arguments | 
					
						
							| 
									
										
										
										
											2019-09-05 00:13:24 +02:00
										 |  |  |       overrideArgs = copyArgs (newArgs: makeOverridable f (overrideWith newArgs)); | 
					
						
							| 
									
										
										
										
											2019-09-05 00:12:05 +02:00
										 |  |  |       # Change the result of the function call by applying g to it | 
					
						
							| 
									
										
										
										
											2019-09-05 00:13:24 +02:00
										 |  |  |       overrideResult = g: makeOverridable (copyArgs (args: g (f args))) origArgs; | 
					
						
							| 
									
										
										
										
											2017-09-29 09:11:26 -04:00
										 |  |  |     in | 
					
						
							| 
									
										
										
										
											2019-09-05 00:16:01 +02:00
										 |  |  |       if builtins.isAttrs result then | 
					
						
							|  |  |  |         result // { | 
					
						
							|  |  |  |           override = overrideArgs; | 
					
						
							|  |  |  |           overrideDerivation = fdrv: overrideResult (x: overrideDerivation x fdrv); | 
					
						
							|  |  |  |           ${if result ? overrideAttrs then "overrideAttrs" else null} = fdrv: | 
					
						
							|  |  |  |             overrideResult (x: x.overrideAttrs fdrv); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       else if lib.isFunction result then | 
					
						
							|  |  |  |         # Transform the result into a functor while propagating its arguments | 
					
						
							|  |  |  |         lib.setFunctionArgs result (lib.functionArgs result) // { | 
					
						
							| 
									
										
										
										
											2019-09-05 00:14:22 +02:00
										 |  |  |           override = overrideArgs; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-09-05 00:16:01 +02:00
										 |  |  |       else result; | 
					
						
							| 
									
										
										
										
											2009-11-19 17:30:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-02 13:57:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /* Call the package function in the file `fn' with the required
 | 
					
						
							|  |  |  |     arguments automatically.  The function is called with the | 
					
						
							|  |  |  |     arguments `args', but any missing arguments are obtained from | 
					
						
							|  |  |  |     `autoArgs'.  This function is intended to be partially | 
					
						
							|  |  |  |     parameterised, e.g., | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       callPackage = callPackageWith pkgs; | 
					
						
							|  |  |  |       pkgs = { | 
					
						
							|  |  |  |         libfoo = callPackage ./foo.nix { }; | 
					
						
							|  |  |  |         libbar = callPackage ./bar.nix { }; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     If the `libbar' function expects an argument named `libfoo', it is | 
					
						
							|  |  |  |     automatically passed as an argument.  Overrides or missing | 
					
						
							|  |  |  |     arguments can be supplied in `args', e.g. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       libbar = callPackage ./bar.nix { | 
					
						
							|  |  |  |         libfoo = null; | 
					
						
							|  |  |  |         enableX11 = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |   */ | 
					
						
							|  |  |  |   callPackageWith = autoArgs: fn: args: | 
					
						
							| 
									
										
										
										
											2017-09-29 09:11:26 -04:00
										 |  |  |     let | 
					
						
							| 
									
										
										
										
											2018-01-31 14:02:19 -05:00
										 |  |  |       f = if lib.isFunction fn then fn else import fn; | 
					
						
							|  |  |  |       auto = builtins.intersectAttrs (lib.functionArgs f) autoArgs; | 
					
						
							| 
									
										
										
										
											2017-09-29 09:11:26 -04:00
										 |  |  |     in makeOverridable f (auto // args); | 
					
						
							| 
									
										
										
										
											2010-08-02 13:57:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-20 19:23:55 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-28 21:35:17 +02:00
										 |  |  |   /* 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 | 
					
						
							| 
									
										
										
										
											2018-01-31 14:02:19 -05:00
										 |  |  |       f = if lib.isFunction fn then fn else import fn; | 
					
						
							|  |  |  |       auto = builtins.intersectAttrs (lib.functionArgs f) autoArgs; | 
					
						
							| 
									
										
										
										
											2017-02-12 13:57:42 +00:00
										 |  |  |       origArgs = auto // args; | 
					
						
							|  |  |  |       pkgs = f origArgs; | 
					
						
							| 
									
										
										
										
											2019-02-03 15:30:15 +00:00
										 |  |  |       mkAttrOverridable = name: _: makeOverridable (newArgs: (f newArgs).${name}) origArgs; | 
					
						
							| 
									
										
										
										
											2020-03-04 11:58:03 +01:00
										 |  |  |     in | 
					
						
							|  |  |  |       if lib.isDerivation pkgs then throw | 
					
						
							|  |  |  |         ("function `callPackages` was called on a *single* derivation " | 
					
						
							|  |  |  |           + ''"${pkgs.name or "<unknown-name>"}";'' | 
					
						
							|  |  |  |           + " did you mean to use `callPackage` instead?") | 
					
						
							|  |  |  |       else lib.mapAttrs mkAttrOverridable pkgs; | 
					
						
							| 
									
										
										
										
											2015-07-28 21:35:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* Add attributes to each output of a derivation without changing
 | 
					
						
							| 
									
										
										
										
											2017-12-25 18:06:49 +00:00
										 |  |  |      the derivation itself and check a given condition when evaluating. */ | 
					
						
							|  |  |  |   extendDerivation = condition: passthru: drv: | 
					
						
							| 
									
										
										
										
											2013-03-24 08:29:10 -04:00
										 |  |  |     let | 
					
						
							|  |  |  |       outputs = drv.outputs or [ "out" ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       commonAttrs = drv // (builtins.listToAttrs outputsList) // | 
					
						
							|  |  |  |         ({ all = map (x: x.value) outputsList; }) // passthru; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       outputToAttrListElement = outputName: | 
					
						
							|  |  |  |         { name = outputName; | 
					
						
							|  |  |  |           value = commonAttrs // { | 
					
						
							| 
									
										
										
										
											2017-12-25 18:06:49 +00:00
										 |  |  |             inherit (drv.${outputName}) type outputName; | 
					
						
							|  |  |  |             drvPath = assert condition; drv.${outputName}.drvPath; | 
					
						
							|  |  |  |             outPath = assert condition; drv.${outputName}.outPath; | 
					
						
							| 
									
										
										
										
											2013-03-24 08:29:10 -04:00
										 |  |  |           }; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       outputsList = map outputToAttrListElement outputs; | 
					
						
							| 
									
										
										
										
											2017-12-25 18:06:49 +00:00
										 |  |  |     in commonAttrs // { | 
					
						
							|  |  |  |       outputUnspecified = true; | 
					
						
							|  |  |  |       drvPath = assert condition; drv.drvPath; | 
					
						
							|  |  |  |       outPath = assert condition; drv.outPath; | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2015-03-20 19:23:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /* Strip a derivation of all non-essential attributes, returning
 | 
					
						
							|  |  |  |      only those needed by hydra-eval-jobs. Also strictly evaluate the | 
					
						
							|  |  |  |      result to ensure that there are no thunks kept alive to prevent | 
					
						
							|  |  |  |      garbage collection. */ | 
					
						
							|  |  |  |   hydraJob = drv: | 
					
						
							|  |  |  |     let | 
					
						
							|  |  |  |       outputs = drv.outputs or ["out"]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       commonAttrs = | 
					
						
							|  |  |  |         { inherit (drv) name system meta; inherit outputs; } | 
					
						
							|  |  |  |         // lib.optionalAttrs (drv._hydraAggregate or false) { | 
					
						
							|  |  |  |           _hydraAggregate = true; | 
					
						
							|  |  |  |           constituents = map hydraJob (lib.flatten drv.constituents); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         // (lib.listToAttrs outputsList); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       makeOutput = outputName: | 
					
						
							|  |  |  |         let output = drv.${outputName}; in | 
					
						
							|  |  |  |         { name = outputName; | 
					
						
							|  |  |  |           value = commonAttrs // { | 
					
						
							|  |  |  |             outPath = output.outPath; | 
					
						
							|  |  |  |             drvPath = output.drvPath; | 
					
						
							|  |  |  |             type = "derivation"; | 
					
						
							|  |  |  |             inherit outputName; | 
					
						
							|  |  |  |           }; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       outputsList = map makeOutput outputs; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       drv' = (lib.head outputsList).value; | 
					
						
							|  |  |  |     in lib.deepSeq drv' drv'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-27 09:45:23 -05:00
										 |  |  |   /* Make a set of packages with a common scope. All packages called
 | 
					
						
							|  |  |  |      with the provided `callPackage' will be evaluated with the same | 
					
						
							|  |  |  |      arguments. Any package in the set may depend on any other. The | 
					
						
							| 
									
										
										
										
											2018-09-23 11:07:35 -04:00
										 |  |  |      `overrideScope'` function allows subsequent modification of the package | 
					
						
							| 
									
										
										
										
											2015-09-27 09:45:23 -05:00
										 |  |  |      set in a consistent way, i.e. all packages in the set will be | 
					
						
							|  |  |  |      called with the overridden packages. The package sets may be | 
					
						
							|  |  |  |      hierarchical: the packages in the set are called with the scope | 
					
						
							|  |  |  |      provided by `newScope' and the set provides a `newScope' attribute | 
					
						
							|  |  |  |      which can form the parent scope for later package sets. */ | 
					
						
							|  |  |  |   makeScope = newScope: f: | 
					
						
							|  |  |  |     let self = f self // { | 
					
						
							|  |  |  |           newScope = scope: newScope (self // scope); | 
					
						
							|  |  |  |           callPackage = self.newScope {}; | 
					
						
							| 
									
										
										
										
											2018-09-23 11:07:35 -04:00
										 |  |  |           overrideScope = g: lib.warn | 
					
						
							| 
									
										
										
										
											2018-10-11 17:23:47 +02:00
										 |  |  |             "`overrideScope` (from `lib.makeScope`) is deprecated. Do `overrideScope' (self: super: { … })` instead of `overrideScope (super: self: { … })`. All other overrides have the parameters in that order, including other definitions of `overrideScope`. This was the only definition violating the pattern." | 
					
						
							| 
									
										
										
										
											2018-09-23 11:07:35 -04:00
										 |  |  |             (makeScope newScope (lib.fixedPoints.extends (lib.flip g) f)); | 
					
						
							|  |  |  |           overrideScope' = g: makeScope newScope (lib.fixedPoints.extends g f); | 
					
						
							| 
									
										
										
										
											2017-02-25 18:58:53 -06:00
										 |  |  |           packages = f; | 
					
						
							| 
									
										
										
										
											2015-09-27 09:45:23 -05:00
										 |  |  |         }; | 
					
						
							|  |  |  |     in self; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-18 12:12:34 -05:00
										 |  |  |   /* Like the above, but aims to support cross compilation. It's still ugly, but
 | 
					
						
							|  |  |  |      hopefully it helps a little bit. */ | 
					
						
							|  |  |  |   makeScopeWithSplicing = splicePackages: newScope: otherSplices: keep: f: | 
					
						
							|  |  |  |     let | 
					
						
							|  |  |  |       spliced = splicePackages { | 
					
						
							|  |  |  |         pkgsBuildBuild = otherSplices.selfBuildBuild; | 
					
						
							|  |  |  |         pkgsBuildHost = otherSplices.selfBuildHost; | 
					
						
							|  |  |  |         pkgsBuildTarget = otherSplices.selfBuildTarget; | 
					
						
							|  |  |  |         pkgsHostHost = otherSplices.selfHostHost; | 
					
						
							|  |  |  |         pkgsHostTarget = self; # Not `otherSplices.selfHostTarget`; | 
					
						
							|  |  |  |         pkgsTargetTarget = otherSplices.selfTargetTarget; | 
					
						
							|  |  |  |       } // keep self; | 
					
						
							|  |  |  |       self = f self // { | 
					
						
							|  |  |  |         newScope = scope: newScope (spliced // scope); | 
					
						
							|  |  |  |         callPackage = newScope spliced; # == self.newScope {}; | 
					
						
							|  |  |  |         # N.B. the other stages of the package set spliced in are *not* | 
					
						
							|  |  |  |         # overridden. | 
					
						
							|  |  |  |         overrideScope = g: makeScopeWithSplicing | 
					
						
							|  |  |  |           splicePackages | 
					
						
							|  |  |  |           newScope | 
					
						
							|  |  |  |           otherSplices | 
					
						
							|  |  |  |           keep | 
					
						
							|  |  |  |           (lib.fixedPoints.extends g f); | 
					
						
							|  |  |  |         packages = f; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |     in self; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-19 16:43:58 +00:00
										 |  |  | } |