wlvncc: unstable-2023-01-05 -> unstable-2024-11-24 (#357566)
[NixPkgs.git] / nixos / modules / misc / nixpkgs / read-only.nix
blobe3c4525e7db3c123c3760cb5f2a3ad3c2bef9da3
1 # A replacement for the traditional nixpkgs module, such that none of the modules
2 # can add their own configuration. This ensures that the Nixpkgs configuration is
3 # exactly as the user intends.
4 # This may also be used as a performance optimization when evaluating multiple
5 # configurations at once, with a shared `pkgs`.
7 # This is a separate module, because merging this logic into the nixpkgs module
8 # is too burdensome, considering that it is already burdened with legacy.
9 # Moving this logic into a module does not lose any composition benefits, because
10 # its purpose is not something that composes anyway.
12 { lib, config, ... }:
14 let
15   cfg = config.nixpkgs;
16   inherit (lib) mkOption types;
20   disabledModules = [
21     ../nixpkgs.nix
22   ];
23   options = {
24     nixpkgs = {
25       pkgs = mkOption {
26         type = lib.types.pkgs;
27         description = ''The pkgs module argument.'';
28       };
29       config = mkOption {
30         internal = true;
31         type = types.unique { message = "nixpkgs.config is set to read-only"; } types.anything;
32         description = ''
33           The Nixpkgs `config` that `pkgs` was initialized with.
34         '';
35       };
36       overlays = mkOption {
37         internal = true;
38         type = types.unique { message = "nixpkgs.overlays is set to read-only"; } types.anything;
39         description = ''
40           The Nixpkgs overlays that `pkgs` was initialized with.
41         '';
42       };
43       hostPlatform = mkOption {
44         internal = true;
45         readOnly = true;
46         description = ''
47           The platform of the machine that is running the NixOS configuration.
48         '';
49       };
50       buildPlatform = mkOption {
51         internal = true;
52         readOnly = true;
53         description = ''
54           The platform of the machine that built the NixOS configuration.
55         '';
56       };
57       # NOTE: do not add the legacy options such as localSystem here. Let's keep
58       #       this module simple and let module authors upgrade their code instead.
59     };
60   };
61   config = {
62     _module.args.pkgs =
63       # find mistaken definitions
64       builtins.seq cfg.config
65       builtins.seq cfg.overlays
66       builtins.seq cfg.hostPlatform
67       builtins.seq cfg.buildPlatform
68       cfg.pkgs;
69     nixpkgs.config = cfg.pkgs.config;
70     nixpkgs.overlays = cfg.pkgs.overlays;
71     nixpkgs.hostPlatform = cfg.pkgs.stdenv.hostPlatform;
72     nixpkgs.buildPlatform = cfg.pkgs.stdenv.buildPlatform;
73   };