forked from DGNum/liminix
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:
parent
02cf2c6b80
commit
c8154a2db9
2 changed files with 39 additions and 7 deletions
|
@ -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 = {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue