diff --git a/default.nix b/default.nix index a606104..841aa45 100644 --- a/default.nix +++ b/default.nix @@ -11,8 +11,7 @@ let overlays = [overlay]; config = {allowUnsupportedSystem = true; }; }); - inherit (pkgs) callPackage writeText liminix fetchFromGitHub; - inherit (pkgs.lib) concatStringsSep; + config = (import ./merge-modules.nix) [ ./modules/base.nix device.module @@ -20,79 +19,13 @@ let ./modules/s6 ./modules/users.nix (if phram then ./modules/phram.nix else (args: {})) + ./modules/outputs.nix ] pkgs; - squashfs = liminix.builders.squashfs config.filesystem.contents; - openwrt = fetchFromGitHub { - name = "openwrt-source"; - repo = "openwrt"; - owner = "openwrt"; - rev = "a5265497a4f6da158e95d6a450cb2cb6dc085cab"; - hash = "sha256-YYi4gkpLjbOK7bM2MGQjAyEBuXJ9JNXoz/JEmYf8xE8="; - }; - - outputs = rec { - inherit squashfs; - kernel = liminix.builders.kernel.override { - inherit (config.kernel) config src extraPatchPhase; - }; - dtb = (callPackage ./kernel/dtb.nix {}) { - dts = config.kernel.dts; - includes = [ - "${openwrt}/target/linux/ath79/dts" - "${kernel.headers}/include" - ]; - }; - uimage = (callPackage ./kernel/uimage.nix {}) { - commandLine = concatStringsSep " " config.boot.commandLine; - inherit (config.device) loadAddress entryPoint; - inherit kernel; - inherit dtb; - }; - combined-image = pkgs.runCommand "firmware.bin" { - nativeBuildInputs = [ pkgs.buildPackages.ubootTools ]; - } '' - mkdir $out - dd if=${uimage} of=$out/firmware.bin bs=128k conv=sync - dd if=${squashfs} of=$out/firmware.bin bs=128k conv=sync,nocreat,notrunc oflag=append - ''; - boot-scr = - let - inherit (pkgs.lib.trivial) toHexString; - uimageStart = 10485760; # 0xa00000 - squashfsStart = uimageStart + 4 * 1024 * 1024; - squashfsSize = 8; - cmd = "mtdparts=phram0:${toString squashfsSize}M(nix) phram.phram=phram0,0x${toHexString squashfsStart},${toString squashfsSize}Mi memmap=${toString squashfsSize}M\$0x${toHexString squashfsStart} root=1f00"; - in - pkgs.buildPackages.writeScript "firmware.bin" '' - setenv serverip 192.168.8.148 - setenv ipaddr 192.168.8.251 - setenv bootargs '${concatStringsSep " " config.boot.commandLine} ${cmd}' - tftp 0x8${toHexString uimageStart} result/uimage ; tftp 0x8${toHexString squashfsStart} result/squashfs - bootm 0x${toHexString uimageStart} - ''; - - directory = pkgs.runCommand "liminix" {} ('' - mkdir $out - cd $out - ln -s ${squashfs} squashfs - ln -s ${kernel} vmlinux - ln -s ${manifest} manifest - ln -s ${kernel.headers} build - '' + - (if config.device.loadAddress != null then - '' - ln -s {uimage} uimage - ${if phram then "ln -s ${boot-scr} boot.scr" else ""} - ln -s ${boot-scr} flash.scr - '' else "")); - # this exists so that you can run "nix-store -q --tree" on it and find - # out what's in the image, which is nice if it's unexpectedly huge - manifest = writeText "manifest.json" (builtins.toJSON config.filesystem.contents); - tftpd = pkgs.buildPackages.tufted; - }; in { - outputs = outputs // { default = outputs.${config.device.defaultOutput}; }; + outputs = config.outputs // { + default = config.outputs.${config.device.defaultOutput}; + }; # this is just here as a convenience, so that we can get a # cross-compiling nix-shell for any package we're customizing diff --git a/devices/gl-ar750/default.nix b/devices/gl-ar750/default.nix index a7982f8..6ef1cdd 100644 --- a/devices/gl-ar750/default.nix +++ b/devices/gl-ar750/default.nix @@ -59,7 +59,12 @@ patches ${openwrt}/target/linux/generic/hack-5.15/*.patch patches ${openwrt}/target/linux/ath79/patches-5.15/*.patch ''; - dts = "${openwrt}/target/linux/ath79/dts/qca9531_glinet_gl-ar750.dts"; + dts = { + src = "${openwrt}/target/linux/ath79/dts/qca9531_glinet_gl-ar750.dts"; + includes = [ + "${openwrt}/target/linux/ath79/dts" + ]; + }; config = { MIPS_ELF_APPENDED_DTB = "y"; OF = "y"; diff --git a/devices/gl-mt300a/default.nix b/devices/gl-mt300a/default.nix index 6172cef..9dd0b5e 100644 --- a/devices/gl-mt300a/default.nix +++ b/devices/gl-mt300a/default.nix @@ -46,7 +46,12 @@ patches ${openwrt}/target/linux/generic/hack-5.15/*.patch patches ${openwrt}/target/linux/ramips/patches-5.15/*.patch ''; - dts = "${openwrt}/target/linux/ramips/dts/mt7620a_glinet_gl-mt300a.dts"; + dts = { + src = "${openwrt}/target/linux/ramips/dts/mt7620a_glinet_gl-mt300a.dts"; + includes = [ + "${openwrt}/target/linux/ramips/dts" + ]; + }; config = { MIPS_ELF_APPENDED_DTB = "y"; OF = "y"; diff --git a/devices/gl-mt300n-v2/default.nix b/devices/gl-mt300n-v2/default.nix index ef19e1c..44a2e9b 100644 --- a/devices/gl-mt300n-v2/default.nix +++ b/devices/gl-mt300n-v2/default.nix @@ -46,7 +46,12 @@ patches ${openwrt}/target/linux/generic/hack-5.15/*.patch patches ${openwrt}/target/linux/ramips/patches-5.15/*.patch ''; - dts = "${openwrt}/target/linux/ramips/dts/mt7628an_glinet_gl-mt300n-v2.dts"; + dts = { + src = "${openwrt}/target/linux/ramips/dts/mt7628an_glinet_gl-mt300n-v2.dts"; + includes = [ + "${openwrt}/target/linux/ramips/dts" + ]; + }; config = { MIPS_ELF_APPENDED_DTB = "y"; OF = "y"; diff --git a/modules/base.nix b/modules/base.nix index 9c16df6..e290e06 100644 --- a/modules/base.nix +++ b/modules/base.nix @@ -29,7 +29,13 @@ in { default = "true"; type = types.lines; } ; - dts = mkOption { type = types.path; }; + dts = { + src = mkOption { type = types.path; }; + includes = mkOption { + default = []; + type = types.listOf types.path; + }; + }; config = mkOption { # mostly the values are y n or m, but sometimes # other strings are also used diff --git a/modules/outputs.nix b/modules/outputs.nix new file mode 100644 index 0000000..2cd92cb --- /dev/null +++ b/modules/outputs.nix @@ -0,0 +1,78 @@ +{ + config +, pkgs +, lib +, ... +}: +let + inherit (lib) mkOption types concatStringsSep; + inherit (pkgs) liminix callPackage writeText; +in +{ + options = { + outputs = mkOption { + type = types.attrsOf types.package; + default = {}; + }; + }; + config = { + outputs = rec { + squashfs = liminix.builders.squashfs config.filesystem.contents; + tftpd = pkgs.buildPackages.tufted; + kernel = liminix.builders.kernel.override { + inherit (config.kernel) config src extraPatchPhase; + }; + dtb = (callPackage ../kernel/dtb.nix {}) { + dts = config.kernel.dts.src; + includes = config.kernel.dts.includes ++ [ + "${kernel.headers}/include" + ]; + }; + uimage = (callPackage ../kernel/uimage.nix {}) { + commandLine = concatStringsSep " " config.boot.commandLine; + inherit (config.device) loadAddress entryPoint; + inherit kernel; + inherit dtb; + }; + combined-image = pkgs.runCommand "firmware.bin" { + nativeBuildInputs = [ pkgs.buildPackages.ubootTools ]; + } '' + mkdir $out + dd if=${uimage} of=$out/firmware.bin bs=128k conv=sync + dd if=${squashfs} of=$out/firmware.bin bs=128k conv=sync,nocreat,notrunc oflag=append + ''; + boot-scr = + let + inherit (pkgs.lib.trivial) toHexString; + uimageStart = 10485760; # 0xa00000 + squashfsStart = uimageStart + 4 * 1024 * 1024; + squashfsSize = 8; + cmd = "mtdparts=phram0:${toString squashfsSize}M(nix) phram.phram=phram0,0x${toHexString squashfsStart},${toString squashfsSize}Mi memmap=${toString squashfsSize}M\$0x${toHexString squashfsStart} root=1f00"; + in + pkgs.buildPackages.writeScript "firmware.bin" '' + setenv serverip 192.168.8.148 + setenv ipaddr 192.168.8.251 + setenv bootargs '${concatStringsSep " " config.boot.commandLine} ${cmd}' + tftp 0x8${toHexString uimageStart} result/uimage ; tftp 0x8${toHexString squashfsStart} result/squashfs + bootm 0x${toHexString uimageStart} + ''; + + directory = pkgs.runCommand "liminix" {} ('' + mkdir $out + cd $out + ln -s ${squashfs} squashfs + ln -s ${kernel} vmlinux + ln -s ${manifest} manifest + ln -s ${kernel.headers} build + '' + + (if config.device.loadAddress != null then + '' + ln -s ${uimage} uimage + ln -s ${boot-scr} flash.scr + '' else "")); + # this exists so that you can run "nix-store -q --tree" on it and find + # out what's in the image, which is nice if it's unexpectedly huge + manifest = writeText "manifest.json" (builtins.toJSON config.filesystem.contents); + }; + }; +}