nixpkgs/pkgs/os-specific/linux/kernel/builder.sh
Lluís Batlle i Rossell 1357904982 Committing the aufs2.1 patch by Shea Levy. His comments:
* My motivation for this patch is that kernels < 2.6.36 contain an
     e1000e that does not support the ethernet card that is part of the
     chipset for the second-generation Core-i Intel CPUs, so in order
     to have a more useful livecd I needed to get aufs working with a
     newer kernel, and 2.6.37 is the latest kernel with an official
     aufs release.
   * All sources are downloaded with fetchgit. This is because the aufs
     upstream doesn't provide release tarballs, they just add a tag to
     their git tree for an official release.
   * The make target for the aufs2.1 headers uses a Makefile in the
     kernel build directory that requires that unifdef be in the
     scripts/ subdirectory of the build directory. The way I've dealt
     with this here is by adding "make $makeFlags -C scripts unifdef"
     to the postBuild in the kernel builder. Since the builder is used
     by all kernel versions, this will require rebuilding every kernel
     and kernel-dependent package if the patch is accepted, so one
     alternative I thought of would be to create a fake kernel build
     directory where everything is symlinked to the real build
     directory except scripts/, which is first copied and then make
     unifdef is run before building aufs2.1. If that more complicated
     solution is preferred, or if anyone has ideas for another one, I
     can do that and submit a new patch.
   * The patch was tested by building a livecd ISO that uses it, then
     running the ISO from within virtualbox and installing aufs2.1-util
     from within the livecd environment.
   * The livecd was built using installation-cd-minimal.nix, with two
     changes to the Nixos tree:
        1. boot.kernelPackages = pkgs.linuxPackages_2_6_37 was added to
           profiles/minimal.nix
        2. config.boot.kernelPackages.aufs2 was changed to
           config.boot.kernelPackages.aufs2_1 in iso-image.nix
     I would have preferred to keep all changes within
     profiles/minimal.nix, but I couldn't figure out how to override
     iso-image.nix's definition of boot.extraModulePackages. Livecds
     that use an older kernel can't be built with this iso-image.nix,
     since we don't have aufs2.1 for them (just aufs2). If someone can
     point me to how I can override things set in iso-image.nix, I'd
     appreciate it.

make -C scripts unifdef compiles the unifdef application in the
scripts/ directory, and when Nix copies over the build tree to
$out/lib/modules/$version/build for kernel modules to reference, it
copies over all of scripts/ except the .o files. I can't speak for
other kernel versions, but at the least for 2.6.37.1 unifdef is not
built by default. If you look at the Makefile in scripts, unifdef is
listed  under a comment saying that the following programs are only
built on-demand.

svn path=/nixpkgs/trunk/; revision=26548
2011-03-27 15:18:39 +00:00

159 lines
5.3 KiB
Bash

source $stdenv/setup
makeFlags="ARCH=$arch SHELL=/bin/sh"
if [ -n "$crossConfig" ]; then
makeFlags="$makeFlags CROSS_COMPILE=$crossConfig-"
fi
postPatch() {
# Makefiles are full of /bin/pwd, /bin/false, /bin/bash, etc.
# Patch these away, assuming the tools are in $PATH.
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() {
if test -n "$preConfigure"; then
eval "$preConfigure";
fi
export INSTALL_PATH=$out
export INSTALL_MOD_PATH=$out
# Set our own localversion, if specified.
rm -f localversion*
if test -n "$localVersion"; then
echo "$localVersion" > localversion-nix
fi
# Patch kconfig to print "###" after every question so that
# generate-config.pl can answer them.
sed -e '/fflush(stdout);/i\printf("###");' -i scripts/kconfig/conf.c
# Get a basic config file for later refinement with $generateConfig.
make $kernelBaseConfig ARCH=$arch
# Create the config file.
echo "generating kernel configuration..."
echo "$kernelConfig" > kernel-config
DEBUG=1 ARCH=$arch KERNEL_CONFIG=kernel-config AUTO_MODULES=$autoModules \
perl -w $generateConfig
}
postBuild() {
# After the builder did a 'make all' (kernel + modules)
# we force building the target asked: bzImage/zImage/uImage/...
make $makeFlags $kernelTarget
make $makeFlags -C scripts unifdef
}
installPhase() {
ensureDir $out
# New kernel versions have a combined tree for i386 and x86_64.
archDir=$arch
if test -e arch/x86 -a \( "$arch" = i386 -o "$arch" = x86_64 \); then
archDir=x86
fi
# Copy the bzImage and System.map.
cp System.map $out
if test "$arch" = um; then
ensureDir $out/bin
cp linux $out/bin
elif test "$kernelTarget" != "vmlinux"; then
# In any case we copy the 'vmlinux' ELF in the next lines
cp arch/$archDir/boot/$kernelTarget $out
fi
cp vmlinux $out
if grep -q "CONFIG_MODULES=y" .config; then
# Install the modules in $out/lib/modules with matching paths
# in modules.dep (i.e., refererring to $out/lib/modules, not
# /lib/modules). The depmod_opts= is to prevent the kernel
# from passing `-b PATH' to depmod.
export MODULE_DIR=$out/lib/modules/
substituteInPlace Makefile --replace '-b $(INSTALL_MOD_PATH)' ''
make modules_install \
DEPMOD=$module_init_tools/sbin/depmod depmod_opts= \
$makeFlags "${makeFlagsArray[@]}" \
$installFlags "${installFlagsArray[@]}"
if test -z "$dontStrip"; then
# Strip the kernel modules.
echo "Stripping kernel modules..."
if [ -z "$crossConfig" ]; then
find $out -name "*.ko" -print0 | xargs -0 strip -S
else
find $out -name "*.ko" -print0 | xargs -0 $crossConfig-strip -S
fi
fi
# move this to install later on
# largely copied from early FC3 kernel spec files
version=$(cd $out/lib/modules && ls -d *)
# remove symlinks and create directories
rm -f $out/lib/modules/$version/build
rm -f $out/lib/modules/$version/source
mkdir $out/lib/modules/$version/build
# copy config
cp .config $out/lib/modules/$version/build/.config
ln -s $out/lib/modules/$version/build/.config $out/config
if test "$arch" != um; then
# copy all Makefiles and Kconfig files
ln -s $out/lib/modules/$version/build $out/lib/modules/$version/source
cp --parents `find -type f -name Makefile -o -name "Kconfig*"` $out/lib/modules/$version/build
cp Module.symvers $out/lib/modules/$version/build
if test "$dontStrip" = "1"; then
# copy any debugging info that can be found
cp --parents -rv `find -name \*.debug -o -name debug.a` \
"$out/lib/modules/$version/build"
fi
# weed out unneeded stuff
rm -rf $out/lib/modules/$version/build/Documentation
rm -rf $out/lib/modules/$version/build/scripts
rm -rf $out/lib/modules/$version/build/include
# copy architecture dependent files
cp -a arch/$archDir/scripts $out/lib/modules/$version/build/ || true
cp -a arch/$archDir/*lds $out/lib/modules/$version/build/ || true
cp -a arch/$archDir/Makefile*.cpu $out/lib/modules/$version/build/arch/$archDir/ || true
cp -a --parents arch/$archDir/kernel/asm-offsets.s $out/lib/modules/$version/build/arch/$archDir/kernel/ || true
# copy scripts
rm -f scripts/*.o
rm -f scripts/*/*.o
cp -a scripts $out/lib/modules/$version/build
# copy include files
includeDir=$out/lib/modules/$version/build/include
mkdir -p $includeDir
(cd include && cp -a * $includeDir)
(cd arch/$archDir/include && cp -a * $includeDir || true)
(cd arch/$archDir/include && cp -a asm/* $includeDir/asm/ || true)
(cd arch/$archDir/include/asm/mach-generic && cp -a * $includeDir/ || true)
fi
fi
if test -n "$postInstall"; then
eval "$postInstall";
fi
}
genericBuild