biglybt: 3.5.0.0 -> 3.6.0.0
[NixPkgs.git] / nixos / doc / manual / development / option-def.section.md
blob227f41d812ff192196e11bb065215d0452311f25
1 # Option Definitions {#sec-option-definitions}
3 Option definitions are generally straight-forward bindings of values to
4 option names, like
6 ```nix
8   config = {
9     services.httpd.enable = true;
10   };
12 ```
14 However, sometimes you need to wrap an option definition or set of
15 option definitions in a *property* to achieve certain effects:
17 ## Delaying Conditionals {#sec-option-definitions-delaying-conditionals}
19 If a set of option definitions is conditional on the value of another
20 option, you may need to use `mkIf`. Consider, for instance:
22 ```nix
24   config = if config.services.httpd.enable then {
25     environment.systemPackages = [ /* ... */ ];
26     # ...
27   } else {};
29 ```
31 This definition will cause Nix to fail with an "infinite recursion"
32 error. Why? Because the value of `config.services.httpd.enable` depends
33 on the value being constructed here. After all, you could also write the
34 clearly circular and contradictory:
36 ```nix
38   config = if config.services.httpd.enable then {
39     services.httpd.enable = false;
40   } else {
41     services.httpd.enable = true;
42   };
44 ```
46 The solution is to write:
48 ```nix
50   config = mkIf config.services.httpd.enable {
51     environment.systemPackages = [ /* ... */ ];
52     # ...
53   };
55 ```
57 The special function `mkIf` causes the evaluation of the conditional to
58 be "pushed down" into the individual definitions, as if you had written:
60 ```nix
62   config = {
63     environment.systemPackages = if config.services.httpd.enable then [ /* ... */ ] else [];
64     # ...
65   };
67 ```
69 ## Setting Priorities {#sec-option-definitions-setting-priorities}
71 A module can override the definitions of an option in other modules by
72 setting an *override priority*. All option definitions that do not have the lowest
73 priority value are discarded. By default, option definitions have
74 priority 100 and option defaults have priority 1500.
75 You can specify an explicit priority by using `mkOverride`, e.g.
77 ```nix
79   services.openssh.enable = mkOverride 10 false;
81 ```
83 This definition causes all other definitions with priorities above 10 to
84 be discarded. The function `mkForce` is equal to `mkOverride 50`, and
85 `mkDefault` is equal to `mkOverride 1000`.
87 ## Ordering Definitions {#sec-option-definitions-ordering}
89 It is also possible to influence the order in which the definitions for an option are
90 merged by setting an *order priority* with `mkOrder`. The default order priority is 1000.
91 The functions `mkBefore` and `mkAfter` are equal to `mkOrder 500` and `mkOrder 1500`, respectively.
92 As an example,
94 ```nix
96   hardware.firmware = mkBefore [ myFirmware ];
98 ```
100 This definition ensures that `myFirmware` comes before other unordered
101 definitions in the final list value of `hardware.firmware`.
103 Note that this is different from [override priorities](#sec-option-definitions-setting-priorities):
104 setting an order does not affect whether the definition is included or not.
106 ## Merging Configurations {#sec-option-definitions-merging}
108 In conjunction with `mkIf`, it is sometimes useful for a module to
109 return multiple sets of option definitions, to be merged together as if
110 they were declared in separate modules. This can be done using
111 `mkMerge`:
113 ```nix
115   config = mkMerge
116     [ # Unconditional stuff.
117       { environment.systemPackages = [ /* ... */ ];
118       }
119       # Conditional stuff.
120       (mkIf config.services.bla.enable {
121         environment.systemPackages = [ /* ... */ ];
122       })
123     ];