| 
									
										
										
										
											2018-10-27 14:51:54 +02:00
										 |  |  | { config, options, lib, pkgs, ... }: | 
					
						
							| 
									
										
										
										
											2009-08-26 16:52:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-14 16:26:48 +02:00
										 |  |  | with lib; | 
					
						
							| 
									
										
										
										
											2011-09-05 09:19:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | let | 
					
						
							| 
									
										
										
										
											2018-01-10 15:19:37 +01:00
										 |  |  |   cfg = config.nixpkgs; | 
					
						
							| 
									
										
										
										
											2018-10-27 14:51:54 +02:00
										 |  |  |   opt = options.nixpkgs; | 
					
						
							| 
									
										
										
										
											2018-01-10 15:19:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-05 09:19:59 +00:00
										 |  |  |   isConfig = x: | 
					
						
							| 
									
										
										
										
											2018-01-31 14:02:19 -05:00
										 |  |  |     builtins.isAttrs x || lib.isFunction x; | 
					
						
							| 
									
										
										
										
											2011-09-05 09:19:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   optCall = f: x: | 
					
						
							| 
									
										
										
										
											2018-01-31 14:02:19 -05:00
										 |  |  |     if lib.isFunction f | 
					
						
							| 
									
										
										
										
											2011-09-05 09:19:59 +00:00
										 |  |  |     then f x | 
					
						
							|  |  |  |     else f; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-11 12:41:47 +00:00
										 |  |  |   mergeConfig = lhs_: rhs_: | 
					
						
							|  |  |  |     let | 
					
						
							|  |  |  |       lhs = optCall lhs_ { inherit pkgs; }; | 
					
						
							|  |  |  |       rhs = optCall rhs_ { inherit pkgs; }; | 
					
						
							|  |  |  |     in | 
					
						
							| 
									
										
										
										
											2019-08-10 20:03:11 +02:00
										 |  |  |     recursiveUpdate lhs rhs // | 
					
						
							| 
									
										
										
										
											2011-09-05 09:19:59 +00:00
										 |  |  |     optionalAttrs (lhs ? packageOverrides) { | 
					
						
							|  |  |  |       packageOverrides = pkgs: | 
					
						
							|  |  |  |         optCall lhs.packageOverrides pkgs // | 
					
						
							|  |  |  |         optCall (attrByPath ["packageOverrides"] ({}) rhs) pkgs; | 
					
						
							| 
									
										
										
										
											2016-07-21 16:19:11 +03:00
										 |  |  |     } // | 
					
						
							|  |  |  |     optionalAttrs (lhs ? perlPackageOverrides) { | 
					
						
							|  |  |  |       perlPackageOverrides = pkgs: | 
					
						
							|  |  |  |         optCall lhs.perlPackageOverrides pkgs // | 
					
						
							|  |  |  |         optCall (attrByPath ["perlPackageOverrides"] ({}) rhs) pkgs; | 
					
						
							| 
									
										
										
										
											2011-09-05 09:19:59 +00:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   configType = mkOptionType { | 
					
						
							| 
									
										
										
										
											2016-12-25 18:50:00 +00:00
										 |  |  |     name = "nixpkgs-config"; | 
					
						
							| 
									
										
										
										
											2017-01-15 18:36:50 +00:00
										 |  |  |     description = "nixpkgs config"; | 
					
						
							| 
									
										
										
										
											2018-04-02 20:45:12 +02:00
										 |  |  |     check = x: | 
					
						
							|  |  |  |       let traceXIfNot = c: | 
					
						
							|  |  |  |             if c x then true | 
					
						
							|  |  |  |             else lib.traceSeqN 1 x false; | 
					
						
							|  |  |  |       in traceXIfNot isConfig; | 
					
						
							| 
									
										
										
										
											2013-10-30 14:21:41 +01:00
										 |  |  |     merge = args: fold (def: mergeConfig def.value) {}; | 
					
						
							| 
									
										
										
										
											2011-09-05 09:19:59 +00:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-25 18:50:00 +00:00
										 |  |  |   overlayType = mkOptionType { | 
					
						
							|  |  |  |     name = "nixpkgs-overlay"; | 
					
						
							|  |  |  |     description = "nixpkgs overlay"; | 
					
						
							| 
									
										
										
										
											2018-01-31 14:02:19 -05:00
										 |  |  |     check = lib.isFunction; | 
					
						
							| 
									
										
										
										
											2016-12-25 18:50:00 +00:00
										 |  |  |     merge = lib.mergeOneOption; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-10 15:19:37 +01:00
										 |  |  |   pkgsType = mkOptionType { | 
					
						
							|  |  |  |     name = "nixpkgs"; | 
					
						
							|  |  |  |     description = "An evaluation of Nixpkgs; the top level attribute set of packages"; | 
					
						
							|  |  |  |     check = builtins.isAttrs; | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2017-04-26 13:20:38 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-15 13:11:09 +01:00
										 |  |  |   defaultPkgs = import ../../.. { | 
					
						
							| 
									
										
										
										
											2018-10-27 14:51:54 +02:00
										 |  |  |     inherit (cfg) config overlays localSystem crossSystem; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   finalPkgs = if opt.pkgs.isDefined then cfg.pkgs.appendOverlays cfg.overlays else defaultPkgs; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-05 09:19:59 +00:00
										 |  |  | in | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-26 16:52:38 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-31 03:38:02 -05:00
										 |  |  |   options.nixpkgs = { | 
					
						
							| 
									
										
										
										
											2018-01-10 15:19:37 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     pkgs = mkOption { | 
					
						
							|  |  |  |       defaultText = literalExample | 
					
						
							| 
									
										
										
										
											2019-01-15 13:11:09 +01:00
										 |  |  |         ''import "''${nixos}/.." {
 | 
					
						
							| 
									
										
										
										
											2018-05-17 18:53:13 -04:00
										 |  |  |             inherit (cfg) config overlays localSystem crossSystem; | 
					
						
							| 
									
										
										
										
											2018-01-10 15:19:37 +01:00
										 |  |  |           } | 
					
						
							|  |  |  |         '';
 | 
					
						
							|  |  |  |       type = pkgsType; | 
					
						
							|  |  |  |       example = literalExample ''import <nixpkgs> {}''; | 
					
						
							|  |  |  |       description = ''
 | 
					
						
							| 
									
										
										
										
											2018-11-10 23:21:21 +01:00
										 |  |  |         If set, the pkgs argument to all NixOS modules is the value of | 
					
						
							|  |  |  |         this option, extended with <code>nixpkgs.overlays</code>, if | 
					
						
							|  |  |  |         that is also set. Either <code>nixpkgs.crossSystem</code> or | 
					
						
							|  |  |  |         <code>nixpkgs.localSystem</code> will be used in an assertion | 
					
						
							|  |  |  |         to check that the NixOS and Nixpkgs architectures match. Any | 
					
						
							|  |  |  |         other options in <code>nixpkgs.*</code>, notably <code>config</code>, | 
					
						
							|  |  |  |         will be ignored. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         If unset, the pkgs argument to all NixOS modules is determined | 
					
						
							|  |  |  |         as shown in the default value for this option. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         The default value imports the Nixpkgs source files | 
					
						
							| 
									
										
										
										
											2018-01-10 15:19:37 +01:00
										 |  |  |         relative to the location of this NixOS module, because | 
					
						
							|  |  |  |         NixOS and Nixpkgs are distributed together for consistency, | 
					
						
							|  |  |  |         so the <code>nixos</code> in the default value is in fact a | 
					
						
							| 
									
										
										
										
											2018-04-05 15:22:45 -04:00
										 |  |  |         relative path. The <code>config</code>, <code>overlays</code>, | 
					
						
							|  |  |  |         <code>localSystem</code>, and <code>crossSystem</code> come | 
					
						
							|  |  |  |         from this option's siblings. | 
					
						
							| 
									
										
										
										
											2018-01-10 15:19:37 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         This option can be used by applications like NixOps to increase | 
					
						
							|  |  |  |         the performance of evaluation, or to create packages that depend | 
					
						
							|  |  |  |         on a container that should be built with the exact same evaluation | 
					
						
							|  |  |  |         of Nixpkgs, for example. Applications like this should set | 
					
						
							|  |  |  |         their default value using <code>lib.mkDefault</code>, so | 
					
						
							|  |  |  |         user-provided configuration can override it without using | 
					
						
							|  |  |  |         <code>lib</code>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Note that using a distinct version of Nixpkgs with NixOS may | 
					
						
							|  |  |  |         be an unexpected source of problems. Use this option with care. | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-31 03:38:02 -05:00
										 |  |  |     config = mkOption { | 
					
						
							| 
									
										
										
										
											2009-08-26 16:52:38 +00:00
										 |  |  |       default = {}; | 
					
						
							| 
									
										
										
										
											2011-09-05 10:14:42 +00:00
										 |  |  |       example = literalExample | 
					
						
							| 
									
										
										
										
											2011-09-05 09:46:14 +00:00
										 |  |  |         ''
 | 
					
						
							| 
									
										
										
										
											2018-02-21 05:12:24 +01:00
										 |  |  |           { allowBroken = true; allowUnfree = true; } | 
					
						
							| 
									
										
										
										
											2011-09-05 09:46:14 +00:00
										 |  |  |         '';
 | 
					
						
							| 
									
										
										
										
											2011-09-05 09:19:59 +00:00
										 |  |  |       type = configType; | 
					
						
							| 
									
										
										
										
											2009-08-26 16:52:38 +00:00
										 |  |  |       description = ''
 | 
					
						
							| 
									
										
										
										
											2011-09-05 09:46:14 +00:00
										 |  |  |         The configuration of the Nix Packages collection.  (For | 
					
						
							|  |  |  |         details, see the Nixpkgs documentation.)  It allows you to set | 
					
						
							| 
									
										
										
										
											2016-12-25 18:50:00 +00:00
										 |  |  |         package configuration options. | 
					
						
							| 
									
										
										
										
											2018-01-10 15:19:37 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         Ignored when <code>nixpkgs.pkgs</code> is set. | 
					
						
							| 
									
										
										
										
											2016-12-25 18:50:00 +00:00
										 |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-31 03:38:02 -05:00
										 |  |  |     overlays = mkOption { | 
					
						
							| 
									
										
										
										
											2016-12-25 18:50:00 +00:00
										 |  |  |       default = []; | 
					
						
							|  |  |  |       example = literalExample | 
					
						
							|  |  |  |         ''
 | 
					
						
							| 
									
										
										
										
											2019-05-04 17:29:04 +02:00
										 |  |  |           [ | 
					
						
							|  |  |  |             (self: super: { | 
					
						
							| 
									
										
										
										
											2016-12-25 18:50:00 +00:00
										 |  |  |               openssh = super.openssh.override { | 
					
						
							|  |  |  |                 hpnSupport = true; | 
					
						
							| 
									
										
										
										
											2017-01-15 15:07:29 +00:00
										 |  |  |                 kerberos = self.libkrb5; | 
					
						
							| 
									
										
										
										
											2016-12-25 18:50:00 +00:00
										 |  |  |               }; | 
					
						
							| 
									
										
										
										
											2019-05-04 17:29:04 +02:00
										 |  |  |             }) | 
					
						
							|  |  |  |           ] | 
					
						
							| 
									
										
										
										
											2016-12-25 18:50:00 +00:00
										 |  |  |         '';
 | 
					
						
							| 
									
										
										
										
											2017-01-15 19:05:22 +00:00
										 |  |  |       type = types.listOf overlayType; | 
					
						
							| 
									
										
										
										
											2016-12-25 18:50:00 +00:00
										 |  |  |       description = ''
 | 
					
						
							|  |  |  |         List of overlays to use with the Nix Packages collection. | 
					
						
							|  |  |  |         (For details, see the Nixpkgs documentation.)  It allows | 
					
						
							| 
									
										
										
										
											2018-10-27 14:51:54 +02:00
										 |  |  |         you to override packages globally. Each function in the list | 
					
						
							| 
									
										
										
										
											2016-12-25 18:50:00 +00:00
										 |  |  |         takes as an argument the <emphasis>original</emphasis> Nixpkgs. | 
					
						
							|  |  |  |         The first argument should be used for finding dependencies, and | 
					
						
							|  |  |  |         the second should be used for overriding recipes. | 
					
						
							| 
									
										
										
										
											2018-01-10 15:19:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-27 14:51:54 +02:00
										 |  |  |         If <code>nixpkgs.pkgs</code> is set, overlays specified here | 
					
						
							|  |  |  |         will be applied after the overlays that were already present | 
					
						
							|  |  |  |         in <code>nixpkgs.pkgs</code>. | 
					
						
							| 
									
										
										
										
											2009-08-26 16:52:38 +00:00
										 |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-05 15:22:45 -04:00
										 |  |  |     localSystem = mkOption { | 
					
						
							|  |  |  |       type = types.attrs; # TODO utilize lib.systems.parsedPlatform | 
					
						
							| 
									
										
										
										
											2018-05-17 18:53:13 -04:00
										 |  |  |       default = { inherit (cfg) system; }; | 
					
						
							| 
									
										
										
										
											2018-04-05 15:22:45 -04:00
										 |  |  |       example = { system = "aarch64-linux"; config = "aarch64-unknown-linux-gnu"; }; | 
					
						
							| 
									
										
										
										
											2018-05-17 18:53:13 -04:00
										 |  |  |       # Make sure that the final value has all fields for sake of other modules | 
					
						
							|  |  |  |       # referring to this. TODO make `lib.systems` itself use the module system. | 
					
						
							|  |  |  |       apply = lib.systems.elaborate; | 
					
						
							| 
									
										
										
										
											2018-04-05 15:22:45 -04:00
										 |  |  |       defaultText = literalExample | 
					
						
							|  |  |  |         ''(import "''${nixos}/../lib").lib.systems.examples.aarch64-multiplatform''; | 
					
						
							|  |  |  |       description = ''
 | 
					
						
							|  |  |  |         Specifies the platform on which NixOS should be built. When | 
					
						
							|  |  |  |         <code>nixpkgs.crossSystem</code> is unset, it also specifies | 
					
						
							|  |  |  |         the platform <emphasis>for</emphasis> which NixOS should be | 
					
						
							|  |  |  |         built.  If this option is unset, it defaults to the platform | 
					
						
							|  |  |  |         type of the machine where evaluation happens. Specifying this | 
					
						
							|  |  |  |         option is useful when doing distributed multi-platform | 
					
						
							|  |  |  |         deployment, or when building virtual machines. See its | 
					
						
							|  |  |  |         description in the Nixpkgs manual for more details. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Ignored when <code>nixpkgs.pkgs</code> is set. | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-01 14:58:15 -05:00
										 |  |  |     crossSystem = mkOption { | 
					
						
							| 
									
										
										
										
											2018-04-05 15:22:45 -04:00
										 |  |  |       type = types.nullOr types.attrs; # TODO utilize lib.systems.parsedPlatform | 
					
						
							| 
									
										
										
										
											2018-03-01 14:58:15 -05:00
										 |  |  |       default = null; | 
					
						
							| 
									
										
										
										
											2018-04-05 15:22:45 -04:00
										 |  |  |       example = { system = "aarch64-linux"; config = "aarch64-unknown-linux-gnu"; }; | 
					
						
							|  |  |  |       defaultText = literalExample | 
					
						
							|  |  |  |         ''(import "''${nixos}/../lib").lib.systems.examples.aarch64-multiplatform''; | 
					
						
							| 
									
										
										
										
											2018-03-01 14:58:15 -05:00
										 |  |  |       description = ''
 | 
					
						
							| 
									
										
										
										
											2018-04-05 15:22:45 -04:00
										 |  |  |         Specifies the platform for which NixOS should be | 
					
						
							|  |  |  |         built. Specify this only if it is different from | 
					
						
							|  |  |  |         <code>nixpkgs.localSystem</code>, the platform | 
					
						
							|  |  |  |         <emphasis>on</emphasis> which NixOS should be built. In other | 
					
						
							|  |  |  |         words, specify this to cross-compile NixOS. Otherwise it | 
					
						
							|  |  |  |         should be set as null, the default. See its description in the | 
					
						
							|  |  |  |         Nixpkgs manual for more details. | 
					
						
							| 
									
										
										
										
											2018-03-01 14:58:15 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         Ignored when <code>nixpkgs.pkgs</code> is set. | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-31 03:38:02 -05:00
										 |  |  |     system = mkOption { | 
					
						
							| 
									
										
										
										
											2015-06-15 18:12:32 +02:00
										 |  |  |       type = types.str; | 
					
						
							| 
									
										
										
										
											2015-04-08 23:12:11 +02:00
										 |  |  |       example = "i686-linux"; | 
					
						
							| 
									
										
										
										
											2010-11-23 16:07:00 +00:00
										 |  |  |       description = ''
 | 
					
						
							| 
									
										
										
										
											2018-04-05 15:22:45 -04:00
										 |  |  |         Specifies the Nix platform type on which NixOS should be built. | 
					
						
							|  |  |  |         It is better to specify <code>nixpkgs.localSystem</code> instead. | 
					
						
							|  |  |  |         <programlisting> | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           nixpkgs.system = ..; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         </programlisting> | 
					
						
							|  |  |  |         is the same as | 
					
						
							|  |  |  |         <programlisting> | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           nixpkgs.localSystem.system = ..; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         </programlisting> | 
					
						
							|  |  |  |         See <code>nixpkgs.localSystem</code> for more information. | 
					
						
							| 
									
										
										
										
											2018-01-10 15:19:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-17 18:53:13 -04:00
										 |  |  |         Ignored when <code>nixpkgs.localSystem</code> is set. | 
					
						
							| 
									
										
										
										
											2018-01-10 15:19:37 +01:00
										 |  |  |         Ignored when <code>nixpkgs.pkgs</code> is set. | 
					
						
							| 
									
										
										
										
											2010-11-23 16:07:00 +00:00
										 |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2009-08-26 16:52:38 +00:00
										 |  |  |   }; | 
					
						
							| 
									
										
										
										
											2014-05-06 10:31:48 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   config = { | 
					
						
							| 
									
										
										
										
											2017-04-26 13:20:38 -03:00
										 |  |  |     _module.args = { | 
					
						
							| 
									
										
										
										
											2018-10-27 14:51:54 +02:00
										 |  |  |       pkgs = finalPkgs; | 
					
						
							| 
									
										
										
										
											2017-04-26 13:20:38 -03:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2018-11-04 23:09:43 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     assertions = [ | 
					
						
							|  |  |  |       ( | 
					
						
							|  |  |  |         let | 
					
						
							|  |  |  |           nixosExpectedSystem = | 
					
						
							|  |  |  |             if config.nixpkgs.crossSystem != null | 
					
						
							|  |  |  |             then config.nixpkgs.crossSystem.system | 
					
						
							|  |  |  |             else config.nixpkgs.localSystem.system; | 
					
						
							|  |  |  |           nixosOption = | 
					
						
							|  |  |  |             if config.nixpkgs.crossSystem != null | 
					
						
							|  |  |  |             then "nixpkgs.crossSystem" | 
					
						
							|  |  |  |             else "nixpkgs.localSystem"; | 
					
						
							|  |  |  |           pkgsSystem = finalPkgs.stdenv.targetPlatform.system; | 
					
						
							|  |  |  |         in { | 
					
						
							|  |  |  |           assertion = nixosExpectedSystem == pkgsSystem; | 
					
						
							|  |  |  |           message = "The NixOS nixpkgs.pkgs option was set to a Nixpkgs invocation that compiles to target system ${pkgsSystem} but NixOS was configured for system ${nixosExpectedSystem} via NixOS option ${nixosOption}. The NixOS system settings must match the Nixpkgs target system."; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       ) | 
					
						
							|  |  |  |     ]; | 
					
						
							| 
									
										
										
										
											2014-05-06 10:31:48 -04:00
										 |  |  |   }; | 
					
						
							| 
									
										
										
										
											2010-02-27 18:37:12 +00:00
										 |  |  | } |