58 lines
1.8 KiB
Nix
58 lines
1.8 KiB
Nix
|
{ 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
|
||
|
}:
|
||
|
|
||
|
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
|
||
|
|
||
|
|
||
|
# 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;
|
||
|
}
|