7 # Not sure what to put here
8 # TARGET_ARCH=$(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
13 TMPDIR=${TMPDIR:-"/var/tmp"}
24 # provided by target file
57 TOPDIR="${0%%${0##*/}}"
58 if [ "${TOPDIR}" ] ; then
59 TOPDIR=$(canon "${TOPDIR}/..")
67 while [ ! -d $retdir/BUILD ] ; do
68 retdir=$(canon "$retdir/..")
69 if [ "$retdir" = "/" ] ; then
85 [ "$2" ] && echo "${0##*/}: $2"
91 echo -n "Available targets:"
92 for target in $TOPDIR/lustre/kernel_patches/targets/*.target ; do
93 target_file=${target##*/}
94 echo -n " ${target_file%%.target}"
103 Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
108 same as --build-kernel --build-lustre --unpack-kernel
111 configure and compile lustre. Requires that --build-kernel was
115 configure and compile a kernel. Implies --depend-kernel.
116 Requires that --unpack-kernel was already run.
119 Prepares a kernel tree for building (similar to make mrproper
120 oldconfig dep). Requires that --unpack-kernel was already run.
123 Root directory to install into (like DESTDIR with auto*).
125 --extraversion=EXTRAVERSION
126 Overrides the target kernel\'s EXTRAVERSION text.
129 Display this message.
132 same as --install-kernel --install-lustre
135 run make install in the Lustre tree.
138 install the kernel image and modules.
141 This works just like the -j option to make, and is passed to make
144 --kerneldir=KERNELDIR
145 Directory containing linux source tarballs.
148 Name of the configuration to use. The available targets are
152 Specifies an architecture to use when choosing a kernel config
153 file. Default is i386.
155 --target-config=CONFIG
156 Specifies a special option (such as smp, bigsmp, bigmem, or BOOT)
157 to use when choosing a kernel config file. This also modifies the
158 kernel version and modules directory.
161 Untars and patches the kernel source.
163 The order that commands (--build-lustre, --unpack-kernel) are
164 specified on the command line is ignored; ${0##*/} will always
165 execute them in the correct order (unpack, then build, then install
176 (( $BUILD_LUSTRE || $BUILD_KERNEL || $DEPEND_KERNEL || \
177 $INSTALL_LUSTRE || $INSTALL_KERNEL || $SAVE_HEADERS || \
178 $UNPACK_KERNEL )) || \
179 fatal 1 "No commands specified."
181 if (( $UNPACK_KERNEL )) ; then
182 [ "$KERNELDIR" ] || \
183 fatal 1 "A kernel directory must be specified with --kerneldir."
184 [ -d "$KERNELDIR" ] || \
185 fatal 1 "$KERNELDIR is not a directory."
188 if (( $INSTALL_LUSTRE || $INSTALL_KERNEL || $SAVE_HEADERS )) ; then
189 [ -z "$DESTDIR" -o -d "$DESTDIR" ] || \
190 fatal 1 "$DESTDIR is not a directory."
193 [ "$TARGET" ] || usage 1 "A target must be specified with --target."
194 TARGET_FILE="$TOPDIR/lustre/kernel_patches/targets/$TARGET.target"
195 [ -r "$TARGET_FILE" ] || \
196 fatal 1 "Target '$TARGET' was not found. Try --list-targets."
198 if [ -z "$JOBS" -o "$JOBS" -lt "1" ] ; then
202 RPMBUILD=$(which rpmbuild 2>/dev/null | head -1)
203 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
204 RPMBUILD=$(which rpm 2>/dev/null | head -1)
205 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
206 usage 1 "Could not find binary for making rpms (tried rpmbuild and rpm)."
213 for series in $SERIES ; do
214 SERIES_FILE="$TOPDIR/lustre/kernel_patches/series/$series"
215 lustre_patch=$(grep lustre_version "$SERIES_FILE" 2>/dev/null)
216 [ "$lustre_patch" ] && break
218 [ "$lustre_patch" ] || \
219 fatal 1 "Could not determine Lustre version from $SERIES series."
221 awk '/^\+#define LUSTRE_KERNEL_VERSION /{ print $3 }' \
222 "$TOPDIR/lustre/kernel_patches/patches/$lustre_patch" 2>/dev/null
227 EXTRA_VERSION_save="$EXTRA_VERSION"
231 [ "$KERNEL" ] || fatal 1 "Target $TARGET did not specify a kernel."
232 # Suse 2.6 has our patches in already
233 # [ "$SERIES" ] || fatal 1 "Target $TARGET did not specify a patch series."
234 # [ "$CONFIG" ] || fatal 1 "Target $TARGET did not specify a kernel config."
235 [ "$VERSION" ] || fatal 1 "Target $TARGET did not specify the kernel version."
237 if [ "$KERNELDIR" ] ; then
238 KERNEL_FILE="$KERNELDIR/$KERNEL"
239 [ -r "$KERNELDIR/$KERNEL" ] || \
240 fatal 1 "Target $TARGET's kernel file $KERNEL not found in kernel directory $KERNELDIR."
243 if [ "$SERIES" ] ; then
244 for series in $SERIES ; do
245 SERIES_FILE="$TOPDIR/lustre/kernel_patches/series/$series"
246 [ -r "$SERIES_FILE" ] || \
247 fatal 1 "Target $TARGET's series $SERIES missing from $TOPDIR/lustre/kernel_patches/series."
251 TARGET_ARCH=${TARGET_ARCH:-$BASE_ARCHS}
252 CONFIG_TARGET="$TARGET-${TARGET_ARCH}${TARGET_CONFIG:+-$TARGET_CONFIG}"
253 CONFIG_FILE="$TOPDIR/lustre/kernel_patches/kernel_configs/kernel-$VERSION-$CONFIG_TARGET.config"
254 [ -r "$CONFIG_FILE" ] ||
255 fatal 1 "Target $TARGET's config file $CONFIG_FILE missing from $TOPDIR/lustre/kernel_patches/configs."
257 if [ "$EXTRA_VERSION_save" ] ; then
258 EXTRA_VERSION="$EXTRA_VERSION_save"
260 EXTRA_VERSION="${EXTRA_VERSION}_lustre.$(get_lustre_version)"
264 # do these after load_target(), which maybe export CC
265 setup_ccache_distcc()
267 # distcc can't handle ".incbin"
268 if [ "$TARGET" == "2.6-suse" -o "$TARGET" == "2.6-rhel4" ]; then
269 if [ "$TARGET_ARCH" == "x86_64" ]; then
275 if [ "$CCACHE" ]; then
277 [ "$DISTCC" ] && export CCACHE_PREFIX="$DISTCC"
279 [ "$DISTCC" ] && CC="$DISTCC $CC"
287 fatal 1 "tarflags(): File name argument missing."
299 fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
306 echo "Untarring ${1##*/}..."
307 tar $(tarflags $1) $1
313 (( $UNPACK_KERNEL )) || return 0
314 pushd "$TOPDIR" >/dev/null
315 if [ -d linux ] ; then
316 [ -L linux ] && rm -rf $(readlink linux)
320 [ -d linux ] || ln -sf linux* linux
326 (( $UNPACK_KERNEL )) || return 0
327 [ "$SERIES" ] || return 0
328 pushd "$TOPDIR/linux" >/dev/null
329 for series in $SERIES ; do
330 echo -n "Applying series $series:"
331 SERIES_FILE="$TOPDIR/lustre/kernel_patches/series/$series"
332 for patch in $(<"$SERIES_FILE") ; do
333 PATCH_FILE="$TOPDIR/lustre/kernel_patches/patches/$patch"
334 [ -r "$PATCH_FILE" ] || \
335 fatal 1 "Patch file not found: $patch"
337 patch -s -p1 < "$PATCH_FILE" || fatal 1 "Error applying patch $patch."
350 if [ "$ARCH" ] ; then
351 MAKE_ARCH="$MAKE ARCH=$ARCH"
357 MAKE_ARCH="$MAKE ARCH=$TARGET_ARCH"
361 MAKE_J="$MAKE -j $JOBS"
375 kill -TERM -$child_pid 2>/dev/null
377 kill -KILL -$child_pid 2>/dev/null
378 echo "$1 was killed due to timeout") &
382 # status will be set to 143 if the process had to be killed due to timeout
383 status=${PIPESTATUS[0]}
390 (( $DEPEND_KERNEL )) || return 0
391 # we need to override $CC at make time, since there is no
394 pushd "$TOPDIR/linux" >/dev/null
395 echo "Overriding EXTRAVERSION in kernel..."
396 perl -p -i -e "s/^EXTRAVERSION.*/EXTRAVERSION = ${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}${TARGET_CONFIG}/" Makefile
397 echo "Making depend in $PWD..."
398 $MAKE "$MAKE_CC" mrproper || fatal 1 "Error running make mrproper"
400 # remove localversion-* files to avoid kernel release string
401 # srewing up by the top-level Makefile
403 cp "$CONFIG_FILE" .config
404 local UPDATE_OLDCONFIG=
405 for oc in oldconfig_nonint silentoldconfig oldconfig ; do
406 if grep -q "$oc" Makefile ; then
407 timed_run 300 $MAKE "$MAKE_CC" $oc || UPDATE_OLDCONFIG=1
412 if [ "$UPDATE_OLDCONFIG" ] ; then
413 # use the expect script to "make oldconfig" and answer the questions for
414 # new items conservatively. QA will get notified on anything newly added
415 # for them to review and adjust accordingly.
416 local logfile=$(mktemp /tmp/XXXXXX)
417 #timed_run 300 $TOPDIR/build/update_oldconfig $logfile
418 #local RC=${PIPESTATUS[0]}
419 #local RC=$(strace -f -o update_oldconfig.strace bash -c "$TOPDIR/build/update_oldconfig $logfile; echo \$?")
420 $TOPDIR/build/update_oldconfig $logfile
421 local RC=${PIPESTATUS[0]}
422 #$TOPDIR/build/update_oldconfig $logfile
423 #local RC=${PIPESTATUS[0]}
424 if [ $RC -eq 143 ]; then
425 fatal 1 "update_oldconfig timed out"
426 elif [ $RC -ne 0 ]; then
430 if [ -f update_oldconfig.strace ]; then
431 cat update_oldconfig.strace
432 rm -f update_oldconfig.strace
434 fatal 1 "update_oldconfig failed: $RC. See log above."
437 # now notify if resulting .config is different than $CONFIG_FILE
438 local tmpfile=$(mktemp /tmp/XXXXXX)
439 diff -I '^#.*' -u "$CONFIG_FILE" .config >$tmpfile
440 if [ -s $tmpfile ]; then
442 To: qa@lists.clusterfs.com
443 Subject: kernel_config change
445 The result of a make oldconfig on file $CONFIG_FILE resulted in a
446 difference when compared to .config in the following way:
450 echo -e "\n\nPlease consider updating $CONFIG_FILE."
451 # not sure these are entirely useful. the above and "patch" are good
452 #echo -e "\nThe entire new .config file:\n"
454 } | sendmail -fqa@clusterfs.com -t
461 $MAKE "$MAKE_CC" include/asm
464 $MAKE "$MAKE_CC" symlinks
465 $MAKE "$MAKE_CC" dep || fatal 1 "Error running make dep"
468 $MAKE "$MAKE_CC" include/linux/version.h || fatal 1 "Error making include/linux/version.h"
473 (( $BUILD_KERNEL )) || return 0
475 echo "Building kernel in $PWD..."
476 case "$TARGET_ARCH" in
477 i386 | i586 | i686 | athlon | x86_64)
478 $MAKE_J "$MAKE_CC" bzImage || fatal 1 "Error making bzImage."
481 $MAKE_J "$MAKE_CC" vmlinux || fatal 1 "Error making vmlinux."
484 $MAKE_J "$MAKE_CC" boot || fatal 1 "Error making boot."
487 $MAKE_J "$MAKE_CC" modules || fatal 1 "Error building modules."
495 (( $BUILD_LUSTRE )) || return 0
496 pushd "$TOPDIR" >/dev/null
497 [ -f Makefile ] && make -s clean
498 [ -f configure ] || sh ./autogen.sh
499 ./configure --with-linux=$PWD/linux $CONFIGURE_FLAGS || \
500 fatal 1 "Error configuring Lustre."
506 (( $BUILD_LUSTRE )) || return 0
508 FULL_VERSION="${VERSION}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}${TARGET_CONFIG}"
509 pushd "$TOPDIR" >/dev/null
511 -e s^@VERSION@^${LUSTRE_VERSION}^g \
512 -e s^@LINUXRELEASE@^${FULL_VERSION}^g \
513 -e s^@RELEASE@^${FULL_VERSION//-/_}^g \
514 -e s^@ac_configure_args@^"--with-linux=${PWD}/linux ${CONFIGURE_FLAGS}"^g \
517 $RPMBUILD --target ${TARGET_ARCH} -bb lustre.spec \
518 --define "_tmppath $TMPDIR" \
519 --define "_topdir $(lbuild_topdir)" || \
520 fatal 1 "Error building Lustre rpms."
521 # $MAKE_J "$MAKE_CC" || fatal 1 "Error building Lustre."
527 (( $INSTALL_KERNEL )) || return 0
529 FULL_VERSION="${VERSION}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}${TARGET_CONFIG}"
530 pushd "$TOPDIR/linux" >/dev/null
531 mkdir -p "$DESTDIR/boot"
533 install -m 644 System.map "$DESTDIR/boot/System.map-${FULL_VERSION}"
534 # install -m 644 module-info ...
535 install -m 644 "$CONFIG_FILE" "$DESTDIR/boot/config-${FULL_VERSION}"
537 mkdir -p "$DESTDIR/dev/shm"
538 mkdir -p "$DESTDIR/lib/modules/${FULL_VERSION}"
540 $MAKE "$MAKE_CC" INSTALL_MOD_PATH="$DESTDIR" KERNELRELEASE="$FULL_VERSION" \
541 -s modules_install || \
542 fatal 1 "Error installing modules."
544 case "$TARGET_ARCH" in
545 i386 | i586 | i686 | athlon)
546 cp arch/i386/boot/bzImage "$DESTDIR/boot/vmlinuz-${FULL_VERSION}"
547 cp vmlinux "$DESTDIR/lib/modules/${FULL_VERSION}/"
548 ln -sf "../lib/modules/${FULL_VERSION}/vmlinux" "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
551 cp arch/x86_64/boot/bzImage "$DESTDIR/boot/vmlinuz-${FULL_VERSION}"
552 cp vmlinux "$DESTDIR/lib/modules/${FULL_VERSION}/"
553 ln -sf "../lib/modules/${FULL_VERSION}/vmlinux" "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
556 cp vmlinux "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
557 ln -sf "$DESTDIR/boot/vmlinux-${FULL_VERSION}" "../lib/modules/${FULL_VERSION}/vmlinux"
560 gzip -cfv vmlinux > vmlinuz
561 mkdir -p "$DESTDIR/boot/efi/redhat"
562 install -m 755 vmlinux "$DESTDIR/lib/modules/${FULL_VERSION}/"
563 install -m 755 vmlinuz "$DESTDIR/boot/efi/redhat/vmlinuz-${FULL_VERSION}"
564 ln -sf "../../../lib/modules/${FULL_VERSION}/vmlinux" "$DESTDIR/boot/efi/redhat/vmlinux-${FULL_VERSION}"
565 ln -sf "efi/redhat/vmlinux-${FULL_VERSION}" "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
566 ln -sf "efi/redhat/vmlinuz-${FULL_VERSION}" "$DESTDIR/boot/vmlinuz-${FULL_VERSION}"
569 cp vmlinuz "$DESTDIR/boot/vmlinuz-${FULL_VERSION}"
570 cp vmlinux "$DESTDIR/lib/modules/${FULL_VERSION}/vmlinux-${FULL_VERSION}"
571 ln -sf "../lib/modules/${FULL_VERSION}/vmlinux-${FULL_VERSION}" "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
575 if [ -e init/kerntypes.o ] ; then
576 cp init/kerntypes.o "$DESTDIR/boot/Kerntypes-${FULL_VERSION}"
584 (( $INSTALL_LUSTRE )) || return 0
586 FULL_VERSION="${VERSION}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}${TARGET_CONFIG}"
587 KVERREL="${VERSION}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}"
588 i="$DESTDIR/lib/modules/${FULL_VERSION}"
593 if (( $LINUX26 )) ; then
594 ln -sf ../../../usr/src/linux-${KVERREL}-obj/${TARGET_ARCH}/${TARGET_CONFIG} $i/build
595 ln -sf ../../../usr/src/linux-${KVERREL} $i/source
597 ln -sf ../../../usr/src/linux-${KVERREL} $i/build
603 (( $INSTALL_LUSTRE )) || return 0
606 FULL_VERSION="${VERSION}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}${TARGET_CONFIG}"
607 pushd "$TOPDIR" >/dev/null
608 $MAKE "$MAKE_CC" -s install "DESTDIR=$DESTDIR" KERNELRELEASE="$FULL_VERSION" || fatal 1 "Error installing Lustre."
614 (( $BUILD_KERNEL )) || return 0
615 (( $SUSEBUILD )) || return 0
617 FULL_VERSION="${VERSION}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}${TARGET_CONFIG}"
618 mkdir -p "${TOPDIR}/modules-${FULL_VERSION}"
619 for dir in /usr/src/kernel-modules/* ; do
620 # we are replacing lustre-lite, so don't include it
621 if [ "${dir##*/}" != "lustre-lite" -a -e $dir/Makefile ]; then
622 build_dir="${TOPDIR}/modules-${FULL_VERSION}/${dir##*/}"
623 cp -a $dir $build_dir
624 # these modules are terrible, and don't all build
625 $MAKE_J "$MAKE_CC" -C $build_dir modules KERNEL_SOURCE="${TOPDIR}/linux"
632 local file=$1 name=${1%.ko}
634 | sed -ne 's,^0*\([0-9a-f]\{8\}\) A __crc_\(.*\),0x\1\t\2\t'"$name"',p'
639 (( $INSTALL_KERNEL )) || return 0
640 (( $LINUX26 )) || return 0
642 FULL_VERSION="${VERSION}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}${TARGET_CONFIG}"
643 for build_dir in "${TOPDIR}/modules-${FULL_VERSION}/*" ; do
644 [ -d $build_dir ] || continue
645 # these modules are terrible, and don't all build
646 $MAKE "$MAKE_CC" -C $build_dir KERNEL_SOURCE="${TOPDIR}/linux" INSTALL_MOD_PATH="$DESTDIR"
649 moddir="${DESTDIR}/lib/modules/${FULL_VERSION}"
651 for module in $(find * -name '*.ko'); do
655 for module in $(find * -path 'kernel/*' -prune -o \
656 -name '*.ko' -print); do
660 | gzip -c9 > "${DESTDIR}/boot/symvers-${VERSION}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}-${TARGET_ARCH}${TARGET_CONFIG}.gz"
665 (( $SAVE_HEADERS )) || return 0
667 echo "Saving headers for ${TARGET_CONFIG:-up} ${TARGET_ARCH}..."
668 pushd linux >/dev/null
670 KVERREL="${VERSION}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}"
671 # deal with the kernel headers that are version specific
673 saveddir="$RPM_BUILD_ROOT/usr/src/linux-${KVERREL}/savedheaders/${TARGET_ARCH}/${TARGET_CONFIG:-up}"
675 install -m 644 include/linux/autoconf.h "$saveddir/autoconf.h"
676 install -m 644 include/linux/version.h "$saveddir/version.h"
677 mv include/linux/modules "$saveddir/"
678 echo ${TARGET_ARCH} ${TARGET_CONFIG} ../../savedheaders/${TARGET_ARCH}/${TARGET_CONFIG:-up}/ \
679 >> "$RPM_BUILD_ROOT/usr/src/linux-${KVERREL}/savedheaders/list"
685 (( $SAVE_HEADERS )) || return 0
687 for arch in $BIGMEM_ARCHS ; do
688 save_headers bigmem $arch
691 for arch in $BOOT_ARCHS ; do
692 save_headers BOOT $arch
695 for arch in $JENSEN_ARCHS ; do
696 save_headers jensen $arch
699 for arch in $SMP_ARCHS ; do
700 save_headers smp $arch
703 for arch in $BIGSMP_ARCHS ; do
704 save_headers bigsmp $arch
706 for arch in $PSERIES64_ARCHS ; do
707 save_headers pseries64 $arch
709 for arch in $UP_ARCHS ; do
710 save_headers up $arch
714 longopts="build,build-lustre,build-kernel,depend-kernel,destdir:,extraversion:"
715 longopts="$longopts,help,install,install-lustre,install-kernel,kerneldir:"
716 longopts="$longopts,save-headers,target:,target-arch:,target-config:,unpack-kernel"
718 options=$(getopt -o hj: -l "$longopts" -- "$@")
720 eval set -- "$options"
805 usage 1 "Unrecognized option: $1"
812 EXTRA_VERSION_DELIMITER=${EXTRA_VERSION_DELIMITER:-"-"}