forked from NixOS/nixpkgs
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconfig.nix
More file actions
513 lines (423 loc) · 17.6 KB
/
config.nix
File metadata and controls
513 lines (423 loc) · 17.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
# This file defines the structure of the `config` nixpkgs option.
# This file is tested in `pkgs/test/config.nix`.
# Run tests with:
#
# nix-build -A tests.config
#
{ config, lib, ... }:
let
inherit (lib)
literalExpression
mapAttrsToList
mkOption
optionals
types
;
mkMassRebuild =
args:
mkOption (
removeAttrs args [ "feature" ]
// {
type = args.type or (types.uniq types.bool);
default = args.default or false;
description = (
(args.description or ''
Whether to ${args.feature} while building nixpkgs packages.
''
)
+ ''
Changing the default may cause a mass rebuild.
''
);
}
);
options = {
# Internal stuff
# Hide built-in module system options from docs.
_module.args = mkOption {
internal = true;
};
# Should be replaced by importing <nixos/modules/misc/assertions.nix> in the future
# see also https://github.com/NixOS/nixpkgs/pull/207187
warnings = mkOption {
type = types.listOf types.str;
default = [ ];
internal = true;
};
assertions = mkOption {
type = types.listOf types.anything;
default = [ ];
internal = true;
};
# Config options
warnUndeclaredOptions = mkOption {
description = "Whether to warn when `config` contains an unrecognized attribute.";
type = types.bool;
default = false;
};
fetchedSourceNameDefault = mkOption {
type = types.uniq (
types.enum [
"source"
"versioned"
"full"
]
);
default = "source";
description = ''
This controls the default derivation `name` attribute set by the
`fetch*` (`fetchzip`, `fetchFromGitHub`, etc) functions.
Possible values and the resulting `.name`:
- `"source"` -> `"source"`
- `"versioned"` -> `"''${repo}-''${rev}-source"`
- `"full"` -> `"''${repo}-''${rev}-''${fetcherName}-source"`
The default `"source"` is the best choice for minimal rebuilds, it
will ignore any non-hash changes (like branches being renamed, source
URLs changing, etc) at the cost of `/nix/store` being easily
cache-poisoned (see [NixOS/nix#969](https://github.com/NixOS/nix/issues/969)).
Setting this to `"versioned"` greatly helps with discoverability of
sources in `/nix/store` and makes cache-poisoning of `/nix/store` much
harder, at the cost of a single mass-rebuild for all `src`
derivations, and an occasional rebuild when a source changes some of
its non-hash attributes.
Setting this to `"full"` is similar to setting it to `"versioned"`,
but the use of `fetcherName` in the derivation name will force a
rebuild when `src` switches between `fetch*` functions, thus forcing
`nix` to check new derivation's `outputHash`, which is useful for
debugging.
Also, `"full"` is useful for easy collection and tracking of
statistics of where the packages you use are hosted.
If you are a developer, you should probably set this to at
least`"versioned"`.
Changing the default will cause a mass rebuild.
'';
};
gitConfig = mkOption {
type = types.attrsOf (types.attrsOf types.anything);
description = ''
The default [git configuration](https://git-scm.com/docs/git-config#_variables) for all [`pkgs.fetchgit`](#fetchgit) calls.
Among many other potential uses, this can be used to override URLs to point to local mirrors.
Changing this will not cause any rebuilds because `pkgs.fetchgit` produces a [fixed-output derivation](https://nix.dev/manual/nix/stable/glossary.html?highlight=fixed-output%20derivation#gloss-fixed-output-derivation).
To set the configuration file directly, use the [`gitConfigFile`](#opt-gitConfigFile) option instead.
To set the configuration file for individual calls, use `fetchgit { gitConfigFile = "..."; }`.
'';
default = { };
example = {
url."https://my-github-mirror.local".insteadOf = [ "https://github.com" ];
};
};
# A rendered version of gitConfig that can be reused by all pkgs.fetchgit calls
gitConfigFile = mkOption {
type = types.nullOr types.path;
description = ''
A path to a [git configuration](https://git-scm.com/docs/git-config#_variables) file, to be used for all [`pkgs.fetchgit`](#fetchgit) calls.
This overrides the [`gitConfig`](#opt-gitConfig) option, see its documentation for more details.
'';
default =
if config.gitConfig != { } then
builtins.toFile "gitconfig" (lib.generators.toGitINI config.gitConfig)
else
null;
};
npmRegistryOverrides = mkOption {
type = types.attrsOf types.str;
description = ''
The default NPM registry overrides for all `fetchNpmDeps` calls, as an attribute set.
For each attribute, all files fetched from the host corresponding to the name will instead be fetched from the host (and sub-path) specified in the value.
For example, an override like `"registry.npmjs.org" = "my-mirror.local/registry.npmjs.org"` will replace a URL like `https://registry.npmjs.org/foo.tar.gz` with `https://my-mirror.local/registry.npmjs.org/foo.tar.gz`.
To set the string directly, see [`npmRegistryOverridesString`](#opt-npmRegistryOverridesString).
'';
default = { };
example = {
"registry.npmjs.org" = "my-mirror.local/registry.npmjs.org";
};
};
npmRegistryOverridesString = mkOption {
type = types.addCheck types.str (
s:
let
j = builtins.fromJSON s;
in
lib.isAttrs j && lib.all builtins.isString (builtins.attrValues j)
);
description = ''
A string containing a string with a JSON representation of NPM registry overrides for `fetchNpmDeps`.
This overrides the [`npmRegistryOverrides`](#opt-npmRegistryOverrides) option, see its documentation for more details.
'';
default = builtins.toJSON config.npmRegistryOverrides;
};
doCheckByDefault = mkMassRebuild {
feature = "run `checkPhase` by default";
};
strictDepsByDefault = mkMassRebuild {
feature = "set `strictDeps` to true by default";
};
structuredAttrsByDefault = mkMassRebuild {
feature = "set `__structuredAttrs` to true by default";
};
enableParallelBuildingByDefault = mkMassRebuild {
feature = "set `enableParallelBuilding` to true by default";
};
configurePlatformsByDefault = mkMassRebuild {
feature = "set `configurePlatforms` to `[\"build\" \"host\"]` by default";
};
contentAddressedByDefault = mkMassRebuild {
feature = "set `__contentAddressed` to true by default";
};
allowAliases = mkOption {
type = types.bool;
default = true;
description = ''
Whether to expose old attribute names for compatibility.
The recommended setting is to enable this, as it
improves backward compatibility, easing updates.
The only reason to disable aliases is for continuous
integration purposes. For instance, Nixpkgs should
not depend on aliases in its internal code. Projects
that aren't Nixpkgs should be cautious of instantly
removing all usages of aliases, as migrating too soon
can break compatibility with the stable Nixpkgs releases.
'';
};
allowUnfree = mkOption {
type = types.bool;
default = false;
# getEnv part is in check-meta.nix
defaultText = literalExpression ''false || builtins.getEnv "NIXPKGS_ALLOW_UNFREE" == "1"'';
description = ''
Whether to allow unfree packages.
See [Installing unfree packages](https://nixos.org/manual/nixpkgs/stable/#sec-allow-unfree) in the NixOS manual.
'';
};
allowUnfreePackages = mkOption {
type = with lib.types; listOf str;
default = [ ];
example = [ "ut1999" ];
description = ''
Allows specific unfree packages to be used.
This option composes with `nixpkgs.config.allowUnfreePredicate` by also allowing the listed package names.
Unlike `nixpkgs.config.allowUnfreePredicate`, this option merges additively, similar to `environment.systemPackages`.
This enables defining allowed unfree packages in multiple modules, close to where they are used.
This avoids the need to centralize all unfree package declarations or globally enable unfree packages via
`nixpkgs.config.allowUnfree = true`.
'';
};
allowBroken = mkOption {
type = types.bool;
default = false;
# getEnv part is in check-meta.nix
defaultText = literalExpression ''false || builtins.getEnv "NIXPKGS_ALLOW_BROKEN" == "1"'';
description = ''
Whether to allow broken packages.
See [Installing broken packages](https://nixos.org/manual/nixpkgs/stable/#sec-allow-broken) in the NixOS manual.
'';
};
allowUnsupportedSystem = mkOption {
type = types.bool;
default = false;
# getEnv part is in check-meta.nix
defaultText = literalExpression ''false || builtins.getEnv "NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM" == "1"'';
description = ''
Whether to allow unsupported packages.
See [Installing packages on unsupported systems](https://nixos.org/manual/nixpkgs/stable/#sec-allow-unsupported-system) in the NixOS manual.
'';
};
allowVariants = mkOption {
type = types.bool;
default = true;
description = ''
Whether to expose the nixpkgs variants.
Variants are instances of the current nixpkgs instance with different stdenvs or other applied options.
This allows for using different toolchains, libcs, or global build changes across nixpkgs.
Disabling can ensure nixpkgs is only building for the platform which you specified.
'';
};
cudaSupport = mkMassRebuild {
feature = "build packages with CUDA support by default";
};
cudaCapabilities = mkOption {
type = types.listOf types.str;
default = [ ];
description = ''
A list of CUDA capabilities to build for.
Packages may use this option to control device code generation to
take advantage of architecture-specific functionality, speed up
compile times by producing less device code, or slim package closures.
For example, you can build for Ada Lovelace GPUs with
`cudaCapabilities = [ "8.9" ];`.
If not provided, the default value is calculated per-package set,
derived from a list of GPUs supported by that CUDA version.
See the [CUDA section](https://nixos.org/manual/nixpkgs/stable/#cuda) in
the Nixpkgs manual for more information.
'';
};
cudaForwardCompat = mkOption {
type = types.bool;
default = true;
description = ''
Whether to enable PTX support for future hardware.
When enabled, packages will include PTX code that can be JIT-compiled
for GPUs newer than those explicitly targeted by `cudaCapabilities`.
'';
};
replaceBootstrapFiles = mkMassRebuild {
type = types.functionTo (types.attrsOf types.package);
default = lib.id;
defaultText = literalExpression "lib.id";
description = ''
Use the bootstrap files returned instead of the default bootstrap
files.
The default bootstrap files are passed as an argument.
'';
example = literalExpression ''
prevFiles:
let
replacements = {
"sha256-YQlr088HPoVWBU2jpPhpIMyOyoEDZYDw1y60SGGbUM0=" = import <nix/fetchurl.nix> {
url = "(custom glibc linux x86_64 bootstrap-tools.tar.xz)";
hash = "(...)";
};
"sha256-QrTEnQTBM1Y/qV9odq8irZkQSD9uOMbs2Q5NgCvKCNQ=" = import <nix/fetchurl.nix> {
url = "(custom glibc linux x86_64 busybox)";
hash = "(...)";
executable = true;
};
};
in
builtins.mapAttrs (name: prev: replacements.''${prev.outputHash} or prev) prevFiles
'';
};
replaceStdenv = mkMassRebuild {
type = types.nullOr (types.functionTo types.package);
default = null;
defaultText = literalExpression "null";
description = ''
A function to replace the standard environment (stdenv).
The function receives an attribute set with `pkgs` and should return
a stdenv derivation.
This can be used to globally replace the stdenv with a custom one,
for example to use ccache or distcc.
'';
example = literalExpression "{ pkgs }: pkgs.ccacheStdenv";
};
rocmSupport = mkMassRebuild {
feature = "build packages with ROCm support by default";
};
showDerivationWarnings = mkOption {
type = types.listOf (types.enum [ "maintainerless" ]);
default = [ ];
description = ''
Which warnings to display for potentially dangerous
or deprecated values passed into `stdenv.mkDerivation`.
A list of warnings can be found in
[/pkgs/stdenv/generic/check-meta.nix](https://github.com/NixOS/nixpkgs/blob/master/pkgs/stdenv/generic/check-meta.nix).
This is not a stable interface; warnings may be added, changed
or removed without prior notice.
'';
};
checkMeta = mkOption {
type = types.bool;
default = false;
description = ''
Whether to check that the `meta` attribute of derivations are correct during evaluation time.
'';
};
hashedMirrors = mkOption {
type = types.listOf types.str;
default = [ "https://tarballs.nixos.org" ];
description = ''
The set of content-addressed/hashed mirror URLs used by [`pkgs.fetchurl`](#sec-pkgs-fetchers-fetchurl).
In case `pkgs.fetchurl` can't download from the given URLs,
it will try the hashed mirrors based on the expected output hash.
See [`copy-tarballs.pl`](https://github.com/NixOS/nixpkgs/blob/a2d829eaa7a455eaa3013c45f6431e705702dd46/maintainers/scripts/copy-tarballs.pl)
for more details on how hashed mirrors are constructed.
'';
};
rewriteURL = mkOption {
type = types.functionTo (types.nullOr types.str);
description = ''
A hook to rewrite/filter URLs before they are fetched.
The function is passed the URL as a string, and is expected to return a new URL, or null if the given URL should not be attempted.
This function is applied _prior_ to resolving mirror:// URLs.
The intended use is to allow URL rewriting to insert company-internal mirrors, or work around company firewalls and similar network restrictions.
'';
default = lib.id;
defaultText = literalExpression "(url: url)";
example = literalExpression ''
{
# Use Nix like it's 2024! ;-)
rewriteURL = url: "https://web.archive.org/web/2024/''${url}";
}
'';
};
microsoftVisualStudioLicenseAccepted = mkOption {
type = types.bool;
default = false;
# getEnv part is in check-meta.nix
defaultText = literalExpression ''false || builtins.getEnv "NIXPKGS_ALLOW_UNFREE" == "1"'';
description = ''
If the Microsoft Visual Studio license has been accepted.
Please read https://www.visualstudio.com/license-terms/mt644918/ and enable this config if you accept.
'';
};
allowDeprecatedx86_64Darwin = mkOption {
# `force` does nothing; it’s reserved for forward compatibility
# with 26.11. We hide it from the documentation to avoid a
# footgun, as it will make the error in 26.11 less useful.
type = types.either types.bool (types.enum [ "force" ]) // {
inherit (types.bool) description descriptionClass;
};
default = false;
description = ''
Silence the warning for the upcoming deprecation of the
`x86_64-darwin` platform in Nixpkgs 26.11.
This does nothing in 25.11, and is provided there for forward
compatibility of configurations with 26.05.
'';
};
problems = (import ../stdenv/generic/problems.nix { inherit lib; }).configOptions;
};
in
{
freeformType =
let
t = types.lazyAttrsOf types.raw;
in
t
// {
merge =
loc: defs:
let
r = t.merge loc defs;
in
r // { _undeclared = r; };
};
inherit options;
config = {
warnings =
optionals config.warnUndeclaredOptions (
mapAttrsToList (k: v: "undeclared Nixpkgs option set: config.${k}") config._undeclared or { }
)
++ lib.optional (config.showDerivationWarnings != [ ]) ''
`config.showDerivationWarnings = [ "maintainerless" ]` is deprecated, use `config.problems` instead:
config.problems.matchers = [ { kind = "maintainerless"; handler = "warn"; } ];
See this page for more details: https://nixos.org/manual/nixpkgs/unstable#sec-problems
'';
assertions =
# Collect the assertions from the problems.matchers.* submodules, propagate them into here
lib.concatMap (matcher: matcher.assertions) config.problems.matchers;
# Put the default value for matchers in here (as in, not as an *actual* mkDefault default value),
# to force it being merged with any custom values instead of being overridden.
problems.matchers = [
# Be loud and clear about package removals
{
kind = "removal";
handler = "warn";
}
(lib.mkIf (lib.elem "maintainerless" config.showDerivationWarnings) {
kind = "maintainerless";
handler = "warn";
})
];
};
}