From c8154a2db99f0d0c6b5e47c279d6b83d8e69cb8f Mon Sep 17 00:00:00 2001 From: Daniel Barlow Date: Sun, 4 Feb 2024 18:12:15 +0000 Subject: [PATCH] kernel: add "conditional" config imagine: you are using a device that requires CONFIG_MYDEVICE_FROBOZZ_DRIVER but only if CONFIG_FROBOZZ has been specified elsewhere. Because we check that every requested config symbol actually appears in .config then it can't be added unconditionally or the build will fail if CONFIG_FROBOZZ wasn't asked for. I'm not 100% happy about this design but it's the best I've thought of so far. --- devices/turris-omnia/default.nix | 9 +++++--- modules/kernel.nix | 37 ++++++++++++++++++++++++++++---- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/devices/turris-omnia/default.nix b/devices/turris-omnia/default.nix index 2a15a13..9c3d333 100644 --- a/devices/turris-omnia/default.nix +++ b/devices/turris-omnia/default.nix @@ -132,9 +132,6 @@ PHY_MVEBU_A38X_COMPHY = "y"; # for eth2 MARVELL_PHY = "y"; - USB_XHCI_MVEBU = "y"; - USB_XHCI_HCD = "y"; - MVPP2 = "y"; MV_XOR = "y"; @@ -150,6 +147,12 @@ NET_DSA = "y"; NET_DSA_MV88E6XXX = "y"; # depends on PTP_1588_CLOCK_OPTIONAL }; + conditionalConfig = { + USB = { + USB_XHCI_MVEBU = "y"; + USB_XHCI_HCD = "y"; + }; + }; }; boot = { diff --git a/modules/kernel.nix b/modules/kernel.nix index 81e7201..f10e3d7 100644 --- a/modules/kernel.nix +++ b/modules/kernel.nix @@ -13,6 +13,16 @@ let type_service = pkgs.liminix.lib.types.service; + mergeConditionals = conf : conditions : + # for each key in conditions, if it is present in conf + # then merge the associated value into conf + lib.foldlAttrs + (acc: name: value: + if (conf ? ${name}) && (conf.${name} != "n") + then acc // value + else acc) + conf + conditions; in { options = { kernel = { @@ -42,6 +52,20 @@ in { }; ''; }; + conditionalConfig = mkOption { + description = '' + Kernel config options that should only be applied when + some other option is present. + ''; + type = types.attrsOf (types.attrsOf types.nonEmptyStr); + default = {}; + example = { + USB = { + USB_XHCI_MVEBU = "y"; + USB_XHCI_HCD = "y"; + }; + }; + }; makeTargets = mkOption { type = types.listOf types.str; }; @@ -49,10 +73,15 @@ in { }; config = { system.outputs = - let k = liminix.builders.kernel.override { - inherit (config.kernel) config src extraPatchPhase; - targets = config.kernel.makeTargets; - }; + let + mergedConfig = mergeConditionals + config.kernel.config + config.kernel.conditionalConfig; + k = liminix.builders.kernel.override { + config = mergedConfig; + inherit (config.kernel) src extraPatchPhase; + targets = config.kernel.makeTargets; + }; in { kernel = k.vmlinux; zimage = k.zImage;