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,25 +74,29 @@ 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; inherit src;
patches = map (p: p.patch) kernelPatches; patches = map (p: p.patch) kernelPatches;
phases = [ "unpackPhase" "patchPhase" "installPhase" ];
prePatch = '' prePatch = ''
for mf in $(find -name Makefile -o -name Makefile.include -o -name install.sh); do for mf in $(find -name Makefile -o -name Makefile.include -o -name install.sh); do
echo "stripping FHS paths in \`$mf'..." echo "stripping FHS paths in \`$mf'..."
@ -101,13 +105,27 @@ stdenv.mkDerivation {
sed -i Makefile -e 's|= depmod|= ${kmod}/sbin/depmod|' sed -i Makefile -e 's|= depmod|= ${kmod}/sbin/depmod|'
''; '';
installPhase = ''
cd ..
mv $sourceRoot $out
'';
};
};
unpackPhase = ''
ln -sv ${self.source} src
export sourceRoot="$(pwd)/src"
mkdir build
export buildRoot="$(pwd)/build"
cd $sourceRoot
'';
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