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;
							 | 
						||
| 
								 | 
							
								}
							 |