3 # vim:expandtab:shiftwidth=4:softtabstop=4:tabstop=4:
10 # CVSROOT is inherited from the environment
15 # XXX - some recent hacking has pretty much neutered this option.
16 # search through this file (and lbuild.old_school -- but that will
17 # be going away soon) for "-bb" and see how many places
18 # simply don't account for this option
24 TARGET_ARCH=$(uname -m)
26 TARGET_ARCHS_ALL=$TARGET_ARCH
27 [ "$TARGET_ARCH" = "i686" ] && TARGET_ARCHS_ALL="i686 i586 i386"
33 TMPDIR=${TMPDIR:-"/var/tmp"}
35 # XXX - i think these two parameters/arguments/variables need to be
36 # cleaned up and merged. they effectively do the same thing
39 # what does this do exactly? does it imply no kernel build?
42 SKIPLDISKFSRPM="v1_4_* b1_4"
43 SMPTYPES="smp bigsmp default ''"
49 # default to not adding -lustre- into the kernel RPM package names
50 KERNEL_LUSTRE_NAMING=false
67 # not in the target file any more
79 # Readlink is not present on some older distributions: emulate it.
83 if [ -L "$path" ]; then
84 ll="$(LC_ALL=C ls -l "$path" 2> /dev/null)" &&
99 [ -n "$msg" ] && echo -e "\n${0##*/}: $msg" >&2
113 Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
116 Specifies the CVS Root to use when pulling files from CVS. The
117 environment variable \$CVSROOT is used if this option is not
120 --external-patches=EXTERNAL_PATCHES
121 Directory similar to lustre/lustre/kernel_patches/ that lbuild should
122 look for seres and config files in before looking in the lustre
125 --extraversion=EXTRAVERSION
126 Text to use for the rpm release and kernel extraversion.
128 --timestamp=TIMESTAMP
129 Date of building lustre in format YYYYMMDDhhmmss
132 Try to reuse old kernel RPMs from DIR
135 Try to reuse old kernel builds from DIR
138 Path to distro kernel RPM collection
144 Do not build RPMs (compile only mode)
147 Build lustre client only
150 Which distro using. Autodetect by default
152 --kerneldir=KERNELDIR
153 Directory containing Linux source tarballs referenced by target
156 --kerneltree=KERNELTREE
157 Directory containing dirs with Linux source tarballs referenced by target
158 files. Dir names in format kernel version ('2.6.9', etc.)
160 --linux=LINUX --with-linux=LINUX
161 Directory of Linux kernel sources. When this option is used, only
162 Lustre modules and userspace are built.
165 Path to an existing lustre source tarball to use instead of
169 Do not try to download a kernel from downloads.lustre.org
172 Do not build a .src.rpm, a full kernel patch, or a patched kernel
176 Do ldiskfs RPM. Now true by default
182 Specifies that the files generated do not include timestamps, and
183 that this is an official release.
186 Build a .src.rpm, a full kernel patch, and a patched kernel tarball.
189 Directory used to stage packages for release. RPMs will be placed
190 more or less in DIR/<target>-<arch>, and the tarball will be
194 A CVS branch/tag name to build from when pulling from CVS.
197 The name of the target to build. The available targets are listed
200 --target-archs=TARGET_ARCHS
201 A (space delimited) list of architectures to build. By default,
202 all of the archs supported by the TARGET will be built, in
203 addition to a .src.rpm. This option can limit those, for machines
204 that can only build certain archs or if you only want a certain
205 arch built (for testing, or a one-off kernel).
207 Also note that by using a non-"base" arch (eg, i386) only kernels
208 will be built - there will be no lustre-lite-utils package.
211 Prevents the datestamp flag (-D) from being passed to cvs for
212 checkouts. This is a workaround for a problem encountered when
213 using lbuild with tinderbox.
216 Builds a Xen domX kernel.
225 # canonicalize a relative path
229 if [ ! -d "$PATH" ]; then
233 pushd "$PATH" >/dev/null || return 1
243 if [ "$LUSTRE" ]; then
244 [ -r "$LUSTRE" ] || \
245 usage 1 "Could not find Lustre source tarball '$LUSTRE'."
248 usage 1 "Either specify a CVS Root with -d, or a Lustre source tarball with --lustre."
250 usage 1 "A branch/tag name must be specified with --tag when not building from a tarball."
253 if [ -z "$LINUX" ]; then
254 [ "$KERNELDIR" -o "$KERNELTREE" ] || \
255 usage 1 "A kernel directory must be specified with --kerneldir or --kerneltree."
257 [ -d "$KERNELDIR" -o -d "$KERNELTREE" ] || \
258 usage 1 "$KERNELDIR and $KERNELTREE are not a directory."
262 usage 1 "When building a snapshot, a tag name must be used."
265 [ "$TARGET" ] || usage 1 "A target must be specified with --target."
266 # TARGET_FILE="$TOPDIR/lustre/kernel_patches/targets/$TARGET.target"
267 # [ -r "$TARGET_FILE" ] || \
268 # usage 1 "Target '$TARGET' was not found."
273 CANONICAL_TARGET="rhel5"
276 CANONICAL_TARGET="rhel-2.6"
279 CANONICAL_TARGET="sles-2.6"
282 CANONICAL_TARGET="sles10-2.6"
285 CANONICAL_TARGET="sles11"
288 CANONICAL_TARGET="oel5"
291 CANONICAL_TARGET="hp-pnnl-2.4"
299 CANONICAL_TARGET="$TARGET"
303 local timestampnodig=$(echo $TIMESTAMP | sed -e s/[0-9]*//g)
304 [ "$timestampnodig" = "" ] || TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M%S")
305 local timestamplength="${#TIMESTAMP}"
306 if [ $timestamplength -eq 12 ]; then
307 TIMESTAMP="${TIMESTAMP}00"
308 elif [ $timestamplength -ne 14 ]; then
309 TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M%S")
312 RPMBUILD=$(which rpmbuild 2>/dev/null | head -1)
313 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
314 RPMBUILD=$(which rpm 2>/dev/null | head -1)
315 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
316 usage 1 "Could not find binary for making rpms (tried rpmbuild and rpm)."
320 if [ -n "$CCACHE" ]; then
321 which "$DISTCC" 2>/dev/null && export DISTCC RPM_BUILD_NCPUS
323 if which "$CCACHE" 2>/dev/null; then
324 local ccache=$(which "$CCACHE")
325 local bindir="$TOPDIR/bin"
327 [ -d $bindir ] || mkdir -p $bindir
328 if [ -d $bindir ]; then
329 rm ${bindir}/* > /dev/null 2>&1
330 ln -s "$ccache" ${bindir}/ccache
331 ln -s "$ccache" ${bindir}/cc
332 ln -s "$ccache" ${bindir}/$CC
333 export PATH=$bindir:$PATH
335 export CCACHE && export CC="ccache $CC"
336 # zero the cache so we can see how effective we are being with it
341 [ -z "$DISTRO" ] && DISTRO=$(autodetect_distro)
344 # autodetect used Distro
345 autodetect_distro() {
350 if [ -f /etc/SuSE-release ]; then
352 version=$(grep ^VERSION /etc/SuSE-release)
353 version=${version#*= }
354 elif [ -f /etc/redhat-release ]; then
355 name=$(head -1 /etc/redhat-release)
356 version=$(echo "$distroname" |
357 sed -e 's/^[^0-9.]*//g' | sed -e 's/[ \.].*//')
359 if [ -z "$name" -o -z "$version" ]; then
360 fatal 1 "I don't know how to determine distro type/version.\n" \
361 "Either update autodetect_distro() or use the --distro argument"
364 echo ${name}${version}
371 echo $(echo "$*" | xargs -n 1 | sort -u)
378 local force="${3:-false}"
380 if $force || [ ! -r "$KERNELDIR/$srpm" ] ||
381 [ ! -s "$KERNELDIR/$srpm" ]; then
383 local location="http://downloads.lustre.org/public/kernels/$target/old"
384 echo "Downloading $location/$srpm..."
385 if ! wget -nv "$location/$srpm" -O "$KERNELDIR/$srpm" ||
386 [ ! -s "$KERNELDIR/$srpm" ]; then
387 rm -f $KERNELDIR/$srpm
388 fatal 1 "Could not download target $target's kernel SRPM" \
389 "$srpm from $location."
392 fatal 1 "$srpm not found in directory $KERNELDIR."
399 local force="${1:-false}"
401 local location="http://downloads.lustre.org/public/OFED/"
404 if [[ $OFED_VERSION = daily-* ]]; then
405 OFED_VERSION=${OFED_VERSION/daily-/}
406 Mmv=${OFED_VERSION%%-*}
407 daily=${OFED_VERSION##$Mmv-}
408 location="http://www.openfabrics.org/downloads/OFED/ofed-${Mmv}-daily/"
409 # find the filename for the version for the date specified
410 OFED_VERSION=$(curl -s "$location" | sed -nre "/${daily}-/s/.*href=\"OFED-([0-9]+\.[0-9]+-${daily}-[0-9]{4,4}).tgz.*$/\1/p")
411 if [ -z "$OFED_VERSION" ]; then
412 fatal 1 "Could not determine the filename of the OFED snapshot for ${daily}"
416 if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ] &&
417 ( $force || [ ! -r "$KERNELTREE/OFED-${OFED_VERSION}.tgz" ] ||
418 [ ! -s "$KERNELTREE/OFED-${OFED_VERSION}.tgz" ] ); then
420 echo "Downloading $location/OFED-${OFED_VERSION}.tgz..."
421 if ! wget -nv "$location/OFED-${OFED_VERSION}.tgz" \
422 -O "$KERNELTREE/OFED-${OFED_VERSION}.tgz" ||
423 [ ! -s "$KERNELTREE/OFED-${OFED_VERSION}.tgz" ]; then
424 rm -f $KERNELTREE/OFED-${OFED_VERSION}.tgz
425 fatal 1 "Could not download OFED-${OFED_VERSION}.tgz" \
426 "from downloads.lustre.org."
429 fatal 1 "OFED-${OFED_VERSION}.tgz not found in kernel" \
430 "directory $KERNELTREE."
437 local force="${1:-false}"
439 if [ -n "$RDAC_VERSION" -a "$RDAC_VERSION" != "inkernel" ] &&
440 ( $force || [ ! -r "$KERNELTREE/rdac-LINUX-${RDAC_VERSION}-source.tar.gz" ] ||
441 [ ! -s "$KERNELTREE/rdac-LINUX-${RDAC_VERSION}-source.tar.gz" ] ); then
443 local location="http://downloads.lustre.org/public/RDAC/"
444 echo "Downloading $location/rdac-LINUX-${RDAC_VERSION}-source.tar.gz..."
445 if ! wget -nv "$location/rdac-LINUX-${RDAC_VERSION}-source.tar.gz" \
446 -O "$KERNELTREE/rdac-LINUX-${RDAC_VERSION}-source.tar.gz" ||
447 [ ! -s "$KERNELTREE/rdac-LINUX-${RDAC_VERSION}-source.tar.gz" ]; then
448 rm -f $KERNELTREE/rdac-LINUX-${RDAC_VERSION}-source.tar.gz
449 fatal 1 "Could not download rdac-LINUX-${RDAC_VERSION}-source.tar.gz" \
450 "from downloads.lustre.org."
453 fatal 1 "rdac-LINUX-${RDAC_VERSION}-source.tar.gz not found in kernel" \
454 "directory $KERNELTREE."
461 download_mptlinux() {
462 local force="${1:-false}"
464 if [ -n "$MPTLINUX_VERSION" -a "$MPTLINUX_VERSION" != "inkernel" ] &&
465 ( $force || [ ! -r "$KERNELTREE/MPTLINUX_RHEL5_SLES10_PH15-${MPTLINUX_VERSION}.zip" ] ||
466 [ ! -s "$KERNELTREE/MPTLINUX_RHEL5_SLES10_PH15-${MPTLINUX_VERSION}.zip" ] ); then
468 local location="http://downloads.lustre.org/public/MPTLINUX/"
469 echo "Downloading $location/MPTLINUX_RHEL5_SLES10_PH15-${MPTLINUX_VERSION}.zip..."
470 if ! wget -nv "$location/MPTLINUX_RHEL5_SLES10_PH15-${MPTLINUX_VERSION}.zip" \
471 -O "$KERNELTREE/MPTLINUX_RHEL5_SLES10_PH15-${MPTLINUX_VERSION}.zip" ||
472 [ ! -s "$KERNELTREE/MPTLINUX_RHEL5_SLES10_PH15-${MPTLINUX_VERSION}.zip" ]; then
473 rm -f $KERNELTREE/MPTLINUX_RHEL5_SLES10_PH15-${MPTLINUX_VERSION}.zip
474 fatal 1 "Could not download MPTLINUX_RHEL5_SLES10_PH15-${MPTLINUX_VERSION}.zip" \
475 "from downloads.lustre.org."
478 fatal 1 "MPTLINUX_RHEL5_SLES10_PH15-${MPTLINUX_VERSION}.zip not found in kernel" \
479 "directory $KERNELTREE."
488 EXTRA_VERSION_save="$EXTRA_VERSION"
489 for patchesdir in "$EXTERNAL_PATCHES" \
490 "$TOPDIR/lustre/lustre/kernel_patches"; do
491 TARGET_FILE="$patchesdir/targets/$TARGET.target"
492 [ -r "$TARGET_FILE" ] && break
494 [ -r "$TARGET_FILE" ] || fatal 1 "Target $TARGET was not found."
496 echo "Loading target config file $TARGET.target..."
498 # if the caller specified an OFED_VERSION it should override whatever
499 # the target file specifies
500 local env_OFED_VERSION="$OFED_VERSION"
504 if [ -n "$env_OFED_VERSION" ]; then
505 OFED_VERSION="$env_OFED_VERSION"
508 # doesn't make any sense to build OFED for xen domX's
513 # XXX - set_rpm_smp_type is an ugly undeterministic hack. it needs to
514 # go away and the target just specify the $RPMSMPTYPE
515 [ -z "$RPMSMPTYPE" ] && set_rpm_smp_type
517 # CC might have been overwriten in TARGET_FILE
518 if [[ $CC != ccache\ * ]] && which "$CCACHE" 2>/dev/null; then
519 export CCACHE && export CC="ccache $CC"
522 if [ ! "$KERNELTREE" = "" ] && [ -d "$KERNELTREE" ]; then
523 KERNELDIR="$KERNELTREE/${lnxmaj}"
524 [ -d "$KERNELDIR" ] || mkdir "$KERNELDIR"
527 # verify the series is available
528 if [ "$SERIES" ]; then
529 for series in $SERIES; do
530 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches"; do
531 [ -r "$patchesdir/series/$series" ] && continue 2
533 fatal 1 "Target $TARGET's series $SERIES could not be" \
534 "found.\nSearched:\n\t$EXTERNAL_PATCHES/series\n" \
535 "\t$TOPDIR/lustre/lustre/kernel_patches/series."
539 # set the location of the .config file
545 if [ -f $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET-$TARGET_ARCH.config ]; then
546 CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET$XENPOSTFIX-$TARGET_ARCH${RPMSMPTYPE:+-}${RPMSMPTYPE}.config"
549 local lnxrelnew=${lnxrel//-/_}
551 # remember the EXTRA_VERSION before we diddle it here
552 # XXX - we really should not diddle with any values read in from the
553 # target file. if we want to modify a value, we should create
555 PRISTINE_EXTRA_VERSION=$EXTRA_VERSION
557 if ! $PATCHLESS && [ ! -f "$CONFIG_FILE" ]; then
558 fatal 1 "Config file for target $TARGET missing from" \
559 "$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/."
562 if [ "$EXTRA_VERSION_save" ]; then
563 EXTRA_VERSION="$EXTRA_VERSION_save"
564 elif ! $RELEASE; then
565 # if there is no patch series, then this is not a lustre specific
566 # kernel. don't make it look like one
567 if [ -n "$SERIES" ]; then
568 #remove the @VERSION@ (lustre version)
569 # EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
570 # EXTRA_VERSION="${EXTRA_VERSION}-${TAG}.${TIMESTAMP}"
571 ! ( $PATCHLESS ) && EXTRA_VERSION="${EXTRA_VERSION}.${TIMESTAMP}"
574 # EXTRA_VERSION=${EXTRA_VERSION//-/_}
576 ALL_ARCHS="$BASE_ARCHS $BIGMEM_ARCHS $BOOT_ARCHS $JENSEN_ARCHS $SMP_ARCHS $BIGSMP_ARCHS $PSERIES64_ARCHS $UP_ARCHS"
579 for arch in $(uniqify "$ALL_ARCHS"); do
580 if [ -z "$TARGET_ARCHS" ] ||
581 [[ \ $TARGET_ARCHS\ = *\ $arch\ * ]]; then
582 BUILD_ARCHS="$BUILD_ARCHS $arch"
585 [ "$BUILD_ARCHS" ] || usage 1 "No available target archs to build."
586 echo "Building for: $BUILD_ARCHS"
594 fatal 1 "tarflags(): File name argument missing."
606 fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
615 echo "Untarring ${file##*/}..."
616 tar $(tarflags "$file") "$file"
622 if ! untar "$KERNELTREE/OFED-${OFED_VERSION}.tgz"; then
625 [ -d OFED ] || ln -sf OFED-[0-9].[0-9]* OFED
631 if ! untar "$KERNELTREE/rdac-LINUX-${RDAC_VERSION}-source.tar.gz"; then
634 [ -d rdac-LINUX ] || ln -sf rdac-LINUX-[0-9][0-9].* rdac-LINUX
640 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
643 mv srpms-2/mptlinux-4.16.00.00-2.src.rpm .
649 if [ -z "$LUSTRE" ]; then
652 if [ -n "$USE_DATESTAMP" ]; then
653 DATESTAMP="-D '$DATE'"
656 local DIRNAME="lustre-$TAG-$TIMESTAMP"
658 cvs -d "$CVSROOT" -qz3 co $DATESTAMP -d "$DIRNAME" lustre || \
659 fatal 1 "There was an error checking out toplevel Lustre from CVS."
660 pushd "$DIRNAME" > /dev/null
661 ./lustrecvs "$TAG" || \
662 fatal 1 "There was an error checking out Lustre/Portals/Build from CVS."
663 echo "Creating lustre tarball..."
664 sh autogen.sh || fatal 1 "There was an error running autogen.sh."
665 ./configure --disable-{modules,utils,liblustre,tests,doc} || \
666 fatal 1 "There was an error running ./configure to create makefiles."
667 make dist || fatal 1 "There was an error running 'make dist'."
668 LUSTRE=$PWD/lustre-*.tar.gz
672 untar "$LUSTRE" || fatal 1 "Error unpacking Lustre tarball"
673 [ -d lustre ] || ln -sf lustre-[0-9].[0-9]* lustre
679 local do_patch=${1:-true}
681 FULL_PATCH="$PWD/lustre-kernel-${TARGET}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}.patch"
682 [ -f "$FULL_PATCH" ] && rm -f "$FULL_PATCH"
683 $do_patch && pushd linux >/dev/null
684 for series in $SERIES; do
685 echo -n "Applying series $series:"
686 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches"; do
687 [ -r "$patchesdir/series/$series" ] || continue
688 SERIES_FILE="$patchesdir/series/$series"
689 for patch in $(<"$SERIES_FILE"); do
691 PATCH_FILE="$patchesdir/patches/$patch"
692 [ -r "$PATCH_FILE" ] || \
693 fatal 1 "Patch $patch does not exist in Lustre tree."
694 cat "$PATCH_FILE" >> "$FULL_PATCH" || {
696 fatal 1 "Error adding patch $patch to full patch."
699 patch -s -p1 < "$PATCH_FILE" || {
701 fatal 1 "Error applying patch $patch."
709 $do_patch && popd >/dev/null
710 echo "Full patch has been saved in ${FULL_PATCH##*/}."
720 pushd lustre >/dev/null
722 echo "Building Lustre RPMs for: $BUILD_ARCHS..."
724 for arch in $BUILD_ARCHS; do
725 targets="--target $arch $targets"
728 local confoptions="--with-linux=${linux}"
730 confoptions="--with-linux=${linux} --disable-server"
732 if [ "$linuxobj" != "" ]; then
733 confoptions="$confoptions --with-linux-obj=${linuxobj}"
736 ./configure $confoptions ${CONFIGURE_FLAGS}
737 if [ "$?" != "0" ]; then
738 local saved_config="../config.log.$(date +%s)"
739 cp config.log $saved_config
740 chmod a+r $saved_config
741 echo "Saved config.log is at $saved_config"
745 echo "config.log contents:"
753 # hack. Somebody move build/lustre.spec to lustre.spec for b1_6
755 [ -f lustre.spec ] && lustre_spec=lustre.spec
756 [ -f build/lustre.spec ] && lustre_spec=build/lustre.spec
758 [ -f "$lustre_spec" ] && sed \
759 -e "s^Release: .*$^Release: $LUSTRE_EXTRA_VERSION^" \
763 local rpmbuildopt='-bb'
766 echo NORPM mode. Only compiling.
769 # convert the $PATCHLESS boolean to an empty/no-empty boolean
770 # as silly as this seems, it makes the syntax of the rpmbuild command
771 # simpler and not need an eval to deal with the quotes in the quotes
772 local is_patchless=""
776 $RPMBUILD $targets $rpmbuildopt ../lustre.spec \
777 ${is_patchless:+--define "lustre_name lustre-client"} \
778 --define "_tmppath $TMPDIR" \
779 --define "_topdir $TOPDIR" || \
780 fatal 1 "Error building rpms for $BUILD_ARCHS."
783 ( $(skeep_ldiskfs_rpm $TAG) ) && return
785 pushd lustre/ldiskfs || return 255
787 if [ "$?" != "0" ]; then
791 cp lustre-ldiskfs*.tar.gz $TOPDIR/SOURCES
795 local ldiskfs_spec=lustre-ldiskfs.spec
796 [ -f "$ldiskfs_spec" ] && sed \
797 -e "s^Release: .*$^Release: $LUSTRE_EXTRA_VERSION^" \
799 > ../lustre-ldiskfs.spec
801 $RPMBUILD $targets $rpmbuildopt ../lustre-ldiskfs.spec \
802 --define "_tmppath /var/tmp" \
803 --define "_topdir $TOPDIR"
804 if [ "$?" != "0" ]; then
810 $RPMBUILD -bs ../lustre-ldiskfs.spec \
811 --define "_tmppath /var/tmp" \
812 --define "_topdir $TOPDIR"
813 if [ "$?" != "0" ]; then
824 [ "$STAGEDIR" ] || return 0
826 for arch in $BUILD_ARCHS; do
827 rpmdir="${STAGEDIR}/${CANONICAL_TARGET}-${arch}"
828 echo "${0##*/}: Copying RPMs into ${rpmdir}"
830 cp -v RPMS/${arch}/*.rpm "${rpmdir}"
831 if [ -d RPMS/noarch ]; then
832 cp -v RPMS/noarch/*.rpm "${rpmdir}"
836 cp -v "$LUSTRE" "$STAGEDIR"
840 #check if we need to build separate ldiskfs RPM
841 skeep_ldiskfs_rpm() {
846 if ! $LDISKFSRPM; then
848 elif $PATCHLESS; then
851 for skiptag in $SKIPLDISKFSRPM; do
852 [[ $tag == $skiptag ]] && skip=true && break
856 pushd $TOPDIR/BUILD/lustre-[1-9]* >/dev/null
857 grep -q '^SERVER_TRUE[ \t]=[ \t]#$' autoMakefile && skip=true
864 #generate LUSTRE_EXTRA_VERSION from EXTRA_VERSION
865 gen_lustre_version() {
867 LUSTRE_EXTRA_VERSION="${lnxmaj}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}${TARGET_DELIMITER}${RPMSMPTYPE}"
868 LUSTRE_EXTRA_VERSION=${LUSTRE_EXTRA_VERSION//-/_}
874 local infact_arch="${TARGET_ARCH}"
877 [ "$infact_arch" == "i586" ] && infact_arch="i686"
880 for smp_type in $SMP_ARCHS; do
881 [ $infact_arch == $smp_type ] && RPMSMPTYPE=smp && break
884 for smp_type in $BIGSMP_ARCHS; do
885 [ $infact_arch == $smp_type ] && RPMSMPTYPE=bigsmp && break
888 for smp_type in $DEFAULT_ARCHS; do
889 [ $infact_arch == $smp_type ] && RPMSMPTYPE=default && break
894 # This function takes a linux source pool and digs out the linux release
896 find_linux_release() {
899 local LINUXRELEASEHEADER=$SRCDIR/include/linux/version.h
900 if [ -s $SRCDIR/include/linux/utsrelease.h ]; then
901 LINUXRELEASEHEADER=$SRCDIR/include/linux/utsrelease.h
904 sed -ne 's/#define UTS_RELEASE "\(.*\)"$/\1/p' $LINUXRELEASEHEADER
908 # XXX this needs to be re-written as a wrapper around find_rpm
909 # or just gotten rid of. :-)
912 local delimiter=${2:-"-"}
914 local pathtorpms="${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
915 [ -d $pathtorpms ] || return 255
917 local kernelbinaryrpm rpmfile
918 local wanted_kernel="${lnxmaj}${delimiter}${lnxrel}"
921 for arch in $TARGET_ARCHS_ALL; do
922 local found_rpm="" rpm
923 for rpm in ${pathtorpms}/${arch}/*.rpm; do
924 if rpm -q --provides -p "$rpm" | grep -q "kernel${prefix} = $wanted_kernel"; then
930 [ -f "$found_rpm" ] && break
938 # unpack kernel(/source/devel) RPM
940 # This function and it's setting of $LINUX and $LINUXOBJ is a total hack that
941 # needs to completely refactored. It completely ingores that $BUILD_ARCHS may
942 # contain a list of arches for which rpmbuild commands (including the one for
944 unpack_linux_devel_rpm() {
945 local kernelrpm="${1}"
946 # it's worth noting that neither sles10 nor rhel5 appear to use their
947 # extra_version delimiter for the dirname under /usr/src, so we could
948 # probably just get rid of this parameter
949 local delimiter=${2:-"-"}
951 [ -f "$kernelrpm" ] || return 255
952 [ -d $TOPDIR/reused ] || mkdir $TOPDIR/reused || return 255
954 pushd $TOPDIR/reused || return 255
956 if ! rpm2cpio < "$kernelrpm" | cpio -id > /dev/null 2>&1; then
960 # call a distro specific hook, if available
961 if type -p unpack_linux_devel_rpm-$DISTRO; then
962 unpack_linux_devel_rpm-$DISTRO "$kernelrpm"
967 find_linux_devel_paths $TOPDIR/reused
973 # XXX - this rhel/sles goop needs abstracting out into the
974 # lbuild-{rhel5,sles10} method files
975 find_linux_devel_paths() {
981 # RHEL-style and SLES-style rpms
982 # XXX - until bug 19336 cleans this up, we need to extricate the
983 # ${lnxmin}- from the $lnxrel
984 local paths="kernels/${lnxmaj}${lnxmin}${delimiter}${lnxrel}-${TARGET_ARCH} linux-${lnxmaj}${lnxmin}${delimiter}${lnxrel##${lnxmin#.}-}"
987 for path in $paths; do
990 if [ -d "$src/$path/" ]; then
991 LINUX="$(pwd)/$src/$path"
993 # SLES has a separate -obj tree
994 if [ -d "$src/${path}-obj" ]; then
995 local src="$src/${path}-obj"
996 local objects="$TARGET_ARCH/$RPMSMPTYPE"
998 # Novell, are you *TRYING* to make life hard for me?
999 if [ -d "$src/powerpc" ]; then
1000 objects="powerpc/$TARGET_ARCH"
1001 elif [ $TARGET_ARCH == 'i686' ]; then
1002 objects="i386/$RPMSMPTYPE"
1005 LINUXOBJ="$(pwd)/$src/$objects"
1008 if [ -z "$LINUX" ]; then
1011 # dig out the release version
1012 LINUXRELEASE=$(find_linux_release ${LINUXOBJ:-$LINUX})
1013 if [ -z "$LINUXRELEASE" ]; then
1014 echo "Failed to find linux release in ${LINUXOBJ:-$LINUX}"
1025 # build kernel-ib{,-devel}
1027 # ofed 1.3 had a bug in the rpm spec
1028 if [ "$OFED_VERSION" = "1.3" ]; then
1032 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"
1033 local OFED_HARDWARE="--with-mthca-mod --with-mlx4-mod --with-mlx4_en-mod --with-cxgb3-mod --with-nes-mod"
1034 # some I/B drivers are architecture dependent and kernel-ib's configure
1035 # does not figure it out for us ~sigh~
1036 case "$TARGET_ARCH" in
1038 OFED_HARDWARE="$OFED_HARDWARE --with-ehca-mod"
1041 # we're no longer shipping the OFED iSCSI
1042 #OFED_ISCSI="--with-srp-mod --with-srp-target-mod"
1043 ## ISER module has no backport support as of OFED 1.5 (i.e. only builds on
1044 ##kernels >= 2.6.30)
1045 #if [[ $OFED_VERSION = 1.[0-4]* ]]; then
1046 # OFED_ISCSI="$OFED_ISCSI --with-iser-mod"
1049 local linuxrelease=$(find_linux_release "$linux")
1050 $RPMBUILD --rebuild --define 'build_kernel_ib 1' --define 'build_kernel_ib_devel 1' \
1051 --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
1052 --define "KVERSION ${linuxrelease}" \
1053 --define "$K_SRC ${linux}" \
1054 --define "LIB_MOD_DIR /lib/modules/${linuxrelease}/updates" \
1055 ${OFA_KERNEL_RELEASE:+--define "_release $OFA_KERNEL_RELEASE"} \
1056 --define "configure_options --without-quilt $OFED_CORE $OFED_HARDWARE $OFED_ISCSI" \
1057 ${TOPDIR}/OFED/SRPMS/ofa_kernel-*.src.rpm
1059 if [ ${PIPESTATUS[0]} != 0 ]; then
1060 fatal 1 "Error building kernel-ib"
1069 local signature="$4"
1070 local use_links="$5"
1077 location="$location"/"$signature"/"$module"
1078 mkdir -p "$location"
1079 # the cleanup script removes any directory that doesn't have a
1080 # .lastused, so let's try to prevent that as soon as we can
1081 # this solution still slightly racy with the cleanup script
1082 # but the race is a lot tighter now
1083 touch -t 197001010000 "$location/.lastused"
1084 ## use eval/echo here to make sure shell expansions are performed
1085 #if ! cp -a${linkflag} $(eval echo $articles) "$location"; then
1087 for article in $(eval echo $articles); do
1088 if ! cp -a${linkflag} "$article" "$location"; then
1089 error "Failed to copy \"$article\" to \"$location\" in store_for_reuse()"
1090 # rename the cache location so that it's not cached
1091 # product, but is around for analysis
1092 mv "$location"{,-bad-$(date +%s)} ||
1093 error "failed to clean up a failed cache attempt" \
1094 "in \"$location\" -- manual cleanup will be" \
1100 # flag the cache as complete (i.e. in case lbuild was previously
1101 # interrupted while caching)
1102 touch "$location/.lastused"
1111 local use_links="${3:-false}"
1112 local signature="$4"
1114 if [ -n "$REUSEBUILD" ] && [ -d "$REUSEBUILD/$signature/$module" ]; then
1115 if [ ! -f "$REUSEBUILD/$signature/$module/.lastused" ]; then
1116 # the .lastused flag is populated at the end of the caching to
1117 # signal that the caching was completed. if that flag is not
1118 # there, then the cache is invalid (and should be removed in fact)
1119 mv "$REUSEBUILD/$signature/$module"{,-bad-$(date +%s)} ||
1120 fatal 1 "failed to clean up a bad cache in location" \
1121 "\"$REUSEBUILD/$signature/$module\" -- manual cleanup" \
1126 # so that we know how stale this entry is
1127 touch $REUSEBUILD/$signature/$module/.lastused
1130 if ls $REUSEBUILD/$signature/$module/* >/dev/null 2>&1; then
1131 cp -al $REUSEBUILD/$signature/$module/* $dest/
1134 # copying is pretty heavy
1135 # cp -a $REUSEBUILD/$signature/$module/* $dest/
1136 # do some creative symlinking instead
1138 for dir in BUILD SRPMS SPECS; do
1139 if ls $REUSEBUILD/$signature/$module/$dir/* >/dev/null 2>&1; then
1140 ln -s $REUSEBUILD/$signature/$module/$dir/* $dest/$dir
1143 # sources have to be copied by file because we need SOURCES to
1144 # be a dir we can write into
1145 # could overrun ls's arg list here
1146 #ls $REUSEBUILD/$signature/$module/SOURCES/* |
1147 find $REUSEBUILD/$signature/$module/SOURCES/ -type f |
1148 xargs ln -t $dest/SOURCES -s
1150 # same for RPMS/* dirs
1151 # could overrun ls's arg list here
1152 #ls $REUSEBUILD/$signature/$module/RPMS/$TARGET_ARCH/* |
1154 for dir in $REUSEBUILD/$signature/$module/RPMS/*; do
1155 mkdir -p $dest/RPMS/${dir##*/}
1157 xargs ln -t $dest/RPMS/${dir##*/} -s
1170 if [[ $arch = i[3456]86 ]]; then
1179 # in a given directory, find the first rpm matching given requirements
1183 local match_type="$2"
1186 pushd "$dir" > /dev/null || \
1187 fatal 1 "Unable to chdir to directory \"$dir\" in find_rpm()"
1190 for file in $(ls *.rpm); do
1191 if [ ! -f "$file" ]; then
1194 case "$match_type" in
1196 # match is any valid ERE (i.e. given to egrep) match
1197 if rpm -q --provides -p "$file" | egrep -q "$match"; then
1205 fatal 1 "Unknown match type \"$match_type\" given to find_rpm()"
1214 build_kernel_with_srpm() {
1216 # need to generate the patch for this target
1217 do_patch_linux false >&2 # sets global $FULL_PATCH (yeah, yuck)
1219 # get an md5sum of the kernel patch + config for reuse check
1220 # XXX really, there needs to be a signature and a CONFIG_FILE per arch
1224 local release_str="RELEASE=$RELEASE\n"
1226 local REUSE_SIGNATURE=$({ echo -en $release_str; echo $BUILD_GEN; cat $CONFIG_FILE $TARGET_FILE $FULL_PATCH; } | md5sum | cut -d" " -f1)
1228 # see if we can link to the reuse pool
1229 # XXX - hrm. i'm not convinced this doesn't belong in the reuse "library"
1230 local CAN_LINK_FOR_REUSE=false
1231 touch $REUSEBUILD/$$
1232 if cp -al $REUSEBUILD/$$ $TOPDIR/; then
1233 CAN_LINK_FOR_REUSE=true
1237 # the extra version string to use for the kernel (which might be a reused
1239 local kernel_extra_version=""
1240 if $REUSERPM && ! reuse kernel "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1241 "$REUSE_SIGNATURE"; then
1242 # nothing cached, build from scratch
1243 if [ ! -r "$KERNELDIR/$KERNEL_SRPM" ]; then
1244 download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM" >&2
1247 if ! rpm -ivh $KERNELDIR/$KERNEL_SRPM \
1248 --define "_topdir $TOPDIR" >&2; then
1249 # should we clean this up or leave it for analysis?
1251 fatal 1 "Error installing kernel SRPM."
1254 # put the Lustre kernel patch into the RPM build tree
1255 cp $FULL_PATCH $TOPDIR/SOURCES/linux-${lnxmaj}-lustre.patch
1256 prepare_and_build_srpm >&2
1258 # store the resulting kernel RPM build tree for future use
1259 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
1260 "kernel" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1261 "$CAN_LINK_FOR_REUSE"; then
1262 error "Failed to store kernel RPMS for reuse"
1268 # figure out the EXTRA_VERSION of the kernel we built or are re-using
1270 if ! KERNEL_RPM=$(find_rpm "$TOPDIR/RPMS/$TARGET_ARCH/" provides "^kernel ="); then
1271 fatal 1 "Failed to find a kernel RPM in $TOPDIR/RPMS/$TARGET_ARCH/"
1273 kernel_extra_version=$(rpm -q --queryformat "%{RELEASE}" -p $TOPDIR/RPMS/$TARGET_ARCH/$KERNEL_RPM)
1275 # should now have the following RPMs
1276 # $TOPDIR/RPMS/$arch/kernel-lustre-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1277 # $TOPDIR/RPMS/$arch/kernel-lustre-devel-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1278 # $TOPDIR/RPMS/$arch/kernel-lustre-headers-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1279 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-common-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1280 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1282 echo $kernel_extra_version
1291 if [ -z "$version" -o "$version" = "inkernel" ]; then
1296 for arch in $BUILD_ARCHS; do
1297 targets="--target $arch $targets"
1300 local rpmbuildopt='-bb'
1303 echo NORPM mode. Only compiling.
1306 # if only we could just rebuild the src.rpm. but the included spec
1307 # is a real pig's breakfast. just check out the patch we need to
1308 # apply to it to make it useful.
1309 #$RPMBUILD --rebuild \
1310 # --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
1311 # ${TOPDIR}/mptlinux-*.src.rpm
1312 rpm -ivh --define "_topdir ${TOPDIR}" ${TOPDIR}/mptlinux-*.src.rpm
1314 # now the big honkin' patch to the spec file
1315 pushd ${TOPDIR}/SPECS
1316 # to regen this patch use:
1317 # !!cd ~/rpm/SPECS/ && diff -u mptlinux.spec{.dist,}
1318 patch -p0 < ${TOPDIR}/lustre/build/mptlinux.spec.patch || fatal 1 "failed to patch mptlinux.spec"
1322 for arch in $BUILD_ARCHS; do
1323 targets="--target $arch $targets"
1326 local rpmbuildopt='-bb'
1329 echo NORPM mode. Only compiling.
1332 if ! $RPMBUILD $targets $rpmbuildopt \
1333 --define "_tmppath /var/tmp" \
1334 --define "_topdir ${TOPDIR}" \
1335 --define "kernel_obj $linux" \
1336 ${TOPDIR}/SPECS/mptlinux.spec; then
1340 if ! $RPMBUILD -bs \
1341 --define "_tmppath /var/tmp" \
1342 --define "_topdir ${TOPDIR}" \
1343 --define "kernel_obj $linux" \
1344 ${TOPDIR}/SPECS/mptlinux.spec; then
1358 if [ -z "$version" -o "$version" = "inkernel" ]; then
1362 # note that we use an _, not a . before the spec on purpose. we are not
1363 # allowed to have more than one file with a .spec trailer in a tarball
1364 # that is supposed to be usable with rpmbuild
1365 cp lustre/build/rdac_spec ${TOPDIR}/SPECS/rdac.spec || fatal 1 "Could not find rdac.spec in lustre/build"
1368 for arch in $BUILD_ARCHS; do
1369 targets="--target $arch $targets"
1372 local rpmbuildopt='-bb'
1375 echo NORPM mode. Only compiling.
1380 rhel5) distro="REDHAT"
1382 sles1*) distro="SUSE"
1384 *) echo "$DISTRO not supported by RDAC, skipping"
1388 if ! $RPMBUILD $targets $rpmbuildopt --define "dist $distro" \
1389 --define "_tmppath /var/tmp" \
1390 --define "_topdir ${TOPDIR}" \
1391 --define "kernel_obj $linux" \
1392 ${TOPDIR}/SPECS/rdac.spec; then
1396 if ! $RPMBUILD -bs --define "dist $distro" \
1397 --define "_tmppath /var/tmp" \
1398 --define "_topdir ${TOPDIR}" \
1399 --define "kernel_obj $linux" \
1400 ${TOPDIR}/SPECS/rdac.spec; then
1411 # REUSEBUILD, REUSERPM
1416 local ofed_version="$2"
1418 # before lustre, build kernel-ib
1419 if [ -z "$ofed_version" -o "$ofed_version" = "inkernel" ]; then
1423 if [ -n "$REUSEBUILD" ]; then
1424 # see if we can link to the reuse pool
1425 # XXX - hrm. i'm not convinced this doesn't belong in the reuse
1427 local CAN_LINK_FOR_REUSE=false
1428 touch $REUSEBUILD/$$
1429 if cp -al $REUSEBUILD/$$ $TOPDIR/; then
1430 CAN_LINK_FOR_REUSE=true
1435 local REUSE_SIGNATURE=$({ echo "$ofed_version";
1436 echo "$(find_linux_release ${linux})";
1437 cat "${linux}/include/linux/autoconf.h"; } |
1438 md5sum | cut -d" " -f1)
1439 if ! $REUSERPM || ! reuse ofed "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1440 "$REUSE_SIGNATURE"; then
1441 # stash away the existing built articles for a moment
1443 mv {BUILD,{S,}RPMS,S{OURCE,PEC}S} bak
1446 find . | cpio -pudlm ..
1450 create_rpmbuild_dirs
1452 build_kernel_ib "${linux}"
1453 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
1454 "ofed" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1455 "$CAN_LINK_FOR_REUSE"; then
1456 error "Failed to store OFED RPMS for reuse"
1460 # put the stuff we stashed away back
1464 pushd "$TOPDIR" >/dev/null
1465 rm -rf kernel-ib-devel
1466 mkdir kernel-ib-devel
1468 # the actual ofed RPMs don't have the -rc$n or -$date string appened that
1469 # might be present on the file
1470 local linuxrelease=$(find_linux_release "$linux")
1471 ofed_version=$(echo $ofed_version |
1472 sed -re 's/-(20[0-9]{6,6}-[0-9]{4,4}|rc[0-9]*)$//')
1473 local rpm=$(ls $TOPDIR/RPMS/*/kernel-ib-devel-${ofed_version}-${linuxrelease//-/_}.*.rpm)
1474 rpm2cpio -itv < $rpm | cpio -id
1475 CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/ofa_kernel ${CONFIGURE_FLAGS}"
1482 if ! $PATCHLESS; then
1483 local kernel_extra_version
1484 if ! kernel_extra_version=$(build_kernel_with_srpm); then
1485 fatal 1 "Failed to build the kernel from it's SRPM"
1488 for arch in $BUILD_ARCHS; do
1489 local kernel_devel_rpm
1490 if ! kernel_devel_rpm=$(find_rpm "$TOPDIR/RPMS/$arch/" provides "^$(devel_kernel_name $KERNEL_LUSTRE_NAMING) ="); then
1491 fatal 1 "Failed to find a kernel development RPM in $TOPDIR/RPMS/$arch/"
1494 # install the -devel RPM in preparation for the lustre build
1495 # note that the EXTRA_VERSION_DELIMITER is *NOT* used in the
1496 # version of the directory name under /usr/src
1497 if ! lnxrel="$kernel_extra_version" unpack_linux_devel_rpm \
1498 "$TOPDIR/RPMS/$arch/$kernel_devel_rpm" "-"; then
1499 fatal 1 "Could not find the Linux tree in $TOPDIR/RPMS/$arch/$kernel_devel_rpm"
1503 # need to find and unpack the vendor's own kernel-devel for patchless
1506 if ! kernelrpm=$(find_linux_rpm "-$DEVEL_KERNEL_TYPE" ${EXTRA_VERSION_DELIMITER:-"-"}); then
1507 fatal 1 "Could not find the kernel-$DEVEL_KERNEL_TYPE RPM in ${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
1509 if ! lnxrel="$lnxrel" unpack_linux_devel_rpm "$kernelrpm" "-"; then
1510 fatal 1 "Could not find the Linux tree in $kernelrpm"
1514 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
1515 fatal 1 "error building OFED"
1517 build_rdac "${LINUXOBJ:-$LINUX}" "$RDAC_VERSION" ||
1518 fatal 1 "error building RDAC"
1520 build_mptlinux "${LINUXOBJ:-$LINUX}" "$MPTLINUX_VERSION" ||
1521 fatal 1 "error building mptlinux"
1524 if build_lustre "$LINUX" "$LINUXOBJ"; then
1525 # the build worked. resolve any symlinked files (i.e. from reuse)
1526 # in RPMS/$arch to real files so that that that huge mess of
1527 # complication known as LTS can copy them yet somewhere else.
1528 # is it any wonder this whole process is so damn so? anyone ever
1529 # heard of hardlinks? it this cool new thing that allows you save
1530 # tons of time and space by creating... well you can go read about
1531 # them if you have not heard about them yet.
1532 # can i say how much the implemenation of all of this really impedes
1534 pushd RPMS/$TARGET_ARCH
1536 if [ -h $file ]; then
1548 create_rpmbuild_dirs() {
1550 [ -d RPMS ] || mkdir RPMS
1551 for arch in $BUILD_ARCHS; do
1552 if [[ $arch = i?86 ]]; then
1553 # some stupidity in the sles11 kernel spec requires an RPMS/i386
1554 # even if the target arch is i686
1555 [ -d RPMS/i386 ] || mkdir RPMS/i386
1557 [ -d RPMS/$arch ] || mkdir RPMS/$arch
1559 [ -d BUILD ] || mkdir BUILD
1560 [ -d SOURCES ] || mkdir SOURCES
1561 [ -d SPECS ] || mkdir SPECS
1562 [ -d SRPMS ] || mkdir SRPMS
1584 [[ $list\ == *\ $item\ * ]]
1588 #########################################################################
1589 # Generate a backtrace through the call stack.
1593 #########################################################################
1597 local funcname="" sourcefile="" lineno="" n
1599 echo "Call stack: (most recent first)"
1600 for (( n = $strip ; n < ${#FUNCNAME[@]} ; ++n )) ; do
1601 funcname=${FUNCNAME[$n - 1]}
1602 sourcefile=$(basename ${BASH_SOURCE[$n]})
1603 lineno=${BASH_LINENO[$n - 1]}
1604 # Display function arguments
1605 if [[ ! -z "${BASH_ARGV[@]}" ]]; then
1606 local args newarg j p=0
1607 for (( j = ${BASH_ARGC[$n - 1]}; j > 0; j-- )); do
1608 newarg=${BASH_ARGV[$j + $p - 1]}
1609 args="${args:+${args} }'${newarg}'"
1611 let p+=${BASH_ARGC[$n - 1]}
1613 echo " ${funcname} ${args:+${args} }at ${sourcefile}:${lineno}"
1617 echo "BEGIN BACKTRACE"
1619 #echo ${BASH_LINENO[*]}
1620 #echo ${BASH_SOURCE[*]}
1621 #echo ${FUNCNAME[*]}
1622 local i=$((${#FUNCNAME[@]} - 1))
1623 while [ $i -ge 0 ]; do
1624 local SOURCELINE="${BASH_SOURCE[$i + 1]}:${BASH_LINENO[$i]}"
1625 # Can't figure out how to get function args from other frames...
1626 local FUNCTION="${FUNCNAME[$i]}()"
1627 echo "$SOURCELINE:$FUNCTION"
1631 echo "END BACKTRACE"
1637 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
1639 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 -- "$@")
1641 if [ $? != 0 ]; then
1645 eval set -- "$options"
1680 if ! KERNELTREE=$(canon_path "$2"); then
1681 fatal 1 "Could not determine the canonical location of $2"
1685 --linux | --with-linux)
1686 if ! LINUX=$(canon_path "$2"); then
1687 fatal 1 "Could not determine the canonical location of $2"
1700 if ! REUSEBUILD=$(canon_path "$2"); then
1701 fatal 1 "Could not determine the canonical location of $2"
1718 if ! KERNELRPMSBASE=$(canon_path "$2"); then
1719 fatal 1 "Could not determine the canonical location of $2"
1770 --disable-datestamp)
1781 CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-liblustre --enable-liblustre-tests"
1785 usage 1 "Unrecognized option: $1"
1795 EXTRA_VERSION_DELIMITER=${EXTRA_VERSION_DELIMITER:-"-"}
1797 if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
1799 unpack_ofed || fatal 1 "Error unpacking OFED tarball"
1802 if [ -n "$MPTLINUX_VERSION" -a "$MPTLINUX_VERSION" != "inkernel" ]; then
1804 unpack_mptlinux || fatal 1 "Error unpacking MPTLINUX distribution"
1807 # make sure the RPM build environment is set up
1808 create_rpmbuild_dirs
1810 if [ -n "$RDAC_VERSION" -a "$RDAC_VERSION" != "inkernel" ]; then
1812 # we don't actually need to unpack this. just put it in the SOURCES dir
1813 #unpack_rdac || fatal 1 "Error unpacking RDAC tarball"
1814 cp "$KERNELTREE/rdac-LINUX-${RDAC_VERSION}-source.tar.gz" ${TOPDIR}/SOURCES/ ||
1815 fatal 1 "Error copying RDAC source tarball to RPM SOURCES dir"
1818 trap '[ -n "$CCACHE" ] && ccache -s' EXIT
1820 # if an unpacked kernel source tree was given on the command line
1821 # just build lustre with it (nothing distro kernel specific here)
1822 if [ -n "$LINUX" ]; then
1823 build_mptlinux "${LINUXOBJ:-$LINUX}" "$MPTLINUX_VERSION" ||
1824 fatal 1 "error building mptlinux"
1825 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
1826 fatal 1 "error building OFED"
1827 build_rdac "${LINUXOBJ:-$LINUX}" "$RDAC_VERSION" ||
1828 fatal 1 "error building RDAC"
1829 build_lustre "$LINUX" "$LINUXOBJ"
1831 if [ -f "${0%/*}/lbuild-$DISTRO" ]; then
1832 seen_list=$(new_list)
1833 trap '(echo "Untrapped error"
1835 # have we seen this one
1836 echo "checking seen list for ${BASH_SOURCE[0]}:${BASH_LINENO[0]}"
1838 if is_list_member "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}"; then
1839 echo "seen this one already"
1841 seen_list=$(add_list "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}")
1847 ) | tee >(mail -s "Untrapped error at ${BASH_SOURCE[0]##*/}:${BASH_LINENO[0]} on $HOSTNAME" brian@sun.com) >&2' ERR
1850 source ${0%/*}/lbuild-$DISTRO
1852 build_with_srpm || fatal 1 "Failed to build_with_srpm"
1854 source ${0%/*}/lbuild.old_school
1856 old_school_download_kernel
1860 patchless_build_sequence && build_success=true
1862 [ "$DISTRO" = "sles9" ] && build_sequence_rpm_reuse && build_success=true
1863 if ! $build_success; then
1864 build_sequence_reuse && build_success=true
1865 if ! $build_success; then
1866 build_sequence && build_success=true
1867 if $build_success; then
1868 store_for_reuse || echo "Cannot store for future reuse"
1873 ( $build_success ) || fatal 1 "Cannot build lustre"