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 00000000000..5d2a42646bf --- /dev/null +++ b/pkgs/os-specific/linux/kernel/manual-config.nix @@ -0,0 +1,135 @@ +{ stdenv, runCommand, nettools, perl, kmod, writeTextFile }: + +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" ] && [ "#" != ''${line:0: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"; + }; + +in + +{ + # The kernel version + version, + # The version of the kernel module directory + modDirVersion ? version, + # The kernel source (tarball, git checkout, etc.) + src, + # Any patches + patches ? [], + # The kernel .config file + config, + # Manually specified features the kernel supports + # If unspecified, this will be autodetected from the .config + features ? readFeatures config +}: + +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 + '';}; +in + +stdenv.mkDerivation ({ + name = "linux-${version}"; + + enableParallelBuilding = true; + + passthru = { + inherit version modDirVersion features; + }; + + inherit patches src; + + prePatch = '' + for mf in $(find -name Makefile -o -name Makefile.include); do + echo "stripping FHS paths in \`$mf'..." + sed -i "$mf" -e 's|/usr/bin/||g ; s|/bin/||g ; s|/sbin/||g' + done + ''; + + configurePhase = '' + runHook preConfigure + mkdir ../build + make $makeFlags "''${makeFlagsArray[@]}" mrproper + ln -sv ${config} ../build/.config + make $makeFlags "''${makeFlagsArray[@]}" oldconfig + rm ../build/.config.old + runHook postConfigure + ''; + + buildNativeInputs = [ perl nettools kmod ]; + + makeFlags = commonMakeFlags; + + 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}\"" + ]; + + postInstall = '' + make modules_install $makeFlags "''${makeFlagsArray[@]}" \ + $installFlags "''${installFlagsArray[@]}" + rm -f $out/lib/modules/${modDirVersion}/{build,source} + cd .. + mv $sourceRoot $out/lib/modules/${modDirVersion}/source + mv build $out/lib/modules/${modDirVersion}/build + unlink $out/lib/modules/${modDirVersion}/build/source + ln -sv $out/lib/modules/${modDirVersion}/{,build/}source + ''; + + postFixup = '' + if [ -z "$dontStrip" ]; then + find $out -name "*.ko" -print0 | xargs -0 strip -S + fi + ''; +}) diff --git a/pkgs/os-specific/linux/kmod/default.nix b/pkgs/os-specific/linux/kmod/default.nix index 89d4c463cc7..afa19491ce5 100644 --- a/pkgs/os-specific/linux/kmod/default.nix +++ b/pkgs/os-specific/linux/kmod/default.nix @@ -1,11 +1,11 @@ { stdenv, fetchurl, xz, zlib, pkgconfig }: stdenv.mkDerivation rec { - name = "kmod-8"; + name = "kmod-9"; src = fetchurl { url = "mirror://kernel/linux/utils/kernel/kmod/${name}.tar.xz"; - sha256 = "0kbkjzcyhkwgcplwa29n0f03ccwpg4df83pdl5nkvsk2rzgx3xrm"; + sha256 = "1kyfplx0gygzxp5dn81yk3cn8zzraqm497vis04r1g1dnry2c1q6"; }; # Disable xz/zlib support to prevent needing them in the initrd. diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 76918d081db..88e1626e580 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 nettools perl kmod writeTextFile; + }; + keyutils = callPackage ../os-specific/linux/keyutils { }; libselinux = callPackage ../os-specific/linux/libselinux { };