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
21 # our children should die when we do
22 push_exit_trap "kill -INT -$$ || true" kill_children
26 # CVSROOT is inherited from the environment
31 # XXX - some recent hacking has pretty much neutered this option.
32 # search through this file (and lbuild.old_school -- but that will
33 # be going away soon) for "-bb" and see how many places
34 # simply don't account for this option
40 TARGET_ARCH=$(uname -m)
42 TARGET_ARCHS_ALL=$TARGET_ARCH
43 [ "$TARGET_ARCH" = "i686" ] && TARGET_ARCHS_ALL="i686 i586 i386"
49 TMPDIR=${TMPDIR:-"/var/tmp"}
51 # this is a dir to try reuse old kernel RPMs in (although, it seems to be
52 # unused in any real manner
55 # should cached products be used or force rebuilding?
57 # what does this do exactly? does it imply no kernel build?
60 SKIPLDISKFSRPM="v1_4_* b1_4"
61 SMPTYPES="smp bigsmp default ''"
67 # default to not adding -lustre- into the kernel RPM package names
68 KERNEL_LUSTRE_NAMING=false
85 # not in the target file any more
97 # Readlink is not present on some older distributions: emulate it.
101 if [ -L "$path" ]; then
102 ll="$(LC_ALL=C ls -l "$path" 2> /dev/null)" &&
117 [ -n "$msg" ] && echo -e "\n${0##*/}: $msg" >&3
131 Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
134 Specifies the CVS Root to use when pulling files from CVS. The
135 environment variable \$CVSROOT is used if this option is not
138 --external-patches=EXTERNAL_PATCHES
139 Directory similar to lustre/lustre/kernel_patches/ that lbuild should
140 look for seres and config files in before looking in the lustre
143 --extraversion=EXTRAVERSION
144 Text to use for the rpm release and kernel extraversion.
146 --timestamp=TIMESTAMP
147 Date of building lustre in format YYYYMMDDhhmmss
150 Try to reuse old kernel RPMs from DIR
153 Try to reuse old kernel builds from DIR
156 Path to distro kernel RPM collection
162 Do not build RPMs (compile only mode)
165 Build lustre client only
168 Which distro using. Autodetect by default
170 --kerneldir=KERNELDIR
171 Directory containing Linux source tarballs referenced by target
174 --kerneltree=KERNELTREE
175 Directory containing dirs with Linux source tarballs referenced by target
176 files. Dir names in format kernel version ('2.6.9', etc.)
178 --linux=LINUX --with-linux=LINUX
179 Directory of Linux kernel sources. When this option is used, only
180 Lustre modules and userspace are built.
183 Path to an existing lustre source tarball to use instead of
187 Do not try to download a kernel from downloads.lustre.org
190 Do not build a .src.rpm, a full kernel patch, or a patched kernel
194 Do ldiskfs RPM. Now true by default
200 Specifies that the files generated do not include timestamps, and
201 that this is an official release.
204 Build a .src.rpm, a full kernel patch, and a patched kernel tarball.
207 Directory used to stage packages for release. RPMs will be placed
208 more or less in DIR/<target>-<arch>, and the tarball will be
212 A CVS branch/tag name to build from when pulling from CVS.
215 The name of the target to build. The available targets are listed
218 --target-archs=TARGET_ARCHS
219 A (space delimited) list of architectures to build. By default,
220 all of the archs supported by the TARGET will be built, in
221 addition to a .src.rpm. This option can limit those, for machines
222 that can only build certain archs or if you only want a certain
223 arch built (for testing, or a one-off kernel).
225 Also note that by using a non-"base" arch (eg, i386) only kernels
226 will be built - there will be no lustre-lite-utils package.
229 Prevents the datestamp flag (-D) from being passed to cvs for
230 checkouts. This is a workaround for a problem encountered when
231 using lbuild with tinderbox.
234 Builds a Xen domX kernel.
243 # canonicalize a relative path
247 if [ ! -d "$PATH" ]; then
251 pushd "$PATH" >/dev/null || return 1
261 if [ "$LUSTRE" ]; then
262 [ -r "$LUSTRE" ] || \
263 usage 1 "Could not find Lustre source tarball '$LUSTRE'."
266 usage 1 "Either specify a CVS Root with -d, or a Lustre source tarball with --lustre."
268 usage 1 "A branch/tag name must be specified with --tag when not building from a tarball."
271 if [ -z "$LINUX" ]; then
272 [ "$KERNELDIR" -o "$KERNELTREE" ] || \
273 usage 1 "A kernel directory must be specified with --kerneldir or --kerneltree."
275 [ -d "$KERNELDIR" -o -d "$KERNELTREE" ] || \
276 usage 1 "$KERNELDIR and $KERNELTREE are not a directory."
280 usage 1 "When building a snapshot, a tag name must be used."
283 [ "$TARGET" ] || usage 1 "A target must be specified with --target."
284 # TARGET_FILE="$TOPDIR/lustre/kernel_patches/targets/$TARGET.target"
285 # [ -r "$TARGET_FILE" ] || \
286 # usage 1 "Target '$TARGET' was not found."
291 CANONICAL_TARGET="rhel5"
294 CANONICAL_TARGET="rhel-2.6"
297 CANONICAL_TARGET="sles-2.6"
300 CANONICAL_TARGET="sles10-2.6"
303 CANONICAL_TARGET="sles11"
306 CANONICAL_TARGET="oel5"
309 CANONICAL_TARGET="hp-pnnl-2.4"
317 CANONICAL_TARGET="$TARGET"
321 local timestampnodig=$(echo $TIMESTAMP | sed -e s/[0-9]*//g)
322 [ "$timestampnodig" = "" ] || TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M%S")
323 local timestamplength="${#TIMESTAMP}"
324 if [ $timestamplength -eq 12 ]; then
325 TIMESTAMP="${TIMESTAMP}00"
326 elif [ $timestamplength -ne 14 ]; then
327 TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M%S")
330 RPMBUILD=$(which rpmbuild 2>/dev/null | head -1)
331 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
332 RPMBUILD=$(which rpm 2>/dev/null | head -1)
333 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
334 usage 1 "Could not find binary for making rpms (tried rpmbuild and rpm)."
338 if [ -n "$CCACHE" ]; then
339 which "$DISTCC" &>/dev/null && export DISTCC RPM_BUILD_NCPUS
341 if which "$CCACHE" &>/dev/null; then
342 local ccache=$(which "$CCACHE")
343 local bindir="$TOPDIR/bin"
345 if [ ! -d $bindir ]; then
346 mkdir -p $bindir || fatal 1 "error trying to create $bindir"
348 rm ${bindir}/* > /dev/null 2>&1 || true
350 ln -s "$ccache" ${bindir}/ccache
351 ln -s "$ccache" ${bindir}/cc
352 ln -s "$ccache" ${bindir}/$CC
353 export PATH=$bindir:$PATH
354 export CCACHE && export CC="ccache $CC"
355 # zero the cache so we can see how effective we are being with it
359 # get some ccache stats when we are done
360 push_exit_trap '[ -n "$CCACHE" ] && ccache -s' "ccache_summary"
361 # should remove the ccache trap if lbuild is interrupted
362 trap 'echo "Received an INT TERM or HUP signal, terminating."; delete_exit_trap "ccache_summary"; exit 1' INT TERM HUP
366 [ -z "$DISTRO" ] && DISTRO=$(autodetect_distro)
372 # autodetect used Distro
373 autodetect_distro() {
378 if [ -f /etc/SuSE-release ]; then
380 version=$(grep ^VERSION /etc/SuSE-release)
381 version=${version#*= }
382 elif [ -f /etc/redhat-release ]; then
383 name=$(head -1 /etc/redhat-release)
384 version=$(echo "$distroname" |
385 sed -e 's/^[^0-9.]*//g' | sed -e 's/[ \.].*//')
387 if [ -z "$name" -o -z "$version" ]; then
388 fatal 1 "I don't know how to determine distro type/version.\nEither update autodetect_distro() or use the --distro argument"
391 echo ${name}${version}
398 echo $(echo "$*" | xargs -n 1 | sort -u)
405 local force="${3:-false}"
407 if $force || [ ! -r "$KERNELDIR/$srpm" ] ||
408 [ ! -s "$KERNELDIR/$srpm" ]; then
410 local location="http://downloads.lustre.org/public/kernels/$target/old"
411 echo "Downloading $location/$srpm..."
412 if ! wget -nv "$location/$srpm" -O "$KERNELDIR/$srpm" 2>&1 ||
413 [ ! -s "$KERNELDIR/$srpm" ]; then
414 rm -f $KERNELDIR/$srpm
415 fatal 1 "Could not download target $target's kernel SRPM $srpm from $location."
418 fatal 1 "$srpm not found in directory $KERNELDIR."
429 local file=${from##*/}
435 local semaphore="$to-downloading"
438 if [ ! -f $semaphore ]; then
442 # make sure the download has not been aborted
443 local now=$(date +%s)
444 local file_mtime=$(stat -c %Y "$to")
445 local staleness=$((now - file_mtime))
446 # let's assume an active download will write at least once a minute
447 if [ $staleness -gt 60 ]; then
455 # if the semaphore file exists, the file is either still downloading
456 # or a download was aborted and we cannot trust the target file
457 if [ -f $semaphore ]; then
461 if ! is_downloading && [ -r "$to" ] && [ -s "$to" ]; then
468 if $force || ! is_downloaded; then
469 if is_downloading; then
470 echo "Somebody else is downloading $from..."
471 while is_downloading; do
472 echo "Waiting for $to to finish downloading"
475 if is_downloaded; then
478 echo "The download we were waiting for seems to have been aborted"
484 echo "Downloading $from..."
485 # flag others so they don't try to download also
486 push_exit_trap "rm -f $to $semaphore" "download"
488 if ! wget -nv "$from" -O "$to" || [ ! -s "$to" ]; then
489 # the trap will remove the files via the fatal below
490 fatal 1 "Could not download ${to##*/} from ${from%%/*}/."
493 delete_exit_trap "download"
495 fatal 1 "${to##*/} not found in directory ${to%/*}."
504 local force="${1:-false}"
506 local location="http://downloads.lustre.org/public/OFED/"
509 if [[ $OFED_VERSION = daily-* ]]; then
510 OFED_VERSION=${OFED_VERSION/daily-/}
511 Mmv=${OFED_VERSION%%-*}
512 daily=${OFED_VERSION##$Mmv-}
513 location="http://www.openfabrics.org/downloads/OFED/ofed-${Mmv}-daily/"
514 # find the filename for the version for the date specified
515 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)
516 if [ -z "$OFED_VERSION" ]; then
517 fatal 1 "Could not determine the filename of the OFED snapshot for ${daily}"
521 if [ -z "$OFED_VERSION" -o "$OFED_VERSION" = "inkernel" ]; then
525 local file="OFED-${OFED_VERSION}.tgz"
526 download_file "$location/$file" "$KERNELTREE" "$force"
531 local force="${1:-false}"
533 local location="http://downloads.lustre.org/public/RDAC/"
535 if [ -z "$RDAC_VERSION" -o "$RDAC_VERSION" = "inkernel" ]; then
539 local file="rdac-LINUX-${RDAC_VERSION}-source.tar.gz"
540 download_file "$location/$file" "$KERNELTREE" "$force"
544 download_mptlinux() {
545 local force="${1:-false}"
547 local location="http://downloads.lustre.org/public/MPTLINUX/"
549 if [ -z "$MPTLINUX_VERSION" -o "$MPTLINUX_VERSION" = "inkernel" ]; then
553 file="MPTLINUX_RHEL5_SLES10_PH15-${MPTLINUX_VERSION}.zip"
554 download_file "$location/$file" "$KERNELTREE" "$force"
560 EXTRA_VERSION_save="$EXTRA_VERSION"
561 for patchesdir in "$EXTERNAL_PATCHES" \
562 "$TOPDIR/lustre/lustre/kernel_patches"; do
563 TARGET_FILE="$patchesdir/targets/$TARGET.target"
564 [ -r "$TARGET_FILE" ] && break
566 [ -r "$TARGET_FILE" ] || fatal 1 "Target $TARGET was not found."
568 echo "Loading target config file $TARGET.target..."
570 # if the caller specified an OFED_VERSION it should override whatever
571 # the target file specifies
572 local env_OFED_VERSION="$OFED_VERSION"
576 if [ -n "$env_OFED_VERSION" ]; then
577 OFED_VERSION="$env_OFED_VERSION"
580 # doesn't make any sense to build OFED for xen domX's
585 # XXX - set_rpm_smp_type is an ugly undeterministic hack. it needs to
586 # go away and the target just specify the $RPMSMPTYPE
587 [ -z "$RPMSMPTYPE" ] && set_rpm_smp_type
589 # CC might have been overwriten in TARGET_FILE
590 if [[ $CC != ccache\ * ]] && which "$CCACHE" &>/dev/null; then
591 export CCACHE && export CC="ccache $CC"
594 if [ ! "$KERNELTREE" = "" ] && [ -d "$KERNELTREE" ]; then
595 KERNELDIR="$KERNELTREE/${lnxmaj}"
596 [ -d "$KERNELDIR" ] || mkdir "$KERNELDIR"
599 # verify the series is available
600 if [ "$SERIES" ]; then
601 for series in $SERIES; do
602 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches"; do
603 [ -r "$patchesdir/series/$series" ] && continue 2
605 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."
609 # set the location of the .config file
615 if [ -f $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET-$TARGET_ARCH.config ]; then
616 CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET$XENPOSTFIX-$TARGET_ARCH${RPMSMPTYPE:+-}${RPMSMPTYPE}.config"
619 local lnxrelnew=${lnxrel//-/_}
621 # remember the EXTRA_VERSION before we diddle it here
622 # XXX - we really should not diddle with any values read in from the
623 # target file. if we want to modify a value, we should create
625 PRISTINE_EXTRA_VERSION=$EXTRA_VERSION
627 if ! $PATCHLESS && [ ! -f "$CONFIG_FILE" ]; then
628 fatal 1 "Config file for target $TARGET missing from $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/."
631 if [ "$EXTRA_VERSION_save" ]; then
632 EXTRA_VERSION="$EXTRA_VERSION_save"
633 elif ! $RELEASE; then
634 # if there is no patch series, then this is not a lustre specific
635 # kernel. don't make it look like one
636 if [ -n "$SERIES" ]; then
637 #remove the @VERSION@ (lustre version)
638 # EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
639 # EXTRA_VERSION="${EXTRA_VERSION}-${TAG}.${TIMESTAMP}"
640 ! ( $PATCHLESS ) && EXTRA_VERSION="${EXTRA_VERSION}.${TIMESTAMP}"
643 # EXTRA_VERSION=${EXTRA_VERSION//-/_}
645 ALL_ARCHS="$BASE_ARCHS $BIGMEM_ARCHS $BOOT_ARCHS $JENSEN_ARCHS $SMP_ARCHS $BIGSMP_ARCHS $PSERIES64_ARCHS $UP_ARCHS"
648 for arch in $(uniqify "$ALL_ARCHS"); do
649 if [ -z "$TARGET_ARCHS" ] ||
650 [[ \ $TARGET_ARCHS\ = *\ $arch\ * ]]; then
651 BUILD_ARCHS="$BUILD_ARCHS $arch"
654 [ "$BUILD_ARCHS" ] || usage 1 "No available target archs to build."
655 echo "Building for: $BUILD_ARCHS"
663 fatal 1 "tarflags(): File name argument missing."
675 fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
684 echo "Untarring ${file##*/}..."
685 tar $(tarflags "$file") "$file"
691 if ! untar "$KERNELTREE/OFED-${OFED_VERSION}.tgz"; then
694 [ -d OFED ] || ln -sf OFED-[0-9].[0-9]* OFED
700 if ! untar "$KERNELTREE/rdac-LINUX-${RDAC_VERSION}-source.tar.gz"; then
703 [ -d rdac-LINUX ] || ln -sf rdac-LINUX-[0-9][0-9].* rdac-LINUX
709 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
712 mv srpms-2/mptlinux-4.16.00.00-2.src.rpm .
718 if [ -z "$LUSTRE" ]; then
721 if [ -n "$USE_DATESTAMP" ]; then
722 DATESTAMP="-D '$DATE'"
725 local DIRNAME="lustre-$TAG-$TIMESTAMP"
727 cvs -d "$CVSROOT" -qz3 co $DATESTAMP -d "$DIRNAME" lustre || \
728 fatal 1 "There was an error checking out toplevel Lustre from CVS."
729 pushd "$DIRNAME" > /dev/null
730 ./lustrecvs "$TAG" || \
731 fatal 1 "There was an error checking out Lustre/Portals/Build from CVS."
732 echo "Creating lustre tarball..."
733 sh autogen.sh || fatal 1 "There was an error running autogen.sh."
734 ./configure --disable-{modules,utils,liblustre,tests,doc} || \
735 fatal 1 "There was an error running ./configure to create makefiles."
736 make dist || fatal 1 "There was an error running 'make dist'."
737 LUSTRE=$PWD/lustre-*.tar.gz
741 untar "$LUSTRE" || fatal 1 "Error unpacking Lustre tarball"
742 [ -d lustre ] || ln -sf lustre-[0-9].[0-9]* lustre
748 local do_patch=${1:-true}
750 FULL_PATCH="$PWD/lustre-kernel-${TARGET}-${EXTRA_VERSION}.patch"
751 [ -f "$FULL_PATCH" ] && rm -f "$FULL_PATCH"
752 $do_patch && pushd linux >/dev/null
753 for series in $SERIES; do
754 echo -n "Applying series $series:"
755 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches"; do
756 [ -r "$patchesdir/series/$series" ] || continue
757 SERIES_FILE="$patchesdir/series/$series"
758 for patch in $(<"$SERIES_FILE"); do
760 PATCH_FILE="$patchesdir/patches/$patch"
761 [ -r "$PATCH_FILE" ] || \
762 fatal 1 "Patch $patch does not exist in Lustre tree."
763 cat "$PATCH_FILE" >> "$FULL_PATCH" || {
765 fatal 1 "Error adding patch $patch to full patch."
768 patch -s -p1 < "$PATCH_FILE" 2>&1 || {
770 fatal 1 "Error applying patch $patch."
778 $do_patch && popd >/dev/null
779 echo "Full patch has been saved in ${FULL_PATCH##*/}."
789 pushd lustre >/dev/null
791 echo "Building Lustre RPMs for: $BUILD_ARCHS..."
793 for arch in $BUILD_ARCHS; do
794 targets="--target $arch $targets"
797 local confoptions="--with-linux=${linux}"
799 confoptions="--with-linux=${linux} --disable-server"
801 if [ "$linuxobj" != "" ]; then
802 confoptions="$confoptions --with-linux-obj=${linuxobj}"
805 ./configure $confoptions ${CONFIGURE_FLAGS} 2>&1
806 if [ "$?" != "0" ]; then
807 local saved_config="../config.log.$(date +%s)"
808 cp config.log $saved_config
809 chmod a+r $saved_config
810 echo "Saved config.log is at $saved_config"
814 echo "config.log contents:"
822 # hack. Somebody move build/lustre.spec to lustre.spec for b1_6
824 [ -f lustre.spec ] && lustre_spec=lustre.spec
825 [ -f build/lustre.spec ] && lustre_spec=build/lustre.spec
827 [ -f "$lustre_spec" ] && sed \
828 -e "s^Release: .*$^Release: $LUSTRE_EXTRA_VERSION^" \
832 local rpmbuildopt='-bb'
835 echo NORPM mode. Only compiling.
838 # convert the $PATCHLESS boolean to an empty/no-empty boolean
839 # as silly as this seems, it makes the syntax of the rpmbuild command
840 # simpler and not need an eval to deal with the quotes in the quotes
841 local is_patchless=""
845 $RPMBUILD $targets $rpmbuildopt ../lustre.spec \
846 ${is_patchless:+--define "lustre_name lustre-client"} \
847 --define "_tmppath $TMPDIR" \
848 --define "_topdir $TOPDIR" 2>&1 || \
849 fatal 1 "Error building rpms for $BUILD_ARCHS."
852 ( $(skeep_ldiskfs_rpm $TAG) ) && return
854 pushd lustre/ldiskfs || return 255
856 if [ "$?" != "0" ]; then
860 cp lustre-ldiskfs*.tar.gz $TOPDIR/SOURCES
864 local ldiskfs_spec=lustre-ldiskfs.spec
865 [ -f "$ldiskfs_spec" ] && sed \
866 -e "s^Release: .*$^Release: $LUSTRE_EXTRA_VERSION^" \
868 > ../lustre-ldiskfs.spec
870 if ! $RPMBUILD $targets $rpmbuildopt ../lustre-ldiskfs.spec \
871 --define "_tmppath /var/tmp" \
872 --define "_topdir $TOPDIR" 2>&1; then
878 if ! $RPMBUILD -bs ../lustre-ldiskfs.spec \
879 --define "_tmppath /var/tmp" \
880 --define "_topdir $TOPDIR" 2>&1; then
891 [ "$STAGEDIR" ] || return 0
893 for arch in $BUILD_ARCHS; do
894 rpmdir="${STAGEDIR}/${CANONICAL_TARGET}-${arch}"
895 echo "${0##*/}: Copying RPMs into ${rpmdir}"
897 cp -v RPMS/${arch}/*.rpm "${rpmdir}"
898 if [ -d RPMS/noarch ]; then
899 cp -v RPMS/noarch/*.rpm "${rpmdir}"
903 cp -v "$LUSTRE" "$STAGEDIR"
907 #check if we need to build separate ldiskfs RPM
908 skeep_ldiskfs_rpm() {
913 if ! $LDISKFSRPM; then
915 elif $PATCHLESS; then
918 for skiptag in $SKIPLDISKFSRPM; do
919 [[ $tag == $skiptag ]] && skip=true && break
923 pushd $TOPDIR/BUILD/lustre-[1-9]* >/dev/null
924 grep -q '^SERVER_TRUE[ \t]=[ \t]#$' autoMakefile && skip=true
931 #generate LUSTRE_EXTRA_VERSION from EXTRA_VERSION
932 gen_lustre_version() {
934 LUSTRE_EXTRA_VERSION="${lnxmaj}-${EXTRA_VERSION}${FLAVOR_DELIMITER}${RPMSMPTYPE}"
935 LUSTRE_EXTRA_VERSION=${LUSTRE_EXTRA_VERSION//-/_}
941 local infact_arch="${TARGET_ARCH}"
944 [ "$infact_arch" == "i586" ] && infact_arch="i686"
947 for smp_type in $SMP_ARCHS; do
948 [ $infact_arch == $smp_type ] && RPMSMPTYPE=smp && break
951 for smp_type in $BIGSMP_ARCHS; do
952 [ $infact_arch == $smp_type ] && RPMSMPTYPE=bigsmp && break
955 for smp_type in $DEFAULT_ARCHS; do
956 [ $infact_arch == $smp_type ] && RPMSMPTYPE=default && break
961 # This function takes a linux source pool and digs out the linux release
963 find_linux_release() {
966 local LINUXRELEASEHEADER=$SRCDIR/include/linux/version.h
967 if [ -s $SRCDIR/include/linux/utsrelease.h ]; then
968 LINUXRELEASEHEADER=$SRCDIR/include/linux/utsrelease.h
971 sed -ne 's/#define UTS_RELEASE "\(.*\)"$/\1/p' $LINUXRELEASEHEADER
975 # XXX this needs to be re-written as a wrapper around find_rpm
976 # or just gotten rid of. :-)
980 local pathtorpms="${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
981 [ -d $pathtorpms ] || return 255
983 local kernelbinaryrpm rpmfile
984 local wanted_kernel="${lnxmaj}${lnxmin}-${lnxrel}"
987 for arch in $TARGET_ARCHS_ALL; do
988 local found_rpm="" rpm
989 for rpm in ${pathtorpms}/${arch}/*.rpm; do
990 if rpm -q --provides -p "$rpm" 2>&3 | grep -q "kernel${prefix} = $wanted_kernel" 2>&3; then
997 [ -f "$found_rpm" ] && break
1005 # unpack kernel(/source/devel) RPM
1007 # This function and it's setting of $LINUX and $LINUXOBJ is a total hack that
1008 # needs to completely refactored. It completely ingores that $BUILD_ARCHS may
1009 # contain a list of arches for which rpmbuild commands (including the one for
1011 unpack_linux_devel_rpm() {
1012 local kernelrpm="${1}"
1014 [ -f "$kernelrpm" ] || return 255
1015 [ -d $TOPDIR/reused ] || mkdir $TOPDIR/reused || return 255
1017 pushd $TOPDIR/reused &>/dev/null || return 255
1019 if ! rpm2cpio < "$kernelrpm" | cpio -id > /dev/null 2>&1; then
1023 # call a distro specific hook, if available
1024 if type -p unpack_linux_devel_rpm-$DISTRO; then
1025 unpack_linux_devel_rpm-$DISTRO "$kernelrpm"
1030 find_linux_devel_paths $TOPDIR/reused
1036 # XXX - this rhel/sles goop needs abstracting out into the
1037 # lbuild-{rhel5,sles10} method files
1038 find_linux_devel_paths() {
1044 # RHEL-style and SLES-style rpms
1045 # XXX - until bug 19336 cleans this up, we need to extricate the
1046 # ${lnxmin}- from the $lnxrel
1047 local paths="kernels/${lnxmaj}${lnxmin}${delimiter}${lnxrel}-${TARGET_ARCH} linux-${lnxmaj}${lnxmin}${delimiter}${lnxrel##${lnxmin#.}-}"
1050 for path in $paths; do
1053 if [ -d "$src/$path/" ]; then
1054 LINUX="$(pwd)/$src/$path"
1056 # SLES has a separate -obj tree
1057 if [ -d "$src/${path}-obj" ]; then
1058 local src="$src/${path}-obj"
1059 local objects="$TARGET_ARCH/$RPMSMPTYPE"
1061 # Novell, are you *TRYING* to make life hard for me?
1062 if [ -d "$src/powerpc" ]; then
1063 objects="powerpc/$TARGET_ARCH"
1064 elif [ $TARGET_ARCH == 'i686' ]; then
1065 objects="i386/$RPMSMPTYPE"
1068 LINUXOBJ="$(pwd)/$src/$objects"
1071 if [ -z "$LINUX" ]; then
1074 # dig out the release version
1075 LINUXRELEASE=$(find_linux_release ${LINUXOBJ:-$LINUX})
1076 if [ -z "$LINUXRELEASE" ]; then
1077 echo "Failed to find linux release in ${LINUXOBJ:-$LINUX}"
1088 # build kernel-ib{,-devel}
1090 # ofed 1.3 had a bug in the rpm spec
1091 if [ "$OFED_VERSION" = "1.3" ]; then
1095 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"
1096 local OFED_HARDWARE="--with-mthca-mod --with-mlx4-mod --with-mlx4_en-mod --with-cxgb3-mod --with-nes-mod"
1097 # some I/B drivers are architecture dependent and kernel-ib's configure
1098 # does not figure it out for us ~sigh~
1099 case "$TARGET_ARCH" in
1101 OFED_HARDWARE="$OFED_HARDWARE --with-ehca-mod"
1104 # we're no longer shipping the OFED iSCSI
1105 #OFED_ISCSI="--with-srp-mod --with-srp-target-mod"
1106 ## ISER module has no backport support as of OFED 1.5 (i.e. only builds on
1107 ##kernels >= 2.6.30)
1108 #if [[ $OFED_VERSION = 1.[0-4]* ]]; then
1109 # OFED_ISCSI="$OFED_ISCSI --with-iser-mod"
1112 # assume we are just rebuilding the SRPM
1113 local BUILD_TYPE=${BUILD_TYPE:-"--rebuild"}
1114 local SOURCE="${TOPDIR}/OFED/SRPMS/ofa_kernel-*.src.rpm"
1116 # but switch to building from the SPEC if we need to apply patches
1117 if ls ${TOPDIR}/lustre/build/patches/ofed/* >/dev/null; then
1119 rpm --define "_topdir ${TOPDIR}" -ivh $SOURCE
1120 SOURCE="${TOPDIR}/SPECS/ofa_kernel.spec"
1121 local file ed_fragment1 ed_fragment2 n=1
1122 for file in ${TOPDIR}/lustre/build/patches/ofed/*; do
1123 ed_fragment1="$ed_fragment1
1124 Patch$n: ${file%%*/}"
1125 ed_fragment2="$ed_fragment2
1127 cp $file ${TOPDIR}/SOURCES
1142 local linuxrelease=$(find_linux_release "$linux")
1143 if ! $RPMBUILD $BUILD_TYPE --define 'build_kernel_ib 1' --define 'build_kernel_ib_devel 1' \
1144 --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
1145 --define "KVERSION ${linuxrelease}" \
1146 --define "$K_SRC ${linux}" \
1147 --define "LIB_MOD_DIR /lib/modules/${linuxrelease}/updates" \
1148 ${OFA_KERNEL_RELEASE:+--define "_release $OFA_KERNEL_RELEASE"} \
1149 --define "configure_options --without-quilt $OFED_CORE $OFED_HARDWARE $OFED_ISCSI" \
1150 ${SOURCE} 2>&1; then
1151 fatal 1 "Error building kernel-ib"
1160 local signature="$4"
1161 local use_links="$5"
1168 location="$location"/"$signature"/"$module"
1169 mkdir -p "$location"
1170 # the cleanup script removes any directory that doesn't have a
1171 # .lastused, so let's try to prevent that as soon as we can
1172 # this solution still slightly racy with the cleanup script
1173 # but the race is a lot tighter now
1174 touch -t 197001010000 "$location/.lastused"
1175 ## use eval/echo here to make sure shell expansions are performed
1176 #if ! cp -a${linkflag} $(eval echo $articles) "$location"; then
1178 for article in $(eval echo $articles); do
1179 if ! cp -a${linkflag} "$article" "$location"; then
1180 error "Failed to copy \"$article\" to \"$location\" in store_for_reuse()"
1181 # rename the cache location so that it's not cached
1182 # product, but is around for analysis
1183 mv "$location"{,-bad-$(date +%s)} ||
1184 error "failed to clean up a failed cache attempt" \
1185 "in \"$location\" -- manual cleanup will be" \
1191 # flag the cache as complete (i.e. in case lbuild was previously
1192 # interrupted while caching)
1193 touch "$location/.lastused"
1202 local use_links="${3:-false}"
1203 local signature="$4"
1205 if [ -n "$REUSEBUILD" ] && [ -d "$REUSEBUILD/$signature/$module" ]; then
1206 if [ ! -f "$REUSEBUILD/$signature/$module/.lastused" ]; then
1207 # the .lastused flag is populated at the end of the caching to
1208 # signal that the caching was completed. if that flag is not
1209 # there, then the cache is invalid (and should be removed in fact)
1210 mv "$REUSEBUILD/$signature/$module"{,-bad-$(date +%s)} ||
1211 fatal 1 "failed to clean up a bad cache in location $REUSEBUILD/$signature/$module\" -- manual cleanup will be necessary"
1215 # so that we know how stale this entry is
1216 touch $REUSEBUILD/$signature/$module/.lastused
1219 if ls $REUSEBUILD/$signature/$module/* >/dev/null 2>&1; then
1220 cp -al $REUSEBUILD/$signature/$module/* $dest/
1223 # copying is pretty heavy
1224 # cp -a $REUSEBUILD/$signature/$module/* $dest/
1225 # do some creative symlinking instead
1227 for dir in BUILD SRPMS SPECS; do
1228 if ls $REUSEBUILD/$signature/$module/$dir/* >/dev/null 2>&1; then
1229 ln -s $REUSEBUILD/$signature/$module/$dir/* $dest/$dir
1232 # sources have to be copied by file because we need SOURCES to
1233 # be a dir we can write into
1234 # could overrun ls's arg list here
1235 #ls $REUSEBUILD/$signature/$module/SOURCES/* |
1236 find $REUSEBUILD/$signature/$module/SOURCES/ -type f |
1237 xargs ln -t $dest/SOURCES -s
1239 # same for RPMS/* dirs
1240 # could overrun ls's arg list here
1241 #ls $REUSEBUILD/$signature/$module/RPMS/$TARGET_ARCH/* |
1243 for dir in $REUSEBUILD/$signature/$module/RPMS/*; do
1244 mkdir -p $dest/RPMS/${dir##*/}
1246 xargs ln -t $dest/RPMS/${dir##*/} -s
1259 if [[ $arch = i[3456]86 ]]; then
1268 # in a given directory, find the first rpm matching given requirements
1272 local match_type="$2"
1275 pushd "$dir" > /dev/null || \
1276 fatal 1 "Unable to chdir to directory \"$dir\" in find_rpm()"
1279 for file in $(ls *.rpm); do
1280 if [ ! -f "$file" ]; then
1283 case "$match_type" in
1285 # match is any valid ERE (i.e. given to egrep) match
1286 if rpm -q --provides -p "$file" 2>&3 | egrep -q "$match"; then
1294 fatal 1 "Unknown match type \"$match_type\" given to find_rpm()"
1303 build_kernel_with_srpm() {
1306 if [ -z "$outfd" ] || [ $outfd = 1 ]; then
1307 fatal 1 "You must supply a file descriptor to ${FUNCNAME[0]} and it cannot be 1"
1310 # need to generate the patch for this target
1311 do_patch_linux false >&${outfd} # sets global $FULL_PATCH (yeah, yuck)
1313 # get an md5sum of the kernel patch + config for reuse check
1314 # XXX really, there needs to be a signature and a CONFIG_FILE per arch
1318 local release_str="RELEASE=$RELEASE\n"
1321 if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
1322 local REUSE_SIGNATURE=$({ echo -en $release_str;
1324 cat $CONFIG_FILE $TARGET_FILE $FULL_PATCH; } |
1325 md5sum | cut -d" " -f1)
1326 # see if we can link to the reuse pool
1327 # XXX - hrm. i'm not convinced this doesn't belong in the reuse
1329 local CAN_LINK_FOR_REUSE=false
1330 touch $REUSEBUILD/$$
1331 if cp -al $REUSEBUILD/$$ $TOPDIR/ 2>/dev/null; then
1332 CAN_LINK_FOR_REUSE=true
1337 # the extra version string to use for the kernel (which might be a reused
1339 local kernel_extra_version=""
1340 if ! $USE_BUILD_CACHE || ! reuse kernel "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1341 "$REUSE_SIGNATURE"; then
1342 # nothing cached, build from scratch
1343 if [ ! -r "$KERNELDIR/$KERNEL_SRPM" ]; then
1344 echo "Downloading kernel SRPM"
1345 download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM" >&${outfd}
1348 if ! rpm -ivh $KERNELDIR/$KERNEL_SRPM \
1349 --define "_topdir $TOPDIR" >&${outfd} 2>&1; then
1350 # should we clean this up or leave it for analysis?
1352 fatal 1 "Error installing kernel SRPM."
1355 # put the Lustre kernel patch into the RPM build tree
1356 cp $FULL_PATCH $TOPDIR/SOURCES/linux-${lnxmaj}-lustre.patch
1357 prepare_and_build_srpm >&${outfd} ||
1358 fatal 1 "failed to prepare_and_build_srpm"
1360 if [ -z "$REUSE_SIGNATURE" ]; then
1361 echo "No reuse signature was caculated so not storing the built kernel" >&${outfd}
1363 # store the resulting kernel RPM build tree for future use
1364 echo "Storing the built kernel for future reuse" >&${outfd}
1365 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
1366 "kernel" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1367 "$CAN_LINK_FOR_REUSE"; then
1368 error "Failed to store kernel RPMS for reuse"
1375 # figure out the EXTRA_VERSION of the kernel we built or are re-using
1377 if ! KERNEL_RPM=$(find_rpm "$TOPDIR/RPMS/$TARGET_ARCH/" provides "^kernel ="); then
1378 fatal 1 "Failed to find a kernel RPM in $TOPDIR/RPMS/$TARGET_ARCH/"
1380 kernel_extra_version=$(rpm -q --queryformat "%{RELEASE}" -p $TOPDIR/RPMS/$TARGET_ARCH/$KERNEL_RPM)
1382 # should now have the following RPMs
1383 # $TOPDIR/RPMS/$arch/kernel-lustre-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1384 # $TOPDIR/RPMS/$arch/kernel-lustre-devel-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1385 # $TOPDIR/RPMS/$arch/kernel-lustre-headers-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1386 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-common-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1387 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1389 echo $kernel_extra_version
1398 if [ -z "$version" -o "$version" = "inkernel" ]; then
1403 for arch in $BUILD_ARCHS; do
1404 targets="--target $arch $targets"
1407 local rpmbuildopt='-bb'
1410 echo NORPM mode. Only compiling.
1413 # if only we could just rebuild the src.rpm. but the included spec
1414 # is a real pig's breakfast. just check out the patch we need to
1415 # apply to it to make it useful.
1416 #$RPMBUILD --rebuild \
1417 # --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
1418 # ${TOPDIR}/mptlinux-*.src.rpm
1419 rpm -ivh --define "_topdir ${TOPDIR}" ${TOPDIR}/mptlinux-*.src.rpm
1421 # now the big honkin' patch to the spec file
1422 pushd ${TOPDIR}/SPECS
1423 # to regen this patch use:
1424 # !!cd ~/rpm/SPECS/ && diff -u mptlinux.spec{.dist,}
1425 patch -p0 < ${TOPDIR}/lustre/build/mptlinux.spec.patch || fatal 1 "failed to patch mptlinux.spec"
1429 for arch in $BUILD_ARCHS; do
1430 targets="--target $arch $targets"
1433 local rpmbuildopt='-bb'
1436 echo NORPM mode. Only compiling.
1439 if ! $RPMBUILD $targets $rpmbuildopt \
1440 --define "_tmppath /var/tmp" \
1441 --define "_topdir ${TOPDIR}" \
1442 --define "kernel_obj $linux" \
1443 ${TOPDIR}/SPECS/mptlinux.spec 2>&1; then
1447 if ! $RPMBUILD -bs \
1448 --define "_tmppath /var/tmp" \
1449 --define "_topdir ${TOPDIR}" \
1450 --define "kernel_obj $linux" \
1451 ${TOPDIR}/SPECS/mptlinux.spec 2>&1; then
1465 if [ -z "$version" -o "$version" = "inkernel" ]; then
1469 # note that we use an _, not a . before the spec on purpose. we are not
1470 # allowed to have more than one file with a .spec trailer in a tarball
1471 # that is supposed to be usable with rpmbuild
1472 cp lustre/build/rdac_spec ${TOPDIR}/SPECS/rdac.spec || fatal 1 "Could not find rdac.spec in lustre/build"
1475 for arch in $BUILD_ARCHS; do
1476 targets="--target $arch $targets"
1479 local rpmbuildopt='-bb'
1482 echo NORPM mode. Only compiling.
1487 rhel5) distro="REDHAT"
1489 sles1*) distro="SUSE"
1491 *) echo "$DISTRO not supported by RDAC, skipping"
1495 if ! $RPMBUILD $targets $rpmbuildopt --define "dist $distro" \
1496 --define "_tmppath /var/tmp" \
1497 --define "_topdir ${TOPDIR}" \
1498 --define "kernel_obj $linux" \
1499 ${TOPDIR}/SPECS/rdac.spec 2>&1; then
1503 if ! $RPMBUILD -bs --define "dist $distro" \
1504 --define "_tmppath /var/tmp" \
1505 --define "_topdir ${TOPDIR}" \
1506 --define "kernel_obj $linux" \
1507 ${TOPDIR}/SPECS/rdac.spec 2>&1; then
1518 # REUSEBUILD, USE_BUILD_CACHE
1523 local ofed_version="$2"
1525 # before lustre, build kernel-ib
1526 if [ -z "$ofed_version" -o "$ofed_version" = "inkernel" ]; then
1530 if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
1531 local REUSE_SIGNATURE=$({ echo "$ofed_version";
1532 echo "$(find_linux_release ${linux})";
1533 cat "${linux}/include/linux/autoconf.h"; } |
1534 md5sum | cut -d" " -f1)
1535 # see if we can link to the reuse pool
1536 # XXX - hrm. i'm not convinced this doesn't belong in the reuse
1538 local CAN_LINK_FOR_REUSE=false
1539 touch $REUSEBUILD/$$
1540 if cp -al $REUSEBUILD/$$ $TOPDIR/; then
1541 CAN_LINK_FOR_REUSE=true
1546 if ! $USE_BUILD_CACHE || ! reuse ofed "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1547 "$REUSE_SIGNATURE"; then
1548 if [ -n "$REUSE_SIGNATURE" ]; then
1549 # stash away the existing built articles for a moment
1551 mv {BUILD,{S,}RPMS,S{OURCE,PEC}S} bak
1554 find . | cpio -pudlm ..
1558 create_rpmbuild_dirs
1561 build_kernel_ib "${linux}"
1563 if [ -z "$REUSE_SIGNATURE" ]; then
1564 echo "No reuse signature was caculated so not storing the built ofed"
1566 # store the resulting RPM build tree for future use
1567 echo "Storing the built ofed for future reuse"
1568 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
1569 "ofed" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1570 "$CAN_LINK_FOR_REUSE"; then
1571 error "Failed to store OFED RPMS for reuse"
1575 # put the stuff we stashed away back
1580 pushd "$TOPDIR" >/dev/null
1581 rm -rf kernel-ib-devel
1582 mkdir kernel-ib-devel
1584 # the actual ofed RPMs don't have the -rc$n or -$date string appened that
1585 # might be present on the file
1586 local linuxrelease=$(find_linux_release "$linux")
1587 ofed_version=$(echo $ofed_version |
1588 sed -re 's/-(20[0-9]{6,6}-[0-9]{4,4}|rc[0-9]*)$//')
1589 local rpm=$(ls $TOPDIR/RPMS/*/kernel-ib-devel-${ofed_version}-${linuxrelease//-/_}.*.rpm)
1590 rpm2cpio -itv < $rpm | cpio -id
1591 CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/ofa_kernel ${CONFIGURE_FLAGS}"
1598 if ! $PATCHLESS; then
1599 local kernel_extra_version
1600 if ! kernel_extra_version=$(build_kernel_with_srpm ${STDOUT}); then
1601 fatal 1 "Failed to build the kernel from it's SRPM"
1604 for arch in $BUILD_ARCHS; do
1605 local kernel_devel_rpm
1606 if ! kernel_devel_rpm=$(find_rpm "$TOPDIR/RPMS/$arch/" provides "^$(devel_kernel_name $KERNEL_LUSTRE_NAMING) ="); then
1607 fatal 1 "Failed to find a kernel development RPM in $TOPDIR/RPMS/$arch/"
1610 # install the -devel RPM in preparation for the lustre build
1611 if ! lnxrel="$kernel_extra_version" unpack_linux_devel_rpm \
1612 "$TOPDIR/RPMS/$arch/$kernel_devel_rpm"; then
1613 fatal 1 "Could not find the Linux tree in $TOPDIR/RPMS/$arch/$kernel_devel_rpm"
1617 # need to find and unpack the vendor's own kernel-devel for patchless
1620 if ! kernelrpm=$(find_linux_rpm "-$DEVEL_KERNEL_TYPE"); then
1621 fatal 1 "Could not find the kernel-$DEVEL_KERNEL_TYPE RPM in ${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
1623 if ! lnxrel="$lnxrel" unpack_linux_devel_rpm "$kernelrpm" "-"; then
1624 fatal 1 "Could not find the Linux tree in $kernelrpm"
1628 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
1629 fatal 1 "error building OFED"
1631 if ! $PATCHLESS; then
1632 # only need RDAC for the server
1633 build_rdac "${LINUXOBJ:-$LINUX}" "$RDAC_VERSION" ||
1634 fatal 1 "error building RDAC"
1637 build_mptlinux "${LINUXOBJ:-$LINUX}" "$MPTLINUX_VERSION" ||
1638 fatal 1 "error building mptlinux"
1641 if build_lustre "$LINUX" "$LINUXOBJ"; then
1642 # the build worked. resolve any symlinked files (i.e. from reuse)
1643 # in RPMS/$arch to real files so that that that huge mess of
1644 # complication known as LTS can copy them yet somewhere else.
1645 # is it any wonder this whole process is so damn so? anyone ever
1646 # heard of hardlinks? it this cool new thing that allows you save
1647 # tons of time and space by creating... well you can go read about
1648 # them if you have not heard about them yet.
1649 # can i say how much the implemenation of all of this really impedes
1651 pushd RPMS/$TARGET_ARCH
1653 if [ -h $file ]; then
1665 create_rpmbuild_dirs() {
1667 [ -d RPMS ] || mkdir RPMS
1668 for arch in $BUILD_ARCHS; do
1669 if [[ $arch = i?86 ]]; then
1670 # some stupidity in the sles11 kernel spec requires an RPMS/i386
1671 # even if the target arch is i686
1672 [ -d RPMS/i386 ] || mkdir RPMS/i386
1674 [ -d RPMS/$arch ] || mkdir RPMS/$arch
1676 [ -d BUILD ] || mkdir BUILD
1677 [ -d SOURCES ] || mkdir SOURCES
1678 [ -d SPECS ] || mkdir SPECS
1679 [ -d SRPMS ] || mkdir SRPMS
1701 [[ $list\ == *\ $item\ * ]]
1705 #########################################################################
1706 # Generate a backtrace through the call stack.
1710 #########################################################################
1714 local funcname="" sourcefile="" lineno="" n
1716 echo "Call stack: (most recent first)"
1717 for (( n = $strip ; n < ${#FUNCNAME[@]} ; ++n )) ; do
1718 funcname=${FUNCNAME[$n - 1]}
1719 sourcefile=$(basename ${BASH_SOURCE[$n]})
1720 lineno=${BASH_LINENO[$n - 1]}
1724 # Display function arguments
1725 if [[ ! -z "${BASH_ARGV[@]}" ]]; then
1726 local args newarg j p=0
1727 for (( j = ${BASH_ARGC[$n - 1]}; j > 0; j-- )); do
1728 newarg=${BASH_ARGV[$j + $p - 1]}
1729 args="${args:+${args} }'${newarg}'"
1731 let p+=${BASH_ARGC[$n - 1]}
1733 echo " ${funcname} ${args:+${args} }at ${sourcefile}:${lineno}"
1737 echo "BEGIN BACKTRACE"
1739 #echo ${BASH_LINENO[*]}
1740 #echo ${BASH_SOURCE[*]}
1741 #echo ${FUNCNAME[*]}
1742 local i=$((${#FUNCNAME[@]} - 1))
1743 while [ $i -ge 0 ]; do
1744 local lineno=${BASH_LINENO[$i]}
1748 local SOURCELINE="${BASH_SOURCE[$i + 1]}:${lineno}"
1749 # Can't figure out how to get function args from other frames...
1750 local FUNCTION="${FUNCNAME[$i]}()"
1751 echo "$SOURCELINE:$FUNCTION"
1755 echo "END BACKTRACE"
1761 seen_list=$(new_list)
1763 echo "An unexpected error has occurred at ${BASH_SOURCE[0]##*/}:$((LINENO-1)).
1764 Unfortunately the above line number in the message may or may not be correct,
1765 but details have been send to the lbuild maintainer. Attempting to continue."; (echo "Untrapped error"
1767 # have we seen this one
1768 echo "checking seen list for ${BASH_SOURCE[0]}:${BASH_LINENO[0]}"
1770 if is_list_member "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}"; then
1771 echo "seen this one already"
1773 seen_list=$(add_list "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}")
1779 ) | mail -s "Untrapped error at ${BASH_SOURCE[0]##*/}:$((LINENO-15)) on $HOSTNAME" brian@sun.com >&2; set $xtrace' ERR
1782 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
1784 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 -- "$@")
1786 if [ $? != 0 ]; then
1790 eval set -- "$options"
1825 if ! KERNELTREE=$(canon_path "$2"); then
1826 fatal 1 "Could not determine the canonical location of $2"
1830 --linux | --with-linux)
1831 if ! LINUX=$(canon_path "$2"); then
1832 fatal 1 "Could not determine the canonical location of $2"
1845 if ! REUSEBUILD=$(canon_path "$2"); then
1846 fatal 1 "Could not determine the canonical location of $2"
1863 if ! KERNELRPMSBASE=$(canon_path "$2"); then
1864 fatal 1 "Could not determine the canonical location of $2"
1915 --disable-datestamp)
1930 CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-liblustre --enable-liblustre-tests"
1934 usage 1 "Unrecognized option: $1"
1945 if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
1947 unpack_ofed || fatal 1 "Error unpacking OFED tarball"
1950 if [ -n "$MPTLINUX_VERSION" -a "$MPTLINUX_VERSION" != "inkernel" ]; then
1952 unpack_mptlinux || fatal 1 "Error unpacking MPTLINUX distribution"
1955 # make sure the RPM build environment is set up
1956 create_rpmbuild_dirs
1958 if [ -n "$RDAC_VERSION" -a "$RDAC_VERSION" != "inkernel" ]; then
1960 # we don't actually need to unpack this. just put it in the SOURCES dir
1961 #unpack_rdac || fatal 1 "Error unpacking RDAC tarball"
1962 cp "$KERNELTREE/rdac-LINUX-${RDAC_VERSION}-source.tar.gz" ${TOPDIR}/SOURCES/ ||
1963 fatal 1 "Error copying RDAC source tarball to RPM SOURCES dir"
1966 # if an unpacked kernel source tree was given on the command line
1967 # just build lustre with it (nothing distro kernel specific here)
1968 if [ -n "$LINUX" ]; then
1969 build_mptlinux "${LINUXOBJ:-$LINUX}" "$MPTLINUX_VERSION" ||
1970 fatal 1 "error building mptlinux"
1971 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
1972 fatal 1 "error building OFED"
1973 if ! $PATCHLESS; then
1974 build_rdac "${LINUXOBJ:-$LINUX}" "$RDAC_VERSION" ||
1975 fatal 1 "error building RDAC"
1977 build_lustre "$LINUX" "$LINUXOBJ"
1979 if [ -f "${0%/*}/lbuild-$DISTRO" ]; then
1980 source ${0%/*}/lbuild-$DISTRO
1982 build_with_srpm || fatal 1 "Failed to build_with_srpm"
1984 EXTRA_VERSION_DELIMITER=${EXTRA_VERSION_DELIMITER:-"-"}
1985 source ${0%/*}/lbuild.old_school
1987 old_school_download_kernel
1991 patchless_build_sequence && build_success=true
1993 [ "$DISTRO" = "sles9" ] && build_sequence_rpm_reuse && build_success=true
1994 if ! $build_success; then
1995 build_sequence_reuse && build_success=true
1996 if ! $build_success; then
1997 build_sequence && build_success=true
1998 if $build_success; then
1999 store_for_reuse || echo "Cannot store for future reuse"
2004 ( $build_success ) || fatal 1 "Cannot build lustre"