summary refs log tree commit diff
path: root/lib
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
parentbf041c3f1d5e63e27b531faf69244fe99fcfd6c1 (diff)
downloadnixpkgs-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.nix1
-rw-r--r--lib/kernel.nix57
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;
 }