2018-10-27 12:51:54 +00:00
{ config , options , lib , pkgs , . . . }:
2011-09-05 09:19:59 +00:00
let
2018-01-10 14:19:37 +00:00
cfg = config . nixpkgs ;
2018-10-27 12:51:54 +00:00
opt = options . nixpkgs ;
2018-01-10 14:19:37 +00:00
2011-09-05 09:19:59 +00:00
isConfig = x :
2018-01-31 19:02:19 +00:00
builtins . isAttrs x || lib . isFunction x ;
2011-09-05 09:19:59 +00:00
optCall = f : x :
2018-01-31 19:02:19 +00: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
2024-08-28 19:18:52 +00:00
lib . recursiveUpdate lhs rhs //
lib . optionalAttrs ( lhs ? packageOverrides ) {
2011-09-05 09:19:59 +00:00
packageOverrides = pkgs :
optCall lhs . packageOverrides pkgs //
2024-08-28 19:18:52 +00:00
optCall ( lib . attrByPath [ " p a c k a g e O v e r r i d e s " ] { } rhs ) pkgs ;
2016-07-21 13:19:11 +00:00
} //
2024-08-28 19:18:52 +00:00
lib . optionalAttrs ( lhs ? perlPackageOverrides ) {
2016-07-21 13:19:11 +00:00
perlPackageOverrides = pkgs :
optCall lhs . perlPackageOverrides pkgs //
2024-08-28 19:18:52 +00:00
optCall ( lib . attrByPath [ " p e r l P a c k a g e O v e r r i d e s " ] { } rhs ) pkgs ;
2011-09-05 09:19:59 +00:00
} ;
2024-08-28 19:18:52 +00:00
configType = lib . mkOptionType {
2016-12-25 18:50:00 +00:00
name = " n i x p k g s - c o n f i g " ;
2017-01-15 18:36:50 +00:00
description = " n i x p k g s c o n f i g " ;
2018-04-02 18:45:12 +00:00
check = x :
let traceXIfNot = c :
if c x then true
else lib . traceSeqN 1 x false ;
in traceXIfNot isConfig ;
2024-08-28 19:18:52 +00:00
merge = args : lib . foldr ( def : mergeConfig def . value ) { } ;
2011-09-05 09:19:59 +00:00
} ;
2024-08-28 19:18:52 +00:00
overlayType = lib . mkOptionType {
2016-12-25 18:50:00 +00:00
name = " n i x p k g s - o v e r l a y " ;
description = " n i x p k g s o v e r l a y " ;
2018-01-31 19:02:19 +00:00
check = lib . isFunction ;
2016-12-25 18:50:00 +00:00
merge = lib . mergeOneOption ;
} ;
2024-08-28 19:18:52 +00:00
pkgsType = lib . types . pkgs // {
2023-05-07 13:32:10 +00:00
# This type is only used by itself, so let's elaborate the description a bit
# for the purpose of documentation.
2018-01-10 14:19:37 +00:00
description = " A n e v a l u a t i o n o f N i x p k g s ; t h e t o p l e v e l a t t r i b u t e s e t o f p a c k a g e s " ;
} ;
2017-04-26 16:20:38 +00:00
2024-08-28 19:18:52 +00:00
hasBuildPlatform = opt . buildPlatform . highestPrio < ( lib . mkOptionDefault { } ) . priority ;
2022-06-14 20:34:16 +00:00
hasHostPlatform = opt . hostPlatform . isDefined ;
hasPlatform = hasHostPlatform || hasBuildPlatform ;
# Context for messages
2024-08-28 19:18:52 +00:00
hostPlatformLine = lib . optionalString hasHostPlatform " ${ lib . showOptionWithDefLocs opt . hostPlatform } " ;
buildPlatformLine = lib . optionalString hasBuildPlatform " ${ lib . showOptionWithDefLocs opt . buildPlatform } " ;
2022-06-14 20:34:16 +00:00
legacyOptionsDefined =
2024-08-28 19:18:52 +00:00
lib . optional ( opt . localSystem . highestPrio < ( lib . mkDefault { } ) . priority ) opt . system
++ lib . optional ( opt . localSystem . highestPrio < ( lib . mkOptionDefault { } ) . priority ) opt . localSystem
++ lib . optional ( opt . crossSystem . highestPrio < ( lib . mkOptionDefault { } ) . priority ) opt . crossSystem
2022-06-14 20:34:16 +00:00
;
defaultPkgs =
if opt . hostPlatform . isDefined
then
let isCross = cfg . buildPlatform != cfg . hostPlatform ;
systemArgs =
if isCross
then {
localSystem = cfg . buildPlatform ;
crossSystem = cfg . hostPlatform ;
}
else {
localSystem = cfg . hostPlatform ;
} ;
in
import ../../.. ( {
inherit ( cfg ) config overlays ;
} // systemArgs )
else
import ../../.. {
inherit ( cfg ) config overlays localSystem crossSystem ;
} ;
2018-10-27 12:51:54 +00:00
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
{
2021-12-03 12:04:36 +00:00
imports = [
./assertions.nix
./meta.nix
2024-09-16 19:01:37 +00:00
( lib . mkRemovedOptionModule [ " n i x p k g s " " i n i t i a l S y s t e m " ] " T h e N i x O S o p t i o n s ` n e s t i n g . c l o n e ` a n d ` n e s t i n g . c h i l d r e n ` h a v e b e e n d e l e t e d , a n d r e p l a c e d w i t h n a m e d s p e c i a l i s a t i o n . T h e r e f o r e ` n i x p g k s . i n i t i a l S y s t e m ` h a s n o e f f e c t a n y m o r e . " )
2021-12-03 12:04:36 +00:00
] ;
2017-01-31 08:38:02 +00:00
options . nixpkgs = {
2018-01-10 14:19:37 +00:00
2024-08-28 19:18:52 +00:00
pkgs = lib . mkOption {
defaultText = lib . literalExpression ''
2021-10-03 16:06:03 +00:00
import " ' ' ${ nixos } / . . " {
inherit ( cfg ) config overlays localSystem crossSystem ;
}
'' ;
2018-01-10 14:19:37 +00:00
type = pkgsType ;
2024-08-28 19:18:52 +00:00
example = lib . literalExpression " i m p o r t < n i x p k g s > { } " ;
2018-01-10 14:19:37 +00:00
description = ''
2018-11-10 22:21:21 +00:00
If set , the pkgs argument to all NixOS modules is the value of
this option , extended with ` nixpkgs . overlays ` , if
that is also set . Either ` nixpkgs . crossSystem ` or
` nixpkgs . localSystem ` will be used in an assertion
to check that the NixOS and Nixpkgs architectures match . Any
other options in ` nixpkgs . * ` , notably ` config ` ,
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 14:19:37 +00:00
relative to the location of this NixOS module , because
NixOS and Nixpkgs are distributed together for consistency ,
so the ` nixos ` in the default value is in fact a
2018-04-05 19:22:45 +00:00
relative path . The ` config ` , ` overlays ` ,
` localSystem ` , and ` crossSystem ` come
from this option's siblings .
2018-01-10 14:19:37 +00: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 ` lib . mkDefault ` , so
user-provided configuration can override it without using
` lib ` .
Note that using a distinct version of Nixpkgs with NixOS may
be an unexpected source of problems . Use this option with care .
'' ;
} ;
2024-08-28 19:18:52 +00:00
config = lib . mkOption {
2009-08-26 16:52:38 +00:00
default = { } ;
2024-08-28 19:18:52 +00:00
example = lib . literalExpression
2011-09-05 09:46:14 +00:00
''
2018-02-21 04:12:24 +00: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 = ''
2024-04-15 15:00:23 +00:00
Global configuration for Nixpkgs .
The complete list of [ Nixpkgs configuration options ] ( https://nixos.org/manual/nixpkgs/unstable/ #sec-config-options-reference) is in the [Nixpkgs manual section on global configuration](https://nixos.org/manual/nixpkgs/unstable/#chap-packageconfig).
2018-01-10 14:19:37 +00:00
2024-04-15 15:00:23 +00:00
Ignored when { option } ` nixpkgs . pkgs ` is set .
2016-12-25 18:50:00 +00:00
'' ;
} ;
2024-08-28 19:18:52 +00:00
overlays = lib . mkOption {
2016-12-25 18:50:00 +00:00
default = [ ] ;
2024-08-28 19:18:52 +00:00
example = lib . literalExpression
2016-12-25 18:50:00 +00:00
''
2019-05-04 15:29:04 +00: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 15:29:04 +00:00
} )
]
2016-12-25 18:50:00 +00:00
'' ;
2024-08-28 19:18:52 +00:00
type = lib . types . listOf overlayType ;
2016-12-25 18:50:00 +00:00
description = ''
2023-09-28 14:25:43 +00:00
List of overlays to apply to Nixpkgs .
This option allows modifying the Nixpkgs package set accessed through the ` pkgs ` module argument .
For details , see the [ Overlays chapter in the Nixpkgs manual ] ( https://nixos.org/manual/nixpkgs/stable/ #chap-overlays).
If the { option } ` nixpkgs . pkgs ` option is set , overlays specified using ` nixpkgs . overlays ` will be applied after the overlays that were already included in ` nixpkgs . pkgs ` .
2009-08-26 16:52:38 +00:00
'' ;
} ;
2024-08-28 19:18:52 +00:00
hostPlatform = lib . mkOption {
type = lib . types . either lib . types . str lib . types . attrs ; # TODO utilize lib.systems.parsedPlatform
2023-10-02 11:29:43 +00:00
example = { system = " a a r c h 6 4 - l i n u x " ; } ;
2022-06-14 20:34:16 +00: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 ;
2024-08-28 19:18:52 +00:00
defaultText = lib . literalExpression
2022-06-14 20:34:16 +00:00
'' ( i m p o r t " ''$ { n i x o s } / . . / l i b " ) . l i b . s y s t e m s . e x a m p l e s . a a r c h 6 4 - m u l t i p l a t f o r m '' ;
description = ''
Specifies the platform where the NixOS configuration will run .
To cross-compile , set also ` nixpkgs . buildPlatform ` .
Ignored when ` nixpkgs . pkgs ` is set .
'' ;
} ;
2024-08-28 19:18:52 +00:00
buildPlatform = lib . mkOption {
type = lib . types . either lib . types . str lib . types . attrs ; # TODO utilize lib.systems.parsedPlatform
2022-06-14 20:34:16 +00:00
default = cfg . hostPlatform ;
2023-10-02 11:29:43 +00:00
example = { system = " x 8 6 _ 6 4 - l i n u x " ; } ;
2022-06-14 20:34:16 +00:00
# Make sure that the final value has all fields for sake of other modules
# referring to this.
2024-03-01 03:22:33 +00:00
apply = inputBuildPlatform :
let elaborated = lib . systems . elaborate inputBuildPlatform ;
in if lib . systems . equals elaborated cfg . hostPlatform
then cfg . hostPlatform # make identical, so that `==` equality works; see https://github.com/NixOS/nixpkgs/issues/278001
else elaborated ;
2024-08-28 19:18:52 +00:00
defaultText = lib . literalExpression
2022-06-14 20:34:16 +00:00
'' c o n f i g . n i x p k g s . h o s t P l a t f o r m '' ;
description = ''
Specifies the platform on which NixOS should be built .
By default , NixOS is built on the system where it runs , but you can
change where it's built . Setting this option will cause NixOS to be
cross-compiled .
For instance , if you're doing distributed multi-platform deployment ,
or if you're building machines , you can set this to match your
development system and/or build farm .
Ignored when ` nixpkgs . pkgs ` is set .
'' ;
} ;
2024-08-28 19:18:52 +00:00
localSystem = lib . mkOption {
type = lib . types . attrs ; # TODO utilize lib.systems.parsedPlatform
2018-05-17 22:53:13 +00:00
default = { inherit ( cfg ) system ; } ;
2023-10-02 11:29:43 +00:00
example = { system = " a a r c h 6 4 - l i n u x " ; } ;
2018-05-17 22:53:13 +00: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 ;
2024-08-28 19:18:52 +00:00
defaultText = lib . literalExpression
2018-04-05 19:22:45 +00:00
'' ( i m p o r t " ''$ { n i x o s } / . . / l i b " ) . l i b . s y s t e m s . e x a m p l e s . a a r c h 6 4 - m u l t i p l a t f o r m '' ;
description = ''
2022-06-25 09:02:54 +00:00
Systems with a recently generated ` hardware-configuration . nix `
do not need to specify this option , unless cross-compiling , in which case
you should set * only * { option } ` nixpkgs . buildPlatform ` .
If this is somehow not feasible , you may fall back to removing the
{ option } ` nixpkgs . hostPlatform ` line from the generated config and
use the old options .
2018-04-05 19:22:45 +00:00
Specifies the platform on which NixOS should be built . When
` nixpkgs . crossSystem ` is unset , it also specifies
the platform * for * 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 .
2022-06-14 20:34:16 +00:00
Ignored when ` nixpkgs . pkgs ` or ` hostPlatform ` is set .
2018-04-05 19:22:45 +00:00
'' ;
} ;
2022-06-14 20:34:16 +00:00
# TODO deprecate. "crossSystem" is a nonsense identifier, because "cross"
# is a relation between at least 2 systems in the context of a
# specific build step, not a single system.
2024-08-28 19:18:52 +00:00
crossSystem = lib . mkOption {
type = lib . types . nullOr lib . types . attrs ; # TODO utilize lib.systems.parsedPlatform
2018-03-01 19:58:15 +00:00
default = null ;
2023-10-02 11:29:43 +00:00
example = { system = " a a r c h 6 4 - l i n u x " ; } ;
2018-03-01 19:58:15 +00:00
description = ''
2022-06-25 09:02:54 +00:00
Systems with a recently generated ` hardware-configuration . nix `
may instead specify * only * { option } ` nixpkgs . buildPlatform ` ,
or fall back to removing the { option } ` nixpkgs . hostPlatform ` line from the generated config .
2018-04-05 19:22:45 +00:00
Specifies the platform for which NixOS should be
built . Specify this only if it is different from
` nixpkgs . localSystem ` , the platform
* on * 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 19:58:15 +00:00
2022-06-14 20:34:16 +00:00
Ignored when ` nixpkgs . pkgs ` or ` hostPlatform ` is set .
2018-03-01 19:58:15 +00:00
'' ;
} ;
2024-08-28 19:18:52 +00:00
system = lib . mkOption {
type = lib . types . str ;
2015-04-08 21:12:11 +00:00
example = " i 6 8 6 - l i n u x " ;
2022-06-25 09:02:54 +00:00
default =
if opt . hostPlatform . isDefined
then
throw ''
Neither $ { opt . system } nor any other option in nixpkgs . * is meant
to be read by modules and configurations .
Use pkgs . stdenv . hostPlatform instead .
''
else
throw ''
2022-11-16 06:54:04 +00:00
Neither $ { opt . hostPlatform } nor the legacy option $ { opt . system } has been set .
2022-06-25 09:02:54 +00:00
You can set $ { opt . hostPlatform } in hardware-configuration . nix by re-running
a recent version of nixos-generate-config .
The option $ { opt . system } is still fully supported for NixOS 22 .05 interoperability ,
but will be deprecated in the future , so we recommend to set $ { opt . hostPlatform } .
'' ;
defaultText = lib . literalMD ''
Traditionally ` builtins . currentSystem ` , but unset when invoking NixOS through ` lib . nixosSystem ` .
'' ;
2010-11-23 16:07:00 +00:00
description = ''
2022-06-25 09:02:54 +00:00
This option does not need to be specified for NixOS configurations
with a recently generated ` hardware-configuration . nix ` .
2018-04-05 19:22:45 +00:00
Specifies the Nix platform type on which NixOS should be built .
It is better to specify ` nixpkgs . localSystem ` instead .
2022-08-30 12:08:50 +00:00
` ` `
2018-04-05 19:22:45 +00:00
{
nixpkgs . system = . . ;
}
2022-08-30 12:08:50 +00:00
` ` `
2018-04-05 19:22:45 +00:00
is the same as
2022-08-30 12:08:50 +00:00
` ` `
2018-04-05 19:22:45 +00:00
{
nixpkgs . localSystem . system = . . ;
}
2022-08-30 12:08:50 +00:00
` ` `
2018-04-05 19:22:45 +00:00
See ` nixpkgs . localSystem ` for more information .
2018-01-10 14:19:37 +00:00
2022-06-14 20:34:16 +00:00
Ignored when ` nixpkgs . pkgs ` , ` nixpkgs . localSystem ` or ` nixpkgs . hostPlatform ` is set .
2010-11-23 16:07:00 +00:00
'' ;
} ;
2009-08-26 16:52:38 +00:00
} ;
2014-05-06 14:31:48 +00:00
config = {
2017-04-26 16:20:38 +00:00
_module . args = {
2023-06-16 19:28:06 +00:00
pkgs =
# We explicitly set the default override priority, so that we do not need
# to evaluate finalPkgs in case an override is placed on `_module.args.pkgs`.
# After all, to determine a definition priority, we need to evaluate `._type`,
# which is somewhat costly for Nixpkgs. With an explicit priority, we only
# evaluate the wrapper to find out that the priority is lower, and then we
# don't need to evaluate `finalPkgs`.
lib . mkOverride lib . modules . defaultOverridePriority
finalPkgs . __splicedPackages ;
2017-04-26 16:20:38 +00:00
} ;
2018-11-04 22:09:43 +00:00
2023-06-16 19:45:09 +00:00
assertions = let
# Whether `pkgs` was constructed by this module. This is false when any of
# nixpkgs.pkgs or _module.args.pkgs is set.
constructedByMe =
# We set it with default priority and it can not be merged, so if the
# pkgs module argument has that priority, it's from us.
( lib . modules . mergeAttrDefinitionsWithPrio options . _module . args ) . pkgs . highestPrio
== lib . modules . defaultOverridePriority
# Although, if nixpkgs.pkgs is set, we did forward it, but we did not construct it.
&& ! opt . pkgs . isDefined ;
in [
2018-11-04 22:09:43 +00:00
(
let
nixosExpectedSystem =
if config . nixpkgs . crossSystem != null
2020-03-22 03:23:24 +00:00
then config . nixpkgs . crossSystem . system or ( lib . systems . parse . doubleFromSystem ( lib . systems . parse . mkSystemFromString config . nixpkgs . crossSystem . config ) )
else config . nixpkgs . localSystem . system or ( lib . systems . parse . doubleFromSystem ( lib . systems . parse . mkSystemFromString config . nixpkgs . localSystem . config ) ) ;
2018-11-04 22:09:43 +00:00
nixosOption =
if config . nixpkgs . crossSystem != null
then " n i x p k g s . c r o s s S y s t e m "
else " n i x p k g s . l o c a l S y s t e m " ;
pkgsSystem = finalPkgs . stdenv . targetPlatform . system ;
in {
2022-10-27 11:41:01 +00:00
assertion = constructedByMe -> ! hasPlatform -> nixosExpectedSystem == pkgsSystem ;
2018-11-04 22:09:43 +00:00
message = " T h e N i x O S n i x p k g s . p k g s o p t i o n w a s s e t t o a N i x p k g s i n v o c a t i o n t h a t c o m p i l e s t o t a r g e t s y s t e m ${ pkgsSystem } b u t N i x O S w a s c o n f i g u r e d f o r s y s t e m ${ nixosExpectedSystem } v i a N i x O S o p t i o n ${ nixosOption } . T h e N i x O S s y s t e m s e t t i n g s m u s t m a t c h t h e N i x p k g s t a r g e t s y s t e m . " ;
}
)
2022-06-14 20:34:16 +00:00
{
2022-10-20 09:18:13 +00:00
assertion = constructedByMe -> hasPlatform -> legacyOptionsDefined == [ ] ;
2022-06-14 20:34:16 +00:00
message = ''
2024-08-28 19:18:52 +00:00
Your system configures nixpkgs with the platform parameter $ { lib . optionalString hasBuildPlatform " s " }:
2022-06-14 20:34:16 +00:00
$ { hostPlatformLine
} $ { buildPlatformLine
}
However , it also defines the legacy options :
2024-08-28 19:18:52 +00:00
$ { lib . concatMapStrings lib . showOptionWithDefLocs legacyOptionsDefined }
2022-06-14 20:34:16 +00:00
For a future proof system configuration , we recommend to remove
the legacy definitions .
'' ;
}
2023-09-26 14:53:40 +00:00
{
assertion = opt . pkgs . isDefined -> cfg . config == { } ;
message = ''
Your system configures nixpkgs with an externally created instance .
` nixpkgs . config ` options should be passed when creating the instance instead .
Current value :
$ { lib . generators . toPretty { multiline = true ; } opt . config }
'' ;
}
2018-11-04 22:09:43 +00:00
] ;
2014-05-06 14:31:48 +00:00
} ;
2021-11-18 23:26:27 +00:00
2018-11-04 22:09:43 +00:00
# needs a full nixpkgs path to import nixpkgs
meta . buildDocsInSandbox = false ;
2010-02-27 18:37:12 +00:00
}