Greatly reduce kernel closure size

Based on access analysis with strace, I determined an essentially
minimal required set of files from the kernel source that was needed to
build all current kernel packages on 3.10, which ultimately resulted in
keeping 30M of source. Generalizing from that minimal set, which
required ad-hoc specifications of which headers outside of include/ and
arch/*/include and which files in the scripts/ directory should be kept,
to a policy of keeping all non-arch-specific headers that aren't part of
the drivers/ directory and the entire scripts/ directory added an
additional 17M, but there was nothing in the analysis that indicated
that that ad-hoc specification was at all complete so I think the extra
hit is worth the likely greater compatibility.

For reference, we now keep:

* All headers that are NOT in arch/${notTargetArch}/include or drivers/
* The scripts/ directory
* Makefile
* arch/${targetArch}/Makefile

IMO the most likely cause of future problems are the headers in
drivers/, but hopefully they won't actually be needed as they add 50M
Ideally kernel packages would only use include and
arch/${targetArch}/include, but alas this is observably not the case.

master:
  * $out
    * size: 234M
    * references-closure: linux-headers, glibc, attr, acl, zlib, gcc,
      coreutils, perl, bash
merge-kernel-builds:
  * $out
    * size: 152M
    * references-closure: none
  * $dev
    * size: 57M
    * references-closure: linux-headers, glibc, zlib, gcc

So even with the non-minimal set we still beat out master. Keeping the
drivers headers would make us only slightly bigger.

Signed-off-by: Shea Levy <shea@shealevy.com>
This commit is contained in:
Shea Levy 2014-01-05 06:55:47 -05:00
parent a589bfae17
commit ac2035287f
2 changed files with 41 additions and 12 deletions

View file

@ -70,10 +70,16 @@ let
kernelConfig = kernelConfigFun configCross;
inherit (kernel.crossDrv) src patches prePatch preUnpack;
inherit (kernel.crossDrv) src patches preUnpack;
};
inherit (kernel) src patches prePatch preUnpack;
prePatch = kernel.prePatch + ''
# Patch kconfig to print "###" after every question so that
# generate-config.pl from the generic builder can answer them.
sed -e '/fflush(stdout);/i\printf("###");' -i scripts/kconfig/conf.c
'';
inherit (kernel) src patches preUnpack;
buildPhase = ''
cd $buildRoot

View file

@ -49,6 +49,7 @@ let
commonMakeFlags = [
"O=$(buildRoot)"
"DEPMOD=${kmod}/bin/depmod"
];
drvAttrs = config_: platform: kernelPatches: configfile:
@ -94,13 +95,6 @@ let
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|'
# Patch kconfig to print "###" after every question so that
# generate-config.pl from the generic builder can answer them.
# This only affects oldaskconfig.
sed -e '/fflush(stdout);/i\printf("###");' -i scripts/kconfig/conf.c
'';
configurePhase = ''
@ -142,15 +136,44 @@ let
mv $buildRoot $dev/lib/modules/${modDirVersion}/build
# !!! No documentation on how much of the source tree must be kept
# If/when kernel builds fail due to missing files, you can undelete
# them here
# If/when kernel builds fail due to missing files, you can add
# them here. Note that we may see packages requiring headers
# from drivers/ in the future; it adds 50M to keep all of its
# headers on 3.10 though.
chmod +w -R ../source
arch=`cd $dev/lib/modules/${modDirVersion}/build/arch; ls`
# Remove unusued arches
mv arch/$arch .
rm -fR arch
mkdir arch
mv $arch arch
# Remove all driver-specific code (50M of which is headers)
rm -fR drivers
# Keep all headers
find . -type f -name '*.h' -print0 | xargs -0 chmod -w
# Keep root and arch-specific Makefiles
chmod -w Makefile
chmod -w arch/$arch/Makefile
# Keep whole scripts dir
chmod -w -R scripts
# Delete everything not kept
find . -type f -perm -u=w -print0 | xargs -0 rm
# Delete empty directories
find -empty -type d -delete
'' else optionalString installsFirmware ''
make firmware_install $makeFlags "''${makeFlagsArray[@]}" \
$installFlags "''${installFlagsArray[@]}"
'');
# !!! This leaves references to gcc and kmod in $dev
# !!! This leaves references to gcc in $dev
# that we might be able to avoid
postFixup = if isModular then ''
if [ -z "$dontStrip" ]; then