nixpkgs/pkgs/os-specific/linux/kernel/builder.sh
Eelco Dolstra 7ce325f3e0 Unify the Linux kernel configurations
Having N different copies of the NixOS kernel configuration is bad
because these copies tend to diverge.  For instance, our 3.10 config
lacked some modules that were enabled in older configs, probably
because the 3.10 config had been copied off an earlier version of some
older kernel config.

So now there is a single kernel config in common-config.nix.  It has a
few conditionals to deal with new/removed kernel options, but
otherwise it's pretty straightforward.

Also, a lot of cut&paste boilerplate between the kernel Nix
expressions is gone (such as preConfigure).
2013-08-01 01:40:40 +02:00

157 lines
5.4 KiB
Bash

source $stdenv/setup
makeFlags="ARCH=$arch SHELL=/bin/sh $makeFlags"
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
substituteInPlace scripts/depmod.sh --replace '-b "$INSTALL_MOD_PATH"' ""
# 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
}
installPhase() {
mkdir -p $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
mkdir -p $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 && cp -a generated/asm/* $includeDir/asm/ || true)
(cd arch/$archDir/include/asm/mach-generic && cp -a * $includeDir/ || true)
# include files for special arm architectures
if [ "$archDir" == "arm" ]; then
cp -a --parents arch/arm/mach-*/include $out/lib/modules/$version/build
fi
fi
fi
if test -n "$postInstall"; then
eval "$postInstall";
fi
}
genericBuild