linux/manual-config: Do source unpacking/patching in a separate derivation.

Since we keep the source in the kernel build anyway, no space is wasted by having a separate store path for the unpacked source. The upside is that the same source can be used to build the kernel multiple times, or generate configurations for later kernel builds, without going through the (fairly long) unpack and patch process multiple times.
This commit is contained in:
Shea Levy 2012-08-11 21:02:09 -04:00
parent 0dea12ff8d
commit 0c18551c93

View File

@ -74,40 +74,58 @@ let
(isModular || (config.isDisabled "FIRMWARE_IN_KERNEL")); (isModular || (config.isDisabled "FIRMWARE_IN_KERNEL"));
commonMakeFlags = [ commonMakeFlags = [
"O=../build" "O=$(buildRoot)"
"INSTALL_PATH=$(out)" "INSTALL_PATH=$(out)"
] ++ (optional isModular "INSTALL_MOD_PATH=$(out)") ] ++ (optional isModular "INSTALL_MOD_PATH=$(out)")
++ optional installsFirmware "INSTALL_FW_PATH=$(out)/lib/firmware"; ++ optional installsFirmware "INSTALL_FW_PATH=$(out)/lib/firmware";
in in
stdenv.mkDerivation { let self = stdenv.mkDerivation {
name = "linux-${version}"; name = "linux-${version}";
enableParallelBuilding = true; enableParallelBuilding = true;
passthru = { passthru = {
inherit version modDirVersion config kernelPatches; inherit version modDirVersion config kernelPatches src;
source = stdenv.mkDerivation {
name = "linux-${version}-source";
inherit src;
patches = map (p: p.patch) kernelPatches;
phases = [ "unpackPhase" "patchPhase" "installPhase" ];
prePatch = ''
for mf in $(find -name Makefile -o -name Makefile.include -o -name install.sh); do
echo "stripping FHS paths in \`$mf'..."
sed -i "$mf" -e 's|/usr/bin/||g ; s|/bin/||g ; s|/sbin/||g'
done
sed -i Makefile -e 's|= depmod|= ${kmod}/sbin/depmod|'
'';
installPhase = ''
cd ..
mv $sourceRoot $out
'';
};
}; };
inherit src; unpackPhase = ''
ln -sv ${self.source} src
patches = map (p: p.patch) kernelPatches; export sourceRoot="$(pwd)/src"
mkdir build
prePatch = '' export buildRoot="$(pwd)/build"
for mf in $(find -name Makefile -o -name Makefile.include -o -name install.sh); do cd $sourceRoot
echo "stripping FHS paths in \`$mf'..."
sed -i "$mf" -e 's|/usr/bin/||g ; s|/bin/||g ; s|/sbin/||g'
done
sed -i Makefile -e 's|= depmod|= ${kmod}/sbin/depmod|'
''; '';
configurePhase = '' configurePhase = ''
runHook preConfigure runHook preConfigure
mkdir ../build
make $makeFlags "''${makeFlagsArray[@]}" mrproper make $makeFlags "''${makeFlagsArray[@]}" mrproper
ln -sv ${configfile} ../build/.config ln -sv ${configfile} $buildRoot/.config
make $makeFlags "''${makeFlagsArray[@]}" oldconfig make $makeFlags "''${makeFlagsArray[@]}" oldconfig
rm ../build/.config.old rm $buildRoot/.config.old
runHook postConfigure runHook postConfigure
''; '';
@ -131,9 +149,9 @@ stdenv.mkDerivation {
rm -f $out/lib/modules/${modDirVersion}/{build,source} rm -f $out/lib/modules/${modDirVersion}/{build,source}
cd .. cd ..
mv $sourceRoot $out/lib/modules/${modDirVersion}/source mv $sourceRoot $out/lib/modules/${modDirVersion}/source
mv build $out/lib/modules/${modDirVersion}/build mv $buildRoot $out/lib/modules/${modDirVersion}/build
unlink $out/lib/modules/${modDirVersion}/build/source unlink $out/lib/modules/${modDirVersion}/build/source
ln -sv $out/lib/modules/${modDirVersion}/{,build/}source ln -sv ${self.source} $out/lib/modules/${modDirVersion}/build/source
'' else optionalString installsFirmware '' '' else optionalString installsFirmware ''
make firmware_install $makeFlags "''${makeFlagsArray[@]}" \ make firmware_install $makeFlags "''${makeFlagsArray[@]}" \
$installFlags "''${installFlagsArray[@]}" $installFlags "''${installFlagsArray[@]}"
@ -154,4 +172,4 @@ stdenv.mkDerivation {
]; ];
platforms = lib.platforms.linux; platforms = lib.platforms.linux;
}; };
} }; in self