anyrun: 0-unstable-2024-11-08 -> 0-unstable-2024-12-27 (#369731)
[NixPkgs.git] / nixos / modules / system / boot / loader / generic-extlinux-compatible / default.nix
blob797f0d81f14cadde64f64f72f969b367063e19d9
1 { config, lib, pkgs, ... }:
3 with lib;
5 let
6   blCfg = config.boot.loader;
7   dtCfg = config.hardware.deviceTree;
8   cfg = blCfg.generic-extlinux-compatible;
10   timeoutStr = if blCfg.timeout == null then "-1" else toString blCfg.timeout;
12   # The builder used to write during system activation
13   builder = import ./extlinux-conf-builder.nix { inherit pkgs; };
14   # The builder exposed in populateCmd, which runs on the build architecture
15   populateBuilder = import ./extlinux-conf-builder.nix { pkgs = pkgs.buildPackages; };
18   options = {
19     boot.loader.generic-extlinux-compatible = {
20       enable = mkOption {
21         default = false;
22         type = types.bool;
23         description = ''
24           Whether to generate an extlinux-compatible configuration file
25           under `/boot/extlinux.conf`.  For instance,
26           U-Boot's generic distro boot support uses this file format.
28           See [U-boot's documentation](https://u-boot.readthedocs.io/en/latest/develop/distro.html)
29           for more information.
30         '';
31       };
33       useGenerationDeviceTree = mkOption {
34         default = true;
35         type = types.bool;
36         description = ''
37           Whether to generate Device Tree-related directives in the
38           extlinux configuration.
40           When enabled, the bootloader will attempt to load the device
41           tree binaries from the generation's kernel.
43           Note that this affects all generations, regardless of the
44           setting value used in their configurations.
45         '';
46       };
48       configurationLimit = mkOption {
49         default = 20;
50         example = 10;
51         type = types.int;
52         description = ''
53           Maximum number of configurations in the boot menu.
54         '';
55       };
57       mirroredBoots = mkOption {
58         default = [ { path = "/boot"; } ];
59         example = [
60           { path = "/boot1"; }
61           { path = "/boot2"; }
62         ];
63         description = ''
64           Mirror the boot configuration to multiple paths.
65         '';
67         type = with types; listOf (submodule {
68           options = {
69             path = mkOption {
70               example = "/boot1";
71               type = types.str;
72               description = ''
73                 The path to the boot directory where the extlinux-compatible
74                 configuration files will be written.
75               '';
76             };
77           };
78         });
79       };
81       populateCmd = mkOption {
82         type = types.str;
83         readOnly = true;
84         description = ''
85           Contains the builder command used to populate an image,
86           honoring all options except the `-c <path-to-default-configuration>`
87           argument.
88           Useful to have for sdImage.populateRootCommands
89         '';
90       };
92     };
93   };
95   config = let
96     builderArgs = "-g ${toString cfg.configurationLimit} -t ${timeoutStr}"
97       + lib.optionalString (dtCfg.name != null) " -n ${dtCfg.name}"
98       + lib.optionalString (!cfg.useGenerationDeviceTree) " -r";
99     installBootLoader = pkgs.writeScript "install-extlinux-conf.sh" (''
100       #!${pkgs.runtimeShell}
101       set -e
102     '' + flip concatMapStrings cfg.mirroredBoots (args: ''
103       ${builder} ${builderArgs} -d '${args.path}' -c "$@"
104     ''));
105   in
106     mkIf cfg.enable {
107       system.build.installBootLoader = installBootLoader;
108       system.boot.loader.id = "generic-extlinux-compatible";
110       boot.loader.generic-extlinux-compatible.populateCmd = "${populateBuilder} ${builderArgs}";
112       assertions = [
113         {
114           assertion = cfg.mirroredBoots != [ ];
115           message = ''
116             You must not remove all elements from option 'boot.loader.generic-extlinux-compatible.mirroredBoots',
117             otherwise the system will not be bootable.
118           '';
119         }
120       ];
121     };