diff options
Diffstat (limited to 'pkgs/os-specific')
-rw-r--r-- | pkgs/os-specific/linux/kernel/manual-config.nix | 112 |
1 files changed, 65 insertions, 47 deletions
diff --git a/pkgs/os-specific/linux/kernel/manual-config.nix b/pkgs/os-specific/linux/kernel/manual-config.nix index 41dbbc227602..a9f0b8f052bb 100644 --- a/pkgs/os-specific/linux/kernel/manual-config.nix +++ b/pkgs/os-specific/linux/kernel/manual-config.nix @@ -4,26 +4,41 @@ with stdenv.lib; let - # Function to parse the config file to get the features supported - readFeatures = config: + # Function to parse the config file into a nix expression + readConfig = configFile: let - configAttrs = import "${runCommand "attrList.nix" {} '' - grep -E -v '(^#|^$)' < ${config} | \ - sed 's/CONFIG_// ; s/=/ /' | \ - awk \ - 'BEGIN { print "{" } - END { print "}" } - { printf "\"%s\" = '"'''"'%s'"'''"';\n", $1, $2 }' > $out + configAttrs = import "${runCommand "config.nix" {} '' + (. ${configFile} + echo "{" + for var in `set`; do + if [[ "$var" =~ ^CONFIG_ ]]; then + IFS="=" + set -- $var + echo "\"$1\" = \"''${*:2}\";" + fi + done + echo "}") > $out ''}"; - getValue = option: - if hasAttr option configAttrs then getAttr option configAttrs else null; - isYes = option: (getValue option) == "y"; - in + config = configAttrs // rec { + attrName = attr: "CONFIG_" + attr; + + isSet = attr: hasAttr (attrName attr) config; + + getValue = attr: if isSet attr then getAttr (attrName attr) config else null; + + isYes = attr: (isSet attr) && ((getValue attr) == "y"); + + isNo = attr: (isSet attr) && ((getValue attr) == "n"); - { - modular = isYes "MODULES"; - }; + isModule = attr: (isSet attr) && ((getValue attr) == "m"); + + isEnabled = attr: (isModule attr) || (isYes attr); + + isDisabled = attr: (!(isSet attr)) || (isNo attr); + }; + in + config; in @@ -37,36 +52,35 @@ in # Any patches patches ? [], # The kernel .config file - config, - # Manually specified features the kernel supports + configfile, + # Manually specified nixexpr representing the config # If unspecified, this will be autodetected from the .config - features ? optionalAttrs allowImportFromDerivation (readFeatures config), + config ? optionalAttrs allowImportFromDerivation (readConfig configfile), # Whether to utilize the controversial import-from-derivation feature to parse the config allowImportFromDerivation ? false }: let - commonMakeFlags = [ - "O=../build" - "INSTALL_PATH=$(out)" - "INSTALLKERNEL=${installkernel}" - ]; - installkernel = writeTextFile { name = "installkernel"; executable=true; text = '' #!/bin/sh mkdir $4 mv -v $2 $4 mv -v $3 $4 '';}; + + isModular = config.isYes "MODULES"; + + installsFirmware = (config.isEnabled "FW_LOADER") && + (isModular || (config.isNo "FIRMWARE_IN_KERNEL")); in -stdenv.mkDerivation ({ +stdenv.mkDerivation { name = "linux-${version}"; enableParallelBuilding = true; passthru = { - inherit version modDirVersion features; + inherit version modDirVersion config; }; inherit patches src; @@ -82,31 +96,22 @@ stdenv.mkDerivation ({ runHook preConfigure mkdir ../build make $makeFlags "''${makeFlagsArray[@]}" mrproper - ln -sv ${config} ../build/.config + ln -sv ${configfile} ../build/.config make $makeFlags "''${makeFlagsArray[@]}" oldconfig rm ../build/.config.old runHook postConfigure ''; - buildNativeInputs = [ perl nettools kmod ]; - - makeFlags = commonMakeFlags; + buildNativeInputs = [ perl nettools ] ++ optional isModular kmod; - meta = { - description = "The Linux kernel"; - license = "GPLv2"; - homepage = http://www.kernel.org/; - maintainers = [ - maintainers.shlevy - ]; - platforms = lib.platforms.linux; - }; -} // optionalAttrs (features ? modular && features.modular) { - makeFlags = commonMakeFlags ++ [ - "MODLIB=\"$(out)/lib/modules/${modDirVersion}\"" - ]; + makeFlags = [ + "O=../build" + "INSTALL_PATH=$(out)" + "INSTALLKERNEL=${installkernel}" + ] ++ (optional isModular "MODLIB=\"$(out)/lib/modules/${modDirVersion}\"") + ++ optional installsFirmware "INSTALL_FW_PATH=\"$(out)/lib/firmware\""; - postInstall = '' + postInstall = if isModular then '' make modules_install $makeFlags "''${makeFlagsArray[@]}" \ $installFlags "''${installFlagsArray[@]}" rm -f $out/lib/modules/${modDirVersion}/{build,source} @@ -115,11 +120,24 @@ stdenv.mkDerivation ({ mv build $out/lib/modules/${modDirVersion}/build unlink $out/lib/modules/${modDirVersion}/build/source ln -sv $out/lib/modules/${modDirVersion}/{,build/}source + '' else optionalString installsFirmware '' + make firmware_install $makeFlags "''${makeFlagsArray[@]}" \ + $installFlags "''${installFlagsArray[@]}" ''; - postFixup = '' + postFixup = optionalString isModular '' if [ -z "$dontStrip" ]; then find $out -name "*.ko" -print0 | xargs -0 strip -S fi ''; -}) + + meta = { + description = "The Linux kernel"; + license = "GPLv2"; + homepage = http://www.kernel.org/; + maintainers = [ + maintainers.shlevy + ]; + platforms = lib.platforms.linux; + }; +} |