diff --git a/build/lmake b/build/lmake new file mode 100755 index 0000000000000000000000000000000000000000..ba18136be7e24bf6eb582b5cd41eff4580092dad --- /dev/null +++ b/build/lmake @@ -0,0 +1,885 @@ +#!/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= +TMPDIR=${TMPDIR:-"/var/tmp"} + +# 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_ARCHS= +BIGMEM_ARCHS= +BOOT_ARCHS= +JENSEN_ARCHS= +SMP_ARCHS= +BIGSMP_ARCHS= +PSERIES64_ARCHS= +UP_ARCHS= + +RHBUILD=0 +SUSEBUILD=0 + +# flat-out globals +TOPDIR= +TARGET_FILE= +KERNEL_FILE= +SERIES_FILE= +CONFIG_FILE= +RPMBUILD= + +canon() +{ + pushd $1 >/dev/null + echo $PWD + popd >/dev/null +} +TOPDIR="${0%%${0##*/}}" +if [ "${TOPDIR}" ] ; then + TOPDIR=$(canon "${TOPDIR}/..") +else + TOPDIR=$(canon "..") +fi + +lbuild_topdir() +{ + retdir=$TOPDIR + while [ ! -d $retdir/BUILD ] ; do + retdir=$(canon "$retdir/..") + if [ "$retdir" = "/" ] ; then + break; + fi + done + echo "$retdir" +} + +cleanup() +{ + true +} + +fatal() +{ + cleanup + [ "$2" ] && echo + [ "$2" ] && echo "${0##*/}: $2" + exit $1 +} + +list_targets() +{ + echo -n "Available targets:" + for target in $TOPDIR/lustre/kernel_patches/targets/*.target ; do + target_file=${target##*/} + echo -n " ${target_file%%.target}" + done + echo +} + + +usage() +{ + cat <<EOF +Usage: ${0##*/} [OPTION]... [-- <lustre configure options>] + +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, bigsmp, 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/lustre/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 + + RPMBUILD=$(which rpmbuild 2>/dev/null | head -1) + if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then + RPMBUILD=$(which rpm 2>/dev/null | head -1) + if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then + usage 1 "Could not find binary for making rpms (tried rpmbuild and rpm)." + fi + fi +} + +get_lustre_version() +{ + for series in $SERIES ; do + SERIES_FILE="$TOPDIR/lustre/kernel_patches/series/$series" + lustre_patch=$(grep lustre_version "$SERIES_FILE" 2>/dev/null) + [ "$lustre_patch" ] && break + done + [ "$lustre_patch" ] || \ + fatal 1 "Could not determine Lustre version from $SERIES series." + + awk '/^\+#define LUSTRE_KERNEL_VERSION /{ print $3 }' \ + "$TOPDIR/lustre/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." +# Suse 2.6 has our patches in already +# [ "$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 + + if [ "$SERIES" ] ; then + for series in $SERIES ; do + SERIES_FILE="$TOPDIR/lustre/kernel_patches/series/$series" + [ -r "$SERIES_FILE" ] || \ + fatal 1 "Target $TARGET's series $SERIES missing from $TOPDIR/lustre/kernel_patches/series." + done + fi + + TARGET_ARCH=${TARGET_ARCH:-$BASE_ARCHS} + CONFIG_TARGET="$TARGET-${TARGET_ARCH}${TARGET_CONFIG:+-$TARGET_CONFIG}" + CONFIG_FILE="$TOPDIR/lustre/kernel_patches/kernel_configs/kernel-$VERSION-$CONFIG_TARGET.config" + [ -r "$CONFIG_FILE" ] || + fatal 1 "Target $TARGET's config file $CONFIG_FILE missing from $TOPDIR/lustre/kernel_patches/configs." + + if [ "$EXTRA_VERSION_save" ] ; then + EXTRA_VERSION="$EXTRA_VERSION_save" + else + EXTRA_VERSION="${EXTRA_VERSION}_lustre.$(get_lustre_version)" + fi +} + +# do these after load_target(), which maybe export CC +setup_ccache_distcc() +{ + # distcc can't handle ".incbin" + if [ "$TARGET" == "2.6-suse" -o "$TARGET" == "2.6-rhel4" ]; then + if [ "$TARGET_ARCH" == "x86_64" ]; then + unset DISTCC + fi + fi + + CC=${CC:-gcc} + if [ "$CCACHE" ]; then + CC="$CCACHE $CC" + [ "$DISTCC" ] && export CCACHE_PREFIX="$DISTCC" + else + [ "$DISTCC" ] && CC="$DISTCC $CC" + fi +} + +tarflags() +{ + case "$1" in + '') + fatal 1 "tarflags(): File name argument missing." + ;; + *.tar.gz | *.tgz) + echo 'zxf' + ;; + *.tar.bz2) + echo 'jxf' + ;; + *.tar) + echo 'xf' + ;; + *) + 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 + [ "$SERIES" ] || return 0 + pushd "$TOPDIR/linux" >/dev/null + for series in $SERIES ; do + echo -n "Applying series $series:" + SERIES_FILE="$TOPDIR/lustre/kernel_patches/series/$series" + for patch in $(<"$SERIES_FILE") ; do + PATCH_FILE="$TOPDIR/lustre/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 + done + popd >/dev/null +} + +set_make() +{ + MAKE="make -s" + if [ "$CC" ] ; then + MAKE_CC="CC=$CC" + fi + if [ "$ARCH" ] ; then + MAKE_ARCH="$MAKE ARCH=$ARCH" + else + case $TARGET_ARCH in + i?86) + ;; + *) + MAKE_ARCH="$MAKE ARCH=$TARGET_ARCH" + ;; + esac + fi + MAKE_J="$MAKE -j $JOBS" +} + +timed_run() { + SLEEP_TIME=$1 + shift + + set -o monitor + + #bash -c "$@" & + ("$@") & + child_pid=$! + + (sleep $SLEEP_TIME + kill -TERM -$child_pid 2>/dev/null + sleep 5 + kill -KILL -$child_pid 2>/dev/null + echo "$1 was killed due to timeout") & + dog_pid=$! + + wait $child_pid + # status will be set to 143 if the process had to be killed due to timeout + status=${PIPESTATUS[0]} + kill -KILL -$dog_pid + return $status +} + +depend_kernel() +{ + (( $DEPEND_KERNEL )) || return 0 + # we need to override $CC at make time, since there is no + # configure + set_make + pushd "$TOPDIR/linux" >/dev/null + echo "Overriding EXTRAVERSION in kernel..." + local extra_version="${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}" + if [ -n "${TARGET_CONFIG}" ]; then + extra_version="${extra_version}${TARGET_DELIMITER}${TARGET_CONFIG}" + fi + perl -p -i -e "s/^EXTRAVERSION.*/EXTRAVERSION = ${extra_version}/" Makefile + echo "Making depend in $PWD..." + $MAKE "$MAKE_CC" mrproper || fatal 1 "Error running make mrproper" + rm -f rpm-release + # remove localversion-* files to avoid kernel release string + # srewing up by the top-level Makefile + rm -f localversion-* + cp "$CONFIG_FILE" .config + local UPDATE_OLDCONFIG= + for oc in oldconfig_nonint silentoldconfig oldconfig ; do + if grep -q "$oc" Makefile ; then + timed_run 300 $MAKE "$MAKE_CC" $oc || UPDATE_OLDCONFIG=1 + break + fi + done + + if [ "$UPDATE_OLDCONFIG" ] ; then + # use the expect script to "make oldconfig" and answer the questions for + # new items conservatively. QA will get notified on anything newly added + # for them to review and adjust accordingly. + local logfile=$(mktemp /tmp/XXXXXX) + #timed_run 300 $TOPDIR/build/update_oldconfig $logfile + #local RC=${PIPESTATUS[0]} + #local RC=$(strace -f -o update_oldconfig.strace bash -c "$TOPDIR/build/update_oldconfig $logfile; echo \$?") + $TOPDIR/build/update_oldconfig $logfile + local RC=${PIPESTATUS[0]} + #$TOPDIR/build/update_oldconfig $logfile + #local RC=${PIPESTATUS[0]} + if [ $RC -eq 143 ]; then + fatal 1 "update_oldconfig timed out" + elif [ $RC -ne 0 ]; then + # dump the log + cat $logfile + rm -f $logfile + if [ -f update_oldconfig.strace ]; then + cat update_oldconfig.strace + rm -f update_oldconfig.strace + fi + fatal 1 "update_oldconfig failed: $RC. See log above." + fi + fi + rm -f $logfile + # now notify if resulting .config is different than $CONFIG_FILE + local tmpfile=$(mktemp /tmp/XXXXXX) + diff -I '^#.*' -u "$CONFIG_FILE" .config >$tmpfile + if [ -s $tmpfile ]; then + { cat <<EOF +To: lustre-qa-team@sun.com +Subject: kernel_config change + +The result of a make oldconfig on file $CONFIG_FILE resulted in a +difference when compared to .config in the following way: + +EOF + cat $tmpfile + echo -e "\n\nPlease consider updating $CONFIG_FILE for version: $extra_version." + # not sure these are entirely useful. the above and "patch" are good + #echo -e "\nThe entire new .config file:\n" + #cat .config + # sadly, the build roots can't e-mail out, so we can only display this + # to stderr for an interested party to inspect + #} | sendmail -flustre-qa-team@sun.com -t + } >&2 + fi + rm -f $tmpfile + + case "$VERSION" in + 2.6*) + $MAKE "$MAKE_CC" include/asm + ;; + 2.4*) + $MAKE "$MAKE_CC" symlinks + $MAKE "$MAKE_CC" dep || fatal 1 "Error running make dep" + ;; + esac + $MAKE "$MAKE_CC" include/linux/version.h || fatal 1 "Error making include/linux/version.h" +} + +build_kernel() +{ + (( $BUILD_KERNEL )) || return 0 + set_make + echo "Building kernel in $PWD..." + case "$TARGET_ARCH" in + i386 | i586 | i686 | athlon | x86_64) + $MAKE_J "$MAKE_CC" bzImage || fatal 1 "Error making bzImage." + ;; + ia64 | ppc | ppc64) + $MAKE_J "$MAKE_CC" vmlinux || fatal 1 "Error making vmlinux." + ;; + *) + $MAKE_J "$MAKE_CC" boot || fatal 1 "Error making boot." + ;; + esac + $MAKE_J "$MAKE_CC" modules || fatal 1 "Error building modules." + + popd >/dev/null +} + +build_kernel_ib() +{ + (( $BUILD_KERNEL )) || return 0 + # build kernel-ib{,-devel} + # some I/B drivers are architecture dependent and kernel-ib's configure + # does not figure it out for us ~sigh~ + local configure_options="" + case "$TARGET_ARCH" in + x86_64 | ia64) + configure_options="--with-ipath_inf-mod" + ;; + ppc64) + configure_options="--with-ipath_inf-mod --with-ehca-mod" + ;; + esac + $RPMBUILD --rebuild --define 'build_kernel_ib 1' --define 'build_kernel_ib_devel 1' \ + --define "_topdir $(lbuild_topdir)" --target ${TARGET_ARCH} \ + --define "KVERSION ${FULL_VERSION}" \ + --define "KSRC $PWD/linux" \ + --define "LIB_MOD_DIR /lib/modules/${FULL_VERSION}" \ + --define "configure_options --without-quilt --with-core-mod --with-user_mad-mod --with-user_access-mod --with-addr_trans-mod --with-srp-target-mod --with-core-mod --with-mthca-mod --with-mlx4-mod --with-cxgb3-mod --with-nes-mod --with-ipoib-mod --with-sdp-mod --with-srp-mod --without-srp-target-mod --with-rds-mod --with-iser-mod --with-qlgc_vnic-mod --with-madeye-mod $configure_options" $(lbuild_topdir)/OFED/SRPMS/ofa_kernel-${OFED_VERSION}-ofed${OFED_VERSION}.src.rpm + + if [ ${PIPESTATUS[0]} != 0 ]; then + fatal 1 "Error building kernel-ib" + fi + + pushd "$TOPDIR" >/dev/null + rm -rf kernel-ib-devel + mkdir kernel-ib-devel + cd kernel-ib-devel + local rpm=$(ls $(lbuild_topdir)/RPMS/*/kernel-ib-devel-${OFED_VERSION}-${FULL_VERSION//-/_}.*.rpm) + rpm2cpio -itv < $rpm | cpio -id + CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/ofa_kernel ${CONFIGURE_FLAGS}" + popd >/dev/null +} + + +configure_lustre() +{ + return 0 + (( $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 + set_make + pushd "$TOPDIR" >/dev/null + sed \ + -e s^@VERSION@^${LUSTRE_VERSION}^g \ + -e s^@LINUXRELEASE@^${FULL_VERSION}^g \ + -e s^@RELEASE@^${FULL_VERSION//-/_}^g \ + -e s^@ac_configure_args@^"--with-linux=${PWD}/linux ${CONFIGURE_FLAGS}"^g \ + < lustre.spec.in \ + > lustre.spec + $RPMBUILD --target ${TARGET_ARCH} -bb lustre.spec \ + --define "_tmppath $TMPDIR" \ + --define "_topdir $(lbuild_topdir)" || \ + fatal 1 "Error building Lustre rpms." + # $MAKE_J "$MAKE_CC" || fatal 1 "Error building Lustre." + popd >/dev/null +} + +install_kernel() +{ + (( $INSTALL_KERNEL )) || return 0 + set_make + 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" + mkdir -p "$DESTDIR/lib/modules/${FULL_VERSION}" + + $MAKE "$MAKE_CC" INSTALL_MOD_PATH="$DESTDIR" KERNELRELEASE="$FULL_VERSION" \ + -s modules_install || \ + fatal 1 "Error installing modules." + + case "$TARGET_ARCH" in + i386 | i586 | i686 | athlon) + cp arch/i386/boot/bzImage "$DESTDIR/boot/vmlinuz-${FULL_VERSION}" + cp vmlinux "$DESTDIR/lib/modules/${FULL_VERSION}/" + ln -sf "../lib/modules/${FULL_VERSION}/vmlinux" "$DESTDIR/boot/vmlinux-${FULL_VERSION}" + ;; + x86_64) + cp arch/x86_64/boot/bzImage "$DESTDIR/boot/vmlinuz-${FULL_VERSION}" + cp vmlinux "$DESTDIR/lib/modules/${FULL_VERSION}/" + ln -sf "../lib/modules/${FULL_VERSION}/vmlinux" "$DESTDIR/boot/vmlinux-${FULL_VERSION}" + ;; + ppc | ppc64) + cp vmlinux "$DESTDIR/boot/vmlinux-${FULL_VERSION}" + ln -sf "$DESTDIR/boot/vmlinux-${FULL_VERSION}" "../lib/modules/${FULL_VERSION}/vmlinux" + ;; + ia64) + gzip -cfv vmlinux > vmlinuz + mkdir -p "$DESTDIR/boot/efi/redhat" + install -m 755 vmlinux "$DESTDIR/lib/modules/${FULL_VERSION}/" + install -m 755 vmlinuz "$DESTDIR/boot/efi/redhat/vmlinuz-${FULL_VERSION}" + ln -sf "../../../lib/modules/${FULL_VERSION}/vmlinux" "$DESTDIR/boot/efi/redhat/vmlinux-${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/lib/modules/${FULL_VERSION}/vmlinux-${FULL_VERSION}" + ln -sf "../lib/modules/${FULL_VERSION}/vmlinux-${FULL_VERSION}" "$DESTDIR/boot/vmlinux-${FULL_VERSION}" + + ;; + esac + if [ -e init/kerntypes.o ] ; then + cp init/kerntypes.o "$DESTDIR/boot/Kerntypes-${FULL_VERSION}" + fi + + popd >/dev/null +} + +cleanup_libmodules() +{ + (( $INSTALL_LUSTRE )) || return 0 + + KVERREL="${VERSION}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}" + i="$DESTDIR/lib/modules/${FULL_VERSION}" + + rm -f $i/build + rm -f $i/source + + if (( $LINUX26 )) ; then + ln -sf ../../../usr/src/linux-${KVERREL}-obj/${TARGET_ARCH}/${TARGET_CONFIG} $i/build + ln -sf ../../../usr/src/linux-${KVERREL} $i/source + else + ln -sf ../../../usr/src/linux-${KVERREL} $i/build + fi +} + +install_lustre() +{ + (( $INSTALL_LUSTRE )) || return 0 + return 0 + set_make + pushd "$TOPDIR" >/dev/null + $MAKE "$MAKE_CC" -s install "DESTDIR=$DESTDIR" KERNELRELEASE="$FULL_VERSION" || fatal 1 "Error installing Lustre." + popd >/dev/null +} + +build_kms() +{ + (( $BUILD_KERNEL )) || return 0 + (( $SUSEBUILD )) || return 0 + set_make + mkdir -p "${TOPDIR}/modules-${FULL_VERSION}" + for dir in /usr/src/kernel-modules/* ; do + # we are replacing lustre-lite, so don't include it + if [ "${dir##*/}" != "lustre-lite" -a -e $dir/Makefile ]; then + build_dir="${TOPDIR}/modules-${FULL_VERSION}/${dir##*/}" + cp -a $dir $build_dir + # these modules are terrible, and don't all build + $MAKE_J "$MAKE_CC" -C $build_dir modules KERNEL_SOURCE="${TOPDIR}/linux" + fi + done +} + +symver() +{ + local file=$1 name=${1%.ko} + nm $file \ + | sed -ne 's,^0*\([0-9a-f]\{8\}\) A __crc_\(.*\),0x\1\t\2\t'"$name"',p' +} + +install_kms() +{ + (( $INSTALL_KERNEL )) || return 0 + (( $LINUX26 )) || return 0 + set_make + for build_dir in "${TOPDIR}/modules-${FULL_VERSION}/*" ; do + [ -d $build_dir ] || continue + # these modules are terrible, and don't all build + $MAKE "$MAKE_CC" -C $build_dir KERNEL_SOURCE="${TOPDIR}/linux" INSTALL_MOD_PATH="$DESTDIR" + done + local symvers_file="${DESTDIR}/boot/symvers-${VERSION}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}-${TARGET_ARCH}" + if [ -n "$TARGET_CONFIG" ]; then + symvers_file="${symvers_file}${TARGET_DELIMITER}${TARGET_CONFIG}" + fi + symvers_file="$symvers_file.gz" + ( symver vmlinux + moddir="${DESTDIR}/lib/modules/${FULL_VERSION}" + cd $moddir/kernel + for module in $(find * -name '*.ko'); do + symver $module + done + cd $moddir + for module in $(find * -path 'kernel/*' -prune -o \ + -name '*.ko' -print); do + symver $module + done + ) | sort -u -k2 | gzip -c9 > $symvers_file +} + +save_headers() +{ + (( $SAVE_HEADERS )) || return 0 + + echo "Saving headers for ${TARGET_CONFIG:-up} ${TARGET_ARCH}..." + pushd linux >/dev/null + + KVERREL="${VERSION}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}" + # deal with the kernel headers that are version specific + + saveddir="$RPM_BUILD_ROOT/usr/src/linux-${KVERREL}/savedheaders/${TARGET_ARCH}/${TARGET_CONFIG:-up}" + 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 ${TARGET_ARCH} ${TARGET_CONFIG} ../../savedheaders/${TARGET_ARCH}/${TARGET_CONFIG:-up}/ \ + >> "$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 $BIGSMP_ARCHS ; do + save_headers bigsmp $arch + done + for arch in $PSERIES64_ARCHS ; do + save_headers pseries64 $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 +EXTRA_VERSION_DELIMITER=${EXTRA_VERSION_DELIMITER:-"-"} +FULL_VERSION="${VERSION}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}" +if [ -n "$TARGET_CONFIG" ]; then + FULL_VERSION="${FULL_VERSION}${TARGET_DELIMITER}${TARGET_CONFIG}" +fi +setup_ccache_distcc + +extract_kernel +patch_kernel + +depend_kernel +build_kernel + +if [ -n "$OFED_VERSION" ]; then + build_kernel_ib +fi + +configure_lustre +build_lustre + +build_kms + +install_kernel +install_lustre + +install_kms + +cleanup_libmodules + +save_headers + +exit 0