Merge pull request #268619 from tweag/lib-descriptions
[NixPkgs.git] / pkgs / top-level / config.nix
blobaa3a235553ef22beca2a37396b6b682ed66a53c6
1 # This file defines the structure of the `config` nixpkgs option.
3 { config, lib, ... }:
5 with lib;
7 let
9   mkMassRebuild = args: mkOption (builtins.removeAttrs args [ "feature" ] // {
10     type = args.type or (types.uniq types.bool);
11     default = args.default or false;
12     description = lib.mdDoc ((args.description or ''
13       Whether to ${args.feature} while building nixpkgs packages.
14     '') + ''
15       Changing the default may cause a mass rebuild.
16     '');
17   });
19   options = {
21     /* Internal stuff */
23     # Hide built-in module system options from docs.
24     _module.args = mkOption {
25       internal = true;
26     };
28     warnings = mkOption {
29       type = types.listOf types.str;
30       default = [];
31       internal = true;
32     };
34     /* Config options */
36     warnUndeclaredOptions = mkOption {
37       description = lib.mdDoc "Whether to warn when `config` contains an unrecognized attribute.";
38       type = types.bool;
39       default = false;
40     };
42     doCheckByDefault = mkMassRebuild {
43       feature = "run `checkPhase` by default";
44     };
46     strictDepsByDefault = mkMassRebuild {
47       feature = "set `strictDeps` to true by default";
48     };
50     structuredAttrsByDefault = mkMassRebuild {
51       feature = "set `__structuredAttrs` to true by default";
52     };
54     enableParallelBuildingByDefault = mkMassRebuild {
55       feature = "set `enableParallelBuilding` to true by default";
56     };
58     configurePlatformsByDefault = mkMassRebuild {
59       feature = "set `configurePlatforms` to `[\"build\" \"host\"]` by default";
60     };
62     contentAddressedByDefault = mkMassRebuild {
63       feature = "set `__contentAddressed` to true by default";
64     };
66     allowAliases = mkOption {
67       type = types.bool;
68       default = true;
69       description = lib.mdDoc ''
70         Whether to expose old attribute names for compatibility.
72         The recommended setting is to enable this, as it
73         improves backward compatibity, easing updates.
75         The only reason to disable aliases is for continuous
76         integration purposes. For instance, Nixpkgs should
77         not depend on aliases in its internal code. Projects
78         that aren't Nixpkgs should be cautious of instantly
79         removing all usages of aliases, as migrating too soon
80         can break compatibility with the stable Nixpkgs releases.
81       '';
82     };
84     allowUnfree = mkOption {
85       type = types.bool;
86       default = false;
87       # getEnv part is in check-meta.nix
88       defaultText = literalExpression ''false || builtins.getEnv "NIXPKGS_ALLOW_UNFREE" == "1"'';
89       description = lib.mdDoc ''
90         Whether to allow unfree packages.
92         See [Installing unfree packages](https://nixos.org/manual/nixpkgs/stable/#sec-allow-unfree) in the NixOS manual.
93       '';
94     };
96     allowBroken = mkOption {
97       type = types.bool;
98       default = false;
99       # getEnv part is in check-meta.nix
100       defaultText = literalExpression ''false || builtins.getEnv "NIXPKGS_ALLOW_BROKEN" == "1"'';
101       description = lib.mdDoc ''
102         Whether to allow broken packages.
104         See [Installing broken packages](https://nixos.org/manual/nixpkgs/stable/#sec-allow-broken) in the NixOS manual.
105       '';
106     };
108     allowUnsupportedSystem = mkOption {
109       type = types.bool;
110       default = false;
111       # getEnv part is in check-meta.nix
112       defaultText = literalExpression ''false || builtins.getEnv "NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM" == "1"'';
113       description = lib.mdDoc ''
114         Whether to allow unsupported packages.
116         See [Installing packages on unsupported systems](https://nixos.org/manual/nixpkgs/stable/#sec-allow-unsupported-system) in the NixOS manual.
117       '';
118     };
120     cudaSupport = mkMassRebuild {
121       type = types.bool;
122       default = false;
123       feature = "build packages with CUDA support by default";
124     };
126     rocmSupport = mkMassRebuild {
127       type = types.bool;
128       default = false;
129       feature = "build packages with ROCm support by default";
130     };
132     showDerivationWarnings = mkOption {
133       type = types.listOf (types.enum [ "maintainerless" ]);
134       default = [];
135       description = lib.mdDoc ''
136         Which warnings to display for potentially dangerous
137         or deprecated values passed into `stdenv.mkDerivation`.
139         A list of warnings can be found in
140         [/pkgs/stdenv/generic/check-meta.nix](https://github.com/NixOS/nixpkgs/blob/master/pkgs/stdenv/generic/check-meta.nix).
142         This is not a stable interface; warnings may be added, changed
143         or removed without prior notice.
144       '';
145     };
147     checkMeta = mkOption {
148       type = types.bool;
149       default = false;
150       description = lib.mdDoc ''
151         Whether to check that the `meta` attribute of derivations are correct during evaluation time.
152       '';
153     };
154   };
156 in {
158   freeformType =
159     let t = lib.types.lazyAttrsOf lib.types.raw;
160     in t // {
161       merge = loc: defs:
162         let r = t.merge loc defs;
163         in r // { _undeclared = r; };
164     };
166   inherit options;
168   config = {
169     warnings = lib.optionals config.warnUndeclaredOptions (
170       lib.mapAttrsToList (k: v: "undeclared Nixpkgs option set: config.${k}") config._undeclared or {}
171     );
172   };