diff options
author | Matthieu Coudron <mattator@gmail.com> | 2018-10-03 18:49:50 +0900 |
---|---|---|
committer | Matthieu Coudron <mattator@gmail.com> | 2019-01-28 09:06:33 +0900 |
commit | 3bb7b3f02e884db944a8a20b4f19227482479b94 (patch) | |
tree | 5a42d2657691b88360fcb8188b34010dfdd75e15 /lib | |
parent | bf041c3f1d5e63e27b531faf69244fe99fcfd6c1 (diff) | |
download | nixpkgs-3bb7b3f02e884db944a8a20b4f19227482479b94.tar nixpkgs-3bb7b3f02e884db944a8a20b4f19227482479b94.tar.gz nixpkgs-3bb7b3f02e884db944a8a20b4f19227482479b94.tar.bz2 nixpkgs-3bb7b3f02e884db944a8a20b4f19227482479b94.tar.lz nixpkgs-3bb7b3f02e884db944a8a20b4f19227482479b94.tar.xz nixpkgs-3bb7b3f02e884db944a8a20b4f19227482479b94.tar.zst nixpkgs-3bb7b3f02e884db944a8a20b4f19227482479b94.zip |
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')
-rw-r--r-- | lib/default.nix | 1 | ||||
-rw-r--r-- | lib/kernel.nix | 57 |
2 files changed, 9 insertions, 49 deletions
diff --git a/lib/default.nix b/lib/default.nix index d400907ebb0..5ae3667406d 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -32,6 +32,7 @@ let modules = callLibs ./modules.nix; options = callLibs ./options.nix; types = callLibs ./types.nix; + kernel = callLibs ./kernel.nix; # constants licenses = callLibs ./licenses.nix; diff --git a/lib/kernel.nix b/lib/kernel.nix index 45b33aea7b8..14783ae9739 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; } |