oxipng: re-enable tests (#375349)
[NixPkgs.git] / nixos / modules / system / activation / specialisation.nix
blob1bc25724853921f7255f7b7f9d9af99c53ac06b8
2   config,
3   lib,
4   pkgs,
5   extendModules,
6   noUserModules,
7   ...
8 }:
10 let
11   inherit (lib)
12     concatStringsSep
13     mapAttrs
14     mapAttrsToList
15     mkOption
16     types
17     ;
19   # This attribute is responsible for creating boot entries for
20   # child configuration. They are only (directly) accessible
21   # when the parent configuration is boot default. For example,
22   # you can provide an easy way to boot the same configuration
23   # as you use, but with another kernel
24   # !!! fix this
25   children = mapAttrs (
26     childName: childConfig: childConfig.configuration.system.build.toplevel
27   ) config.specialisation;
31   options = {
32     isSpecialisation = mkOption {
33       type = lib.types.bool;
34       internal = true;
35       default = false;
36       description = "Whether this system is a specialisation of another.";
37     };
39     specialisation = mkOption {
40       default = { };
41       example = lib.literalExpression "{ fewJobsManyCores.configuration = { nix.settings = { core = 0; max-jobs = 1; }; }; }";
42       description = ''
43         Additional configurations to build. If
44         `inheritParentConfig` is true, the system
45         will be based on the overall system configuration.
47         To switch to a specialised configuration
48         (e.g. `fewJobsManyCores`) at runtime, run:
50         ```
51         sudo /run/current-system/specialisation/fewJobsManyCores/bin/switch-to-configuration test
52         ```
53       '';
54       type = types.attrsOf (
55         types.submodule (
56           local@{ ... }:
57           let
58             extend = if local.config.inheritParentConfig then extendModules else noUserModules.extendModules;
59           in
60           {
61             options.inheritParentConfig = mkOption {
62               type = types.bool;
63               default = true;
64               description = "Include the entire system's configuration. Set to false to make a completely differently configured system.";
65             };
67             options.configuration = mkOption {
68               default = { };
69               description = ''
70                 Arbitrary NixOS configuration.
72                 Anything you can add to a normal NixOS configuration, you can add
73                 here, including imports and config values, although nested
74                 specialisations will be ignored.
75               '';
76               visible = "shallow";
77               inherit (extend { modules = [ ./no-clone.nix ]; }) type;
78             };
79           }
80         )
81       );
82     };
84   };
86   config = {
87     system.systemBuilderCommands = ''
88       mkdir $out/specialisation
89       ${concatStringsSep "\n" (
90         mapAttrsToList (name: path: "ln -s ${path} $out/specialisation/${name}") children
91       )}
92     '';
93   };
95   # uses extendModules to generate a type
96   meta.buildDocsInSandbox = false;