commit c8154a2db99f0d0c6b5e47c279d6b83d8e69cb8f
parent 02cf2c6b807913f90f6ca831213eace4799a6765
Author: Daniel Barlow <dan@telent.net>
Date: Sun, 4 Feb 2024 18:12:15 +0000
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.
Diffstat:
2 files changed, 39 insertions(+), 7 deletions(-)
diff --git 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
@@ -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;