| 
									
										
										
										
											2014-10-05 00:03:52 +02:00
										 |  |  | let | 
					
						
							| 
									
										
										
										
											2015-07-28 21:35:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-05 00:03:52 +02:00
										 |  |  |   lib = import ./default.nix; | 
					
						
							|  |  |  |   inherit (builtins) attrNames isFunction; | 
					
						
							| 
									
										
										
										
											2015-07-28 21:35:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-23 15:54:10 +00:00
										 |  |  | in | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  |      derivation in which the attributes of the original are overriden | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  |      scenarios (e.g. in ~/.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: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        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)); | 
					
						
							| 
									
										
										
										
											2013-05-15 00:39:17 -04:00
										 |  |  |     in addPassthru 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
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-19 22:52:53 +00:00
										 |  |  |   makeOverridable = f: origArgs: | 
					
						
							|  |  |  |     let | 
					
						
							|  |  |  |       ff = f origArgs; | 
					
						
							| 
									
										
										
										
											2015-03-19 15:48:54 +00:00
										 |  |  |       overrideWith = newArgs: origArgs // (if builtins.isFunction newArgs then newArgs origArgs else newArgs); | 
					
						
							| 
									
										
										
										
											2010-08-19 22:52:53 +00:00
										 |  |  |     in | 
					
						
							| 
									
										
										
										
											2016-08-19 22:21:32 -04:00
										 |  |  |       if builtins.isAttrs ff then (ff // { | 
					
						
							|  |  |  |         override = newArgs: makeOverridable f (overrideWith newArgs); | 
					
						
							|  |  |  |         overrideDerivation = fdrv: | 
					
						
							|  |  |  |           makeOverridable (args: overrideDerivation (f args) fdrv) origArgs; | 
					
						
							|  |  |  |         ${if ff ? overrideAttrs then "overrideAttrs" else null} = fdrv: | 
					
						
							|  |  |  |           makeOverridable (args: (f args).overrideAttrs fdrv) origArgs; | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  |       else if builtins.isFunction ff then { | 
					
						
							|  |  |  |         override = newArgs: makeOverridable f (overrideWith newArgs); | 
					
						
							|  |  |  |         __functor = self: ff; | 
					
						
							|  |  |  |         overrideDerivation = throw "overrideDerivation not yet supported for functors"; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2010-08-19 22:52:53 +00:00
										 |  |  |       else ff; | 
					
						
							| 
									
										
										
										
											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: | 
					
						
							| 
									
										
										
										
											2015-03-19 15:48:54 +00:00
										 |  |  |     let | 
					
						
							| 
									
										
										
										
											2015-07-28 21:35:17 +02:00
										 |  |  |       f = if builtins.isFunction fn then fn else import fn; | 
					
						
							| 
									
										
										
										
											2015-03-19 15:48:54 +00:00
										 |  |  |       auto = builtins.intersectAttrs (builtins.functionArgs f) autoArgs; | 
					
						
							|  |  |  |     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 | 
					
						
							|  |  |  |       f = if builtins.isFunction fn then fn else import fn; | 
					
						
							|  |  |  |       auto = builtins.intersectAttrs (builtins.functionArgs f) autoArgs; | 
					
						
							|  |  |  |       finalArgs = auto // args; | 
					
						
							|  |  |  |       pkgs = f finalArgs; | 
					
						
							|  |  |  |       mkAttrOverridable = name: pkg: pkg // { | 
					
						
							|  |  |  |         override = newArgs: mkAttrOverridable name (f (finalArgs // newArgs)).${name}; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |     in lib.mapAttrs mkAttrOverridable pkgs; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* Add attributes to each output of a derivation without changing
 | 
					
						
							|  |  |  |      the derivation itself. */ | 
					
						
							| 
									
										
										
										
											2013-03-24 08:29:10 -04:00
										 |  |  |   addPassthru = drv: passthru: | 
					
						
							|  |  |  |     let | 
					
						
							|  |  |  |       outputs = drv.outputs or [ "out" ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       commonAttrs = drv // (builtins.listToAttrs outputsList) // | 
					
						
							|  |  |  |         ({ all = map (x: x.value) outputsList; }) // passthru; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       outputToAttrListElement = outputName: | 
					
						
							|  |  |  |         { name = outputName; | 
					
						
							|  |  |  |           value = commonAttrs // { | 
					
						
							| 
									
										
										
										
											2014-10-05 00:03:52 +02:00
										 |  |  |             inherit (drv.${outputName}) outPath drvPath type outputName; | 
					
						
							| 
									
										
										
										
											2013-03-24 08:29:10 -04:00
										 |  |  |           }; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       outputsList = map outputToAttrListElement outputs; | 
					
						
							| 
									
										
										
										
											2016-01-28 11:24:18 +01:00
										 |  |  |   in commonAttrs // { outputUnspecified = true; }; | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  |      `override' function allows subsequent modification of the package | 
					
						
							|  |  |  |      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 {}; | 
					
						
							|  |  |  |           override = g: makeScope newScope (self_: | 
					
						
							|  |  |  |             let super = f self_; | 
					
						
							|  |  |  |             in super // g super self_); | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |     in self; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-19 16:43:58 +00:00
										 |  |  | } |