diff --git a/default.nix b/default.nix index 6ec720f..025b1d0 100644 --- a/default.nix +++ b/default.nix @@ -8,14 +8,14 @@ let overlay = import ./overlay.nix; pkgs = import nixpkgs (device.system // { - overlays = [overlay device.overlay]; + overlays = [overlay]; config = {allowUnsupportedSystem = true; }; }); inherit (pkgs) callPackage writeText liminix fetchFromGitHub; inherit (pkgs.lib) concatStringsSep; config = (import ./merge-modules.nix) [ ./modules/base.nix - ({ lib, ... } : { config = { inherit (device) kernel; }; }) + device.module liminix-config ./modules/s6 ./modules/users.nix @@ -33,11 +33,11 @@ let outputs = rec { inherit squashfs; - kernel = pkgs.kernel.override { - inherit (config.kernel) config; + kernel = liminix.builders.kernel.override { + inherit (config.kernel) config src extraPatchPhase; }; dtb = (callPackage ./kernel/dtb.nix {}) { - dts = config.kernel.dts { inherit openwrt; }; + dts = config.kernel.dts; includes = [ "${openwrt}/target/linux/ath79/dts" "${kernel.headers}/include" @@ -91,7 +91,7 @@ let tftpd = pkgs.buildPackages.tufted; }; in { - outputs = outputs // { default = outputs.${device.outputs.default}; }; + outputs = outputs // { default = 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 e82d7a7..2af5dbe 100644 --- a/devices/gl-ar750/default.nix +++ b/devices/gl-ar750/default.nix @@ -24,15 +24,9 @@ }; }; - # We need to be able to import default.nix before we import nixpkgs - # because it has the system config to tell nixpkgs what arch to build for. - # But we also need some way to do things like fetchFromGitHub in the - # per-device config and we can only do that once we have a reference to - # pkgs - - overlay = final: prev: + module = {pkgs, ... }: let - openwrt = final.fetchFromGitHub { + openwrt = pkgs.pkgsBuildBuild.fetchFromGitHub { name = "openwrt-source"; repo = "openwrt"; owner = "openwrt"; @@ -40,8 +34,14 @@ hash = "sha256-YYi4gkpLjbOK7bM2MGQjAyEBuXJ9JNXoz/JEmYf8xE8="; }; in { - kernel = prev.kernel.override { - src = final.fetchurl { + device.defaultOutput = "directory"; + device.boot = { + loadAddress = "0x80060000"; + entryPoint = "0x80060000"; + }; + + kernel = { + src = pkgs.pkgsBuildBuild.fetchurl { name = "linux.tar.gz"; url = "https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.71.tar.gz"; hash = "sha256-yhO2cXIeIgUxkSZf/4aAsF11uxyh+UUZu6D1h92vCD8="; @@ -59,72 +59,65 @@ 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"; + config = { + MIPS_ELF_APPENDED_DTB = "y"; + OF = "y"; + USE_OF = "y"; + ATH79 = "y"; + + SERIAL_8250_CONSOLE = "y"; + SERIAL_8250 = "y"; + SERIAL_CORE_CONSOLE = "y"; + + # need this to open console device at boot. dmesg goes from + # [ 0.272934] Warning: unable to open an initial console. + # to + # [ 0.247413] printk: console [ttyS0] disabled + # [ 0.25200] 18020000.uart: ttyS0 at MMIO 0x1802000 (irq = 10, base_baud = 1562500) is a 16550A + SERIAL_OF_PLATFORM = "y"; + + CONSOLE_LOGLEVEL_DEFAULT = "8"; + CONSOLE_LOGLEVEL_QUIET = "4"; + + # "empty" initramfs source should create an initial + # filesystem that has a /dev/console node and not much + # else. Note that pid 1 is started *before* the root + # filesystem is mounted and it expects /dev/console to + # be present already + BLK_DEV_INITRD = "n"; + + NET = "y"; + NETDEVICES = "y"; + ETHERNET = "y"; + NET_VENDOR_ATHEROS = "y"; + AG71XX = "y"; # ethernet (qca,qca9530-eth) + MFD_SYSCON = "y"; # ethernet (compatible "syscon") + AR8216_PHY = "y"; # eth1 is behind a switch + + MTD = "y"; + MTD_CMDLINE_PARTS = "y"; + MTD_BLOCK = "y"; # fix undefined ref to register_mtd_blktrans_devs + CPU_BIG_ENDIAN= "y"; + + # this is all copied from nixwrt ath79 config. Clearly not all + # of it is device config, some of it is wifi config or + # installation method config or ... + + "CMDLINE_PARTITION" = "y"; + "EARLY_PRINTK" = "y"; + "FW_LOADER" = "y"; + # we don't have a user helper, so we get multiple 60s pauses + # at boot time unless we disable trying to call it + "FW_LOADER_USER_HELPER" = "n"; + + "MODULE_SIG" = "y"; + + "PARTITION_ADVANCED" = "y"; + "PRINTK_TIME" = "y"; + "SQUASHFS" = "y"; + "SQUASHFS_XZ" = "y"; + }; }; }; - kernel = rec { - dts = { openwrt,... }:"${openwrt}/target/linux/ath79/dts/qca9531_glinet_gl-ar750.dts"; - config = { - MIPS_ELF_APPENDED_DTB = "y"; - OF = "y"; - USE_OF = "y"; - ATH79 = "y"; - - SERIAL_8250_CONSOLE = "y"; - SERIAL_8250 = "y"; - SERIAL_CORE_CONSOLE = "y"; - - # need this to open console device at boot. dmesg goes from - # [ 0.272934] Warning: unable to open an initial console. - # to - # [ 0.247413] printk: console [ttyS0] disabled - # [ 0.25200] 18020000.uart: ttyS0 at MMIO 0x1802000 (irq = 10, base_baud = 1562500) is a 16550A - SERIAL_OF_PLATFORM = "y"; - - CONSOLE_LOGLEVEL_DEFAULT = "8"; - CONSOLE_LOGLEVEL_QUIET = "4"; - - # "empty" initramfs source should create an initial - # filesystem that has a /dev/console node and not much - # else. Note that pid 1 is started *before* the root - # filesystem is mounted and it expects /dev/console to - # be present already - BLK_DEV_INITRD = "n"; - - NET = "y"; - NETDEVICES = "y"; - ETHERNET = "y"; - NET_VENDOR_ATHEROS = "y"; - AG71XX = "y"; # ethernet (qca,qca9530-eth) - MFD_SYSCON = "y"; # ethernet (compatible "syscon") - AR8216_PHY = "y"; # eth1 is behind a switch - - MTD = "y"; - MTD_CMDLINE_PARTS = "y"; - MTD_BLOCK = "y"; # fix undefined ref to register_mtd_blktrans_devs - CPU_BIG_ENDIAN= "y"; - - # this is all copied from nixwrt ath79 config. Clearly not all - # of it is device config, some of it is wifi config or - # installation method config or ... - - "CMDLINE_PARTITION" = "y"; - "EARLY_PRINTK" = "y"; - "FW_LOADER" = "y"; - # we don't have a user helper, so we get multiple 60s pauses - # at boot time unless we disable trying to call it - "FW_LOADER_USER_HELPER" = "n"; - - "MODULE_SIG" = "y"; - - "PARTITION_ADVANCED" = "y"; - "PRINTK_TIME" = "y"; - "SQUASHFS" = "y"; - "SQUASHFS_XZ" = "y"; - }; - }; - outputs.default = "directory"; - boot = { - loadAddress = "0x80060000"; - entryPoint = "0x80060000"; - }; } diff --git a/devices/gl-mt300a/default.nix b/devices/gl-mt300a/default.nix index e169c04..5e49ef7 100644 --- a/devices/gl-mt300a/default.nix +++ b/devices/gl-mt300a/default.nix @@ -11,15 +11,9 @@ }; }; - # We need to be able to import default.nix before we import nixpkgs - # because it has the system config to tell nixpkgs what arch to build for. - # But we also need some way to do things like fetchFromGitHub in the - # per-device config and we can only do that once we have a reference to - # pkgs - - overlay = final: prev: + module = { pkgs, ...}: let - openwrt = final.fetchFromGitHub { + openwrt = pkgs.fetchFromGitHub { name = "openwrt-source"; repo = "openwrt"; owner = "openwrt"; @@ -27,8 +21,16 @@ hash = "sha256-YYi4gkpLjbOK7bM2MGQjAyEBuXJ9JNXoz/JEmYf8xE8="; }; in { - kernel = prev.kernel.override { - src = final.fetchurl { + device = { + defaultOutput = "directory"; + boot = { + loadAddress = "0x80000000"; + entryPoint = "0x80000000"; + }; + }; + + kernel = { + src = pkgs.fetchurl { name = "linux.tar.gz"; url = "https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.71.tar.gz"; hash = "sha256-yhO2cXIeIgUxkSZf/4aAsF11uxyh+UUZu6D1h92vCD8="; @@ -46,69 +48,62 @@ 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"; + config = { + MIPS_ELF_APPENDED_DTB = "y"; + OF = "y"; + USE_OF = "y"; + + RALINK = "y"; + SOC_MT7620 = "y"; + + SERIAL_8250_CONSOLE = "y"; + SERIAL_8250 = "y"; + SERIAL_CORE_CONSOLE = "y"; + SERIAL_OF_PLATFORM = "y"; + + CONSOLE_LOGLEVEL_DEFAULT = "8"; + CONSOLE_LOGLEVEL_QUIET = "4"; + + # "empty" initramfs source should create an initial + # filesystem that has a /dev/console node and not much + # else. Note that pid 1 is started *before* the root + # filesystem is mounted and it expects /dev/console to + # be present already + BLK_DEV_INITRD = "n"; + + NET = "y"; + NETDEVICES = "y"; + ETHERNET = "y"; + # NET_VENDOR_ATHEROS = "y"; + # AG71XX = "y"; # ethernet (qca,qca9530-eth) + # MFD_SYSCON = "y"; # ethernet (compatible "syscon") + # AR8216_PHY = "y"; # eth1 is behind a switch + + MTD = "y"; + MTD_CMDLINE_PARTS = "y"; + MTD_BLOCK = "y"; # fix undefined ref to register_mtd_blktrans_devs + + CPU_LITTLE_ENDIAN= "y"; + + # this is all copied from nixwrt ath79 config. Clearly not all + # of it is device config, some of it is wifi config or + # installation method config or ... + + "CMDLINE_PARTITION" = "y"; + "EARLY_PRINTK" = "y"; + "FW_LOADER" = "y"; + # we don't have a user helper, so we get multiple 60s pauses + # at boot time unless we disable trying to call it + "FW_LOADER_USER_HELPER" = "n"; + + "MODULE_SIG" = "y"; + + "PARTITION_ADVANCED" = "y"; + "PRINTK_TIME" = "y"; + "SQUASHFS" = "y"; + "SQUASHFS_XZ" = "y"; + }; }; }; - kernel = rec { - dts = { openwrt,... } : "${openwrt}/target/linux/ramips/dts/mt7620a_glinet_gl-mt300a.dts"; - config = { - MIPS_ELF_APPENDED_DTB = "y"; - OF = "y"; - USE_OF = "y"; - - RALINK = "y"; - SOC_MT7620 = "y"; - - SERIAL_8250_CONSOLE = "y"; - SERIAL_8250 = "y"; - SERIAL_CORE_CONSOLE = "y"; - SERIAL_OF_PLATFORM = "y"; - - CONSOLE_LOGLEVEL_DEFAULT = "8"; - CONSOLE_LOGLEVEL_QUIET = "4"; - - # "empty" initramfs source should create an initial - # filesystem that has a /dev/console node and not much - # else. Note that pid 1 is started *before* the root - # filesystem is mounted and it expects /dev/console to - # be present already - BLK_DEV_INITRD = "n"; - - NET = "y"; - NETDEVICES = "y"; - ETHERNET = "y"; - # NET_VENDOR_ATHEROS = "y"; - # AG71XX = "y"; # ethernet (qca,qca9530-eth) - # MFD_SYSCON = "y"; # ethernet (compatible "syscon") - # AR8216_PHY = "y"; # eth1 is behind a switch - - MTD = "y"; - MTD_CMDLINE_PARTS = "y"; - MTD_BLOCK = "y"; # fix undefined ref to register_mtd_blktrans_devs - - CPU_LITTLE_ENDIAN= "y"; - - # this is all copied from nixwrt ath79 config. Clearly not all - # of it is device config, some of it is wifi config or - # installation method config or ... - - "CMDLINE_PARTITION" = "y"; - "EARLY_PRINTK" = "y"; - "FW_LOADER" = "y"; - # we don't have a user helper, so we get multiple 60s pauses - # at boot time unless we disable trying to call it - "FW_LOADER_USER_HELPER" = "n"; - - "MODULE_SIG" = "y"; - - "PARTITION_ADVANCED" = "y"; - "PRINTK_TIME" = "y"; - "SQUASHFS" = "y"; - "SQUASHFS_XZ" = "y"; - }; - }; - outputs.default = "directory"; - boot = { - loadAddress = "0x80000000"; - entryPoint = "0x80000000"; - }; } diff --git a/devices/gl-mt300n-v2/default.nix b/devices/gl-mt300n-v2/default.nix index 3583b75..fb97e30 100644 --- a/devices/gl-mt300n-v2/default.nix +++ b/devices/gl-mt300n-v2/default.nix @@ -11,15 +11,9 @@ }; }; - # We need to be able to import default.nix before we import nixpkgs - # because it has the system config to tell nixpkgs what arch to build for. - # But we also need some way to do things like fetchFromGitHub in the - # per-device config and we can only do that once we have a reference to - # pkgs - - overlay = final: prev: + module = { pkgs, ...}: let - openwrt = final.fetchFromGitHub { + openwrt = pkgs.fetchFromGitHub { name = "openwrt-source"; repo = "openwrt"; owner = "openwrt"; @@ -27,8 +21,16 @@ hash = "sha256-YYi4gkpLjbOK7bM2MGQjAyEBuXJ9JNXoz/JEmYf8xE8="; }; in { - kernel = prev.kernel.override { - src = final.fetchurl { + device = { + defaultOutput = "directory"; + boot = { + loadAddress = "0x80000000"; + entryPoint = "0x80000000"; + }; + }; + + kernel = { + src = pkgs.fetchurl { name = "linux.tar.gz"; url = "https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.71.tar.gz"; hash = "sha256-yhO2cXIeIgUxkSZf/4aAsF11uxyh+UUZu6D1h92vCD8="; @@ -46,80 +48,73 @@ 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"; + config = { + MIPS_ELF_APPENDED_DTB = "y"; + OF = "y"; + USE_OF = "y"; + + RALINK = "y"; + SOC_MT7620 = "y"; + CPU_LITTLE_ENDIAN= "y"; + + SERIAL_8250_CONSOLE = "y"; + SERIAL_8250 = "y"; + SERIAL_CORE_CONSOLE = "y"; + SERIAL_OF_PLATFORM = "y"; + + CONSOLE_LOGLEVEL_DEFAULT = "8"; + CONSOLE_LOGLEVEL_QUIET = "4"; + + # "empty" initramfs source should create an initial + # filesystem that has a /dev/console node and not much + # else. Note that pid 1 is started *before* the root + # filesystem is mounted and it expects /dev/console to + # be present already + BLK_DEV_INITRD = "n"; + + MTD = "y"; + MTD_CMDLINE_PARTS = "y"; + MTD_BLOCK = "y"; # fix undefined ref to register_mtd_blktrans_dev + + REGULATOR = "y"; + REGULATOR_FIXED_VOLTAGE = "y"; + + NET = "y"; + NETDEVICES = "y"; + ETHERNET = "y"; + + PHYLIB = "y"; + AT803X_PHY="y"; + FIXED_PHY="y"; + GENERIC_PHY="y"; + NET_VENDOR_RALINK = "y"; + NET_RALINK_RT3050 = "y"; + NET_RALINK_SOC="y"; + + SWCONFIG = "y"; + + GPIOLIB="y"; + GPIO_MT7621 = "y"; + + # this is all copied from nixwrt ath79 config. Clearly not all + # of it is device config, some of it is wifi config or + # installation method config or ... + + "CMDLINE_PARTITION" = "y"; + "EARLY_PRINTK" = "y"; + "FW_LOADER" = "y"; + # we don't have a user helper, so we get multiple 60s pauses + # at boot time unless we disable trying to call it + "FW_LOADER_USER_HELPER" = "n"; + + "MODULE_SIG" = "y"; + + "PARTITION_ADVANCED" = "y"; + "PRINTK_TIME" = "y"; + "SQUASHFS" = "y"; + "SQUASHFS_XZ" = "y"; + }; }; }; - kernel = rec { - dts = { openwrt,... } : "${openwrt}/target/linux/ramips/dts/mt7628an_glinet_gl-mt300n-v2.dts"; - config = { - MIPS_ELF_APPENDED_DTB = "y"; - OF = "y"; - USE_OF = "y"; - - RALINK = "y"; - SOC_MT7620 = "y"; - CPU_LITTLE_ENDIAN= "y"; - - SERIAL_8250_CONSOLE = "y"; - SERIAL_8250 = "y"; - SERIAL_CORE_CONSOLE = "y"; - SERIAL_OF_PLATFORM = "y"; - - CONSOLE_LOGLEVEL_DEFAULT = "8"; - CONSOLE_LOGLEVEL_QUIET = "4"; - - # "empty" initramfs source should create an initial - # filesystem that has a /dev/console node and not much - # else. Note that pid 1 is started *before* the root - # filesystem is mounted and it expects /dev/console to - # be present already - BLK_DEV_INITRD = "n"; - - MTD = "y"; - MTD_CMDLINE_PARTS = "y"; - MTD_BLOCK = "y"; # fix undefined ref to register_mtd_blktrans_dev - - REGULATOR = "y"; - REGULATOR_FIXED_VOLTAGE = "y"; - - NET = "y"; - NETDEVICES = "y"; - ETHERNET = "y"; - - PHYLIB = "y"; - AT803X_PHY="y"; - FIXED_PHY="y"; - GENERIC_PHY="y"; - NET_VENDOR_RALINK = "y"; - NET_RALINK_RT3050 = "y"; - NET_RALINK_SOC="y"; - - SWCONFIG = "y"; - - GPIOLIB="y"; - GPIO_MT7621 = "y"; - - # this is all copied from nixwrt ath79 config. Clearly not all - # of it is device config, some of it is wifi config or - # installation method config or ... - - "CMDLINE_PARTITION" = "y"; - "EARLY_PRINTK" = "y"; - "FW_LOADER" = "y"; - # we don't have a user helper, so we get multiple 60s pauses - # at boot time unless we disable trying to call it - "FW_LOADER_USER_HELPER" = "n"; - - "MODULE_SIG" = "y"; - - "PARTITION_ADVANCED" = "y"; - "PRINTK_TIME" = "y"; - "SQUASHFS" = "y"; - "SQUASHFS_XZ" = "y"; - }; - }; - outputs.default = "directory"; - boot = { - loadAddress = "0x80000000"; - entryPoint = "0x80000000"; - }; } diff --git a/devices/qemu/default.nix b/devices/qemu/default.nix index 7b94ce6..e616910 100644 --- a/devices/qemu/default.nix +++ b/devices/qemu/default.nix @@ -13,42 +13,34 @@ }; }; - overlay = final: prev: - let inherit (final) stdenvNoCC fetchFromGitHub; - in { - kernel = prev.kernel.override { - # using fetchurl not fetchzip because it doesn't unpack, and - # copying 6GB of data from one store location to another - # takes an absolute bloody age - src = final.fetchurl { - name = "linux.tar.gz"; - url = "https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.19.16.tar.gz"; - hash = "sha256-m4NeoEsCEK0HSIKTZ6zYTgk1fD3W0PSOMXN6fyHpkP8="; - }; + module = {pkgs, ... }: { + kernel = { + src = pkgs.pkgsBuildBuild.fetchurl { + name = "linux.tar.gz"; + url = "https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.19.16.tar.gz"; + hash = "sha256-m4NeoEsCEK0HSIKTZ6zYTgk1fD3W0PSOMXN6fyHpkP8="; + }; + config = { + MIPS_MALTA= "y"; + CPU_LITTLE_ENDIAN= "n"; + CPU_BIG_ENDIAN= "y"; + CPU_MIPS32_R2= "y"; + + SQUASHFS = "y"; + SQUASHFS_XZ = "y"; + + VIRTIO_MENU = "y"; + PCI = "y"; + VIRTIO_PCI = "y"; + BLOCK = "y"; + VIRTIO_BLK = "y"; + NETDEVICES = "y"; + VIRTIO_NET = "y"; + + SERIAL_8250= "y"; + SERIAL_8250_CONSOLE= "y"; }; }; - - kernel = { - config = { - MIPS_MALTA= "y"; - CPU_LITTLE_ENDIAN= "n"; - CPU_BIG_ENDIAN= "y"; - CPU_MIPS32_R2= "y"; - - SQUASHFS = "y"; - SQUASHFS_XZ = "y"; - - VIRTIO_MENU = "y"; - PCI = "y"; - VIRTIO_PCI = "y"; - BLOCK = "y"; - VIRTIO_BLK = "y"; - NETDEVICES = "y"; - VIRTIO_NET = "y"; - - SERIAL_8250= "y"; - SERIAL_8250_CONSOLE= "y"; - }; + device.defaultOutput = "directory"; }; - outputs.default = "directory"; } diff --git a/modules/base.nix b/modules/base.nix index efad7b6..9aa6d23 100644 --- a/modules/base.nix +++ b/modules/base.nix @@ -24,7 +24,12 @@ in { }; filesystem = mkOption { type = types.anything; }; kernel = { - dts = mkOption { type = types.functionTo types.string; }; + src = mkOption { type = types.package; } ; + extraPatchPhase = mkOption { + default = "true"; + type = types.lines; + } ; + dts = mkOption { type = types.string; }; config = mkOption { # mostly the values are y n or m, but sometimes # other strings are also used @@ -40,6 +45,12 @@ in { users = mkOption { type = types.attrsOf types.anything; }; + device = { + defaultOutput = mkOption { + type = types.nonEmptyStr; + }; + boot = mkOption { type = types.any; }; + }; }; config = { defaultProfile.packages = with pkgs; diff --git a/overlay.nix b/overlay.nix index 0d046b3..d1b3294 100644 --- a/overlay.nix +++ b/overlay.nix @@ -6,14 +6,13 @@ final: prev: { networking = final.callPackage ./pkgs/liminix-tools/networking {}; builders = { squashfs = final.callPackage ./pkgs/liminix-tools/builders/squashfs.nix {}; + kernel = final.callPackage ./pkgs/kernel {}; }; }; writeAshScript = final.callPackage ./pkgs/write-ash-script {}; s6-init-bin = final.callPackage ./pkgs/s6-init-bin {}; s6-rc-database = final.callPackage ./pkgs/s6-rc-database {}; - kernel = final.callPackage ./pkgs/kernel {}; - dnsmasq = let d = prev.dnsmasq.overrideAttrs(o: { preBuild = '' diff --git a/pkgs/kernel/default.nix b/pkgs/kernel/default.nix index 2c05b95..2421407 100644 --- a/pkgs/kernel/default.nix +++ b/pkgs/kernel/default.nix @@ -6,7 +6,7 @@ , config , src - , extraPatchPhase ? "true" + , extraPatchPhase ? "echo" } : let writeConfig = name : config: writeText name (builtins.concatStringsSep