#!/bin/sh # option variables DESTDIR= KERNELDIR= TARGET= # Not sure what to put here # TARGET_ARCH=$(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/) TARGET_ARCH= TARGET_CONFIG= JOBS=1 CONFIGURE_FLAGS= # commands to run BUILD_LUSTRE=0 BUILD_KERNEL=0 DEPEND_KERNEL=0 INSTALL_LUSTRE=0 INSTALL_KERNEL=0 SAVE_HEADERS=0 UNPACK_KERNEL=0 # provided by target file KERNEL= SERIES= CONFIG= VERSION= EXTRA_VERSION= BASE_ARCH= BIGMEM_ARCHS= BOOT_ARCHS= JENSEN_ARCHS= SMP_ARCHS= UP_ARCHS= # flat-out globals TOPDIR= TARGET_FILE= KERNEL_FILE= SERIES_FILE= CONFIG_FILE= CC=${CC:-gcc} canon() { pushd $1 >/dev/null echo $PWD popd >/dev/null } TOPDIR=$(canon "${0%%${0##*/}}/..") cleanup() { true } fatal() { cleanup [ "$2" ] && echo [ "$2" ] && echo "${0##*/}: $2" exit $1 } list_targets() { echo -n "Available targets:" for target in $TOPDIR/kernel_patches/targets/*.target ; do target_file=${target##*/} echo -n " ${target_file%%.target}" done echo } usage() { cat <] Options: --build same as --build-kernel --build-lustre --unpack-kernel --build-lustre configure and compile lustre. Requires that --build-kernel was already run. --build-kernel configure and compile a kernel. Implies --depend-kernel. Requires that --unpack-kernel was already run. --depend-kernel) Prepares a kernel tree for building (similar to make mrproper oldconfig dep). Requires that --unpack-kernel was already run. --destdir=DESTDIR Root directory to install into (like DESTDIR with auto*). --extraversion=EXTRAVERSION Overrides the target kernel\'s EXTRAVERSION text. -h, --help Display this message. --install same as --install-kernel --install-lustre --install-lustre run make install in the Lustre tree. --install-kernel install the kernel image and modules. -j jobs This works just like the -j option to make, and is passed to make when building. --kerneldir=KERNELDIR Directory containing linux source tarballs. --target=TARGET Name of the configuration to use. The available targets are listed below. --target-arch=ARCH Specifies an architecture to use when choosing a kernel config file. Default is i386. --target-config=CONFIG Specifies a special option (such as smp, bigmem, or BOOT) to use when choosing a kernel config file. This also modifies the kernel version and modules directory. --unpack-kernel Untars and patches the kernel source. The order that commands (--build-lustre, --unpack-kernel) are specified on the command line is ignored; ${0##*/} will always execute them in the correct order (unpack, then build, then install etc.). EOF list_targets fatal "$1" "$2" } check_options() { (( $BUILD_LUSTRE || $BUILD_KERNEL || $DEPEND_KERNEL || \ $INSTALL_LUSTRE || $INSTALL_KERNEL || $SAVE_HEADERS || \ $UNPACK_KERNEL )) || \ fatal 1 "No commands specified." if (( $UNPACK_KERNEL )) ; then [ "$KERNELDIR" ] || \ fatal 1 "A kernel directory must be specified with --kerneldir." [ -d "$KERNELDIR" ] || \ fatal 1 "$KERNELDIR is not a directory." fi if (( $INSTALL_LUSTRE || $INSTALL_KERNEL || $SAVE_HEADERS )) ; then [ -z "$DESTDIR" -o -d "$DESTDIR" ] || \ fatal 1 "$DESTDIR is not a directory." fi [ "$TARGET" ] || usage 1 "A target must be specified with --target." TARGET_FILE="$TOPDIR/kernel_patches/targets/$TARGET.target" [ -r "$TARGET_FILE" ] || \ fatal 1 "Target '$TARGET' was not found. Try --list-targets." if [ -z "$JOBS" -o "$JOBS" -lt "1" ] ; then JOBS=1 fi } get_lustre_version() { lustre_patch=$(grep lustre_version "$SERIES_FILE" 2>/dev/null) [ "$lustre_patch" ] || \ fatal 1 "Could not determine Lustre version from $SERIES series." awk '/^\+#define LUSTRE_KERNEL_VERSION /{ print $3 }' \ "$TOPDIR/kernel_patches/patches/$lustre_patch" 2>/dev/null } load_target() { EXTRA_VERSION_save="$EXTRA_VERSION" . "$TARGET_FILE" [ "$KERNEL" ] || fatal 1 "Target $TARGET did not specify a kernel." [ "$SERIES" ] || fatal 1 "Target $TARGET did not specify a patch series." # [ "$CONFIG" ] || fatal 1 "Target $TARGET did not specify a kernel config." [ "$VERSION" ] || fatal 1 "Target $TARGET did not specify the kernel version." if [ "$KERNELDIR" ] ; then KERNEL_FILE="$KERNELDIR/$KERNEL" [ -r "$KERNELDIR/$KERNEL" ] || \ fatal 1 "Target $TARGET's kernel file $KERNEL not found in kernel directory $KERNELDIR." fi SERIES_FILE="$TOPDIR/kernel_patches/series/$SERIES" [ -r "$SERIES_FILE" ] || \ fatal 1 "Target $TARGET's series $SERIES missing from $TOPDIR/kernel_patches/series." TARGET_ARCH=${TARGET_ARCH:-$BASE_ARCHS} CONFIG_TARGET="$TARGET-${TARGET_ARCH}${TARGET_CONFIG:+-$TARGET_CONFIG}" CONFIG_FILE="$TOPDIR/kernel_patches/kernel_configs/kernel-$VERSION-$CONFIG_TARGET.config" [ -r "$CONFIG_FILE" ] || fatal 1 "Target $TARGET's config file $CONFIG_FILE missing from $TOPDIR/kernel_patches/configs." if [ "$EXTRA_VERSION_save" ] ; then EXTRA_VERSION="$EXTRA_VERSION_save" else EXTRA_VERSION="${EXTRA_VERSION}_lustre.$(get_lustre_version)" fi } tarflags() { case "$1" in '') fatal 1 "tarflags(): File name argument missing." ;; *.tar.gz) echo 'zxf' ;; *.tar.bz2) echo 'jxf' ;; *) fatal 1 "tarflags(): Unrecognized tar extension in file: $1" ;; esac } untar() { echo "Untarring ${1##*/}..." tar $(tarflags $1) $1 } extract_kernel() { (( $UNPACK_KERNEL )) || return 0 pushd "$TOPDIR" >/dev/null if [ -d linux ] ; then [ -L linux ] && rm -rf $(readlink linux) rm -rf linux fi untar "$KERNEL_FILE" [ -d linux ] || ln -sf linux* linux popd >/dev/null } patch_kernel() { (( $UNPACK_KERNEL )) || return 0 pushd "$TOPDIR/linux" >/dev/null echo -n "Applying patch" for patch in $(<"$SERIES_FILE") ; do PATCH_FILE="$TOPDIR/kernel_patches/patches/$patch" [ -r "$PATCH_FILE" ] || \ fatal 1 "Patch file not found: $patch" echo -n " $patch" patch -s -p1 < "$PATCH_FILE" || fatal 1 "Error applying patch $patch." done echo popd >/dev/null } depend_kernel() { (( $DEPEND_KERNEL )) || return 0 # we need to override $CC at make time, since there is no # configure MAKE="make -s CC=$CC" pushd "$TOPDIR/linux" >/dev/null echo "Overriding EXTRAVERSION in kernel..." perl -p -i -e "s/^EXTRAVERSION.*/EXTRAVERSION = -${EXTRA_VERSION}${TARGET_CONFIG}/" Makefile echo "Making depend in $PWD..." $MAKE mrproper || fatal 1 "Error running make mrproper" cp "$CONFIG_FILE" .config $MAKE oldconfig_nonint || fatal 1 "Error running make oldconfig" $MAKE -j $JOBS dep || fatal 1 "Error running make dep" $MAKE include/linux/version.h || fatal 1 "Error making include/linux/version.h" } build_kernel() { (( $BUILD_KERNEL )) || return 0 # we need to override $CC at make time, since there is no # configure MAKE="make -s CC=$CC" echo "Building kernel in $PWD..." case "$TARGET_ARCH" in i386 | i586 | i686 | athlon | x86_64) $MAKE -j $JOBS -s bzImage || fatal 1 "Error making bzImage." ;; *) $MAKE -j $JOBS -s boot || fatal 1 "Error making boot." ;; esac $MAKE -j $JOBS -s modules || fatal 1 "Error building modules." popd >/dev/null } configure_lustre() { (( $BUILD_LUSTRE )) || return 0 pushd "$TOPDIR" >/dev/null [ -f Makefile ] && make -s clean [ -f configure ] || sh ./autogen.sh ./configure --with-linux=$PWD/linux $CONFIGURE_FLAGS || \ fatal 1 "Error configuring Lustre." popd >/dev/null } build_lustre() { (( $BUILD_LUSTRE )) || return 0 pushd "$TOPDIR" >/dev/null make -j $JOBS -s || fatal 1 "Error building Lustre." popd >/dev/null } install_kernel() { (( $INSTALL_KERNEL )) || return 0 FULL_VERSION="${VERSION}-${EXTRA_VERSION}${TARGET_CONFIG}" pushd "$TOPDIR/linux" >/dev/null mkdir -p "$DESTDIR/boot" install -m 644 System.map "$DESTDIR/boot/System.map-${FULL_VERSION}" # install -m 644 module-info ... install -m 644 "$CONFIG_FILE" "$DESTDIR/boot/config-${FULL_VERSION}" mkdir -p "$DESTDIR/dev/shm" case "$TARGET_ARCH" in i386 | i586 | i686 | athlon) cp arch/i386/boot/bzImage "$DESTDIR/boot/vmlinuz-${FULL_VERSION}" cp vmlinux "$DESTDIR/boot/vmlinux-${FULL_VERSION}" ;; x86_64) cp arch/x86_64/boot/bzImage "$DESTDIR/boot/vmlinuz-${FULL_VERSION}" cp vmlinux "$DESTDIR/boot/vmlinux-${FULL_VERSION}" ;; ia64) gzip -cfv vmlinux > vmlinuz mkdir -p "$DESTDIR/boot/efi/redhat" install -m 755 vmlinux "$DESTDIR/boot/efi/redhat/vmlinux-${FULL_VERSION}" install -m 755 vmlinuz "$DESTDIR/boot/efi/redhat/vmlinuz-${FULL_VERSION}" ln -sf "efi/redhat/vmlinux-${FULL_VERSION}" "$DESTDIR/boot/vmlinux-${FULL_VERSION}" ln -sf "efi/redhat/vmlinuz-${FULL_VERSION}" "$DESTDIR/boot/vmlinuz-${FULL_VERSION}" ;; *) cp vmlinuz "$DESTDIR/boot/vmlinuz-${FULL_VERSION}" cp vmlinux "$DESTDIR/boot/vmlinux-${FULL_VERSION}" ;; esac mkdir -p "$DESTDIR/lib/modules/${FULL_VERSION}" make CC="$CC" INSTALL_MOD_PATH="$DESTDIR" KERNELRELEASE="$FULL_VERSION" \ -s modules_install || \ fatal 1 "Error installing modules." popd >/dev/null } install_lustre() { (( $INSTALL_LUSTRE )) || return 0 FULL_VERSION="${VERSION}-${EXTRA_VERSION}${TARGET_CONFIG}" pushd "$TOPDIR" >/dev/null make -s install "DESTDIR=$DESTDIR" KERNELRELEASE="$FULL_VERSION" || fatal 1 "Error installing Lustre." popd >/dev/null } save_headers() { echo "Saving headers for $1 $2..." pushd linux >/dev/null KVERREL="${VERSION}-${EXTRA_VERSION}" # deal with the kernel headers that are version specific saveddir="$RPM_BUILD_ROOT/usr/src/linux-${KVERREL}/savedheaders/$2/$1" mkdir -p "$saveddir" install -m 644 include/linux/autoconf.h "$saveddir/autoconf.h" install -m 644 include/linux/version.h "$saveddir/version.h" mv include/linux/modules "$saveddir/" echo $2 $1 ../../savedheaders/$2/$1/ >> $RPM_BUILD_ROOT/usr/src/linux-${KVERREL}/savedheaders/list popd >/dev/null } save_all_headers() { (( $SAVE_HEADERS )) || return 0 for arch in $BIGMEM_ARCHS ; do save_headers bigmem $arch done for arch in $BOOT_ARCHS ; do save_headers BOOT $arch done for arch in $JENSEN_ARCHS ; do save_headers jensen $arch done for arch in $SMP_ARCHS ; do save_headers smp $arch done for arch in $UP_ARCHS ; do save_headers up $arch done } longopts="build,build-lustre,build-kernel,depend-kernel,destdir:,extraversion:" longopts="$longopts,help,install,install-lustre,install-kernel,kerneldir:" longopts="$longopts,save-headers,target:,target-arch:,target-config:,unpack-kernel" options=$(getopt -o hj: -l "$longopts" -- "$@") eval set -- "$options" while [ "$1" ] ; do case "$1" in '') usage 1 ;; --build) BUILD_LUSTRE=1 BUILD_KERNEL=1 DEPEND_KERNEL=1 UNPACK_KERNEL=1 shift ;; --build-lustre) BUILD_LUSTRE=1 shift ;; --build-kernel) BUILD_KERNEL=1 DEPEND_KERNEL=1 shift ;; --depend-kernel) DEPEND_KERNEL=1 shift ;; --destdir) DESTDIR=$2 shift 2 ;; --extraversion) EXTRA_VERSION=$2 shift 2 ;; --help | -h) usage 0 ;; --install) INSTALL_LUSTRE=1 INSTALL_KERNEL=1 shift ;; --install-lustre) INSTALL_LUSTRE=1 shift ;; --install-kernel) INSTALL_KERNEL=1 shift ;; -j) JOBS=$2 shift 2 ;; --kerneldir) KERNELDIR=$2 shift 2 ;; --save-headers) SAVE_HEADERS=1 shift ;; --target) TARGET=$2 shift 2 ;; --target-arch) TARGET_ARCH=$2 shift 2 ;; --target-config) TARGET_CONFIG=$2 shift 2 ;; --unpack-kernel) UNPACK_KERNEL=1 shift ;; --) shift CONFIGURE_FLAGS=$@ break ;; *) usage 1 "Unrecognized option: $1" ;; esac done check_options load_target extract_kernel patch_kernel depend_kernel build_kernel configure_lustre build_lustre install_kernel install_lustre save_all_headers exit 0