From 2e50368bd224c54e2c72e0c902ae244fd3ad13ee Mon Sep 17 00:00:00 2001 From: Daniel Barlow Date: Thu, 13 Jul 2023 19:24:59 +0100 Subject: [PATCH] rename config.outputs to config.system.outputs New rules: everything under "config" that isn't actually configuration (e.g. build products) will in future live in config.system. This is the first step. --- default.nix | 4 +- devices/gl-ar750/default.nix | 2 +- devices/gl-mt300a/default.nix | 2 +- devices/gl-mt300n-v2/default.nix | 2 +- devices/qemu/default.nix | 2 +- examples/rotuer.nix | 4 +- modules/flashimage.nix | 99 ++++++++++++++++++++------------ modules/initramfs.nix | 14 ++++- modules/jffs2.nix | 15 ++++- modules/kexecboot.nix | 79 +++++++++++++++---------- modules/outputs.nix | 52 ++++++++++++++--- modules/squashfs.nix | 5 +- modules/tftpboot.nix | 78 +++++++++++++++---------- 13 files changed, 236 insertions(+), 122 deletions(-) diff --git a/default.nix b/default.nix index 2c1027b..5f23d16 100644 --- a/default.nix +++ b/default.nix @@ -41,8 +41,8 @@ let ]; }).config.system; in { - outputs = config.outputs // { - default = config.outputs.${config.hardware.defaultOutput}; + outputs = config.system.outputs // { + default = config.system.outputs.${config.hardware.defaultOutput}; }; # this is just here as a convenience, so that we can get a diff --git a/devices/gl-ar750/default.nix b/devices/gl-ar750/default.nix index 8186bb8..ee34139 100644 --- a/devices/gl-ar750/default.nix +++ b/devices/gl-ar750/default.nix @@ -59,7 +59,7 @@ }; mac80211 = pkgs.mac80211.override { drivers = ["ath9k" "ath10k_pci"]; - klibBuild = config.outputs.kernel.modulesupport; + klibBuild = config.system.outputs.kernel.modulesupport; }; ath10k_cal_data = let diff --git a/devices/gl-mt300a/default.nix b/devices/gl-mt300a/default.nix index 13529c0..ac57d6e 100644 --- a/devices/gl-mt300a/default.nix +++ b/devices/gl-mt300a/default.nix @@ -24,7 +24,7 @@ inherit (pkgs) openwrt; mac80211 = pkgs.mac80211.override { drivers = ["rt2800soc"]; - klibBuild = config.outputs.kernel.modulesupport; + klibBuild = config.system.outputs.kernel.modulesupport; }; in { hardware = { diff --git a/devices/gl-mt300n-v2/default.nix b/devices/gl-mt300n-v2/default.nix index 59b69fb..0f0f47c 100644 --- a/devices/gl-mt300n-v2/default.nix +++ b/devices/gl-mt300n-v2/default.nix @@ -20,7 +20,7 @@ mac80211 = pkgs.mac80211.override { drivers = ["mt7603e"]; - klibBuild = config.outputs.kernel.modulesupport; + klibBuild = config.system.outputs.kernel.modulesupport; }; wlan_firmware = pkgs.fetchurl { url = "https://github.com/openwrt/mt76/raw/f24b56f935392ca1d35fae5fd6e56ef9deda4aad/firmware/mt7628_e2.bin"; diff --git a/devices/qemu/default.nix b/devices/qemu/default.nix index d21b664..f9d5af0 100644 --- a/devices/qemu/default.nix +++ b/devices/qemu/default.nix @@ -49,7 +49,7 @@ let mac80211 = pkgs.mac80211.override { drivers = ["mac80211_hwsim"]; - klibBuild = config.outputs.kernel.modulesupport; + klibBuild = config.system.outputs.kernel.modulesupport; }; inherit (pkgs.liminix.networking) interface; in { diff --git a/examples/rotuer.nix b/examples/rotuer.nix index 7973496..3f2880d 100644 --- a/examples/rotuer.nix +++ b/examples/rotuer.nix @@ -238,8 +238,8 @@ in rec { let script= pkgs.firewallgen "firewall.nft" (import ./rotuer-firewall.nix); kmodules = pkgs.kernel-modules.override { - kernelSrc = config.outputs.kernel.src; - modulesupport = config.outputs.kernel.modulesupport; + kernelSrc = config.system.outputs.kernel.src; + modulesupport = config.system.outputs.kernel.modulesupport; kconfig = { NFT_FIB_IPV4 = "m"; NFT_FIB_IPV6 = "m"; diff --git a/modules/flashimage.nix b/modules/flashimage.nix index 4e7675b..686d46c 100644 --- a/modules/flashimage.nix +++ b/modules/flashimage.nix @@ -8,8 +8,32 @@ let inherit (lib) mkOption types concatStringsSep; inherit (config.boot) tftp; in { - options = { + options.system.outputs = { + firmware = mkOption { + type = types.package; + internal = true; # component of flashimage + description = '' + Binary image (combining kernel, FDT, rootfs, initramfs + if needed, etc) for the target device. + ''; + }; + flash-scr = mkOption { + type = types.package; + internal = true; # component of flashimage + description = '' + Copy-pastable U-Boot commands to TFTP download the + image and write it to flash + ''; + }; + flashimage = mkOption { + type = types.package; + description = '' + Flashable image for the target device, and the script to + install it + ''; + }; }; + config = { kernel = { config = { @@ -21,43 +45,44 @@ in { "flashcp" ]; - outputs.firmware = - let o = config.outputs; in - pkgs.runCommand "firmware" {} '' - dd if=${o.uimage} of=$out bs=128k conv=sync - dd if=${o.rootfs} of=$out bs=128k conv=sync,nocreat,notrunc oflag=append - ''; - outputs.flashimage = - let o = config.outputs; in - pkgs.runCommand "flashimage" {} '' - mkdir $out - cd $out - ln -s ${o.firmware} firmware.bin - ln -s ${o.rootfs} rootfs - ln -s ${o.kernel} vmlinux - ln -s ${o.manifest} manifest - ln -s ${o.kernel.headers} build - ln -s ${o.uimage} uimage - ln -s ${o.dtb} dtb - ln -s ${o.flash-scr} flash.scr - ''; - - outputs.flash-scr = - let - inherit (pkgs.lib.trivial) toHexString; - inherit (config.hardware) flash; - in - pkgs.buildPackages.runCommand "" {} '' - imageSize=$(stat -L -c %s ${config.outputs.firmware}) - cat > $out << EOF - setenv serverip ${tftp.serverip} - setenv ipaddr ${tftp.ipaddr} - tftp 0x$(printf %x ${tftp.loadAddress}) result/firmware.bin - erase 0x$(printf %x ${flash.address}) +${flash.size} - cp.b 0x$(printf %x ${tftp.loadAddress}) 0x$(printf %x ${flash.address}) \''${filesize} - echo command line was ${builtins.toJSON (concatStringsSep " " config.boot.commandLine)} - EOF + system.outputs = { + firmware = + let o = config.system.outputs; in + pkgs.runCommand "firmware" {} '' + dd if=${o.uimage} of=$out bs=128k conv=sync + dd if=${o.rootfs} of=$out bs=128k conv=sync,nocreat,notrunc oflag=append ''; + flashimage = + let o = config.system.outputs; in + pkgs.runCommand "flashimage" {} '' + mkdir $out + cd $out + ln -s ${o.firmware} firmware.bin + ln -s ${o.rootfs} rootfs + ln -s ${o.kernel} vmlinux + ln -s ${o.manifest} manifest + ln -s ${o.kernel.headers} build + ln -s ${o.uimage} uimage + ln -s ${o.dtb} dtb + ln -s ${o.flash-scr} flash.scr + ''; + flash-scr = + let + inherit (pkgs.lib.trivial) toHexString; + inherit (config.hardware) flash; + in + pkgs.buildPackages.runCommand "" {} '' + imageSize=$(stat -L -c %s ${config.system.outputs.firmware}) + cat > $out << EOF + setenv serverip ${tftp.serverip} + setenv ipaddr ${tftp.ipaddr} + tftp 0x$(printf %x ${tftp.loadAddress}) result/firmware.bin + erase 0x$(printf %x ${flash.address}) +${flash.size} + cp.b 0x$(printf %x ${tftp.loadAddress}) 0x$(printf %x ${flash.address}) \''${filesize} + echo command line was ${builtins.toJSON (concatStringsSep " " config.boot.commandLine)} + EOF + ''; + }; }; } diff --git a/modules/initramfs.nix b/modules/initramfs.nix index 4116424..5f8b117 100644 --- a/modules/initramfs.nix +++ b/modules/initramfs.nix @@ -5,7 +5,7 @@ , ... }: let - inherit (lib) mkEnableOption mkIf; + inherit (lib) mkEnableOption mkOption mkIf types; inherit (pkgs) runCommand callPackage writeText; in { @@ -14,15 +14,23 @@ in enable = mkEnableOption "enable initramfs"; default = false; }; + system.outputs.initramfs = mkOption { + type = types.package; + internal = true; + description = '' + Initramfs image capable of mounting the jffs2 root + filesystem + ''; + }; }; config = mkIf config.boot.initramfs.enable { kernel.config = { BLK_DEV_INITRD = "y"; - INITRAMFS_SOURCE = builtins.toJSON "${config.outputs.initramfs}"; + INITRAMFS_SOURCE = builtins.toJSON "${config.system.outputs.initramfs}"; # INITRAMFS_COMPRESSION_LZO = "y"; }; - outputs = { + system.outputs = { initramfs = let inherit (pkgs.pkgsBuildBuild) gen_init_cpio; in runCommand "initramfs.cpio" {} '' diff --git a/modules/jffs2.nix b/modules/jffs2.nix index fdda2ab..52dfdd1 100644 --- a/modules/jffs2.nix +++ b/modules/jffs2.nix @@ -5,12 +5,23 @@ , ... }: let - inherit (lib) mkIf; + inherit (lib) mkIf mkOption types; in { imports = [ ./initramfs.nix ]; + options.system.outputs = { + systemConfiguration = mkOption { + type = types.package; + description = '' + pkgs.systemconfig for the configured filesystem, + contains 'activate' and 'init' commands + ''; + internal = true; + }; + }; + config = mkIf (config.rootfsType == "jffs2") { kernel.config = { JFFS2_FS = "y"; @@ -21,7 +32,7 @@ in JFFS2_CMODE_SIZE = "y"; }; boot.initramfs.enable = true; - outputs = rec { + system.outputs = rec { systemConfiguration = pkgs.systemconfig config.filesystem.contents; rootfs = diff --git a/modules/kexecboot.nix b/modules/kexecboot.nix index c34c1d5..e99ff9e 100644 --- a/modules/kexecboot.nix +++ b/modules/kexecboot.nix @@ -8,39 +8,56 @@ let inherit (lib) mkOption mkForce types concatStringsSep; in { imports = [ ./ramdisk.nix ]; + options.system.outputs = { + kexecboot = mkOption { + type = types.package; + description = '' + Directory containing files needed for kexec booting. + Can be copied onto the target device using ssh or similar + ''; + }; + boot-sh = mkOption { + type = types.package; + description = '' + Shell script to run on the target device that invokes + kexec with appropriate options + ''; + }; + }; config = { boot.ramdisk.enable = true; + system.outputs = { + kexecboot = + let o = config.system.outputs; in + pkgs.runCommand "kexecboot" {} '' + mkdir $out + cd $out + ln -s ${o.rootfs} rootfs + ln -s ${o.kernel} kernel + ln -s ${o.manifest} manifest + ln -s ${o.boot-sh} boot.sh + ln -s ${pkgs.kexec-tools-static}/bin/kexec ./kexec + ln -s ${o.dtb} dtb + ''; - outputs.kexecboot = - let o = config.outputs; in - pkgs.runCommand "kexecboot" {} '' - mkdir $out - cd $out - ln -s ${o.rootfs} rootfs - ln -s ${o.kernel} kernel - ln -s ${o.manifest} manifest - ln -s ${o.boot-sh} boot.sh - ln -s ${pkgs.kexec-tools-static}/bin/kexec ./kexec - ln -s ${o.dtb} dtb - ''; - - outputs.boot-sh = - let - inherit (pkgs.lib.trivial) toHexString; - inherit (config.outputs) rootfs kernel; - cmdline = concatStringsSep " " config.boot.commandLine; - in - pkgs.buildPackages.runCommand "boot.sh.sh" { - } '' - rootfsStart=${toString (100 * 1024 * 1024)} - rootfsBytes=$(stat -L -c %s ${rootfs}) - append_cmd="mtdparts=phram0:''${rootfsBytes}(rootfs) phram.phram=phram0,''${rootfsStart},''${rootfsBytes} memmap=''${rootfsBytes}\$''${rootfsStart}"; - cat > $out < $out < $out << EOF - setenv serverip ${cfg.serverip} - setenv ipaddr ${cfg.ipaddr} - setenv bootargs 'liminix $cmd' - tftp 0x$(printf %x ${cfg.loadAddress}) result/uimage ; tftp 0x$(printf %x $rootfsStart) result/rootfs - bootm 0x$(printf %x ${cfg.loadAddress}) - EOF - ''; + cat > $out << EOF + setenv serverip ${cfg.serverip} + setenv ipaddr ${cfg.ipaddr} + setenv bootargs 'liminix $cmd' + tftp 0x$(printf %x ${cfg.loadAddress}) result/uimage ; tftp 0x$(printf %x $rootfsStart) result/rootfs + bootm 0x$(printf %x ${cfg.loadAddress}) + EOF + ''; + }; }; }