summaryrefslogtreecommitdiffstats
path: root/lib/kernel.nix
diff options
context:
space:
mode:
authorMatthieu Coudron <mattator@gmail.com>2018-10-03 18:49:50 +0900
committerMatthieu Coudron <mattator@gmail.com>2019-01-28 09:06:33 +0900
commit3bb7b3f02e884db944a8a20b4f19227482479b94 (patch)
tree5a42d2657691b88360fcb8188b34010dfdd75e15 /lib/kernel.nix
parentbf041c3f1d5e63e27b531faf69244fe99fcfd6c1 (diff)
linux: ability to merge structured configs
This should make the composability of kernel configurations more straigthforward. - now distinguish freeform options from tristate ones - will look for a structured config in kernelPatches too one can now access the structuredConfig from a kernel via linux_test.configfile.structuredConfig in order to reinject it into another kernel, no need to rewrite the config from scratch The following merge strategies are used in case of conflict: -- freeform items must be equal or they conflict (mergeEqualOption) -- for tristate (y/m/n) entries, I use the mergeAnswer strategy which takes the best available value, "best" being defined by the user (by default "y" > "m" > "n", e.g. if one entry is both marked "y" and "n", "y" wins) -- if one item is both marked optional/mandatory, mandatory wins (mergeFalseByDefault)
Diffstat (limited to 'lib/kernel.nix')
-rw-r--r--lib/kernel.nix57
1 files changed, 8 insertions, 49 deletions
diff --git a/lib/kernel.nix b/lib/kernel.nix
index 45b33aea7b87..14783ae97393 100644
--- a/lib/kernel.nix
+++ b/lib/kernel.nix
@@ -1,57 +1,16 @@
-{ lib
-# we pass the kernel version here to keep a nice syntax `whenOlder "4.13"`
-# kernelVersion, e.g., config.boot.kernelPackages.version
-, version
-, mkValuePreprocess ? null
-}:
+{ lib }:
with lib;
rec {
- # Common patterns
- when = cond: opt: if cond then opt else null;
- whenAtLeast = ver: when (versionAtLeast version ver);
- whenOlder = ver: when (versionOlder version ver);
- whenBetween = verLow: verHigh: when (versionAtLeast version verLow && versionOlder version verHigh);
- # Keeping these around in case we decide to change this horrible implementation :)
- option = x: if x == null then null else "?${x}";
- yes = "y";
- no = "n";
- module = "m";
- mkValue = val:
- let
- isNumber = c: elem c ["0" "1" "2" "3" "4" "5" "6" "7" "8" "9"];
- in
- if val == "" then "\"\""
- else if val == yes || val == module || val == no then val
- else if all isNumber (stringToCharacters val) then val
- else if substring 0 2 val == "0x" then val
- else val; # FIXME: fix quoting one day
+ # Keeping these around in case we decide to change this horrible implementation :)
+ option = x:
+ x // { optional = true; };
+ yes = { tristate = "y"; };
+ no = { tristate = "n"; };
+ module = { tristate = "m"; };
+ freeform = x: { freeform = x; };
- # generate nix intermediate kernel config file of the form
- #
- # VIRTIO_MMIO m
- # VIRTIO_BLK y
- # VIRTIO_CONSOLE n
- # NET_9P_VIRTIO? y
- #
- # Use mkValuePreprocess to preprocess option values, aka mark 'modules' as
- # 'yes' or vice-versa
- # Borrowed from copumpkin https://github.com/NixOS/nixpkgs/pull/12158
- # returns a string, expr should be an attribute set
- generateNixKConf = exprs: mkValuePreprocess:
- let
- mkConfigLine = key: rawval:
- let
- val = if builtins.isFunction mkValuePreprocess then mkValuePreprocess rawval else rawval;
- in
- if val == null
- then ""
- else if hasPrefix "?" val
- then "${key}? ${mkValue (removePrefix "?" val)}\n"
- else "${key} ${mkValue val}\n";
- mkConf = cfg: concatStrings (mapAttrsToList mkConfigLine cfg);
- in mkConf exprs;
}