3 # vim:expandtab:shiftwidth=4:softtabstop=4:tabstop=4:
8 # include the exit_traps library
9 . ${0%/lbuild}/exit_traps.sh
11 # our children should die when we do
12 push_exit_trap "kill -INT -$$ || true" kill_children
16 # CVSROOT is inherited from the environment
21 # XXX - some recent hacking has pretty much neutered this option.
22 # search through this file (and lbuild.old_school -- but that will
23 # be going away soon) for "-bb" and see how many places
24 # simply don't account for this option
30 TARGET_ARCH=$(uname -m)
32 TARGET_ARCHS_ALL=$TARGET_ARCH
33 [ "$TARGET_ARCH" = "i686" ] && TARGET_ARCHS_ALL="i686 i586 i386"
39 TMPDIR=${TMPDIR:-"/var/tmp"}
41 # XXX - i think these two parameters/arguments/variables need to be
42 # cleaned up and merged. they effectively do the same thing
45 # what does this do exactly? does it imply no kernel build?
48 SKIPLDISKFSRPM="v1_4_* b1_4"
49 SMPTYPES="smp bigsmp default ''"
55 # default to not adding -lustre- into the kernel RPM package names
56 KERNEL_LUSTRE_NAMING=false
73 # not in the target file any more
85 # Readlink is not present on some older distributions: emulate it.
89 if [ -L "$path" ]; then
90 ll="$(LC_ALL=C ls -l "$path" 2> /dev/null)" &&
105 [ -n "$msg" ] && echo -e "\n${0##*/}: $msg" >&2
119 Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
122 Specifies the CVS Root to use when pulling files from CVS. The
123 environment variable \$CVSROOT is used if this option is not
126 --external-patches=EXTERNAL_PATCHES
127 Directory similar to lustre/lustre/kernel_patches/ that lbuild should
128 look for seres and config files in before looking in the lustre
131 --extraversion=EXTRAVERSION
132 Text to use for the rpm release and kernel extraversion.
134 --timestamp=TIMESTAMP
135 Date of building lustre in format YYYYMMDDhhmmss
138 Try to reuse old kernel RPMs from DIR
141 Try to reuse old kernel builds from DIR
144 Path to distro kernel RPM collection
150 Do not build RPMs (compile only mode)
153 Build lustre client only
156 Which distro using. Autodetect by default
158 --kerneldir=KERNELDIR
159 Directory containing Linux source tarballs referenced by target
162 --kerneltree=KERNELTREE
163 Directory containing dirs with Linux source tarballs referenced by target
164 files. Dir names in format kernel version ('2.6.9', etc.)
166 --linux=LINUX --with-linux=LINUX
167 Directory of Linux kernel sources. When this option is used, only
168 Lustre modules and userspace are built.
171 Path to an existing lustre source tarball to use instead of
175 Do not try to download a kernel from downloads.lustre.org
178 Do not build a .src.rpm, a full kernel patch, or a patched kernel
182 Do ldiskfs RPM. Now true by default
188 Specifies that the files generated do not include timestamps, and
189 that this is an official release.
192 Build a .src.rpm, a full kernel patch, and a patched kernel tarball.
195 Directory used to stage packages for release. RPMs will be placed
196 more or less in DIR/<target>-<arch>, and the tarball will be
200 A CVS branch/tag name to build from when pulling from CVS.
203 The name of the target to build. The available targets are listed
206 --target-archs=TARGET_ARCHS
207 A (space delimited) list of architectures to build. By default,
208 all of the archs supported by the TARGET will be built, in
209 addition to a .src.rpm. This option can limit those, for machines
210 that can only build certain archs or if you only want a certain
211 arch built (for testing, or a one-off kernel).
213 Also note that by using a non-"base" arch (eg, i386) only kernels
214 will be built - there will be no lustre-lite-utils package.
217 Prevents the datestamp flag (-D) from being passed to cvs for
218 checkouts. This is a workaround for a problem encountered when
219 using lbuild with tinderbox.
222 Builds a Xen domX kernel.
231 # canonicalize a relative path
235 if [ ! -d "$PATH" ]; then
239 pushd "$PATH" >/dev/null || return 1
249 if [ "$LUSTRE" ]; then
250 [ -r "$LUSTRE" ] || \
251 usage 1 "Could not find Lustre source tarball '$LUSTRE'."
254 usage 1 "Either specify a CVS Root with -d, or a Lustre source tarball with --lustre."
256 usage 1 "A branch/tag name must be specified with --tag when not building from a tarball."
259 if [ -z "$LINUX" ]; then
260 [ "$KERNELDIR" -o "$KERNELTREE" ] || \
261 usage 1 "A kernel directory must be specified with --kerneldir or --kerneltree."
263 [ -d "$KERNELDIR" -o -d "$KERNELTREE" ] || \
264 usage 1 "$KERNELDIR and $KERNELTREE are not a directory."
268 usage 1 "When building a snapshot, a tag name must be used."
271 [ "$TARGET" ] || usage 1 "A target must be specified with --target."
272 # TARGET_FILE="$TOPDIR/lustre/kernel_patches/targets/$TARGET.target"
273 # [ -r "$TARGET_FILE" ] || \
274 # usage 1 "Target '$TARGET' was not found."
279 CANONICAL_TARGET="rhel5"
282 CANONICAL_TARGET="rhel-2.6"
285 CANONICAL_TARGET="sles-2.6"
288 CANONICAL_TARGET="sles10-2.6"
291 CANONICAL_TARGET="sles11"
294 CANONICAL_TARGET="oel5"
297 CANONICAL_TARGET="hp-pnnl-2.4"
305 CANONICAL_TARGET="$TARGET"
309 local timestampnodig=$(echo $TIMESTAMP | sed -e s/[0-9]*//g)
310 [ "$timestampnodig" = "" ] || TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M%S")
311 local timestamplength="${#TIMESTAMP}"
312 if [ $timestamplength -eq 12 ]; then
313 TIMESTAMP="${TIMESTAMP}00"
314 elif [ $timestamplength -ne 14 ]; then
315 TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M%S")
318 RPMBUILD=$(which rpmbuild 2>/dev/null | head -1)
319 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
320 RPMBUILD=$(which rpm 2>/dev/null | head -1)
321 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
322 usage 1 "Could not find binary for making rpms (tried rpmbuild and rpm)."
326 if [ -n "$CCACHE" ]; then
327 which "$DISTCC" 2>/dev/null && export DISTCC RPM_BUILD_NCPUS
329 if which "$CCACHE" 2>/dev/null; then
330 local ccache=$(which "$CCACHE")
331 local bindir="$TOPDIR/bin"
333 [ -d $bindir ] || mkdir -p $bindir
334 if [ -d $bindir ]; then
335 rm ${bindir}/* > /dev/null 2>&1
336 ln -s "$ccache" ${bindir}/ccache
337 ln -s "$ccache" ${bindir}/cc
338 ln -s "$ccache" ${bindir}/$CC
339 export PATH=$bindir:$PATH
341 export CCACHE && export CC="ccache $CC"
342 # zero the cache so we can see how effective we are being with it
347 [ -z "$DISTRO" ] && DISTRO=$(autodetect_distro)
350 # autodetect used Distro
351 autodetect_distro() {
356 if [ -f /etc/SuSE-release ]; then
358 version=$(grep ^VERSION /etc/SuSE-release)
359 version=${version#*= }
360 elif [ -f /etc/redhat-release ]; then
361 name=$(head -1 /etc/redhat-release)
362 version=$(echo "$distroname" |
363 sed -e 's/^[^0-9.]*//g' | sed -e 's/[ \.].*//')
365 if [ -z "$name" -o -z "$version" ]; then
366 fatal 1 "I don't know how to determine distro type/version.\n" \
367 "Either update autodetect_distro() or use the --distro argument"
370 echo ${name}${version}
377 echo $(echo "$*" | xargs -n 1 | sort -u)
384 local force="${3:-false}"
386 if $force || [ ! -r "$KERNELDIR/$srpm" ] ||
387 [ ! -s "$KERNELDIR/$srpm" ]; then
389 local location="http://downloads.lustre.org/public/kernels/$target/old"
390 echo "Downloading $location/$srpm..."
391 if ! wget -nv "$location/$srpm" -O "$KERNELDIR/$srpm" ||
392 [ ! -s "$KERNELDIR/$srpm" ]; then
393 rm -f $KERNELDIR/$srpm
394 fatal 1 "Could not download target $target's kernel SRPM" \
395 "$srpm from $location."
398 fatal 1 "$srpm not found in directory $KERNELDIR."
409 local file=${from##*/}
415 local semaphore="$to-downloading"
418 if [ ! -f $semaphore ]; then
422 # make sure the download has not been aborted
423 local now=$(date +%s)
424 local file_mtime=$(stat -c %Y "$to")
425 local staleness=$((now - file_mtime))
426 # let's assume an active download will write at least once a minute
427 if [ $staleness -gt 60 ]; then
435 # if the semaphore file exists, the file is either still downloading
436 # or a download was aborted and we cannot trust the target file
437 if [ -f $semaphore ]; then
441 if ! $(is_downloading) && [ -r "$to" ] && [ -s "$to" ]; then
448 if $force || ! $(is_downloaded); then
449 if $(is_downloading); then
450 echo "Somebody else is downloading $from..."
451 while $(is_downloading); do
452 echo "Waiting for $to to finish downloading"
455 if $(is_downloaded); then
458 echo "The download we were waiting for seems to have been aborted"
464 echo "Downloading $from..."
465 # flag others so they don't try to download also
466 push_exit_trap "rm -f $to $semaphore" "download"
468 if ! wget -nv "$from" -O "$to" || [ ! -s "$to" ]; then
469 # the trap will remove the files via the fatal below
470 fatal 1 "Could not download ${to##*/} from ${from%%/*}/."
473 delete_exit_trap "download"
475 fatal 1 "${to##*/} not found in directory ${to%/*}."
484 local force="${1:-false}"
486 local location="http://downloads.lustre.org/public/OFED/"
489 if [[ $OFED_VERSION = daily-* ]]; then
490 OFED_VERSION=${OFED_VERSION/daily-/}
491 Mmv=${OFED_VERSION%%-*}
492 daily=${OFED_VERSION##$Mmv-}
493 location="http://www.openfabrics.org/downloads/OFED/ofed-${Mmv}-daily/"
494 # find the filename for the version for the date specified
495 OFED_VERSION=$(curl -s "$location" | sed -nre "/${daily}-/s/.*href=\"OFED-([0-9]+\.[0-9]+-${daily}-[0-9]{4,4}).tgz.*$/\1/p" | tail -1)
496 if [ -z "$OFED_VERSION" ]; then
497 fatal 1 "Could not determine the filename of the OFED snapshot for ${daily}"
501 if [ -z "$OFED_VERSION" -o "$OFED_VERSION" = "inkernel" ]; then
505 local file="OFED-${OFED_VERSION}.tgz"
506 download_file "$location/$file" "$KERNELTREE" "$force"
511 local force="${1:-false}"
513 local location="http://downloads.lustre.org/public/RDAC/"
515 if [ -z "$RDAC_VERSION" -o "$RDAC_VERSION" = "inkernel" ]; then
519 local file="rdac-LINUX-${RDAC_VERSION}-source.tar.gz"
520 download_file "$location/$file" "$KERNELTREE" "$force"
524 download_mptlinux() {
525 local force="${1:-false}"
527 local location="http://downloads.lustre.org/public/MPTLINUX/"
529 if [ -z "$MPTLINUX_VERSION" -o "$MPTLINUX_VERSION" = "inkernel" ]; then
533 file="MPTLINUX_RHEL5_SLES10_PH15-${MPTLINUX_VERSION}.zip"
534 download_file "$location/$file" "$KERNELTREE" "$force"
540 EXTRA_VERSION_save="$EXTRA_VERSION"
541 for patchesdir in "$EXTERNAL_PATCHES" \
542 "$TOPDIR/lustre/lustre/kernel_patches"; do
543 TARGET_FILE="$patchesdir/targets/$TARGET.target"
544 [ -r "$TARGET_FILE" ] && break
546 [ -r "$TARGET_FILE" ] || fatal 1 "Target $TARGET was not found."
548 echo "Loading target config file $TARGET.target..."
550 # if the caller specified an OFED_VERSION it should override whatever
551 # the target file specifies
552 local env_OFED_VERSION="$OFED_VERSION"
556 if [ -n "$env_OFED_VERSION" ]; then
557 OFED_VERSION="$env_OFED_VERSION"
560 # doesn't make any sense to build OFED for xen domX's
565 # XXX - set_rpm_smp_type is an ugly undeterministic hack. it needs to
566 # go away and the target just specify the $RPMSMPTYPE
567 [ -z "$RPMSMPTYPE" ] && set_rpm_smp_type
569 # CC might have been overwriten in TARGET_FILE
570 if [[ $CC != ccache\ * ]] && which "$CCACHE" 2>/dev/null; then
571 export CCACHE && export CC="ccache $CC"
574 if [ ! "$KERNELTREE" = "" ] && [ -d "$KERNELTREE" ]; then
575 KERNELDIR="$KERNELTREE/${lnxmaj}"
576 [ -d "$KERNELDIR" ] || mkdir "$KERNELDIR"
579 # verify the series is available
580 if [ "$SERIES" ]; then
581 for series in $SERIES; do
582 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches"; do
583 [ -r "$patchesdir/series/$series" ] && continue 2
585 fatal 1 "Target $TARGET's series $SERIES could not be" \
586 "found.\nSearched:\n\t$EXTERNAL_PATCHES/series\n" \
587 "\t$TOPDIR/lustre/lustre/kernel_patches/series."
591 # set the location of the .config file
597 if [ -f $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET-$TARGET_ARCH.config ]; then
598 CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET$XENPOSTFIX-$TARGET_ARCH${RPMSMPTYPE:+-}${RPMSMPTYPE}.config"
601 local lnxrelnew=${lnxrel//-/_}
603 # remember the EXTRA_VERSION before we diddle it here
604 # XXX - we really should not diddle with any values read in from the
605 # target file. if we want to modify a value, we should create
607 PRISTINE_EXTRA_VERSION=$EXTRA_VERSION
609 if ! $PATCHLESS && [ ! -f "$CONFIG_FILE" ]; then
610 fatal 1 "Config file for target $TARGET missing from" \
611 "$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/."
614 if [ "$EXTRA_VERSION_save" ]; then
615 EXTRA_VERSION="$EXTRA_VERSION_save"
616 elif ! $RELEASE; then
617 # if there is no patch series, then this is not a lustre specific
618 # kernel. don't make it look like one
619 if [ -n "$SERIES" ]; then
620 #remove the @VERSION@ (lustre version)
621 # EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
622 # EXTRA_VERSION="${EXTRA_VERSION}-${TAG}.${TIMESTAMP}"
623 ! ( $PATCHLESS ) && EXTRA_VERSION="${EXTRA_VERSION}.${TIMESTAMP}"
626 # EXTRA_VERSION=${EXTRA_VERSION//-/_}
628 ALL_ARCHS="$BASE_ARCHS $BIGMEM_ARCHS $BOOT_ARCHS $JENSEN_ARCHS $SMP_ARCHS $BIGSMP_ARCHS $PSERIES64_ARCHS $UP_ARCHS"
631 for arch in $(uniqify "$ALL_ARCHS"); do
632 if [ -z "$TARGET_ARCHS" ] ||
633 [[ \ $TARGET_ARCHS\ = *\ $arch\ * ]]; then
634 BUILD_ARCHS="$BUILD_ARCHS $arch"
637 [ "$BUILD_ARCHS" ] || usage 1 "No available target archs to build."
638 echo "Building for: $BUILD_ARCHS"
646 fatal 1 "tarflags(): File name argument missing."
658 fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
667 echo "Untarring ${file##*/}..."
668 tar $(tarflags "$file") "$file"
674 if ! untar "$KERNELTREE/OFED-${OFED_VERSION}.tgz"; then
677 [ -d OFED ] || ln -sf OFED-[0-9].[0-9]* OFED
683 if ! untar "$KERNELTREE/rdac-LINUX-${RDAC_VERSION}-source.tar.gz"; then
686 [ -d rdac-LINUX ] || ln -sf rdac-LINUX-[0-9][0-9].* rdac-LINUX
692 if ! unzip -p $KERNELTREE/MPTLINUX_RHEL5_SLES10_PH15-4.16.00.00-2.zip | tar xzvf - srpms-2/mptlinux-4.16.00.00-2.src.rpm; then
695 mv srpms-2/mptlinux-4.16.00.00-2.src.rpm .
701 if [ -z "$LUSTRE" ]; then
704 if [ -n "$USE_DATESTAMP" ]; then
705 DATESTAMP="-D '$DATE'"
708 local DIRNAME="lustre-$TAG-$TIMESTAMP"
710 cvs -d "$CVSROOT" -qz3 co $DATESTAMP -d "$DIRNAME" lustre || \
711 fatal 1 "There was an error checking out toplevel Lustre from CVS."
712 pushd "$DIRNAME" > /dev/null
713 ./lustrecvs "$TAG" || \
714 fatal 1 "There was an error checking out Lustre/Portals/Build from CVS."
715 echo "Creating lustre tarball..."
716 sh autogen.sh || fatal 1 "There was an error running autogen.sh."
717 ./configure --disable-{modules,utils,liblustre,tests,doc} || \
718 fatal 1 "There was an error running ./configure to create makefiles."
719 make dist || fatal 1 "There was an error running 'make dist'."
720 LUSTRE=$PWD/lustre-*.tar.gz
724 untar "$LUSTRE" || fatal 1 "Error unpacking Lustre tarball"
725 [ -d lustre ] || ln -sf lustre-[0-9].[0-9]* lustre
731 local do_patch=${1:-true}
733 FULL_PATCH="$PWD/lustre-kernel-${TARGET}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}.patch"
734 [ -f "$FULL_PATCH" ] && rm -f "$FULL_PATCH"
735 $do_patch && pushd linux >/dev/null
736 for series in $SERIES; do
737 echo -n "Applying series $series:"
738 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches"; do
739 [ -r "$patchesdir/series/$series" ] || continue
740 SERIES_FILE="$patchesdir/series/$series"
741 for patch in $(<"$SERIES_FILE"); do
743 PATCH_FILE="$patchesdir/patches/$patch"
744 [ -r "$PATCH_FILE" ] || \
745 fatal 1 "Patch $patch does not exist in Lustre tree."
746 cat "$PATCH_FILE" >> "$FULL_PATCH" || {
748 fatal 1 "Error adding patch $patch to full patch."
751 patch -s -p1 < "$PATCH_FILE" || {
753 fatal 1 "Error applying patch $patch."
761 $do_patch && popd >/dev/null
762 echo "Full patch has been saved in ${FULL_PATCH##*/}."
772 pushd lustre >/dev/null
774 echo "Building Lustre RPMs for: $BUILD_ARCHS..."
776 for arch in $BUILD_ARCHS; do
777 targets="--target $arch $targets"
780 local confoptions="--with-linux=${linux}"
782 confoptions="--with-linux=${linux} --disable-server"
784 if [ "$linuxobj" != "" ]; then
785 confoptions="$confoptions --with-linux-obj=${linuxobj}"
788 ./configure $confoptions ${CONFIGURE_FLAGS}
789 if [ "$?" != "0" ]; then
790 local saved_config="../config.log.$(date +%s)"
791 cp config.log $saved_config
792 chmod a+r $saved_config
793 echo "Saved config.log is at $saved_config"
797 echo "config.log contents:"
805 # hack. Somebody move build/lustre.spec to lustre.spec for b1_6
807 [ -f lustre.spec ] && lustre_spec=lustre.spec
808 [ -f build/lustre.spec ] && lustre_spec=build/lustre.spec
810 [ -f "$lustre_spec" ] && sed \
811 -e "s^Release: .*$^Release: $LUSTRE_EXTRA_VERSION^" \
815 local rpmbuildopt='-bb'
818 echo NORPM mode. Only compiling.
821 # convert the $PATCHLESS boolean to an empty/no-empty boolean
822 # as silly as this seems, it makes the syntax of the rpmbuild command
823 # simpler and not need an eval to deal with the quotes in the quotes
824 local is_patchless=""
828 $RPMBUILD $targets $rpmbuildopt ../lustre.spec \
829 ${is_patchless:+--define "lustre_name lustre-client"} \
830 --define "_tmppath $TMPDIR" \
831 --define "_topdir $TOPDIR" || \
832 fatal 1 "Error building rpms for $BUILD_ARCHS."
835 ( $(skeep_ldiskfs_rpm $TAG) ) && return
837 pushd lustre/ldiskfs || return 255
839 if [ "$?" != "0" ]; then
843 cp lustre-ldiskfs*.tar.gz $TOPDIR/SOURCES
847 local ldiskfs_spec=lustre-ldiskfs.spec
848 [ -f "$ldiskfs_spec" ] && sed \
849 -e "s^Release: .*$^Release: $LUSTRE_EXTRA_VERSION^" \
851 > ../lustre-ldiskfs.spec
853 $RPMBUILD $targets $rpmbuildopt ../lustre-ldiskfs.spec \
854 --define "_tmppath /var/tmp" \
855 --define "_topdir $TOPDIR"
856 if [ "$?" != "0" ]; then
862 $RPMBUILD -bs ../lustre-ldiskfs.spec \
863 --define "_tmppath /var/tmp" \
864 --define "_topdir $TOPDIR"
865 if [ "$?" != "0" ]; then
876 [ "$STAGEDIR" ] || return 0
878 for arch in $BUILD_ARCHS; do
879 rpmdir="${STAGEDIR}/${CANONICAL_TARGET}-${arch}"
880 echo "${0##*/}: Copying RPMs into ${rpmdir}"
882 cp -v RPMS/${arch}/*.rpm "${rpmdir}"
883 if [ -d RPMS/noarch ]; then
884 cp -v RPMS/noarch/*.rpm "${rpmdir}"
888 cp -v "$LUSTRE" "$STAGEDIR"
892 #check if we need to build separate ldiskfs RPM
893 skeep_ldiskfs_rpm() {
898 if ! $LDISKFSRPM; then
900 elif $PATCHLESS; then
903 for skiptag in $SKIPLDISKFSRPM; do
904 [[ $tag == $skiptag ]] && skip=true && break
908 pushd $TOPDIR/BUILD/lustre-[1-9]* >/dev/null
909 grep -q '^SERVER_TRUE[ \t]=[ \t]#$' autoMakefile && skip=true
916 #generate LUSTRE_EXTRA_VERSION from EXTRA_VERSION
917 gen_lustre_version() {
919 LUSTRE_EXTRA_VERSION="${lnxmaj}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}${TARGET_DELIMITER}${RPMSMPTYPE}"
920 LUSTRE_EXTRA_VERSION=${LUSTRE_EXTRA_VERSION//-/_}
926 local infact_arch="${TARGET_ARCH}"
929 [ "$infact_arch" == "i586" ] && infact_arch="i686"
932 for smp_type in $SMP_ARCHS; do
933 [ $infact_arch == $smp_type ] && RPMSMPTYPE=smp && break
936 for smp_type in $BIGSMP_ARCHS; do
937 [ $infact_arch == $smp_type ] && RPMSMPTYPE=bigsmp && break
940 for smp_type in $DEFAULT_ARCHS; do
941 [ $infact_arch == $smp_type ] && RPMSMPTYPE=default && break
946 # This function takes a linux source pool and digs out the linux release
948 find_linux_release() {
951 local LINUXRELEASEHEADER=$SRCDIR/include/linux/version.h
952 if [ -s $SRCDIR/include/linux/utsrelease.h ]; then
953 LINUXRELEASEHEADER=$SRCDIR/include/linux/utsrelease.h
956 sed -ne 's/#define UTS_RELEASE "\(.*\)"$/\1/p' $LINUXRELEASEHEADER
960 # XXX this needs to be re-written as a wrapper around find_rpm
961 # or just gotten rid of. :-)
964 local delimiter=${2:-"-"}
966 local pathtorpms="${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
967 [ -d $pathtorpms ] || return 255
969 local kernelbinaryrpm rpmfile
970 local wanted_kernel="${lnxmaj}${delimiter}${lnxrel}"
973 for arch in $TARGET_ARCHS_ALL; do
974 local found_rpm="" rpm
975 for rpm in ${pathtorpms}/${arch}/*.rpm; do
976 if rpm -q --provides -p "$rpm" | grep -q "kernel${prefix} = $wanted_kernel"; then
982 [ -f "$found_rpm" ] && break
990 # unpack kernel(/source/devel) RPM
992 # This function and it's setting of $LINUX and $LINUXOBJ is a total hack that
993 # needs to completely refactored. It completely ingores that $BUILD_ARCHS may
994 # contain a list of arches for which rpmbuild commands (including the one for
996 unpack_linux_devel_rpm() {
997 local kernelrpm="${1}"
998 # it's worth noting that neither sles10 nor rhel5 appear to use their
999 # extra_version delimiter for the dirname under /usr/src, so we could
1000 # probably just get rid of this parameter
1001 local delimiter=${2:-"-"}
1003 [ -f "$kernelrpm" ] || return 255
1004 [ -d $TOPDIR/reused ] || mkdir $TOPDIR/reused || return 255
1006 pushd $TOPDIR/reused || return 255
1008 if ! rpm2cpio < "$kernelrpm" | cpio -id > /dev/null 2>&1; then
1012 # call a distro specific hook, if available
1013 if type -p unpack_linux_devel_rpm-$DISTRO; then
1014 unpack_linux_devel_rpm-$DISTRO "$kernelrpm"
1019 find_linux_devel_paths $TOPDIR/reused
1025 # XXX - this rhel/sles goop needs abstracting out into the
1026 # lbuild-{rhel5,sles10} method files
1027 find_linux_devel_paths() {
1033 # RHEL-style and SLES-style rpms
1034 # XXX - until bug 19336 cleans this up, we need to extricate the
1035 # ${lnxmin}- from the $lnxrel
1036 local paths="kernels/${lnxmaj}${lnxmin}${delimiter}${lnxrel}-${TARGET_ARCH} linux-${lnxmaj}${lnxmin}${delimiter}${lnxrel##${lnxmin#.}-}"
1039 for path in $paths; do
1042 if [ -d "$src/$path/" ]; then
1043 LINUX="$(pwd)/$src/$path"
1045 # SLES has a separate -obj tree
1046 if [ -d "$src/${path}-obj" ]; then
1047 local src="$src/${path}-obj"
1048 local objects="$TARGET_ARCH/$RPMSMPTYPE"
1050 # Novell, are you *TRYING* to make life hard for me?
1051 if [ -d "$src/powerpc" ]; then
1052 objects="powerpc/$TARGET_ARCH"
1053 elif [ $TARGET_ARCH == 'i686' ]; then
1054 objects="i386/$RPMSMPTYPE"
1057 LINUXOBJ="$(pwd)/$src/$objects"
1060 if [ -z "$LINUX" ]; then
1063 # dig out the release version
1064 LINUXRELEASE=$(find_linux_release ${LINUXOBJ:-$LINUX})
1065 if [ -z "$LINUXRELEASE" ]; then
1066 echo "Failed to find linux release in ${LINUXOBJ:-$LINUX}"
1077 # build kernel-ib{,-devel}
1079 # ofed 1.3 had a bug in the rpm spec
1080 if [ "$OFED_VERSION" = "1.3" ]; then
1084 local OFED_CORE="--with-core-mod --with-ipoib-mod --with-sdp-mod --with-user_mad-mod --with-user_access-mod --with-addr_trans-mod --with-rds-mod --with-qlgc_vnic-mod --with-madeye-mod"
1085 local OFED_HARDWARE="--with-mthca-mod --with-mlx4-mod --with-mlx4_en-mod --with-cxgb3-mod --with-nes-mod"
1086 # some I/B drivers are architecture dependent and kernel-ib's configure
1087 # does not figure it out for us ~sigh~
1088 case "$TARGET_ARCH" in
1090 OFED_HARDWARE="$OFED_HARDWARE --with-ehca-mod"
1093 # we're no longer shipping the OFED iSCSI
1094 #OFED_ISCSI="--with-srp-mod --with-srp-target-mod"
1095 ## ISER module has no backport support as of OFED 1.5 (i.e. only builds on
1096 ##kernels >= 2.6.30)
1097 #if [[ $OFED_VERSION = 1.[0-4]* ]]; then
1098 # OFED_ISCSI="$OFED_ISCSI --with-iser-mod"
1101 # assume we are just rebuilding the SRPM
1102 local BUILD_TYPE=${BUILD_TYPE:-"--rebuild"}
1103 local SOURCE="${TOPDIR}/OFED/SRPMS/ofa_kernel-*.src.rpm"
1105 # but switch to building from the SPEC if we need to apply patches
1106 if ls ${TOPDIR}/lustre/build/patches/ofed/* >/dev/null; then
1108 rpm --define "_topdir ${TOPDIR}" -ivh $SOURCE
1109 SOURCE="${TOPDIR}/SPECS/ofa_kernel.spec"
1110 local file ed_fragment1 ed_fragment2 n=1
1111 for file in ${TOPDIR}/lustre/build/patches/ofed/*; do
1112 ed_fragment1="$ed_fragment1
1113 Patch$n: ${file%%*/}"
1114 ed_fragment2="$ed_fragment2
1116 cp $file ${TOPDIR}/SOURCES
1131 local linuxrelease=$(find_linux_release "$linux")
1132 $RPMBUILD $BUILD_TYPE --define 'build_kernel_ib 1' --define 'build_kernel_ib_devel 1' \
1133 --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
1134 --define "KVERSION ${linuxrelease}" \
1135 --define "$K_SRC ${linux}" \
1136 --define "LIB_MOD_DIR /lib/modules/${linuxrelease}/updates" \
1137 ${OFA_KERNEL_RELEASE:+--define "_release $OFA_KERNEL_RELEASE"} \
1138 --define "configure_options --without-quilt $OFED_CORE $OFED_HARDWARE $OFED_ISCSI" \
1141 if [ ${PIPESTATUS[0]} != 0 ]; then
1142 fatal 1 "Error building kernel-ib"
1151 local signature="$4"
1152 local use_links="$5"
1159 location="$location"/"$signature"/"$module"
1160 mkdir -p "$location"
1161 # the cleanup script removes any directory that doesn't have a
1162 # .lastused, so let's try to prevent that as soon as we can
1163 # this solution still slightly racy with the cleanup script
1164 # but the race is a lot tighter now
1165 touch -t 197001010000 "$location/.lastused"
1166 ## use eval/echo here to make sure shell expansions are performed
1167 #if ! cp -a${linkflag} $(eval echo $articles) "$location"; then
1169 for article in $(eval echo $articles); do
1170 if ! cp -a${linkflag} "$article" "$location"; then
1171 error "Failed to copy \"$article\" to \"$location\" in store_for_reuse()"
1172 # rename the cache location so that it's not cached
1173 # product, but is around for analysis
1174 mv "$location"{,-bad-$(date +%s)} ||
1175 error "failed to clean up a failed cache attempt" \
1176 "in \"$location\" -- manual cleanup will be" \
1182 # flag the cache as complete (i.e. in case lbuild was previously
1183 # interrupted while caching)
1184 touch "$location/.lastused"
1193 local use_links="${3:-false}"
1194 local signature="$4"
1196 if [ -n "$REUSEBUILD" ] && [ -d "$REUSEBUILD/$signature/$module" ]; then
1197 if [ ! -f "$REUSEBUILD/$signature/$module/.lastused" ]; then
1198 # the .lastused flag is populated at the end of the caching to
1199 # signal that the caching was completed. if that flag is not
1200 # there, then the cache is invalid (and should be removed in fact)
1201 mv "$REUSEBUILD/$signature/$module"{,-bad-$(date +%s)} ||
1202 fatal 1 "failed to clean up a bad cache in location" \
1203 "\"$REUSEBUILD/$signature/$module\" -- manual cleanup" \
1208 # so that we know how stale this entry is
1209 touch $REUSEBUILD/$signature/$module/.lastused
1212 if ls $REUSEBUILD/$signature/$module/* >/dev/null 2>&1; then
1213 cp -al $REUSEBUILD/$signature/$module/* $dest/
1216 # copying is pretty heavy
1217 # cp -a $REUSEBUILD/$signature/$module/* $dest/
1218 # do some creative symlinking instead
1220 for dir in BUILD SRPMS SPECS; do
1221 if ls $REUSEBUILD/$signature/$module/$dir/* >/dev/null 2>&1; then
1222 ln -s $REUSEBUILD/$signature/$module/$dir/* $dest/$dir
1225 # sources have to be copied by file because we need SOURCES to
1226 # be a dir we can write into
1227 # could overrun ls's arg list here
1228 #ls $REUSEBUILD/$signature/$module/SOURCES/* |
1229 find $REUSEBUILD/$signature/$module/SOURCES/ -type f |
1230 xargs ln -t $dest/SOURCES -s
1232 # same for RPMS/* dirs
1233 # could overrun ls's arg list here
1234 #ls $REUSEBUILD/$signature/$module/RPMS/$TARGET_ARCH/* |
1236 for dir in $REUSEBUILD/$signature/$module/RPMS/*; do
1237 mkdir -p $dest/RPMS/${dir##*/}
1239 xargs ln -t $dest/RPMS/${dir##*/} -s
1252 if [[ $arch = i[3456]86 ]]; then
1261 # in a given directory, find the first rpm matching given requirements
1265 local match_type="$2"
1268 pushd "$dir" > /dev/null || \
1269 fatal 1 "Unable to chdir to directory \"$dir\" in find_rpm()"
1272 for file in $(ls *.rpm); do
1273 if [ ! -f "$file" ]; then
1276 case "$match_type" in
1278 # match is any valid ERE (i.e. given to egrep) match
1279 if rpm -q --provides -p "$file" | egrep -q "$match"; then
1287 fatal 1 "Unknown match type \"$match_type\" given to find_rpm()"
1296 build_kernel_with_srpm() {
1298 # need to generate the patch for this target
1299 do_patch_linux false >&2 # sets global $FULL_PATCH (yeah, yuck)
1301 # get an md5sum of the kernel patch + config for reuse check
1302 # XXX really, there needs to be a signature and a CONFIG_FILE per arch
1306 local release_str="RELEASE=$RELEASE\n"
1308 local REUSE_SIGNATURE=$({ echo -en $release_str; echo $BUILD_GEN; cat $CONFIG_FILE $TARGET_FILE $FULL_PATCH; } | md5sum | cut -d" " -f1)
1310 # see if we can link to the reuse pool
1311 # XXX - hrm. i'm not convinced this doesn't belong in the reuse "library"
1312 local CAN_LINK_FOR_REUSE=false
1313 touch $REUSEBUILD/$$
1314 if cp -al $REUSEBUILD/$$ $TOPDIR/; then
1315 CAN_LINK_FOR_REUSE=true
1319 # the extra version string to use for the kernel (which might be a reused
1321 local kernel_extra_version=""
1322 if $REUSERPM && ! reuse kernel "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1323 "$REUSE_SIGNATURE"; then
1324 # nothing cached, build from scratch
1325 if [ ! -r "$KERNELDIR/$KERNEL_SRPM" ]; then
1326 download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM" >&2
1329 if ! rpm -ivh $KERNELDIR/$KERNEL_SRPM \
1330 --define "_topdir $TOPDIR" >&2; then
1331 # should we clean this up or leave it for analysis?
1333 fatal 1 "Error installing kernel SRPM."
1336 # put the Lustre kernel patch into the RPM build tree
1337 cp $FULL_PATCH $TOPDIR/SOURCES/linux-${lnxmaj}-lustre.patch
1338 prepare_and_build_srpm >&2
1340 # store the resulting kernel RPM build tree for future use
1341 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
1342 "kernel" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1343 "$CAN_LINK_FOR_REUSE"; then
1344 error "Failed to store kernel RPMS for reuse"
1350 # figure out the EXTRA_VERSION of the kernel we built or are re-using
1352 if ! KERNEL_RPM=$(find_rpm "$TOPDIR/RPMS/$TARGET_ARCH/" provides "^kernel ="); then
1353 fatal 1 "Failed to find a kernel RPM in $TOPDIR/RPMS/$TARGET_ARCH/"
1355 kernel_extra_version=$(rpm -q --queryformat "%{RELEASE}" -p $TOPDIR/RPMS/$TARGET_ARCH/$KERNEL_RPM)
1357 # should now have the following RPMs
1358 # $TOPDIR/RPMS/$arch/kernel-lustre-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1359 # $TOPDIR/RPMS/$arch/kernel-lustre-devel-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1360 # $TOPDIR/RPMS/$arch/kernel-lustre-headers-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1361 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-common-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1362 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1364 echo $kernel_extra_version
1373 if [ -z "$version" -o "$version" = "inkernel" ]; then
1378 for arch in $BUILD_ARCHS; do
1379 targets="--target $arch $targets"
1382 local rpmbuildopt='-bb'
1385 echo NORPM mode. Only compiling.
1388 # if only we could just rebuild the src.rpm. but the included spec
1389 # is a real pig's breakfast. just check out the patch we need to
1390 # apply to it to make it useful.
1391 #$RPMBUILD --rebuild \
1392 # --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
1393 # ${TOPDIR}/mptlinux-*.src.rpm
1394 rpm -ivh --define "_topdir ${TOPDIR}" ${TOPDIR}/mptlinux-*.src.rpm
1396 # now the big honkin' patch to the spec file
1397 pushd ${TOPDIR}/SPECS
1398 # to regen this patch use:
1399 # !!cd ~/rpm/SPECS/ && diff -u mptlinux.spec{.dist,}
1400 patch -p0 < ${TOPDIR}/lustre/build/mptlinux.spec.patch || fatal 1 "failed to patch mptlinux.spec"
1404 for arch in $BUILD_ARCHS; do
1405 targets="--target $arch $targets"
1408 local rpmbuildopt='-bb'
1411 echo NORPM mode. Only compiling.
1414 if ! $RPMBUILD $targets $rpmbuildopt \
1415 --define "_tmppath /var/tmp" \
1416 --define "_topdir ${TOPDIR}" \
1417 --define "kernel_obj $linux" \
1418 ${TOPDIR}/SPECS/mptlinux.spec; then
1422 if ! $RPMBUILD -bs \
1423 --define "_tmppath /var/tmp" \
1424 --define "_topdir ${TOPDIR}" \
1425 --define "kernel_obj $linux" \
1426 ${TOPDIR}/SPECS/mptlinux.spec; then
1440 if [ -z "$version" -o "$version" = "inkernel" ]; then
1444 # note that we use an _, not a . before the spec on purpose. we are not
1445 # allowed to have more than one file with a .spec trailer in a tarball
1446 # that is supposed to be usable with rpmbuild
1447 cp lustre/build/rdac_spec ${TOPDIR}/SPECS/rdac.spec || fatal 1 "Could not find rdac.spec in lustre/build"
1450 for arch in $BUILD_ARCHS; do
1451 targets="--target $arch $targets"
1454 local rpmbuildopt='-bb'
1457 echo NORPM mode. Only compiling.
1462 rhel5) distro="REDHAT"
1464 sles1*) distro="SUSE"
1466 *) echo "$DISTRO not supported by RDAC, skipping"
1470 if ! $RPMBUILD $targets $rpmbuildopt --define "dist $distro" \
1471 --define "_tmppath /var/tmp" \
1472 --define "_topdir ${TOPDIR}" \
1473 --define "kernel_obj $linux" \
1474 ${TOPDIR}/SPECS/rdac.spec; then
1478 if ! $RPMBUILD -bs --define "dist $distro" \
1479 --define "_tmppath /var/tmp" \
1480 --define "_topdir ${TOPDIR}" \
1481 --define "kernel_obj $linux" \
1482 ${TOPDIR}/SPECS/rdac.spec; then
1493 # REUSEBUILD, REUSERPM
1498 local ofed_version="$2"
1500 # before lustre, build kernel-ib
1501 if [ -z "$ofed_version" -o "$ofed_version" = "inkernel" ]; then
1505 if [ -n "$REUSEBUILD" ]; then
1506 # see if we can link to the reuse pool
1507 # XXX - hrm. i'm not convinced this doesn't belong in the reuse
1509 local CAN_LINK_FOR_REUSE=false
1510 touch $REUSEBUILD/$$
1511 if cp -al $REUSEBUILD/$$ $TOPDIR/; then
1512 CAN_LINK_FOR_REUSE=true
1517 local REUSE_SIGNATURE=$({ echo "$ofed_version";
1518 echo "$(find_linux_release ${linux})";
1519 cat "${linux}/include/linux/autoconf.h"; } |
1520 md5sum | cut -d" " -f1)
1521 if ! $REUSERPM || ! reuse ofed "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1522 "$REUSE_SIGNATURE"; then
1523 # stash away the existing built articles for a moment
1525 mv {BUILD,{S,}RPMS,S{OURCE,PEC}S} bak
1528 find . | cpio -pudlm ..
1532 create_rpmbuild_dirs
1534 build_kernel_ib "${linux}"
1535 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
1536 "ofed" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1537 "$CAN_LINK_FOR_REUSE"; then
1538 error "Failed to store OFED RPMS for reuse"
1542 # put the stuff we stashed away back
1546 pushd "$TOPDIR" >/dev/null
1547 rm -rf kernel-ib-devel
1548 mkdir kernel-ib-devel
1550 # the actual ofed RPMs don't have the -rc$n or -$date string appened that
1551 # might be present on the file
1552 local linuxrelease=$(find_linux_release "$linux")
1553 ofed_version=$(echo $ofed_version |
1554 sed -re 's/-(20[0-9]{6,6}-[0-9]{4,4}|rc[0-9]*)$//')
1555 local rpm=$(ls $TOPDIR/RPMS/*/kernel-ib-devel-${ofed_version}-${linuxrelease//-/_}.*.rpm)
1556 rpm2cpio -itv < $rpm | cpio -id
1557 CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/ofa_kernel ${CONFIGURE_FLAGS}"
1564 if ! $PATCHLESS; then
1565 local kernel_extra_version
1566 if ! kernel_extra_version=$(build_kernel_with_srpm); then
1567 fatal 1 "Failed to build the kernel from it's SRPM"
1570 for arch in $BUILD_ARCHS; do
1571 local kernel_devel_rpm
1572 if ! kernel_devel_rpm=$(find_rpm "$TOPDIR/RPMS/$arch/" provides "^$(devel_kernel_name $KERNEL_LUSTRE_NAMING) ="); then
1573 fatal 1 "Failed to find a kernel development RPM in $TOPDIR/RPMS/$arch/"
1576 # install the -devel RPM in preparation for the lustre build
1577 # note that the EXTRA_VERSION_DELIMITER is *NOT* used in the
1578 # version of the directory name under /usr/src
1579 if ! lnxrel="$kernel_extra_version" unpack_linux_devel_rpm \
1580 "$TOPDIR/RPMS/$arch/$kernel_devel_rpm" "-"; then
1581 fatal 1 "Could not find the Linux tree in $TOPDIR/RPMS/$arch/$kernel_devel_rpm"
1585 # need to find and unpack the vendor's own kernel-devel for patchless
1588 if ! kernelrpm=$(find_linux_rpm "-$DEVEL_KERNEL_TYPE" ${EXTRA_VERSION_DELIMITER:-"-"}); then
1589 fatal 1 "Could not find the kernel-$DEVEL_KERNEL_TYPE RPM in ${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
1591 if ! lnxrel="$lnxrel" unpack_linux_devel_rpm "$kernelrpm" "-"; then
1592 fatal 1 "Could not find the Linux tree in $kernelrpm"
1596 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
1597 fatal 1 "error building OFED"
1599 if ! $PATCHLESS; then
1600 # only need RDAC for the server
1601 build_rdac "${LINUXOBJ:-$LINUX}" "$RDAC_VERSION" ||
1602 fatal 1 "error building RDAC"
1605 build_mptlinux "${LINUXOBJ:-$LINUX}" "$MPTLINUX_VERSION" ||
1606 fatal 1 "error building mptlinux"
1609 if build_lustre "$LINUX" "$LINUXOBJ"; then
1610 # the build worked. resolve any symlinked files (i.e. from reuse)
1611 # in RPMS/$arch to real files so that that that huge mess of
1612 # complication known as LTS can copy them yet somewhere else.
1613 # is it any wonder this whole process is so damn so? anyone ever
1614 # heard of hardlinks? it this cool new thing that allows you save
1615 # tons of time and space by creating... well you can go read about
1616 # them if you have not heard about them yet.
1617 # can i say how much the implemenation of all of this really impedes
1619 pushd RPMS/$TARGET_ARCH
1621 if [ -h $file ]; then
1633 create_rpmbuild_dirs() {
1635 [ -d RPMS ] || mkdir RPMS
1636 for arch in $BUILD_ARCHS; do
1637 if [[ $arch = i?86 ]]; then
1638 # some stupidity in the sles11 kernel spec requires an RPMS/i386
1639 # even if the target arch is i686
1640 [ -d RPMS/i386 ] || mkdir RPMS/i386
1642 [ -d RPMS/$arch ] || mkdir RPMS/$arch
1644 [ -d BUILD ] || mkdir BUILD
1645 [ -d SOURCES ] || mkdir SOURCES
1646 [ -d SPECS ] || mkdir SPECS
1647 [ -d SRPMS ] || mkdir SRPMS
1669 [[ $list\ == *\ $item\ * ]]
1673 #########################################################################
1674 # Generate a backtrace through the call stack.
1678 #########################################################################
1682 local funcname="" sourcefile="" lineno="" n
1684 echo "Call stack: (most recent first)"
1685 for (( n = $strip ; n < ${#FUNCNAME[@]} ; ++n )) ; do
1686 funcname=${FUNCNAME[$n - 1]}
1687 sourcefile=$(basename ${BASH_SOURCE[$n]})
1688 lineno=${BASH_LINENO[$n - 1]}
1689 # Display function arguments
1690 if [[ ! -z "${BASH_ARGV[@]}" ]]; then
1691 local args newarg j p=0
1692 for (( j = ${BASH_ARGC[$n - 1]}; j > 0; j-- )); do
1693 newarg=${BASH_ARGV[$j + $p - 1]}
1694 args="${args:+${args} }'${newarg}'"
1696 let p+=${BASH_ARGC[$n - 1]}
1698 echo " ${funcname} ${args:+${args} }at ${sourcefile}:${lineno}"
1702 echo "BEGIN BACKTRACE"
1704 #echo ${BASH_LINENO[*]}
1705 #echo ${BASH_SOURCE[*]}
1706 #echo ${FUNCNAME[*]}
1707 local i=$((${#FUNCNAME[@]} - 1))
1708 while [ $i -ge 0 ]; do
1709 local SOURCELINE="${BASH_SOURCE[$i + 1]}:${BASH_LINENO[$i]}"
1710 # Can't figure out how to get function args from other frames...
1711 local FUNCTION="${FUNCNAME[$i]}()"
1712 echo "$SOURCELINE:$FUNCTION"
1716 echo "END BACKTRACE"
1722 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
1724 options=$(getopt -o d:D:h -l kerneltree:,distro:,kernelrpm:,reusebuild:,patchless,ldiskfs,ccache,reuse:,norpm,disable-datestamp,external-patches:,timestamp:,extraversion:,kerneldir:,linux:,lustre:,nodownload,nosrc,ofed-version:,publish,release,src,stage:,tag:,target:,target-archs:,with-linux:,xen -- "$@")
1726 if [ $? != 0 ]; then
1730 eval set -- "$options"
1765 if ! KERNELTREE=$(canon_path "$2"); then
1766 fatal 1 "Could not determine the canonical location of $2"
1770 --linux | --with-linux)
1771 if ! LINUX=$(canon_path "$2"); then
1772 fatal 1 "Could not determine the canonical location of $2"
1785 if ! REUSEBUILD=$(canon_path "$2"); then
1786 fatal 1 "Could not determine the canonical location of $2"
1803 if ! KERNELRPMSBASE=$(canon_path "$2"); then
1804 fatal 1 "Could not determine the canonical location of $2"
1855 --disable-datestamp)
1866 CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-liblustre --enable-liblustre-tests"
1870 usage 1 "Unrecognized option: $1"
1880 EXTRA_VERSION_DELIMITER=${EXTRA_VERSION_DELIMITER:-"-"}
1882 if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
1884 unpack_ofed || fatal 1 "Error unpacking OFED tarball"
1887 if [ -n "$MPTLINUX_VERSION" -a "$MPTLINUX_VERSION" != "inkernel" ]; then
1889 unpack_mptlinux || fatal 1 "Error unpacking MPTLINUX distribution"
1892 # make sure the RPM build environment is set up
1893 create_rpmbuild_dirs
1895 if [ -n "$RDAC_VERSION" -a "$RDAC_VERSION" != "inkernel" ]; then
1897 # we don't actually need to unpack this. just put it in the SOURCES dir
1898 #unpack_rdac || fatal 1 "Error unpacking RDAC tarball"
1899 cp "$KERNELTREE/rdac-LINUX-${RDAC_VERSION}-source.tar.gz" ${TOPDIR}/SOURCES/ ||
1900 fatal 1 "Error copying RDAC source tarball to RPM SOURCES dir"
1903 push_exit_trap '[ -n "$CCACHE" ] && ccache -s' "ccache_summary"
1904 # should remove the ccache trap if lbuild is interrupted
1905 trap 'delete_exit_trap "ccache_summary"; exit 1' INT TERM HUP
1907 # if an unpacked kernel source tree was given on the command line
1908 # just build lustre with it (nothing distro kernel specific here)
1909 if [ -n "$LINUX" ]; then
1910 build_mptlinux "${LINUXOBJ:-$LINUX}" "$MPTLINUX_VERSION" ||
1911 fatal 1 "error building mptlinux"
1912 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
1913 fatal 1 "error building OFED"
1914 if ! $PATCHLESS; then
1915 build_rdac "${LINUXOBJ:-$LINUX}" "$RDAC_VERSION" ||
1916 fatal 1 "error building RDAC"
1918 build_lustre "$LINUX" "$LINUXOBJ"
1920 if [ -f "${0%/*}/lbuild-$DISTRO" ]; then
1921 seen_list=$(new_list)
1922 trap '(echo "Untrapped error"
1924 # have we seen this one
1925 echo "checking seen list for ${BASH_SOURCE[0]}:${BASH_LINENO[0]}"
1927 if is_list_member "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}"; then
1928 echo "seen this one already"
1930 seen_list=$(add_list "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}")
1936 ) | tee >(mail -s "Untrapped error at ${BASH_SOURCE[0]##*/}:${BASH_LINENO[0]} on $HOSTNAME" brian@sun.com) >&2' ERR
1939 source ${0%/*}/lbuild-$DISTRO
1941 build_with_srpm || fatal 1 "Failed to build_with_srpm"
1943 source ${0%/*}/lbuild.old_school
1945 old_school_download_kernel
1949 patchless_build_sequence && build_success=true
1951 [ "$DISTRO" = "sles9" ] && build_sequence_rpm_reuse && build_success=true
1952 if ! $build_success; then
1953 build_sequence_reuse && build_success=true
1954 if ! $build_success; then
1955 build_sequence && build_success=true
1956 if $build_success; then
1957 store_for_reuse || echo "Cannot store for future reuse"
1962 ( $build_success ) || fatal 1 "Cannot build lustre"