3 # vim:expandtab:shiftwidth=4:softtabstop=4:tabstop=4:
5 # this is an alternative FD for stdout, to be used especially when we are
6 # taking stdout from a function as it's return value. i.e. foo=$(bar)
7 # this is a workaround until a version of bash where we can put xtrace
13 if [[ $SHELLOPTS = *xtrace* ]]; then
18 # include the exit_traps library
19 . ${0%/lbuild}/exit_traps.sh
20 . ${0%/lbuild}/funcs.sh
22 # our children should die when we do
23 push_exit_trap "kill -INT -$$ || true" kill_children
25 # increment this if you have made a change that should force a new kernel
28 #BUILD_GEN=2 # bz19952: remove -lustre tag from kernel RPM names
29 #BUILD_GEN=3 # bz19975: enable the building of src.rpms by default
30 #BUILD_GEN=4 # bz22281: use the git hash in the kernel extra version
31 BUILD_GEN=5 # TT-107: don't cache the BUILD dir
35 # CVSROOT is inherited from the environment
40 # XXX - some recent hacking has pretty much neutered this option.
41 # search through this file (and lbuild.old_school -- but that will
42 # be going away soon) for "-bb" and see how many places
43 # simply don't account for this option
49 TARGET_ARCH="$(uname -m)"
50 # change default behavior to only build for the current arch
51 TARGET_ARCHS="$TARGET_ARCH"
52 TARGET_ARCHS_ALL="$TARGET_ARCH"
53 [ "$TARGET_ARCH" = "i686" ] && TARGET_ARCHS_ALL="i686 i586 i386"
58 TMPDIR=${TMPDIR:-"/var/tmp"}
60 # this is a dir to try reuse old kernel RPMs in (although, it seems to be
61 # unused in any real manner
63 # this is the dir that should be used to store reuse products
65 # should cached products be used or force rebuilding?
67 # what does this do exactly? does it imply no kernel build?
71 SKIPLDISKFSRPM="v1_4_* b1_4"
72 SMPTYPES="smp bigsmp default ''"
78 # default to not adding -lustre- into the kernel RPM package names
79 KERNEL_LUSTRE_NAMING=false
80 # default not use kabi check.
98 # not in the target file any more
101 # build the lustre-tests rpm?
113 # Readlink is not present on some older distributions: emulate it.
117 if [ -L "$path" ]; then
118 ll="$(LC_ALL=C ls -l "$path" 2> /dev/null)" &&
127 Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
130 Specifies the CVS Root to use when pulling files from CVS. The
131 environment variable \$CVSROOT is used if this option is not
134 --external-patches=EXTERNAL_PATCHES
135 Directory similar to lustre/lustre/kernel_patches/ that lbuild should
136 look for seres and config files in before looking in the lustre
139 --extraversion=EXTRAVERSION
140 Text to use for the rpm release and kernel extraversion.
142 --timestamp=TIMESTAMP
143 Date of building lustre in format YYYYMMDDhhmmss
146 Try to reuse old kernel RPMs from DIR
149 Try to reuse old kernel builds from DIR
152 Path to distro kernel RPM collection
158 Do not build RPMs (compile only mode)
161 Build lustre client only
164 Which distro using. Autodetect by default
166 --kerneldir=KERNELDIR
167 Directory containing Linux source tarballs referenced by target
170 --kerneltree=KERNELTREE
171 Directory containing dirs with Linux source tarballs referenced by target
172 files. Dir names in format kernel version ('2.6.9', etc.)
174 --linux=LINUX --with-linux=LINUX
175 Directory of Linux kernel sources. When this option is used, only
176 Lustre modules and userspace are built.
179 Path to an existing lustre source tarball to use instead of
183 Do not try to download a kernel from downloads.lustre.org
186 Do not build a .src.rpm, a full kernel patch, or a patched kernel
190 Do ldiskfs RPM. Now true by default
193 Do not build lustre-iokit RPM. Now true by default
199 Specifies that the files generated do not include timestamps, and
200 that this is an official release.
203 Build a .src.rpm, a full kernel patch, and a patched kernel tarball.
206 Directory used to stage packages for release. RPMs will be placed
207 more or less in DIR/<target>-<arch>, and the tarball will be
211 A CVS branch/tag name to build from when pulling from CVS.
214 The name of the target to build. The available targets are listed
217 --target-archs=TARGET_ARCHS
218 A (space delimited) list of architectures to build. By default,
219 all of the archs supported by the TARGET will be built, in
220 addition to a .src.rpm. This option can limit those, for machines
221 that can only build certain archs or if you only want a certain
222 arch built (for testing, or a one-off kernel).
224 Also note that by using a non-"base" arch (eg, i386) only kernels
225 will be built - there will be no lustre-lite-utils package.
228 Prevents the datestamp flag (-D) from being passed to cvs for
229 checkouts. This is a workaround for a problem encountered when
230 using lbuild with tinderbox.
233 Builds a Xen domX kernel.
236 Set's a variable to a given value.
245 # canonicalize a relative path to a file
249 if [ ! -f "$PATH" ]; then
253 local FILE=${PATH##*/}
256 echo $(canon_path "$DIR")/$FILE
260 # canonicalize a relative path to a dir
264 if [ ! -d "$PATH" ]; then
268 pushd "$PATH" >/dev/null || return 1
278 if [ "$LUSTRE" ]; then
279 [ -r "$LUSTRE" ] || \
280 usage 1 "Could not find Lustre source tarball '$LUSTRE'."
283 usage 1 "Either specify a CVS Root with -d, or a Lustre source tarball with --lustre."
285 usage 1 "A branch/tag name must be specified with --tag when not building from a tarball."
288 [ -z "$DISTRO" ] && DISTRO=$(autodetect_distro)
290 if [ -z "$LINUX" ]; then
291 [ "$KERNELDIR" -o "$KERNELTREE" ] || \
292 usage 1 "A kernel directory must be specified with --kerneldir or --kerneltree."
294 [ -d "$KERNELDIR" -o -d "$KERNELTREE" ] || \
295 usage 1 "$KERNELDIR and $KERNELTREE are not a directory."
299 usage 1 "When building a snapshot, a tag name must be used."
302 [ "$TARGET" ] || TARGET=$(autodetect_target "$DISTRO")
303 # TARGET_FILE="$TOPDIR/lustre/kernel_patches/targets/$TARGET.target"
304 # [ -r "$TARGET_FILE" ] || \
305 # usage 1 "Target '$TARGET' was not found."
310 CANONICAL_TARGET="rhel6"
313 CANONICAL_TARGET="rhel5"
316 CANONICAL_TARGET="rhel-2.6"
319 CANONICAL_TARGET="sles-2.6"
322 CANONICAL_TARGET="sles10-2.6"
325 CANONICAL_TARGET="sles11"
328 CANONICAL_TARGET="oel5"
331 CANONICAL_TARGET="hp-pnnl-2.4"
339 CANONICAL_TARGET="$TARGET"
343 local timestampnodig=$(echo $TIMESTAMP | sed -e s/[0-9]*//g)
344 [ "$timestampnodig" = "" ] || TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M%S")
345 local timestamplength="${#TIMESTAMP}"
346 if [ $timestamplength -eq 12 ]; then
347 TIMESTAMP="${TIMESTAMP}00"
348 elif [ $timestamplength -ne 14 ]; then
349 TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M%S")
352 RPMBUILD=$(which rpmbuild 2>/dev/null | head -1)
353 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
354 RPMBUILD=$(which rpm 2>/dev/null | head -1)
355 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
356 usage 1 "Could not find binary for making rpms (tried rpmbuild and rpm)."
360 if [ -n "$CCACHE" ]; then
361 which "$DISTCC" &>/dev/null && export DISTCC RPM_BUILD_NCPUS
363 if which "$CCACHE" &>/dev/null; then
364 local ccache=$(which "$CCACHE")
365 local bindir="$TOPDIR/bin"
367 if [ ! -d $bindir ]; then
368 mkdir -p $bindir || fatal 1 "error trying to create $bindir"
370 rm ${bindir}/* > /dev/null 2>&1 || true
372 ln -s "$ccache" ${bindir}/ccache
373 ln -s "$ccache" ${bindir}/cc
374 ln -s "$ccache" ${bindir}/$CC
375 export PATH=$bindir:$PATH
376 export CCACHE && export CC="ccache $CC"
377 # zero the cache so we can see how effective we are being with it
381 # get some ccache stats when we are done
382 push_exit_trap '[ -n "$CCACHE" ] && ccache -s' "ccache_summary"
383 # should remove the ccache trap if lbuild is interrupted
384 trap 'echo "Received an INT TERM or HUP signal, terminating."; delete_exit_trap "ccache_summary"; exit 1' INT TERM HUP
394 echo $(echo "$*" | xargs -n 1 | sort -u)
403 if which wget >/dev/null 2>&1; then
404 if ! wget -nv "$url" -O "$target"; then
407 elif which curl >/dev/null 2>&1; then
408 if ! curl -L -s -o "$target" "$url"; then
412 fatal 1 "Could not find either wget or curl to fetch URLs."
422 local force="${3:-false}"
424 if $force || [ ! -r "$KERNELDIR/$srpm" ] ||
425 [ ! -s "$KERNELDIR/$srpm" ]; then
427 local location="http://downloads.lustre.org/public/kernels/$target/old"
428 # get the location from a distro specific method if it exists
429 if type -p kernel_srpm_location; then
430 location=$(kernel_srpm_location)
432 echo "Downloading $location/$srpm..."
433 if ! fetch_url "$location/$srpm" "$KERNELDIR/$srpm" 2>&1 ||
434 [ ! -s "$KERNELDIR/$srpm" ]; then
435 rm -f $KERNELDIR/$srpm
436 # punt to a distro specific method if it exists
437 if ! type -p download_srpm-$DISTRO; then
438 fatal 1 "Could not download target $target's kernel SRPM $srpm from $location."
440 if ! download_srpm-$DISTRO "$target" "$srpm" "$force"; then
441 fatal 1 "Could not download target $target's kernel SRPM $srpm using download_srpm-$DISTRO."
446 fatal 1 "$srpm not found in directory $KERNELDIR."
457 local file=${from##*/}
463 local semaphore="$to-downloading"
466 if [ ! -f $semaphore ]; then
470 # make sure the download has not been aborted
471 local now=$(date +%s)
472 local file_mtime=$(stat -c %Y "$to")
473 local staleness=$((now - file_mtime))
474 # let's assume an active download will write at least once a minute
475 if [ $staleness -gt 60 ]; then
483 # if the semaphore file exists, the file is either still downloading
484 # or a download was aborted and we cannot trust the target file
485 if [ -f $semaphore ]; then
489 if ! is_downloading && [ -r "$to" ] && [ -s "$to" ]; then
496 if $force || ! is_downloaded; then
497 if is_downloading; then
498 echo "Somebody else is downloading $from..."
499 while is_downloading; do
500 echo "Waiting for $to to finish downloading"
503 if is_downloaded; then
506 echo "The download we were waiting for seems to have been aborted"
512 echo "Downloading $from..."
513 # flag others so they don't try to download also
514 push_exit_trap "rm -f $to $semaphore" "download"
516 if ! fetch_url "$from" "$to" || [ ! -s "$to" ]; then
517 # the trap will remove the files via the fatal below
518 fatal 1 "Could not download ${to##*/} from ${from%/*}/."
521 delete_exit_trap "download"
523 fatal 1 "${to##*/} not found in directory ${to%/*}."
532 local force="${1:-false}"
534 if [ -z "$OFED_VERSION" -o "$OFED_VERSION" = "inkernel" ]; then
538 local OFED_BASE_VERSION=$OFED_VERSION
539 if [[ $OFED_VERSION = *.*.*.* ]]; then
540 OFED_BASE_VERSION=${OFED_VERSION%.*}
543 local location="http://www.openfabrics.org/downloads/OFED/ofed-${OFED_BASE_VERSION}/"
545 if [[ $OFED_VERSION = daily-* ]]; then
547 OFED_VERSION=${OFED_VERSION/daily-/}
548 Mmv=${OFED_VERSION%%-*}
549 daily=${OFED_VERSION##$Mmv-}
550 location="http://www.openfabrics.org/downloads/OFED/ofed-${Mmv}-daily/"
551 # find the filename for the version for the date specified
552 OFED_VERSION=$(curl -s "$location" | sed -nre "/${daily}-/s/.*href=\"OFED-(${Mmv//./\\.}-${daily}-[0-9]{4,4}).tgz.*$/\1/p" | tail -1)
553 if [ -z "$OFED_VERSION" ]; then
554 fatal 1 "Could not determine the filename of the OFED snapshot for ${daily}"
558 local file="OFED-${OFED_VERSION}.tgz"
559 download_file "$location/$file" "$KERNELTREE" "$force"
565 EXTRA_VERSION_save="$EXTRA_VERSION"
566 for patchesdir in "$EXTERNAL_PATCHES" \
567 "$TOPDIR/lustre/lustre/kernel_patches"; do
568 TARGET_FILE="$patchesdir/targets/$TARGET.target"
569 [ -r "$TARGET_FILE" ] && break
571 [ -r "$TARGET_FILE" ] || fatal 1 "Target $TARGET was not found."
573 echo "Loading target config file $TARGET.target..."
575 # if the caller specified an OFED_VERSION it should override whatever
576 # the target file specifies
577 local env_OFED_VERSION="$OFED_VERSION"
581 if [ -n "$env_OFED_VERSION" ]; then
582 OFED_VERSION="$env_OFED_VERSION"
585 # doesn't make any sense to build OFED for xen domX's
590 # XXX - set_rpm_smp_type is an ugly undeterministic hack. it needs to
591 # go away and the target just specify the $RPMSMPTYPE
592 [ -z "$RPMSMPTYPE" ] && set_rpm_smp_type
594 # CC might have been overwriten in TARGET_FILE
595 if [[ $CC != ccache\ * ]] && which "$CCACHE" &>/dev/null; then
596 export CCACHE && export CC="ccache $CC"
599 if [ ! "$KERNELTREE" = "" ] && [ -d "$KERNELTREE" ]; then
600 KERNELDIR="$KERNELTREE/${lnxmaj}"
601 [ -d "$KERNELDIR" ] || mkdir "$KERNELDIR"
604 # verify the series is available
605 if [ "$SERIES" ]; then
606 for series in $SERIES; do
607 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches"; do
608 [ -r "$patchesdir/series/$series" ] && continue 2
610 fatal 1 "Target $TARGET's series $SERIES could not be found.\nSearched:\n\t$EXTERNAL_PATCHES/series\n\t$TOPDIR/lustre/lustre/kernel_patches/series."
614 # set the location of the .config file
620 if [ -f $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET-$TARGET_ARCH.config ]; then
621 CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET$XENPOSTFIX-$TARGET_ARCH${RPMSMPTYPE:+-}${RPMSMPTYPE}.config"
624 local lnxrelnew=${lnxrel//-/_}
626 # remember the EXTRA_VERSION before we diddle it here
627 # XXX - we really should not diddle with any values read in from the
628 # target file. if we want to modify a value, we should create
630 PRISTINE_EXTRA_VERSION=$EXTRA_VERSION
632 if ! $PATCHLESS && [ ! -f "$CONFIG_FILE" ]; then
633 fatal 1 "Config file for target $TARGET missing from $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/."
636 if [ "$EXTRA_VERSION_save" ]; then
637 EXTRA_VERSION="$EXTRA_VERSION_save"
638 elif ! $RELEASE; then
639 # if there is no patch series, then this is not a lustre specific
640 # kernel. don't make it look like one
641 if $PATCHLESS || [ -n "$SERIES" ]; then
642 EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
643 # EXTRA_VERSION="${EXTRA_VERSION}-${TAG}.${TIMESTAMP}"
644 if ! $PATCHLESS && [ -n "$BUILDID" ]; then
645 EXTRA_VERSION="${EXTRA_VERSION}.${BUILDID}"
649 # EXTRA_VERSION=${EXTRA_VERSION//-/_}
651 ALL_ARCHS="$BASE_ARCHS $BIGMEM_ARCHS $BOOT_ARCHS $JENSEN_ARCHS $SMP_ARCHS $BIGSMP_ARCHS $PSERIES64_ARCHS $UP_ARCHS"
654 for arch in $(uniqify "$ALL_ARCHS"); do
655 if [ -z "$TARGET_ARCHS" ] ||
656 [[ \ $TARGET_ARCHS\ = *\ $arch\ * ]]; then
657 BUILD_ARCHS="$BUILD_ARCHS $arch"
660 [ "$BUILD_ARCHS" ] || usage 1 "No available target archs to build."
661 echo "Building for: $BUILD_ARCHS"
669 fatal 1 "tarflags(): File name argument missing."
681 fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
690 local extractfile="$@"
692 echo "Untarring ${tarfile##*/}..."
693 tar $(tarflags "$tarfile") "$tarfile" $extractfile
699 if ! untar "$KERNELTREE/OFED-${OFED_VERSION}.tgz"; then
702 [ -d OFED ] || ln -sf OFED-[0-9].[0-9]* OFED
708 if [ -z "$LUSTRE" ]; then
711 if [ -n "$USE_DATESTAMP" ]; then
712 DATESTAMP="-D '$DATE'"
715 local DIRNAME="lustre-$TAG-$TIMESTAMP"
717 cvs -d "$CVSROOT" -qz3 co $DATESTAMP -d "$DIRNAME" lustre || \
718 fatal 1 "There was an error checking out toplevel Lustre from CVS."
719 pushd "$DIRNAME" > /dev/null
720 ./lustrecvs "$TAG" || \
721 fatal 1 "There was an error checking out Lustre/Portals/Build from CVS."
722 echo "Creating lustre tarball..."
723 sh autogen.sh || fatal 1 "There was an error running autogen.sh."
724 ./configure --enable-dist || \
725 fatal 1 "There was an error running ./configure to create makefiles."
726 make dist || fatal 1 "There was an error running 'make dist'."
727 LUSTRE=$PWD/lustre-*.tar.gz
731 untar "$LUSTRE" || fatal 1 "Error unpacking Lustre tarball"
732 [ -d lustre ] || ln -sf lustre-[0-9].[0-9]* lustre
738 local do_patch=${1:-true}
740 FULL_PATCH="$PWD/lustre-kernel-${TARGET}-${EXTRA_VERSION}.patch"
741 [ -f "$FULL_PATCH" ] && rm -f "$FULL_PATCH"
742 $do_patch && pushd linux >/dev/null
743 for series in $SERIES; do
744 echo -n "Applying series $series:"
745 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches"; do
746 [ -r "$patchesdir/series/$series" ] || continue
747 SERIES_FILE="$patchesdir/series/$series"
748 for patch in $(<"$SERIES_FILE"); do
750 PATCH_FILE="$patchesdir/patches/$patch"
751 [ -r "$PATCH_FILE" ] || \
752 fatal 1 "Patch $patch does not exist in Lustre tree."
753 cat "$PATCH_FILE" >> "$FULL_PATCH" || {
755 fatal 1 "Error adding patch $patch to full patch."
758 patch -s -p1 < "$PATCH_FILE" 2>&1 || {
760 fatal 1 "Error applying patch $patch."
768 $do_patch && popd >/dev/null
769 echo "Full patch has been saved in ${FULL_PATCH##*/}."
774 local rpmbuildopt="$1"
776 pushd lustre-iokit > /dev/null || return 255
778 if ! ./configure; then
779 echo "failed to configure in lustre-iokit"
780 popd >/dev/null # pushd lustre-iokit
785 echo "failed to make dist in lustre-iokit"
786 popd >/dev/null # pushd lustre-iokit
790 if ! $RPMBUILD $rpmbuildopt lustre-iokit*.tar.gz \
791 --define "_tmppath /var/tmp" \
792 --define "_topdir $TOPDIR" 2>&1; then
793 popd >/dev/null # pushd lustre-iokit
797 if $DO_SRC && ! $RPMBUILD -ts lustre-iokit*.tar.gz \
798 --define "_tmppath /var/tmp" \
799 --define "_topdir $TOPDIR" 2>&1; then
800 popd >/dev/null # pushd lustre-iokit
803 popd >/dev/null # pushd lustre-iokit
812 pushd lustre >/dev/null
814 echo "Building Lustre RPMs for: $BUILD_ARCHS..."
816 for arch in $BUILD_ARCHS; do
817 targets="--target $arch $targets"
823 confoptions="$confoptions --disable-server"
826 local rpmbuildopt='-tb'
829 echo NORPM mode. Only compiling.
832 ( $(skeep_ldiskfs_rpm $TAG) ) || {
834 pushd ldiskfs > /dev/null || return 255
836 if ! ./configure --enable-dist; then
837 echo "failed to configure in ldiskfs"
838 popd >/dev/null # pushd ldiskfs
839 popd >/dev/null # pushd lustre
843 if ! make dist 2>&1; then
844 popd >/dev/null # pushd ldiskfs
845 popd >/dev/null # pushd lustre
849 #cp lustre-ldiskfs*.tar.gz $TOPDIR/SOURCES || \
850 # fatal 1 "Could not copy lustre-ldiskfs*.tar.gz to $TOPDIR/SOURCES"
852 if ! $RPMBUILD $targets $rpmbuildopt lustre-ldiskfs*.tar.gz \
853 --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
854 --define "kdir $linux" \
855 ${linuxobj:+--define "kobjdir $linuxobj"} \
856 --define "_tmppath /var/tmp" \
857 --define "_topdir $TOPDIR" 2>&1; then
858 popd >/dev/null # pushd ldiskfs
859 popd >/dev/null # pushd lustre
864 if ! $RPMBUILD -ts lustre-ldiskfs*.tar.gz \
865 --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
866 --define "kdir $linux" \
867 ${linuxobj:+--define "kobjdir $linuxobj"} \
868 --define "_tmppath /var/tmp" \
869 --define "_topdir $TOPDIR" 2>&1; then
870 popd >/dev/null # pushd ldiskfs
871 popd >/dev/null # pushd lustre
875 popd >/dev/null # pushd ldiskfs
877 # tell lustre where ldiskfs is
878 # XXX - pointing to the RPM BUILD dir is a hack. we need to flesh
879 # out the ldiskfs RPM build so that it builds a
880 # lustre-ldiskfs-devel RPM and install that and point lustre
882 confoptions="$confoptions --with-ldiskfs=$(ls -d $TOPDIR/BUILD/lustre-ldiskfs-*)"
886 if ! build_iokit $rpmbuildopt; then
887 echo "failed to build lustre-iokit"
888 popd >/dev/null # pushd lustre
893 # convert the $PATCHLESS boolean to an empty/not-empty boolean
894 # as silly as this seems, it makes the syntax of the rpmbuild command
895 # simpler and not need an eval to deal with the quotes in the quotes
896 local is_patchless=""
901 # ditto for the lustre-tests boolean
902 local lustre_tests=""
903 if ! $LUSTRE_TESTS; then
907 $RPMBUILD $targets $rpmbuildopt "$LUSTRE" \
908 ${is_patchless:+--define "lustre_name lustre-client"} \
909 ${lustre_tests:+--define "build_lustre_tests 0"} \
910 ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
911 --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
912 --define "kdir $linux" \
913 ${linuxobj:+--define "kobjdir $linuxobj"} \
914 --define "_tmppath $TMPDIR" \
915 --define "_topdir $TOPDIR" 2>&1 || \
916 fatal 1 "Error building rpms for $BUILD_ARCHS."
919 if ! $RPMBUILD -ts "$LUSTRE" \
920 ${is_patchless:+--define "lustre_name lustre-client"} \
921 ${lustre_tests:+--define "build_lustre_tests 0"} \
922 ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
923 --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
924 --define "kdir $linux" \
925 ${linuxobj:+--define "kobjdir $linuxobj"} \
926 --define "_tmppath $TMPDIR" \
927 --define "_topdir $TOPDIR" 2>&1; then
938 [ "$STAGEDIR" ] || return 0
940 for arch in $BUILD_ARCHS; do
941 rpmdir="${STAGEDIR}/${CANONICAL_TARGET}-${arch}"
942 echo "${0##*/}: Copying RPMs into ${rpmdir}"
944 cp -v RPMS/${arch}/*.rpm "${rpmdir}"
945 if [ -d RPMS/noarch ]; then
946 cp -v RPMS/noarch/*.rpm "${rpmdir}"
950 cp -v "$LUSTRE" "$STAGEDIR"
954 #check if we need to build separate ldiskfs RPM
955 skeep_ldiskfs_rpm() {
960 if ! $LDISKFSRPM; then
962 elif $PATCHLESS; then
965 for skiptag in $SKIPLDISKFSRPM; do
966 [[ $tag == $skiptag ]] && skip=true && break
976 local infact_arch="${TARGET_ARCH}"
979 [ "$infact_arch" == "i586" ] && infact_arch="i686"
982 for smp_type in $SMP_ARCHS; do
983 [ $infact_arch == $smp_type ] && RPMSMPTYPE=smp && break
986 for smp_type in $BIGSMP_ARCHS; do
987 [ $infact_arch == $smp_type ] && RPMSMPTYPE=bigsmp && break
990 for smp_type in $PPC64_ARCHS; do
991 [ $infact_arch == $smp_type ] && RPMSMPTYPE=ppc64 && break
994 for smp_type in $DEFAULT_ARCHS; do
995 [ $infact_arch == $smp_type ] && RPMSMPTYPE=default && break
1000 # This function takes a linux source pool and digs out the linux release
1002 find_linux_release() {
1005 local LINUXRELEASEHEADER=$SRCDIR/include/linux/version.h
1006 if [ -s $SRCDIR/include/linux/utsrelease.h ]; then
1007 LINUXRELEASEHEADER=$SRCDIR/include/linux/utsrelease.h
1010 sed -ne 's/#define UTS_RELEASE "\(.*\)"$/\1/p' $LINUXRELEASEHEADER
1014 # unpack kernel(/source/devel) RPM
1016 # This function and it's setting of $LINUX and $LINUXOBJ is a total hack that
1017 # needs to completely refactored. It completely ingores that $BUILD_ARCHS may
1018 # contain a list of arches for which rpmbuild commands (including the one for
1020 unpack_linux_devel_rpm() {
1021 local kernelrpm="${1}"
1023 [ -f "$kernelrpm" ] || return 255
1024 [ -d $TOPDIR/reused ] || mkdir $TOPDIR/reused || return 255
1026 pushd $TOPDIR/reused &>/dev/null || return 255
1028 if ! rpm2cpio < "$kernelrpm" | cpio -id > /dev/null 2>&1; then
1032 # call a distro specific hook, if available
1033 if type -p unpack_linux_devel_rpm-$DISTRO; then
1034 if ! unpack_linux_devel_rpm-$DISTRO "$kernelrpm"; then
1041 find_linux_devel_paths $TOPDIR/reused
1050 # build kernel-ib{,-devel}
1052 # ofed 1.3 had a bug in the rpm spec
1053 if [ "$OFED_VERSION" = "1.3" ]; then
1057 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-madeye-mod"
1058 local OFED_HARDWARE="--with-mthca-mod --with-mlx4-mod --with-mlx4_en-mod --with-cxgb3-mod --with-nes-mod"
1059 # some I/B drivers are architecture dependent and kernel-ib's configure
1060 # does not figure it out for us ~sigh~
1061 case "$TARGET_ARCH" in
1063 OFED_HARDWARE="$OFED_HARDWARE --with-ehca-mod"
1066 # we're no longer shipping the OFED iSCSI
1067 #OFED_ISCSI="--with-srp-mod --with-srp-target-mod"
1068 ## ISER module has no backport support as of OFED 1.5 (i.e. only builds on
1069 ##kernels >= 2.6.30)
1070 #if [[ $OFED_VERSION = 1.[0-4]* ]]; then
1071 # OFED_ISCSI="$OFED_ISCSI --with-iser-mod"
1074 # assume we are just rebuilding the SRPM
1075 local BUILD_TYPE=${BUILD_TYPE:-"--rebuild"}
1076 local SOURCE="${TOPDIR}/OFED/SRPMS/ofa_kernel-*.src.rpm"
1078 # but switch to building from the SPEC if we need to apply patches
1079 if ls ${TOPDIR}/lustre/build/patches/ofed/* >/dev/null; then
1081 rpm --define "_topdir ${TOPDIR}" -ivh $SOURCE
1082 SOURCE="${TOPDIR}/SPECS/ofa_kernel.spec"
1083 local file ed_fragment1 ed_fragment2 n=1
1084 for file in $(ls ${TOPDIR}/lustre/build/patches/ofed/*.patch); do
1085 ed_fragment1="$ed_fragment1
1086 Patch$n: ${file%%*/}"
1087 ed_fragment2="$ed_fragment2
1089 cp $file ${TOPDIR}/SOURCES
1092 for file in $(ls ${TOPDIR}/lustre/build/patches/ofed/*.ed); do
1093 ed_fragment3="$ed_fragment3
1098 if [ $n -gt 1 ]; then
1112 local linuxrelease=$(find_linux_release "$linux")
1113 if ! $RPMBUILD $BUILD_TYPE --define 'build_kernel_ib 1' --define 'build_kernel_ib_devel 1' \
1114 ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
1115 --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
1116 --define "KVERSION ${linuxrelease}" \
1117 --define "$K_SRC ${linux}" \
1118 --define "LIB_MOD_DIR /lib/modules/${linuxrelease}/updates" \
1119 ${OFA_KERNEL_RELEASE:+--define "_release $OFA_KERNEL_RELEASE"} \
1120 --define "configure_options --without-quilt $OFED_CORE $OFED_HARDWARE $OFED_ISCSI" \
1121 ${SOURCE} 2>&1; then
1122 fatal 1 "Error building kernel-ib"
1131 local signature="$4"
1132 local use_links="$5"
1139 local default_iface=$(/sbin/ip route get 192.1.1.1 | sed -ne 's/.* dev \(.*\) * src .*/\1/p')
1140 if [ -z "$default_iface" ]; then
1141 fatal 1 "Failed to determine the default route interface"
1143 local unique_id=$(/sbin/ip addr show dev $default_iface | sed -ne '/ inet /s/ *inet \(.*\)\/.*/\1/p' | head -1)
1144 if [ -z "$unique_id" ]; then
1145 fatal 1 "Failed to determine a unique id from interface $default_interface"
1148 local finallocation="$location"/"$signature"/"$module"
1149 location="$location"/"$signature-${unique_id}"/"$module"
1150 mkdir -p "$location"
1151 # the cleanup script removes any directory that doesn't have a
1152 # .lastused, so let's try to prevent that as soon as we can
1153 # this solution still slightly racy with the cleanup script
1154 # but the race is a lot tighter now
1155 touch -t 197001010000 "$location/.lastused"
1156 ## use eval/echo here to make sure shell expansions are performed
1157 #if ! cp -a${linkflag} $(eval echo $articles) "$location"; then
1159 for article in $(eval echo $articles); do
1160 if ! cp -a${linkflag} "$article" "$location"; then
1161 error "Failed to copy \"$article\" to \"$location\" in store_for_reuse()"
1162 # rename the cache location so that it's not cached
1163 # product, but is around for analysis
1164 mv "$location"{,-bad-$(date +%s)} ||
1165 error "failed to clean up a failed cache attempt" \
1166 "in \"$location\" -- manual cleanup will be" \
1172 # flag the cache as complete (i.e. in case lbuild was previously
1173 # interrupted while caching)
1174 touch "$location/.lastused"
1176 # put the temporary location into the final location
1178 mkdir -p "${finallocation%/*}"
1179 mv "$location" "$finallocation"
1180 rmdir "${location%/*}"
1188 local use_links="${3:-false}"
1189 local signature="$4"
1191 if [ -n "$REUSEBUILD" ] && [ -d "$REUSEBUILD/$signature/$module" ]; then
1192 if [ ! -f "$REUSEBUILD/$signature/$module/.lastused" ]; then
1193 # the .lastused flag is populated at the end of the caching to
1194 # signal that the caching was completed. if that flag is not
1195 # there, then the cache is invalid (and should be removed in fact)
1196 mv "$REUSEBUILD/$signature/$module"{,-bad-$(date +%s)} ||
1197 fatal 1 "failed to clean up a bad cache in location $REUSEBUILD/$signature/$module\" -- manual cleanup will be necessary"
1201 # so that we know how stale this entry is
1202 touch $REUSEBUILD/$signature/$module/.lastused
1205 if ls $REUSEBUILD/$signature/$module/* >/dev/null 2>&1; then
1206 cp -al $REUSEBUILD/$signature/$module/* $dest/
1209 # copying is pretty heavy
1210 # cp -a $REUSEBUILD/$signature/$module/* $dest/
1211 # do some creative symlinking instead
1213 for dir in BUILD SRPMS SPECS; do
1214 if ls $REUSEBUILD/$signature/$module/$dir/* >/dev/null 2>&1; then
1215 ln -s $REUSEBUILD/$signature/$module/$dir/* $dest/$dir
1218 # sources have to be copied by file because we need SOURCES to
1219 # be a dir we can write into
1220 # could overrun ls's arg list here
1221 #ls $REUSEBUILD/$signature/$module/SOURCES/* |
1222 find $REUSEBUILD/$signature/$module/SOURCES/ -type f |
1223 xargs ln -t $dest/SOURCES -s
1225 # same for RPMS/* dirs
1226 # could overrun ls's arg list here
1227 #ls $REUSEBUILD/$signature/$module/RPMS/$TARGET_ARCH/* |
1229 for dir in $REUSEBUILD/$signature/$module/RPMS/*; do
1230 mkdir -p $dest/RPMS/${dir##*/}
1232 xargs ln -t $dest/RPMS/${dir##*/} -s
1244 if [[ $arch = i[3456]86 ]]; then
1252 build_kernel_with_srpm() {
1255 if [ -z "$outfd" ] || [ $outfd = 1 ]; then
1256 fatal 1 "You must supply a file descriptor to ${FUNCNAME[0]} and it cannot be 1"
1259 # need to generate the patch for this target
1260 do_patch_linux false >&${outfd} # sets global $FULL_PATCH (yeah, yuck)
1262 # get an md5sum of the kernel patch + config for reuse check
1263 # XXX really, there needs to be a signature and a CONFIG_FILE per arch
1267 local release_str="RELEASE=$RELEASE\n"
1270 if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
1271 local REUSE_SIGNATURE=$({ echo -en $release_str;
1273 cat $CONFIG_FILE $TARGET_FILE $FULL_PATCH; } |
1274 md5sum | cut -d" " -f1)
1275 # see if we can link to the reuse pool
1276 # XXX - hrm. i'm not convinced this doesn't belong in the reuse
1278 local CAN_LINK_FOR_REUSE=false
1279 touch $REUSEBUILD/$$
1280 if cp -al $REUSEBUILD/$$ $TOPDIR/ 2>/dev/null; then
1281 CAN_LINK_FOR_REUSE=true
1286 # the extra version string to use for the kernel (which might be a reused
1288 local kernel_extra_version=""
1289 if ! $USE_BUILD_CACHE || ! reuse kernel "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1290 "$REUSE_SIGNATURE"; then
1291 # nothing cached, build from scratch
1292 if [ ! -r "$KERNELDIR/$KERNEL_SRPM" ]; then
1293 echo "Downloading kernel SRPM" >&${outfd}
1294 download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM" >&${outfd}
1297 if ! rpm -ivh $KERNELDIR/$KERNEL_SRPM \
1298 --define "_topdir $TOPDIR" >&${outfd} 2>&1; then
1299 # should we clean this up or leave it for analysis?
1301 fatal 1 "Error installing kernel SRPM."
1304 # put the Lustre kernel patch into the RPM build tree
1305 cp $FULL_PATCH $TOPDIR/SOURCES/linux-${lnxmaj}-lustre.patch
1306 prepare_and_build_srpm >&${outfd} ||
1307 fatal 1 "failed to prepare_and_build_srpm"
1309 if [ -z "$REUSE_SIGNATURE" ]; then
1310 echo "No reuse signature was caculated so not storing the built kernel" >&${outfd}
1312 # store the resulting kernel RPM build tree for future use
1313 echo "Storing the built kernel for future reuse" >&${outfd}
1314 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,SRPMS,RPMS}" \
1315 "kernel" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1316 "$CAN_LINK_FOR_REUSE"; then
1317 error "Failed to store kernel RPMS for reuse"
1318 echo "unknown" >&${outfd}
1324 # figure out the EXTRA_VERSION of the kernel we built or are re-using
1326 if ! KERNEL_RPM=$(find_rpm "$TOPDIR/RPMS/$TARGET_ARCH/" provides "^kernel ="); then
1327 fatal 1 "Failed to find a kernel RPM in $TOPDIR/RPMS/$TARGET_ARCH/"
1329 kernel_extra_version=$(rpm -q --queryformat "%{RELEASE}" -p $TOPDIR/RPMS/$TARGET_ARCH/$KERNEL_RPM)
1331 # should now have the following RPMs
1332 # $TOPDIR/RPMS/$arch/kernel-lustre-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1333 # $TOPDIR/RPMS/$arch/kernel-lustre-devel-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1334 # $TOPDIR/RPMS/$arch/kernel-lustre-headers-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1335 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-common-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1336 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1338 echo $kernel_extra_version
1346 # REUSEBUILD, USE_BUILD_CACHE
1351 local ofed_version="$2"
1353 # if an ofed version is given, then it means use OFED proper,
1354 # not any vendor specific "inkernel" version
1355 if [ -z "$ofed_version" ]; then
1359 if [ "$ofed_version" = "inkernel" ]; then
1360 # see if there is a distro specific override for this and use
1362 # XXX we need to better integrate a distro specific override with
1363 # the rest of this function so that all of the reuse cache
1364 # stuff is leveraged given that 80% of this function is reuse
1365 if type -p build_ofed-${DISTRO}; then
1367 ofed_location=$(build_ofed-${DISTRO} ${STDOUT})
1368 local rc=${PIPESTATUS[0]}
1369 CONFIGURE_FLAGS="--with-o2ib=${ofed_location} ${CONFIGURE_FLAGS}"
1377 if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
1378 local REUSE_SIGNATURE=$({ echo "$ofed_version";
1379 echo "$(find_linux_release ${linux})";
1380 cat "${linux}/include/linux/autoconf.h"; } |
1381 md5sum | cut -d" " -f1)
1382 # see if we can link to the reuse pool
1383 # XXX - hrm. i'm not convinced this doesn't belong in the reuse
1385 local CAN_LINK_FOR_REUSE=false
1386 touch $REUSEBUILD/$$
1387 if cp -al $REUSEBUILD/$$ $TOPDIR/; then
1388 CAN_LINK_FOR_REUSE=true
1393 if ! $USE_BUILD_CACHE || ! reuse ofed "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1394 "$REUSE_SIGNATURE"; then
1395 if [ -n "$REUSE_SIGNATURE" ]; then
1396 # stash away the existing built articles for a moment
1398 mv {BUILD,{S,}RPMS,S{OURCE,PEC}S} bak
1401 find . | cpio -pudlm ..
1405 create_rpmbuild_dirs
1408 build_kernel_ib "${linux}"
1410 if [ -z "$REUSE_SIGNATURE" ]; then
1411 echo "No reuse signature was caculated so not storing the built ofed"
1413 # store the resulting RPM build tree for future use
1414 echo "Storing the built ofed for future reuse"
1415 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
1416 "ofed" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1417 "$CAN_LINK_FOR_REUSE"; then
1418 error "Failed to store OFED RPMS for reuse"
1422 # put the stuff we stashed away back
1427 pushd "$TOPDIR" >/dev/null
1428 rm -rf kernel-ib-devel
1429 mkdir kernel-ib-devel
1431 # the actual ofed RPMs don't have the -rc$n or -$date string appened that
1432 # might be present on the file
1433 local linuxrelease=$(find_linux_release "$linux")
1434 ofed_version=$(echo $ofed_version |
1435 sed -re 's/-(20[0-9]{6,6}-[0-9]{4,4}|rc[0-9]*)$//')
1436 local rpm=$(ls $TOPDIR/RPMS/*/kernel-ib-devel-${ofed_version}-${linuxrelease//-/_}.*.rpm)
1437 if ! rpm2cpio < $rpm | cpio -id; then
1438 fatal 1 "could not unpack the kernel-ib-devel rpm."
1440 CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/ofa_kernel ${CONFIGURE_FLAGS}"
1447 if ! $PATCHLESS; then
1448 local kernel_extra_version
1449 if ! kernel_extra_version=$(build_kernel_with_srpm ${STDOUT}); then
1450 fatal 1 "Failed to build the kernel from it's SRPM"
1453 for arch in $BUILD_ARCHS; do
1454 local kernel_devel_rpm
1455 if ! kernel_devel_rpm=$(find_rpm "$TOPDIR/RPMS/$arch/" provides "^$(devel_kernel_name $KERNEL_LUSTRE_NAMING) ="); then
1456 fatal 1 "Failed to find a kernel development RPM in $TOPDIR/RPMS/$arch/"
1459 # install the -devel RPM in preparation for modules builds
1460 if ! lnxrel="$kernel_extra_version" unpack_linux_devel_rpm \
1461 "$TOPDIR/RPMS/$arch/$kernel_devel_rpm"; then
1462 fatal 1 "Could not find the Linux tree in $TOPDIR/RPMS/$arch/$kernel_devel_rpm"
1466 # need to find and unpack the vendor's own kernel-devel for patchless
1469 if ! kernelrpm=$(find_linux_rpm "-$DEVEL_KERNEL_TYPE"); then
1470 fatal 1 "Could not find the kernel-$DEVEL_KERNEL_TYPE RPM in ${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
1472 if ! lnxrel="$lnxrel" unpack_linux_devel_rpm "$kernelrpm" "-"; then
1473 fatal 1 "Could not find the Linux tree in $kernelrpm"
1477 # ~sigh~ have to make copies of and modify some of the rpm
1478 # infrastructure files so that find-requires can find our unpacked
1479 # kernel-devel artifacts
1480 cp $RPM_HELPERS_DIR/{symset-table,find-requires{,.ksyms}} .
1481 FIND_REQUIRES="$(pwd)/find-requires"
1482 chmod 755 {symset-table,find-requires{,.ksyms}}
1484 tmp="${tmp//\//\\/}"
1485 ed find-requires <<EOF
1489 /|.*find-requires.ksyms/s/|/| bash -x/
1490 g/ [^ ]*\/\(find-requires\.ksyms\)/s// $tmp\/\1/g
1493 ed find-requires.ksyms <<EOF
1497 g/\/.*\/\(symset-table\)/s//$tmp\/\1/g
1500 ed symset-table <<EOF
1504 g/\(\/boot\/\)/s//$tmp\/reused\1/g
1505 g/\(\/usr\/src\/kernels\/\)/s//$tmp\/reused\1/g
1509 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
1510 fatal 1 "error building OFED"
1513 if build_lustre "$LINUX" "$LINUXOBJ"; then
1514 # the build worked. resolve any symlinked files (i.e. from reuse)
1515 # in RPMS/$arch to real files so that that that huge mess of
1516 # complication known as LTS can copy them yet somewhere else.
1517 # is it any wonder this whole process is so damn so? anyone ever
1518 # heard of hardlinks? it's this cool new thing that allows you save
1519 # tons of time and space by creating... well you can go read about
1520 # them if you have not heard about them yet.
1521 # can i say how much the implemenation of all of this really impedes
1524 for dir in RPMS/*; do
1526 for file in $(ls); do
1527 if [ -h $file ]; then
1534 # also, for i?86, make sure all of the RPMs are in RPMS/$TARGET_ARCH
1535 # as that's where LTS expects to find them
1536 for dir in RPMS/*; do
1537 if [ $dir = RPMS/$TARGET_ARCH ]; then
1542 if [ -n "$files" ]; then
1543 cp -al $files ../$TARGET_ARCH
1553 create_rpmbuild_dirs() {
1555 [ -d RPMS ] || mkdir RPMS
1556 for arch in $BUILD_ARCHS; do
1557 if [[ $arch = i?86 ]]; then
1558 # some stupidity in the sles11 kernel spec requires an RPMS/i386
1559 # even if the target arch is i686
1560 [ -d RPMS/i386 ] || mkdir RPMS/i386
1562 [ -d RPMS/$arch ] || mkdir RPMS/$arch
1564 [ -d BUILD ] || mkdir BUILD
1565 [ -d SOURCES ] || mkdir SOURCES
1566 [ -d SPECS ] || mkdir SPECS
1567 [ -d SRPMS ] || mkdir SRPMS
1589 [[ $list\ == *\ $item\ * ]]
1593 #########################################################################
1594 # Generate a backtrace through the call stack.
1598 #########################################################################
1602 local funcname="" sourcefile="" lineno="" n
1604 echo "Call stack: (most recent first)"
1605 for (( n = $strip ; n < ${#FUNCNAME[@]} ; ++n )) ; do
1606 funcname=${FUNCNAME[$n - 1]}
1607 sourcefile=$(basename ${BASH_SOURCE[$n]})
1608 lineno=${BASH_LINENO[$n - 1]}
1612 # Display function arguments
1613 if [[ ! -z "${BASH_ARGV[@]}" ]]; then
1614 local args newarg j p=0
1615 for (( j = ${BASH_ARGC[$n - 1]}; j > 0; j-- )); do
1616 newarg=${BASH_ARGV[$j + $p - 1]}
1617 args="${args:+${args} }'${newarg}'"
1619 let p+=${BASH_ARGC[$n - 1]}
1621 echo " ${funcname} ${args:+${args} }at ${sourcefile}:${lineno}"
1625 echo "BEGIN BACKTRACE"
1627 #echo ${BASH_LINENO[*]}
1628 #echo ${BASH_SOURCE[*]}
1629 #echo ${FUNCNAME[*]}
1630 local i=$((${#FUNCNAME[@]} - 1))
1631 while [ $i -ge 0 ]; do
1632 local lineno=${BASH_LINENO[$i]}
1636 local SOURCELINE="${BASH_SOURCE[$i + 1]}:${lineno}"
1637 # Can't figure out how to get function args from other frames...
1638 local FUNCTION="${FUNCNAME[$i]}()"
1639 echo "$SOURCELINE:$FUNCTION"
1643 echo "END BACKTRACE"
1649 seen_list=$(new_list)
1651 echo "An unexpected error has occurred at ${BASH_SOURCE[0]##*/}:$((LINENO-1)).
1652 Unfortunately the above line number in the message may or may not be correct,
1653 but details have been send to the lbuild maintainer. Attempting to continue."; (echo "Untrapped error"
1655 # have we seen this one
1656 echo "checking seen list for ${BASH_SOURCE[0]}:${BASH_LINENO[0]}"
1658 if is_list_member "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}"; then
1659 echo "seen this one already"
1661 seen_list=$(add_list "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}")
1667 ) | mail -s "Untrapped error at ${BASH_SOURCE[0]##*/}:$((LINENO-15)) on $HOSTNAME" brian@whamcloud.com >&2; set $xtrace' ERR
1670 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
1672 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,set-value:,src,stage:,tag:,target:,target-archs:,with-linux:,xen -- "$@")
1674 if [ $? != 0 ]; then
1678 eval set -- "$options"
1713 if ! KERNELTREE=$(canon_path "$2"); then
1714 fatal 1 "Could not determine the canonical location of $2"
1718 --linux | --with-linux)
1719 if ! LINUX=$(canon_path "$2"); then
1720 fatal 1 "Could not determine the canonical location of $2"
1733 if ! REUSEBUILD=$(canon_path "$2"); then
1734 fatal 1 "Could not determine the canonical location of $2"
1755 if ! KERNELRPMSBASE=$(canon_path "$2"); then
1756 fatal 1 "Could not determine the canonical location of $2"
1765 if ! LUSTRE=$(canon_filepath "$2"); then
1766 fatal 1 "Could not determine the canonical location of $2"
1809 --disable-datestamp)
1823 # there are actually some lustre configure flags that we need to
1824 # handle ourselves (but we still give them to configure)
1825 if [[ \ $@\ == *\ --disable-tests\ * ]]; then
1829 CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-liblustre --enable-liblustre-tests"
1833 usage 1 "Unrecognized option: $1"
1842 # XXX - should we _always_ get the buildid from the META file? what are the
1843 # other (i.e. non-lustre-tarball use cases of lbuild)?
1844 BUILDID=$(sed -ne '/^BUILDID =/s/.*= *//p' lustre/META)
1848 if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
1850 unpack_ofed || fatal 1 "Error unpacking OFED tarball"
1853 # make sure the RPM build environment is set up
1854 create_rpmbuild_dirs
1856 # if an unpacked kernel source tree was given on the command line
1857 # just build lustre with it (nothing distro kernel specific here)
1858 if [ -n "$LINUX" ]; then
1859 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
1860 fatal 1 "error building OFED"
1861 build_lustre "$LINUX" "$LINUXOBJ"
1863 if [ -f "${0%/*}/lbuild-$DISTRO" ]; then
1864 source ${0%/*}/lbuild-$DISTRO
1866 build_with_srpm || fatal 1 "Failed to build_with_srpm"
1868 EXTRA_VERSION_DELIMITER=${EXTRA_VERSION_DELIMITER:-"-"}
1869 source ${0%/*}/lbuild.old_school
1871 old_school_download_kernel
1875 patchless_build_sequence && build_success=true
1877 [ "$DISTRO" = "sles9" ] && build_sequence_rpm_reuse && build_success=true
1878 if ! $build_success; then
1879 build_sequence_reuse && build_success=true
1880 if ! $build_success; then
1881 build_sequence && build_success=true
1882 if $build_success; then
1883 store_for_reuse || echo "Cannot store for future reuse"
1888 ( $build_success ) || fatal 1 "Cannot build lustre"