1{
2 config,
3 lib,
4 pkgs,
5 extendModules,
6 ...
7}:
8let
9 inherit (lib) types;
10
11 imageModules = {
12 amazon = ../../maintainers/scripts/ec2/amazon-image.nix;
13 azure = ../virtualisation/azure-image.nix;
14 cloudstack = ../../maintainers/scripts/cloudstack/cloudstack-image.nix;
15 digital-ocean = ../virtualisation/digital-ocean-image.nix;
16 google-compute = ../virtualisation/google-compute-image.nix;
17 hyperv = ../virtualisation/hyperv-image.nix;
18 linode = ../virtualisation/linode-image.nix;
19 lxc = ../virtualisation/lxc-container.nix;
20 lxc-metadata = ../virtualisation/lxc-image-metadata.nix;
21 oci = ../virtualisation/oci-image.nix;
22 openstack = ../../maintainers/scripts/openstack/openstack-image.nix;
23 openstack-zfs = ../../maintainers/scripts/openstack/openstack-image-zfs.nix;
24 proxmox = ../virtualisation/proxmox-image.nix;
25 proxmox-lxc = ../virtualisation/proxmox-lxc.nix;
26 qemu-efi = ../virtualisation/disk-image.nix;
27 qemu = {
28 imports = [ ../virtualisation/disk-image.nix ];
29 image.efiSupport = false;
30 };
31 raw-efi = {
32 imports = [ ../virtualisation/disk-image.nix ];
33 image.format = "raw";
34 };
35 raw = {
36 imports = [ ../virtualisation/disk-image.nix ];
37 image.format = "raw";
38 image.efiSupport = false;
39 };
40 kubevirt = ../virtualisation/kubevirt.nix;
41 vagrant-virtualbox = ../virtualisation/vagrant-virtualbox-image.nix;
42 virtualbox = ../virtualisation/virtualbox-image.nix;
43 vmware = ../virtualisation/vmware-image.nix;
44 iso = ../installer/cd-dvd/iso-image.nix;
45 iso-installer = ../installer/cd-dvd/installation-cd-base.nix;
46 sd-card = {
47 imports =
48 let
49 module = ../. + "/installer/sd-card/sd-image-${pkgs.targetPlatform.qemuArch}.nix";
50 in
51 if builtins.pathExists module then
52 [ module ]
53 else
54 throw "The module ${toString module} does not exist.";
55 };
56 kexec = ../installer/netboot/netboot-minimal.nix;
57 };
58 imageConfigs = lib.mapAttrs (
59 name: module:
60 extendModules {
61 modules = [ module ];
62 }
63 ) config.image.modules;
64in
65{
66 options = {
67 system.build = {
68 images = lib.mkOption {
69 type = types.lazyAttrsOf types.raw;
70 readOnly = true;
71 description = ''
72 Different target images generated for this NixOS configuration.
73 '';
74 };
75 };
76 image.modules = lib.mkOption {
77 type = types.attrsOf types.deferredModule;
78 description = ''
79 image-specific NixOS Modules used for `system.build.images`.
80 '';
81 };
82 };
83
84 config.image.modules = lib.mkIf (!config.system.build ? image) imageModules;
85 config.system.build.images = lib.mkIf (!config.system.build ? image) (
86 lib.mapAttrs (
87 name: nixos:
88 let
89 inherit (nixos) config;
90 inherit (config.image) filePath;
91 builder =
92 config.system.build.image
93 or (throw "Module for `system.build.images.${name}` misses required `system.build.image` option.");
94 in
95 lib.recursiveUpdate builder {
96 passthru = {
97 inherit config filePath;
98 };
99 }
100 ) imageConfigs
101 );
102}