diff --git a/pkgs/os-specific/linux/kernel/manual-config.nix b/pkgs/os-specific/linux/kernel/manual-config.nix new file mode 100644 index 000000000000..8cf8b6502166 --- /dev/null +++ b/pkgs/os-specific/linux/kernel/manual-config.nix @@ -0,0 +1,81 @@ +{ stdenv, runCommand }: + +{ version, modDirVersion ? version, src, patches ? [], config }: + +with stdenv.lib; + +let + + # Function to parse the config file to get the features supported + readFeatures = config: + let + # !!! Original causes recursion too deep, need to import from derivation + # linesWithComments = splitString "\n" (builtins.readFile config); + lines = import "${runCommand "lines.nix" {} '' + echo "[" >> $out + while read line; do + if [ -n "$line" ] && [ `expr index "$line" "#"` -ne 1 ]; then + echo "${"''"}" >> $out + echo $(echo $line | sed "s@${"''"}@\$\{\"${"''"}\"}@g")"${"''"}" >> $out + fi + done < ${config} + echo "]" >> $out + ''}"; + + nvpairs = map (s: let split = splitString "=" s; fst = head split; in { + name = substring (stringLength "CONFIG_") (stringLength fst) fst; + value = head (tail split); + }) lines; + + configAttrs = listToAttrs nvpairs; + + getValue = option: + if hasAttr option configAttrs then getAttr option configAttrs else null; + + isYes = option: (getValue option) == "y"; + in + + { + modular = isYes "MODULES"; + }; + + features = readFeatures config; + +in + +stdenv.mkDerivation ({ + name = "linux-${version}"; + + enableParallelBuilding = true; + + passthru = { + inherit version modDirVersion features; + }; + + inherit patches src; + + postPatch = '' + for mf in $(find -name Makefile); do + echo "stripping FHS paths in \`$mf'..." + sed -i "$mf" -e 's|/usr/bin/||g ; s|/bin/||g' + done + ''; + + configurePhase = '' + runHook preConfigure + ln -sv ${config} .config + make oldconfig + runHook postConfigure + ''; + + INSTALL_PATH = "$out"; +} // optionalAttrs features.modular { + MODLIB = "$out/lib/modules/${modDirVersion}"; + + INSTALL_MOD_STRIP = "1"; + + postInstall = '' + make modules_install $makeFlags "$\{makeFlagsArray[@]}" \ + $installFlags "$\{installFlagsArray[@]}" + ''; +}) diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 76918d081db0..0ca0f90768a3 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -5856,6 +5856,11 @@ let linux = linuxPackages.kernel; linuxPackages = linuxPackages_3_2; + # A function to build a manually-configured kernel + linuxManualConfig = import ../os-specific/linux/kernel/manual-config.nix { + inherit stdenv runCommand; + }; + keyutils = callPackage ../os-specific/linux/keyutils { }; libselinux = callPackage ../os-specific/linux/libselinux { };