#!/bin/sh # $Id: update-kernel,v 1.14 2006/08/20 19:34:51 mikpe Exp $ # usage: # cd ${kernelsrcdir} # ${perfctrsrcdir}/update-kernel perfctr= patch= patchtype= nopatch= dryrun= sym= backup= maybe_redhat= VERSION= PATCHLEVEL= SUBLEVEL= EXTRAVERSION= kernel= usage() { echo 'Usage: cd ${kernelsrcdir}; ${perfctrsrcdir}/update-kernel [options]' echo 'Available options:' echo '--patch=version force use of patch for particular kernel version' echo '-p version ditto' echo '--nopatch do not apply patch, only install new files' echo '-n ditto' echo '--test apply the patch but do not change any files' echo '-t ditto' exit 1 } get_perfctr_srcdir() { # XXX: use dirname instead? perfctr=`echo $0 | sed 's+/update-kernel$++'` } get_arch() { if [ -z "$ARCH" ]; then ARCH=`uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/ -e s/ppc.*/powerpc/` fi } get_options() { while [ $# -gt 0 ]; do case "$1" in --patch=*) patch=`echo "$1" | sed s/--patch=//` ;; -p) shift if [ $# -eq 0 ]; then echo Error: option "'-p'" requires an argument usage fi patch="$1" ;; --nopatch|-n) nopatch=1 ;; --test|-t) dryrun="--dry-run" ;; --sym) # not for general use sym=1 ;; --backup) # not for general use backup=1 ;; *) echo Error: unknown option "$1" usage ;; esac shift done } check_pwd_is_kernel_srcdir() { if [ ! -f drivers/Makefile -o ! -f "arch/$ARCH/kernel/Makefile" ]; then echo "Error: `pwd` does not appear to be the top-level kernel source directory" usage fi } check_kernel_srcdir_is_clean() { if [ -f System.map -o -f .version ]; then echo 'Error: kernel source is not clean; please do a "make mrproper"' exit 1 fi } get_makefile_variable() { eval `grep "^$1 *=" Makefile | head -n 1 | sed 's/ *= */=/'` } get_kernel_version() { get_makefile_variable VERSION get_makefile_variable PATCHLEVEL get_makefile_variable SUBLEVEL get_makefile_variable EXTRAVERSION case "$EXTRAVERSION" in *custom) maybe_redhat=1 EXTRAVERSION=`echo $EXTRAVERSION | sed 's/\(.*\)custom/\1/'` ;; esac kernel="$VERSION.$PATCHLEVEL.$SUBLEVEL$EXTRAVERSION" } check_given_patch() { if [ ! -f "$perfctr/patches/patch-kernel-$patch" ]; then alias=`grep ^$patch/ $perfctr/patches/aliases | awk -F/ '{ print $2 }'` if [ -n "$alias" -a -f "$perfctr/patches/patch-kernel-$alias" ]; then patch="$alias" echo Using patch "$alias" for kernel "$kernel" else echo Error: no patch for user-specified version "$patch" found echo See "$perfctr/patches/" for supported kernel versions exit 1 fi fi patchtype="(forced, kernel is $kernel)" } try_standard() { if [ -f "$perfctr/patches/patch-kernel-$kernel" ]; then patch="$kernel" echo Found patch for kernel "$kernel" else alias=`grep ^$kernel/ $perfctr/patches/aliases | awk -F/ '{ print $2 }'` if [ -n "$alias" -a -f "$perfctr/patches/patch-kernel-$alias" ]; then patch="$alias" echo Using patch "$alias" for kernel "$kernel" fi fi } try_redhat() { if [ -f /etc/redhat-release ]; then maybe_redhat=1 fi if [ -n "$EXTRAVERSION" -a -n "$maybe_redhat" ]; then if [ -f "$perfctr/patches/patch-kernel-$kernel-redhat" ]; then patch="$kernel-redhat" echo Found patch for RedHat kernel "$kernel" else alias=`grep ^$kernel-redhat $perfctr/patches/aliases | awk -F/ '{ print $2 }'` if [ -n "$alias" -a -f "$perfctr/patches/patch-kernel-$alias" ]; then patch="$alias" echo Using patch "$alias" for RedHat kernel "$kernel" fi fi fi } deduce_patch() { try_standard if [ -z "$patch" ]; then try_redhat fi if [ -z "$patch" ]; then echo Error: no suitable patch found for kernel "$kernel" echo See "$perfctr/patches/" for supported kernel versions exit 1 fi patchtype="(auto-detected)" } identify_patch() { if [ -n "$patch" ]; then check_given_patch else deduce_patch fi } apply_patch() { echo echo Applying kernel source patch for "$patch" "$patchtype" echo bVt= if [ "$backup" ]; then bVt="-bVt" fi patch $dryrun $bVt -p1 < "$perfctr/patches/patch-kernel-$patch" } install_files_by_symlinks() { echo ln -sf ${perfctr}/linux/include/asm-i386/perfctr.h include/asm-i386/ ln -sf ${perfctr}/linux/include/asm-i386/perfctr.h include/asm-i386/ echo ln -sf ${perfctr}/linux/include/asm-x86_64/perfctr.h include/asm-x86_64/ ln -sf ${perfctr}/linux/include/asm-x86_64/perfctr.h include/asm-x86_64/ echo ln -sf ${perfctr}/linux/include/asm-powerpc/perfctr.h include/asm-powerpc/ ln -sf ${perfctr}/linux/include/asm-powerpc/perfctr.h include/asm-powerpc/ echo ln -sf ${perfctr}/linux/include/linux/perfctr.h include/linux/ ln -sf ${perfctr}/linux/include/linux/perfctr.h include/linux/ echo ln -sf ${perfctr}/linux/drivers/perfctr drivers/ ln -sf ${perfctr}/linux/drivers/perfctr drivers/ } install_files_by_tar() { tar -C "$perfctr/linux" --exclude CVS -cf - . | tar -xf - rm -f include/asm } install_files() { echo echo Installing new kernel source files echo if [ -n "$sym" ]; then install_files_by_symlinks else install_files_by_tar fi } get_perfctr_srcdir get_arch get_options "$@" check_pwd_is_kernel_srcdir check_kernel_srcdir_is_clean get_kernel_version if [ -z "$nopatch" ]; then identify_patch apply_patch fi if [ -z "$dryrun" ]; then install_files fi