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.
This commit is contained in:
Daniel Barlow 2024-02-04 18:12:15 +00:00
parent 02cf2c6b80
commit c8154a2db9
2 changed files with 39 additions and 7 deletions

View file

@ -132,9 +132,6 @@
PHY_MVEBU_A38X_COMPHY = "y"; # for eth2 PHY_MVEBU_A38X_COMPHY = "y"; # for eth2
MARVELL_PHY = "y"; MARVELL_PHY = "y";
USB_XHCI_MVEBU = "y";
USB_XHCI_HCD = "y";
MVPP2 = "y"; MVPP2 = "y";
MV_XOR = "y"; MV_XOR = "y";
@ -150,6 +147,12 @@
NET_DSA = "y"; NET_DSA = "y";
NET_DSA_MV88E6XXX = "y"; # depends on PTP_1588_CLOCK_OPTIONAL NET_DSA_MV88E6XXX = "y"; # depends on PTP_1588_CLOCK_OPTIONAL
}; };
conditionalConfig = {
USB = {
USB_XHCI_MVEBU = "y";
USB_XHCI_HCD = "y";
};
};
}; };
boot = { boot = {

View file

@ -13,6 +13,16 @@ let
type_service = pkgs.liminix.lib.types.service; 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 { in {
options = { options = {
kernel = { 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 { makeTargets = mkOption {
type = types.listOf types.str; type = types.listOf types.str;
}; };
@ -49,10 +73,15 @@ in {
}; };
config = { config = {
system.outputs = system.outputs =
let k = liminix.builders.kernel.override { let
inherit (config.kernel) config src extraPatchPhase; mergedConfig = mergeConditionals
targets = config.kernel.makeTargets; config.kernel.config
}; config.kernel.conditionalConfig;
k = liminix.builders.kernel.override {
config = mergedConfig;
inherit (config.kernel) src extraPatchPhase;
targets = config.kernel.makeTargets;
};
in { in {
kernel = k.vmlinux; kernel = k.vmlinux;
zimage = k.zImage; zimage = k.zImage;