3 # vim:expandtab:shiftwidth=4:softtabstop=4:tabstop=4:
5 # this is an alternative FD for stdout, to be used especially when we are
6 # taking stdout from a function as it's return value. i.e. foo=$(bar)
7 # this is a workaround until a version of bash where we can put xtrace
13 if [[ $SHELLOPTS = *xtrace* ]]; then
18 # include the exit_traps library
19 . ${0%/lbuild}/exit_traps.sh
20 . ${0%/lbuild}/funcs.sh
22 # our children should die when we do
23 push_exit_trap "kill -INT -$$ || true" kill_children
25 # increment this if you have made a change that should force a new kernel
28 #BUILD_GEN=2 # bz19952: remove -lustre tag from kernel RPM names
29 #BUILD_GEN=3 # bz19975: enable the building of src.rpms by default
30 #BUILD_GEN=4 # bz22281: use the git hash in the kernel extra version
31 BUILD_GEN=5 # TT-107: don't cache the BUILD dir
35 # CVSROOT is inherited from the environment
40 # XXX - some recent hacking has pretty much neutered this option.
41 # search through this file (and lbuild.old_school -- but that will
42 # be going away soon) for "-bb" and see how many places
43 # simply don't account for this option
49 TARGET_ARCH="$(uname -m)"
50 # change default behavior to only build for the current arch
51 TARGET_ARCHS="$TARGET_ARCH"
52 TARGET_ARCHS_ALL="$TARGET_ARCH"
53 [ "$TARGET_ARCH" = "i686" ] && TARGET_ARCHS_ALL="i686 i586 i386"
58 TMPDIR=${TMPDIR:-"/var/tmp"}
60 # this is a dir to try reuse old kernel RPMs in (although, it seems to be
61 # unused in any real manner
63 # this is the dir that should be used to store reuse products
65 # should cached products be used or force rebuilding?
67 # what does this do exactly? does it imply no kernel build?
70 SKIPLDISKFSRPM="v1_4_* b1_4"
71 SMPTYPES="smp bigsmp default ''"
77 # default to not adding -lustre- into the kernel RPM package names
78 KERNEL_LUSTRE_NAMING=false
79 # default not use kabi check.
97 # not in the target file any more
100 # build the lustre-tests rpm?
112 # Readlink is not present on some older distributions: emulate it.
116 if [ -L "$path" ]; then
117 ll="$(LC_ALL=C ls -l "$path" 2> /dev/null)" &&
126 Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
129 Specifies the CVS Root to use when pulling files from CVS. The
130 environment variable \$CVSROOT is used if this option is not
133 --external-patches=EXTERNAL_PATCHES
134 Directory similar to lustre/lustre/kernel_patches/ that lbuild should
135 look for seres and config files in before looking in the lustre
138 --extraversion=EXTRAVERSION
139 Text to use for the rpm release and kernel extraversion.
141 --timestamp=TIMESTAMP
142 Date of building lustre in format YYYYMMDDhhmmss
145 Try to reuse old kernel RPMs from DIR
148 Try to reuse old kernel builds from DIR
151 Path to distro kernel RPM collection
157 Do not build RPMs (compile only mode)
160 Build lustre client only
163 Which distro using. Autodetect by default
165 --kerneldir=KERNELDIR
166 Directory containing Linux source tarballs referenced by target
169 --kerneltree=KERNELTREE
170 Directory containing dirs with Linux source tarballs referenced by target
171 files. Dir names in format kernel version ('2.6.9', etc.)
173 --linux=LINUX --with-linux=LINUX
174 Directory of Linux kernel sources. When this option is used, only
175 Lustre modules and userspace are built.
178 Path to an existing lustre source tarball to use instead of
182 Do not try to download a kernel from downloads.lustre.org
185 Do not build a .src.rpm, a full kernel patch, or a patched kernel
189 Do ldiskfs RPM. Now true by default
195 Specifies that the files generated do not include timestamps, and
196 that this is an official release.
199 Build a .src.rpm, a full kernel patch, and a patched kernel tarball.
202 Directory used to stage packages for release. RPMs will be placed
203 more or less in DIR/<target>-<arch>, and the tarball will be
207 A CVS branch/tag name to build from when pulling from CVS.
210 The name of the target to build. The available targets are listed
213 --target-archs=TARGET_ARCHS
214 A (space delimited) list of architectures to build. By default,
215 all of the archs supported by the TARGET will be built, in
216 addition to a .src.rpm. This option can limit those, for machines
217 that can only build certain archs or if you only want a certain
218 arch built (for testing, or a one-off kernel).
220 Also note that by using a non-"base" arch (eg, i386) only kernels
221 will be built - there will be no lustre-lite-utils package.
224 Prevents the datestamp flag (-D) from being passed to cvs for
225 checkouts. This is a workaround for a problem encountered when
226 using lbuild with tinderbox.
229 Builds a Xen domX kernel.
232 Set's a variable to a given value.
241 # canonicalize a relative path to a file
245 if [ ! -f "$PATH" ]; then
249 local FILE=${PATH##*/}
252 echo $(canon_path "$DIR")/$FILE
256 # canonicalize a relative path to a dir
260 if [ ! -d "$PATH" ]; then
264 pushd "$PATH" >/dev/null || return 1
274 if [ "$LUSTRE" ]; then
275 [ -r "$LUSTRE" ] || \
276 usage 1 "Could not find Lustre source tarball '$LUSTRE'."
279 usage 1 "Either specify a CVS Root with -d, or a Lustre source tarball with --lustre."
281 usage 1 "A branch/tag name must be specified with --tag when not building from a tarball."
284 [ -z "$DISTRO" ] && DISTRO=$(autodetect_distro)
286 if [ -z "$LINUX" ]; then
287 [ "$KERNELDIR" -o "$KERNELTREE" ] || \
288 usage 1 "A kernel directory must be specified with --kerneldir or --kerneltree."
290 [ -d "$KERNELDIR" -o -d "$KERNELTREE" ] || \
291 usage 1 "$KERNELDIR and $KERNELTREE are not a directory."
295 usage 1 "When building a snapshot, a tag name must be used."
298 [ "$TARGET" ] || TARGET=$(autodetect_target "$DISTRO")
299 # TARGET_FILE="$TOPDIR/lustre/kernel_patches/targets/$TARGET.target"
300 # [ -r "$TARGET_FILE" ] || \
301 # usage 1 "Target '$TARGET' was not found."
306 CANONICAL_TARGET="rhel6"
309 CANONICAL_TARGET="rhel5"
312 CANONICAL_TARGET="rhel-2.6"
315 CANONICAL_TARGET="sles-2.6"
318 CANONICAL_TARGET="sles10-2.6"
321 CANONICAL_TARGET="sles11"
324 CANONICAL_TARGET="oel5"
327 CANONICAL_TARGET="hp-pnnl-2.4"
335 CANONICAL_TARGET="$TARGET"
339 local timestampnodig=$(echo $TIMESTAMP | sed -e s/[0-9]*//g)
340 [ "$timestampnodig" = "" ] || TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M%S")
341 local timestamplength="${#TIMESTAMP}"
342 if [ $timestamplength -eq 12 ]; then
343 TIMESTAMP="${TIMESTAMP}00"
344 elif [ $timestamplength -ne 14 ]; then
345 TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M%S")
348 RPMBUILD=$(which rpmbuild 2>/dev/null | head -1)
349 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
350 RPMBUILD=$(which rpm 2>/dev/null | head -1)
351 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
352 usage 1 "Could not find binary for making rpms (tried rpmbuild and rpm)."
356 if [ -n "$CCACHE" ]; then
357 which "$DISTCC" &>/dev/null && export DISTCC RPM_BUILD_NCPUS
359 if which "$CCACHE" &>/dev/null; then
360 local ccache=$(which "$CCACHE")
361 local bindir="$TOPDIR/bin"
363 if [ ! -d $bindir ]; then
364 mkdir -p $bindir || fatal 1 "error trying to create $bindir"
366 rm ${bindir}/* > /dev/null 2>&1 || true
368 ln -s "$ccache" ${bindir}/ccache
369 ln -s "$ccache" ${bindir}/cc
370 ln -s "$ccache" ${bindir}/$CC
371 export PATH=$bindir:$PATH
372 export CCACHE && export CC="ccache $CC"
373 # zero the cache so we can see how effective we are being with it
377 # get some ccache stats when we are done
378 push_exit_trap '[ -n "$CCACHE" ] && ccache -s' "ccache_summary"
379 # should remove the ccache trap if lbuild is interrupted
380 trap 'echo "Received an INT TERM or HUP signal, terminating."; delete_exit_trap "ccache_summary"; exit 1' INT TERM HUP
390 echo $(echo "$*" | xargs -n 1 | sort -u)
399 if which wget >/dev/null 2>&1; then
400 if ! wget -nv "$url" -O "$target"; then
403 elif which curl >/dev/null 2>&1; then
404 if ! curl -L -s -o "$target" "$url"; then
408 fatal 1 "Could not find either wget or curl to fetch URLs."
418 local force="${3:-false}"
420 if $force || [ ! -r "$KERNELDIR/$srpm" ] ||
421 [ ! -s "$KERNELDIR/$srpm" ]; then
423 local location="http://downloads.lustre.org/public/kernels/$target/old"
424 # get the location from a distro specific method if it exists
425 if type -p kernel_srpm_location; then
426 location=$(kernel_srpm_location)
428 echo "Downloading $location/$srpm..."
429 if ! fetch_url "$location/$srpm" "$KERNELDIR/$srpm" 2>&1 ||
430 [ ! -s "$KERNELDIR/$srpm" ]; then
431 rm -f $KERNELDIR/$srpm
432 # punt to a distro specific method if it exists
433 if ! type -p download_srpm-$DISTRO; then
434 fatal 1 "Could not download target $target's kernel SRPM $srpm from $location."
436 if ! download_srpm-$DISTRO "$target" "$srpm" "$force"; then
437 fatal 1 "Could not download target $target's kernel SRPM $srpm using download_srpm-$DISTRO."
442 fatal 1 "$srpm not found in directory $KERNELDIR."
453 local file=${from##*/}
459 local semaphore="$to-downloading"
462 if [ ! -f $semaphore ]; then
466 # make sure the download has not been aborted
467 local now=$(date +%s)
468 local file_mtime=$(stat -c %Y "$to")
469 local staleness=$((now - file_mtime))
470 # let's assume an active download will write at least once a minute
471 if [ $staleness -gt 60 ]; then
479 # if the semaphore file exists, the file is either still downloading
480 # or a download was aborted and we cannot trust the target file
481 if [ -f $semaphore ]; then
485 if ! is_downloading && [ -r "$to" ] && [ -s "$to" ]; then
492 if $force || ! is_downloaded; then
493 if is_downloading; then
494 echo "Somebody else is downloading $from..."
495 while is_downloading; do
496 echo "Waiting for $to to finish downloading"
499 if is_downloaded; then
502 echo "The download we were waiting for seems to have been aborted"
508 echo "Downloading $from..."
509 # flag others so they don't try to download also
510 push_exit_trap "rm -f $to $semaphore" "download"
512 if ! fetch_url "$from" "$to" || [ ! -s "$to" ]; then
513 # the trap will remove the files via the fatal below
514 fatal 1 "Could not download ${to##*/} from ${from%/*}/."
517 delete_exit_trap "download"
519 fatal 1 "${to##*/} not found in directory ${to%/*}."
528 local force="${1:-false}"
530 if [ -z "$OFED_VERSION" -o "$OFED_VERSION" = "inkernel" ]; then
534 local OFED_BASE_VERSION=$OFED_VERSION
535 if [[ $OFED_VERSION = *.*.*.* ]]; then
536 OFED_BASE_VERSION=${OFED_VERSION%.*}
539 local location="http://www.openfabrics.org/downloads/OFED/ofed-${OFED_BASE_VERSION}/"
541 if [[ $OFED_VERSION = daily-* ]]; then
543 OFED_VERSION=${OFED_VERSION/daily-/}
544 Mmv=${OFED_VERSION%%-*}
545 daily=${OFED_VERSION##$Mmv-}
546 location="http://www.openfabrics.org/downloads/OFED/ofed-${Mmv}-daily/"
547 # find the filename for the version for the date specified
548 OFED_VERSION=$(curl -s "$location" | sed -nre "/${daily}-/s/.*href=\"OFED-(${Mmv//./\\.}-${daily}-[0-9]{4,4}).tgz.*$/\1/p" | tail -1)
549 if [ -z "$OFED_VERSION" ]; then
550 fatal 1 "Could not determine the filename of the OFED snapshot for ${daily}"
554 local file="OFED-${OFED_VERSION}.tgz"
555 download_file "$location/$file" "$KERNELTREE" "$force"
561 EXTRA_VERSION_save="$EXTRA_VERSION"
562 for patchesdir in "$EXTERNAL_PATCHES" \
563 "$TOPDIR/lustre/lustre/kernel_patches"; do
564 TARGET_FILE="$patchesdir/targets/$TARGET.target"
565 [ -r "$TARGET_FILE" ] && break
567 [ -r "$TARGET_FILE" ] || fatal 1 "Target $TARGET was not found."
569 echo "Loading target config file $TARGET.target..."
571 # if the caller specified an OFED_VERSION it should override whatever
572 # the target file specifies
573 local env_OFED_VERSION="$OFED_VERSION"
577 if [ -n "$env_OFED_VERSION" ]; then
578 OFED_VERSION="$env_OFED_VERSION"
581 # doesn't make any sense to build OFED for xen domX's
586 # XXX - set_rpm_smp_type is an ugly undeterministic hack. it needs to
587 # go away and the target just specify the $RPMSMPTYPE
588 [ -z "$RPMSMPTYPE" ] && set_rpm_smp_type
590 # CC might have been overwriten in TARGET_FILE
591 if [[ $CC != ccache\ * ]] && which "$CCACHE" &>/dev/null; then
592 export CCACHE && export CC="ccache $CC"
595 if [ ! "$KERNELTREE" = "" ] && [ -d "$KERNELTREE" ]; then
596 KERNELDIR="$KERNELTREE/${lnxmaj}"
597 [ -d "$KERNELDIR" ] || mkdir "$KERNELDIR"
600 # verify the series is available
601 if [ "$SERIES" ]; then
602 for series in $SERIES; do
603 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches"; do
604 [ -r "$patchesdir/series/$series" ] && continue 2
606 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."
610 # set the location of the .config file
616 if [ -f $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET-$TARGET_ARCH.config ]; then
617 CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET$XENPOSTFIX-$TARGET_ARCH${RPMSMPTYPE:+-}${RPMSMPTYPE}.config"
620 local lnxrelnew=${lnxrel//-/_}
622 # remember the EXTRA_VERSION before we diddle it here
623 # XXX - we really should not diddle with any values read in from the
624 # target file. if we want to modify a value, we should create
626 PRISTINE_EXTRA_VERSION=$EXTRA_VERSION
628 if ! $PATCHLESS && [ ! -f "$CONFIG_FILE" ]; then
629 fatal 1 "Config file for target $TARGET missing from $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/."
632 if [ "$EXTRA_VERSION_save" ]; then
633 EXTRA_VERSION="$EXTRA_VERSION_save"
634 elif ! $RELEASE; then
635 # if there is no patch series, then this is not a lustre specific
636 # kernel. don't make it look like one
637 if $PATCHLESS || [ -n "$SERIES" ]; then
638 EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
639 # EXTRA_VERSION="${EXTRA_VERSION}-${TAG}.${TIMESTAMP}"
640 if ! $PATCHLESS && [ -n "$BUILDID" ]; then
641 EXTRA_VERSION="${EXTRA_VERSION}.${BUILDID}"
645 # EXTRA_VERSION=${EXTRA_VERSION//-/_}
647 ALL_ARCHS="$BASE_ARCHS $BIGMEM_ARCHS $BOOT_ARCHS $JENSEN_ARCHS $SMP_ARCHS $BIGSMP_ARCHS $PSERIES64_ARCHS $UP_ARCHS"
650 for arch in $(uniqify "$ALL_ARCHS"); do
651 if [ -z "$TARGET_ARCHS" ] ||
652 [[ \ $TARGET_ARCHS\ = *\ $arch\ * ]]; then
653 BUILD_ARCHS="$BUILD_ARCHS $arch"
656 [ "$BUILD_ARCHS" ] || usage 1 "No available target archs to build."
657 echo "Building for: $BUILD_ARCHS"
665 fatal 1 "tarflags(): File name argument missing."
677 fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
686 local extractfile="$@"
688 echo "Untarring ${tarfile##*/}..."
689 tar $(tarflags "$tarfile") "$tarfile" $extractfile
695 if ! untar "$KERNELTREE/OFED-${OFED_VERSION}.tgz"; then
698 [ -d OFED ] || ln -sf OFED-[0-9].[0-9]* OFED
704 if [ -z "$LUSTRE" ]; then
707 if [ -n "$USE_DATESTAMP" ]; then
708 DATESTAMP="-D '$DATE'"
711 local DIRNAME="lustre-$TAG-$TIMESTAMP"
713 cvs -d "$CVSROOT" -qz3 co $DATESTAMP -d "$DIRNAME" lustre || \
714 fatal 1 "There was an error checking out toplevel Lustre from CVS."
715 pushd "$DIRNAME" > /dev/null
716 ./lustrecvs "$TAG" || \
717 fatal 1 "There was an error checking out Lustre/Portals/Build from CVS."
718 echo "Creating lustre tarball..."
719 sh autogen.sh || fatal 1 "There was an error running autogen.sh."
720 ./configure --enable-dist || \
721 fatal 1 "There was an error running ./configure to create makefiles."
722 make dist || fatal 1 "There was an error running 'make dist'."
723 LUSTRE=$PWD/lustre-*.tar.gz
727 untar "$LUSTRE" || fatal 1 "Error unpacking Lustre tarball"
728 [ -d lustre ] || ln -sf lustre-[0-9].[0-9]* lustre
734 local do_patch=${1:-true}
736 FULL_PATCH="$PWD/lustre-kernel-${TARGET}-${EXTRA_VERSION}.patch"
737 [ -f "$FULL_PATCH" ] && rm -f "$FULL_PATCH"
738 $do_patch && pushd linux >/dev/null
739 for series in $SERIES; do
740 echo -n "Applying series $series:"
741 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches"; do
742 [ -r "$patchesdir/series/$series" ] || continue
743 SERIES_FILE="$patchesdir/series/$series"
744 for patch in $(<"$SERIES_FILE"); do
746 PATCH_FILE="$patchesdir/patches/$patch"
747 [ -r "$PATCH_FILE" ] || \
748 fatal 1 "Patch $patch does not exist in Lustre tree."
749 cat "$PATCH_FILE" >> "$FULL_PATCH" || {
751 fatal 1 "Error adding patch $patch to full patch."
754 patch -s -p1 < "$PATCH_FILE" 2>&1 || {
756 fatal 1 "Error applying patch $patch."
764 $do_patch && popd >/dev/null
765 echo "Full patch has been saved in ${FULL_PATCH##*/}."
775 pushd lustre >/dev/null
777 echo "Building Lustre RPMs for: $BUILD_ARCHS..."
779 for arch in $BUILD_ARCHS; do
780 targets="--target $arch $targets"
786 confoptions="$confoptions --disable-server"
789 local rpmbuildopt='-tb'
792 echo NORPM mode. Only compiling.
795 ( $(skeep_ldiskfs_rpm $TAG) ) || {
797 pushd ldiskfs > /dev/null || return 255
799 if ! ./configure --enable-dist; then
800 echo "failed to configure in ldiskfs"
801 popd >/dev/null # pushd ldiskfs
802 popd >/dev/null # pushd lustre
806 if ! make dist 2>&1; then
807 popd >/dev/null # pushd ldiskfs
808 popd >/dev/null # pushd lustre
812 #cp lustre-ldiskfs*.tar.gz $TOPDIR/SOURCES || \
813 # fatal 1 "Could not copy lustre-ldiskfs*.tar.gz to $TOPDIR/SOURCES"
815 if ! $RPMBUILD $targets $rpmbuildopt lustre-ldiskfs*.tar.gz \
816 --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
817 --define "kdir $linux" \
818 ${linuxobj:+--define "kobjdir $linuxobj"} \
819 --define "_tmppath /var/tmp" \
820 --define "_topdir $TOPDIR" 2>&1; then
821 popd >/dev/null # pushd ldiskfs
822 popd >/dev/null # pushd lustre
827 if ! $RPMBUILD -ts lustre-ldiskfs*.tar.gz \
828 --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
829 --define "kdir $linux" \
830 ${linuxobj:+--define "kobjdir $linuxobj"} \
831 --define "_tmppath /var/tmp" \
832 --define "_topdir $TOPDIR" 2>&1; then
833 popd >/dev/null # pushd ldiskfs
834 popd >/dev/null # pushd lustre
838 popd >/dev/null # pushd ldiskfs
840 # tell lustre where ldiskfs is
841 # XXX - pointing to the RPM BUILD dir is a hack. we need to flesh
842 # out the ldiskfs RPM build so that it builds a
843 # lustre-ldiskfs-devel RPM and install that and point lustre
845 confoptions="$confoptions --with-ldiskfs=$(ls -d $TOPDIR/BUILD/lustre-ldiskfs-*)"
848 # convert the $PATCHLESS boolean to an empty/not-empty boolean
849 # as silly as this seems, it makes the syntax of the rpmbuild command
850 # simpler and not need an eval to deal with the quotes in the quotes
851 local is_patchless=""
856 # ditto for the lustre-tests boolean
857 local lustre_tests=""
858 if ! $LUSTRE_TESTS; then
862 $RPMBUILD $targets $rpmbuildopt "$LUSTRE" \
863 ${is_patchless:+--define "lustre_name lustre-client"} \
864 ${lustre_tests:+--define "build_lustre_tests 0"} \
865 ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
866 --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
867 --define "kdir $linux" \
868 ${linuxobj:+--define "kobjdir $linuxobj"} \
869 --define "_tmppath $TMPDIR" \
870 --define "_topdir $TOPDIR" 2>&1 || \
871 fatal 1 "Error building rpms for $BUILD_ARCHS."
874 if ! $RPMBUILD -ts "$LUSTRE" \
875 ${is_patchless:+--define "lustre_name lustre-client"} \
876 ${lustre_tests:+--define "build_lustre_tests 0"} \
877 ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
878 --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
879 --define "kdir $linux" \
880 ${linuxobj:+--define "kobjdir $linuxobj"} \
881 --define "_tmppath $TMPDIR" \
882 --define "_topdir $TOPDIR" 2>&1; then
893 [ "$STAGEDIR" ] || return 0
895 for arch in $BUILD_ARCHS; do
896 rpmdir="${STAGEDIR}/${CANONICAL_TARGET}-${arch}"
897 echo "${0##*/}: Copying RPMs into ${rpmdir}"
899 cp -v RPMS/${arch}/*.rpm "${rpmdir}"
900 if [ -d RPMS/noarch ]; then
901 cp -v RPMS/noarch/*.rpm "${rpmdir}"
905 cp -v "$LUSTRE" "$STAGEDIR"
909 #check if we need to build separate ldiskfs RPM
910 skeep_ldiskfs_rpm() {
915 if ! $LDISKFSRPM; then
917 elif $PATCHLESS; then
920 for skiptag in $SKIPLDISKFSRPM; do
921 [[ $tag == $skiptag ]] && skip=true && break
931 local infact_arch="${TARGET_ARCH}"
934 [ "$infact_arch" == "i586" ] && infact_arch="i686"
937 for smp_type in $SMP_ARCHS; do
938 [ $infact_arch == $smp_type ] && RPMSMPTYPE=smp && break
941 for smp_type in $BIGSMP_ARCHS; do
942 [ $infact_arch == $smp_type ] && RPMSMPTYPE=bigsmp && break
945 for smp_type in $PPC64_ARCHS; do
946 [ $infact_arch == $smp_type ] && RPMSMPTYPE=ppc64 && break
949 for smp_type in $DEFAULT_ARCHS; do
950 [ $infact_arch == $smp_type ] && RPMSMPTYPE=default && break
955 # This function takes a linux source pool and digs out the linux release
957 find_linux_release() {
960 local LINUXRELEASEHEADER=$SRCDIR/include/linux/version.h
961 if [ -s $SRCDIR/include/linux/utsrelease.h ]; then
962 LINUXRELEASEHEADER=$SRCDIR/include/linux/utsrelease.h
965 sed -ne 's/#define UTS_RELEASE "\(.*\)"$/\1/p' $LINUXRELEASEHEADER
969 # unpack kernel(/source/devel) RPM
971 # This function and it's setting of $LINUX and $LINUXOBJ is a total hack that
972 # needs to completely refactored. It completely ingores that $BUILD_ARCHS may
973 # contain a list of arches for which rpmbuild commands (including the one for
975 unpack_linux_devel_rpm() {
976 local kernelrpm="${1}"
978 [ -f "$kernelrpm" ] || return 255
979 [ -d $TOPDIR/reused ] || mkdir $TOPDIR/reused || return 255
981 pushd $TOPDIR/reused &>/dev/null || return 255
983 if ! rpm2cpio < "$kernelrpm" | cpio -id > /dev/null 2>&1; then
987 # call a distro specific hook, if available
988 if type -p unpack_linux_devel_rpm-$DISTRO; then
989 if ! unpack_linux_devel_rpm-$DISTRO "$kernelrpm"; then
996 find_linux_devel_paths $TOPDIR/reused
1005 # build kernel-ib{,-devel}
1007 # ofed 1.3 had a bug in the rpm spec
1008 if [ "$OFED_VERSION" = "1.3" ]; then
1012 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"
1013 local OFED_HARDWARE="--with-mthca-mod --with-mlx4-mod --with-mlx4_en-mod --with-cxgb3-mod --with-nes-mod"
1014 # some I/B drivers are architecture dependent and kernel-ib's configure
1015 # does not figure it out for us ~sigh~
1016 case "$TARGET_ARCH" in
1018 OFED_HARDWARE="$OFED_HARDWARE --with-ehca-mod"
1021 # we're no longer shipping the OFED iSCSI
1022 #OFED_ISCSI="--with-srp-mod --with-srp-target-mod"
1023 ## ISER module has no backport support as of OFED 1.5 (i.e. only builds on
1024 ##kernels >= 2.6.30)
1025 #if [[ $OFED_VERSION = 1.[0-4]* ]]; then
1026 # OFED_ISCSI="$OFED_ISCSI --with-iser-mod"
1029 # assume we are just rebuilding the SRPM
1030 local BUILD_TYPE=${BUILD_TYPE:-"--rebuild"}
1031 local SOURCE="${TOPDIR}/OFED/SRPMS/ofa_kernel-*.src.rpm"
1033 # but switch to building from the SPEC if we need to apply patches
1034 if ls ${TOPDIR}/lustre/build/patches/ofed/* >/dev/null; then
1036 rpm --define "_topdir ${TOPDIR}" -ivh $SOURCE
1037 SOURCE="${TOPDIR}/SPECS/ofa_kernel.spec"
1038 local file ed_fragment1 ed_fragment2 n=1
1039 for file in $(ls ${TOPDIR}/lustre/build/patches/ofed/*); do
1040 ed_fragment1="$ed_fragment1
1041 Patch$n: ${file%%*/}"
1042 ed_fragment2="$ed_fragment2
1044 cp $file ${TOPDIR}/SOURCES
1048 if [ $n -gt 1 ]; then
1061 local linuxrelease=$(find_linux_release "$linux")
1062 if ! $RPMBUILD $BUILD_TYPE --define 'build_kernel_ib 1' --define 'build_kernel_ib_devel 1' \
1063 ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
1064 --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
1065 --define "KVERSION ${linuxrelease}" \
1066 --define "$K_SRC ${linux}" \
1067 --define "LIB_MOD_DIR /lib/modules/${linuxrelease}/updates" \
1068 ${OFA_KERNEL_RELEASE:+--define "_release $OFA_KERNEL_RELEASE"} \
1069 --define "configure_options --without-quilt $OFED_CORE $OFED_HARDWARE $OFED_ISCSI" \
1070 ${SOURCE} 2>&1; then
1071 fatal 1 "Error building kernel-ib"
1080 local signature="$4"
1081 local use_links="$5"
1088 local default_iface=$(/sbin/ip route get 192.1.1.1 | sed -ne 's/.* dev \(.*\) * src .*/\1/p')
1089 if [ -z "$default_iface" ]; then
1090 fatal 1 "Failed to determine the default route interface"
1092 local unique_id=$(/sbin/ip addr show dev $default_iface | sed -ne '/ inet /s/ *inet \(.*\)\/.*/\1/p' | head -1)
1093 if [ -z "$unique_id" ]; then
1094 fatal 1 "Failed to determine a unique id from interface $default_interface"
1097 local finallocation="$location"/"$signature"/"$module"
1098 location="$location"/"$signature-${unique_id}"/"$module"
1099 mkdir -p "$location"
1100 # the cleanup script removes any directory that doesn't have a
1101 # .lastused, so let's try to prevent that as soon as we can
1102 # this solution still slightly racy with the cleanup script
1103 # but the race is a lot tighter now
1104 touch -t 197001010000 "$location/.lastused"
1105 ## use eval/echo here to make sure shell expansions are performed
1106 #if ! cp -a${linkflag} $(eval echo $articles) "$location"; then
1108 for article in $(eval echo $articles); do
1109 if ! cp -a${linkflag} "$article" "$location"; then
1110 error "Failed to copy \"$article\" to \"$location\" in store_for_reuse()"
1111 # rename the cache location so that it's not cached
1112 # product, but is around for analysis
1113 mv "$location"{,-bad-$(date +%s)} ||
1114 error "failed to clean up a failed cache attempt" \
1115 "in \"$location\" -- manual cleanup will be" \
1121 # flag the cache as complete (i.e. in case lbuild was previously
1122 # interrupted while caching)
1123 touch "$location/.lastused"
1125 # put the temporary location into the final location
1127 mkdir -p "${finallocation%/*}"
1128 mv "$location" "$finallocation"
1129 rmdir "${location%/*}"
1137 local use_links="${3:-false}"
1138 local signature="$4"
1140 if [ -n "$REUSEBUILD" ] && [ -d "$REUSEBUILD/$signature/$module" ]; then
1141 if [ ! -f "$REUSEBUILD/$signature/$module/.lastused" ]; then
1142 # the .lastused flag is populated at the end of the caching to
1143 # signal that the caching was completed. if that flag is not
1144 # there, then the cache is invalid (and should be removed in fact)
1145 mv "$REUSEBUILD/$signature/$module"{,-bad-$(date +%s)} ||
1146 fatal 1 "failed to clean up a bad cache in location $REUSEBUILD/$signature/$module\" -- manual cleanup will be necessary"
1150 # so that we know how stale this entry is
1151 touch $REUSEBUILD/$signature/$module/.lastused
1154 if ls $REUSEBUILD/$signature/$module/* >/dev/null 2>&1; then
1155 cp -al $REUSEBUILD/$signature/$module/* $dest/
1158 # copying is pretty heavy
1159 # cp -a $REUSEBUILD/$signature/$module/* $dest/
1160 # do some creative symlinking instead
1162 for dir in BUILD SRPMS SPECS; do
1163 if ls $REUSEBUILD/$signature/$module/$dir/* >/dev/null 2>&1; then
1164 ln -s $REUSEBUILD/$signature/$module/$dir/* $dest/$dir
1167 # sources have to be copied by file because we need SOURCES to
1168 # be a dir we can write into
1169 # could overrun ls's arg list here
1170 #ls $REUSEBUILD/$signature/$module/SOURCES/* |
1171 find $REUSEBUILD/$signature/$module/SOURCES/ -type f |
1172 xargs ln -t $dest/SOURCES -s
1174 # same for RPMS/* dirs
1175 # could overrun ls's arg list here
1176 #ls $REUSEBUILD/$signature/$module/RPMS/$TARGET_ARCH/* |
1178 for dir in $REUSEBUILD/$signature/$module/RPMS/*; do
1179 mkdir -p $dest/RPMS/${dir##*/}
1181 xargs ln -t $dest/RPMS/${dir##*/} -s
1193 if [[ $arch = i[3456]86 ]]; then
1201 build_kernel_with_srpm() {
1204 if [ -z "$outfd" ] || [ $outfd = 1 ]; then
1205 fatal 1 "You must supply a file descriptor to ${FUNCNAME[0]} and it cannot be 1"
1208 # need to generate the patch for this target
1209 do_patch_linux false >&${outfd} # sets global $FULL_PATCH (yeah, yuck)
1211 # get an md5sum of the kernel patch + config for reuse check
1212 # XXX really, there needs to be a signature and a CONFIG_FILE per arch
1216 local release_str="RELEASE=$RELEASE\n"
1219 if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
1220 local REUSE_SIGNATURE=$({ echo -en $release_str;
1222 cat $CONFIG_FILE $TARGET_FILE $FULL_PATCH; } |
1223 md5sum | cut -d" " -f1)
1224 # see if we can link to the reuse pool
1225 # XXX - hrm. i'm not convinced this doesn't belong in the reuse
1227 local CAN_LINK_FOR_REUSE=false
1228 touch $REUSEBUILD/$$
1229 if cp -al $REUSEBUILD/$$ $TOPDIR/ 2>/dev/null; then
1230 CAN_LINK_FOR_REUSE=true
1235 # the extra version string to use for the kernel (which might be a reused
1237 local kernel_extra_version=""
1238 if ! $USE_BUILD_CACHE || ! reuse kernel "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1239 "$REUSE_SIGNATURE"; then
1240 # nothing cached, build from scratch
1241 if [ ! -r "$KERNELDIR/$KERNEL_SRPM" ]; then
1242 echo "Downloading kernel SRPM" >&${outfd}
1243 download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM" >&${outfd}
1246 if ! rpm -ivh $KERNELDIR/$KERNEL_SRPM \
1247 --define "_topdir $TOPDIR" >&${outfd} 2>&1; then
1248 # should we clean this up or leave it for analysis?
1250 fatal 1 "Error installing kernel SRPM."
1253 # put the Lustre kernel patch into the RPM build tree
1254 cp $FULL_PATCH $TOPDIR/SOURCES/linux-${lnxmaj}-lustre.patch
1255 prepare_and_build_srpm >&${outfd} ||
1256 fatal 1 "failed to prepare_and_build_srpm"
1258 if [ -z "$REUSE_SIGNATURE" ]; then
1259 echo "No reuse signature was caculated so not storing the built kernel" >&${outfd}
1261 # store the resulting kernel RPM build tree for future use
1262 echo "Storing the built kernel for future reuse" >&${outfd}
1263 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,SRPMS,RPMS}" \
1264 "kernel" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1265 "$CAN_LINK_FOR_REUSE"; then
1266 error "Failed to store kernel RPMS for reuse"
1267 echo "unknown" >&${outfd}
1273 # figure out the EXTRA_VERSION of the kernel we built or are re-using
1275 if ! KERNEL_RPM=$(find_rpm "$TOPDIR/RPMS/$TARGET_ARCH/" provides "^kernel ="); then
1276 fatal 1 "Failed to find a kernel RPM in $TOPDIR/RPMS/$TARGET_ARCH/"
1278 kernel_extra_version=$(rpm -q --queryformat "%{RELEASE}" -p $TOPDIR/RPMS/$TARGET_ARCH/$KERNEL_RPM)
1280 # should now have the following RPMs
1281 # $TOPDIR/RPMS/$arch/kernel-lustre-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1282 # $TOPDIR/RPMS/$arch/kernel-lustre-devel-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1283 # $TOPDIR/RPMS/$arch/kernel-lustre-headers-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1284 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-common-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1285 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1287 echo $kernel_extra_version
1295 # REUSEBUILD, USE_BUILD_CACHE
1300 local ofed_version="$2"
1302 # if an ofed version is given, then it means use OFED proper,
1303 # not any vendor specific "inkernel" version
1304 if [ -z "$ofed_version" ]; then
1308 if [ "$ofed_version" = "inkernel" ]; then
1309 # see if there is a distro specific override for this and use
1311 # XXX we need to better integrate a distro specific override with
1312 # the rest of this function so that all of the reuse cache
1313 # stuff is leveraged given that 80% of this function is reuse
1314 if type -p build_ofed-${DISTRO}; then
1316 ofed_location=$(build_ofed-${DISTRO} ${STDOUT})
1317 local rc=${PIPESTATUS[0]}
1318 CONFIGURE_FLAGS="--with-o2ib=${ofed_location} ${CONFIGURE_FLAGS}"
1326 if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
1327 local REUSE_SIGNATURE=$({ echo "$ofed_version";
1328 echo "$(find_linux_release ${linux})";
1329 cat "${linux}/include/linux/autoconf.h"; } |
1330 md5sum | cut -d" " -f1)
1331 # see if we can link to the reuse pool
1332 # XXX - hrm. i'm not convinced this doesn't belong in the reuse
1334 local CAN_LINK_FOR_REUSE=false
1335 touch $REUSEBUILD/$$
1336 if cp -al $REUSEBUILD/$$ $TOPDIR/; then
1337 CAN_LINK_FOR_REUSE=true
1342 if ! $USE_BUILD_CACHE || ! reuse ofed "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1343 "$REUSE_SIGNATURE"; then
1344 if [ -n "$REUSE_SIGNATURE" ]; then
1345 # stash away the existing built articles for a moment
1347 mv {BUILD,{S,}RPMS,S{OURCE,PEC}S} bak
1350 find . | cpio -pudlm ..
1354 create_rpmbuild_dirs
1357 build_kernel_ib "${linux}"
1359 if [ -z "$REUSE_SIGNATURE" ]; then
1360 echo "No reuse signature was caculated so not storing the built ofed"
1362 # store the resulting RPM build tree for future use
1363 echo "Storing the built ofed for future reuse"
1364 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
1365 "ofed" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1366 "$CAN_LINK_FOR_REUSE"; then
1367 error "Failed to store OFED RPMS for reuse"
1371 # put the stuff we stashed away back
1376 pushd "$TOPDIR" >/dev/null
1377 rm -rf kernel-ib-devel
1378 mkdir kernel-ib-devel
1380 # the actual ofed RPMs don't have the -rc$n or -$date string appened that
1381 # might be present on the file
1382 local linuxrelease=$(find_linux_release "$linux")
1383 ofed_version=$(echo $ofed_version |
1384 sed -re 's/-(20[0-9]{6,6}-[0-9]{4,4}|rc[0-9]*)$//')
1385 local rpm=$(ls $TOPDIR/RPMS/*/kernel-ib-devel-${ofed_version}-${linuxrelease//-/_}.*.rpm)
1386 if ! rpm2cpio < $rpm | cpio -id; then
1387 fatal 1 "could not unpack the kernel-ib-devel rpm."
1389 CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/ofa_kernel ${CONFIGURE_FLAGS}"
1396 if ! $PATCHLESS; then
1397 local kernel_extra_version
1398 if ! kernel_extra_version=$(build_kernel_with_srpm ${STDOUT}); then
1399 fatal 1 "Failed to build the kernel from it's SRPM"
1402 for arch in $BUILD_ARCHS; do
1403 local kernel_devel_rpm
1404 if ! kernel_devel_rpm=$(find_rpm "$TOPDIR/RPMS/$arch/" provides "^$(devel_kernel_name $KERNEL_LUSTRE_NAMING) ="); then
1405 fatal 1 "Failed to find a kernel development RPM in $TOPDIR/RPMS/$arch/"
1408 # install the -devel RPM in preparation for modules builds
1409 if ! lnxrel="$kernel_extra_version" unpack_linux_devel_rpm \
1410 "$TOPDIR/RPMS/$arch/$kernel_devel_rpm"; then
1411 fatal 1 "Could not find the Linux tree in $TOPDIR/RPMS/$arch/$kernel_devel_rpm"
1415 # need to find and unpack the vendor's own kernel-devel for patchless
1418 if ! kernelrpm=$(find_linux_rpm "-$DEVEL_KERNEL_TYPE"); then
1419 fatal 1 "Could not find the kernel-$DEVEL_KERNEL_TYPE RPM in ${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
1421 if ! lnxrel="$lnxrel" unpack_linux_devel_rpm "$kernelrpm" "-"; then
1422 fatal 1 "Could not find the Linux tree in $kernelrpm"
1426 # ~sigh~ have to make copies of and modify some of the rpm
1427 # infrastructure files so that find-requires can find our unpacked
1428 # kernel-devel artifacts
1429 cp $RPM_HELPERS_DIR/{symset-table,find-requires{,.ksyms}} .
1430 FIND_REQUIRES="$(pwd)/find-requires"
1431 chmod 755 {symset-table,find-requires{,.ksyms}}
1433 tmp="${tmp//\//\\/}"
1434 ed find-requires <<EOF
1438 /|.*find-requires.ksyms/s/|/| bash -x/
1439 g/ [^ ]*\/\(find-requires\.ksyms\)/s// $tmp\/\1/g
1442 ed find-requires.ksyms <<EOF
1446 g/\/.*\/\(symset-table\)/s//$tmp\/\1/g
1449 ed symset-table <<EOF
1453 g/\(\/boot\/\)/s//$tmp\/reused\1/g
1454 g/\(\/usr\/src\/kernels\/\)/s//$tmp\/reused\1/g
1458 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
1459 fatal 1 "error building OFED"
1462 if build_lustre "$LINUX" "$LINUXOBJ"; then
1463 # the build worked. resolve any symlinked files (i.e. from reuse)
1464 # in RPMS/$arch to real files so that that that huge mess of
1465 # complication known as LTS can copy them yet somewhere else.
1466 # is it any wonder this whole process is so damn so? anyone ever
1467 # heard of hardlinks? it's this cool new thing that allows you save
1468 # tons of time and space by creating... well you can go read about
1469 # them if you have not heard about them yet.
1470 # can i say how much the implemenation of all of this really impedes
1473 for dir in RPMS/*; do
1475 for file in $(ls); do
1476 if [ -h $file ]; then
1483 # also, for i?86, make sure all of the RPMs are in RPMS/$TARGET_ARCH
1484 # as that's where LTS expects to find them
1485 for dir in RPMS/*; do
1486 if [ $dir = RPMS/$TARGET_ARCH ]; then
1491 if [ -n "$files" ]; then
1492 cp -al $files ../$TARGET_ARCH
1502 create_rpmbuild_dirs() {
1504 [ -d RPMS ] || mkdir RPMS
1505 for arch in $BUILD_ARCHS; do
1506 if [[ $arch = i?86 ]]; then
1507 # some stupidity in the sles11 kernel spec requires an RPMS/i386
1508 # even if the target arch is i686
1509 [ -d RPMS/i386 ] || mkdir RPMS/i386
1511 [ -d RPMS/$arch ] || mkdir RPMS/$arch
1513 [ -d BUILD ] || mkdir BUILD
1514 [ -d SOURCES ] || mkdir SOURCES
1515 [ -d SPECS ] || mkdir SPECS
1516 [ -d SRPMS ] || mkdir SRPMS
1538 [[ $list\ == *\ $item\ * ]]
1542 #########################################################################
1543 # Generate a backtrace through the call stack.
1547 #########################################################################
1551 local funcname="" sourcefile="" lineno="" n
1553 echo "Call stack: (most recent first)"
1554 for (( n = $strip ; n < ${#FUNCNAME[@]} ; ++n )) ; do
1555 funcname=${FUNCNAME[$n - 1]}
1556 sourcefile=$(basename ${BASH_SOURCE[$n]})
1557 lineno=${BASH_LINENO[$n - 1]}
1561 # Display function arguments
1562 if [[ ! -z "${BASH_ARGV[@]}" ]]; then
1563 local args newarg j p=0
1564 for (( j = ${BASH_ARGC[$n - 1]}; j > 0; j-- )); do
1565 newarg=${BASH_ARGV[$j + $p - 1]}
1566 args="${args:+${args} }'${newarg}'"
1568 let p+=${BASH_ARGC[$n - 1]}
1570 echo " ${funcname} ${args:+${args} }at ${sourcefile}:${lineno}"
1574 echo "BEGIN BACKTRACE"
1576 #echo ${BASH_LINENO[*]}
1577 #echo ${BASH_SOURCE[*]}
1578 #echo ${FUNCNAME[*]}
1579 local i=$((${#FUNCNAME[@]} - 1))
1580 while [ $i -ge 0 ]; do
1581 local lineno=${BASH_LINENO[$i]}
1585 local SOURCELINE="${BASH_SOURCE[$i + 1]}:${lineno}"
1586 # Can't figure out how to get function args from other frames...
1587 local FUNCTION="${FUNCNAME[$i]}()"
1588 echo "$SOURCELINE:$FUNCTION"
1592 echo "END BACKTRACE"
1598 seen_list=$(new_list)
1600 echo "An unexpected error has occurred at ${BASH_SOURCE[0]##*/}:$((LINENO-1)).
1601 Unfortunately the above line number in the message may or may not be correct,
1602 but details have been send to the lbuild maintainer. Attempting to continue."; (echo "Untrapped error"
1604 # have we seen this one
1605 echo "checking seen list for ${BASH_SOURCE[0]}:${BASH_LINENO[0]}"
1607 if is_list_member "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}"; then
1608 echo "seen this one already"
1610 seen_list=$(add_list "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}")
1616 ) | mail -s "Untrapped error at ${BASH_SOURCE[0]##*/}:$((LINENO-15)) on $HOSTNAME" brian@sun.com >&2; set $xtrace' ERR
1619 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
1621 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 -- "$@")
1623 if [ $? != 0 ]; then
1627 eval set -- "$options"
1662 if ! KERNELTREE=$(canon_path "$2"); then
1663 fatal 1 "Could not determine the canonical location of $2"
1667 --linux | --with-linux)
1668 if ! LINUX=$(canon_path "$2"); then
1669 fatal 1 "Could not determine the canonical location of $2"
1682 if ! REUSEBUILD=$(canon_path "$2"); then
1683 fatal 1 "Could not determine the canonical location of $2"
1700 if ! KERNELRPMSBASE=$(canon_path "$2"); then
1701 fatal 1 "Could not determine the canonical location of $2"
1710 if ! LUSTRE=$(canon_filepath "$2"); then
1711 fatal 1 "Could not determine the canonical location of $2"
1754 --disable-datestamp)
1768 # there are actually some lustre configure flags that we need to
1769 # handle ourselves (but we still give them to configure)
1770 if [[ \ $@\ == *\ --disable-tests\ * ]]; then
1774 CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-liblustre --enable-liblustre-tests"
1778 usage 1 "Unrecognized option: $1"
1787 # XXX - should we _always_ get the buildid from the META file? what are the
1788 # other (i.e. non-lustre-tarball use cases of lbuild)?
1789 BUILDID=$(sed -ne '/^BUILDID =/s/.*= *//p' lustre/META)
1793 if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
1795 unpack_ofed || fatal 1 "Error unpacking OFED tarball"
1798 # make sure the RPM build environment is set up
1799 create_rpmbuild_dirs
1801 # if an unpacked kernel source tree was given on the command line
1802 # just build lustre with it (nothing distro kernel specific here)
1803 if [ -n "$LINUX" ]; then
1804 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
1805 fatal 1 "error building OFED"
1806 build_lustre "$LINUX" "$LINUXOBJ"
1808 if [ -f "${0%/*}/lbuild-$DISTRO" ]; then
1809 source ${0%/*}/lbuild-$DISTRO
1811 build_with_srpm || fatal 1 "Failed to build_with_srpm"
1813 EXTRA_VERSION_DELIMITER=${EXTRA_VERSION_DELIMITER:-"-"}
1814 source ${0%/*}/lbuild.old_school
1816 old_school_download_kernel
1820 patchless_build_sequence && build_success=true
1822 [ "$DISTRO" = "sles9" ] && build_sequence_rpm_reuse && build_success=true
1823 if ! $build_success; then
1824 build_sequence_reuse && build_success=true
1825 if ! $build_success; then
1826 build_sequence && build_success=true
1827 if $build_success; then
1828 store_for_reuse || echo "Cannot store for future reuse"
1833 ( $build_success ) || fatal 1 "Cannot build lustre"