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