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/*.patch); do
1040 ed_fragment1="$ed_fragment1
1041 Patch$n: ${file%%*/}"
1042 ed_fragment2="$ed_fragment2
1044 cp $file ${TOPDIR}/SOURCES
1047 for file in $(ls ${TOPDIR}/lustre/build/patches/ofed/*.ed); do
1048 ed_fragment3="$ed_fragment3
1053 if [ $n -gt 1 ]; then
1067 local linuxrelease=$(find_linux_release "$linux")
1068 if ! $RPMBUILD $BUILD_TYPE --define 'build_kernel_ib 1' --define 'build_kernel_ib_devel 1' \
1069 ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
1070 --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
1071 --define "KVERSION ${linuxrelease}" \
1072 --define "$K_SRC ${linux}" \
1073 --define "LIB_MOD_DIR /lib/modules/${linuxrelease}/updates" \
1074 ${OFA_KERNEL_RELEASE:+--define "_release $OFA_KERNEL_RELEASE"} \
1075 --define "configure_options --without-quilt $OFED_CORE $OFED_HARDWARE $OFED_ISCSI" \
1076 ${SOURCE} 2>&1; then
1077 fatal 1 "Error building kernel-ib"
1086 local signature="$4"
1087 local use_links="$5"
1094 local default_iface=$(/sbin/ip route get 192.1.1.1 | sed -ne 's/.* dev \(.*\) * src .*/\1/p')
1095 if [ -z "$default_iface" ]; then
1096 fatal 1 "Failed to determine the default route interface"
1098 local unique_id=$(/sbin/ip addr show dev $default_iface | sed -ne '/ inet /s/ *inet \(.*\)\/.*/\1/p' | head -1)
1099 if [ -z "$unique_id" ]; then
1100 fatal 1 "Failed to determine a unique id from interface $default_interface"
1103 local finallocation="$location"/"$signature"/"$module"
1104 location="$location"/"$signature-${unique_id}"/"$module"
1105 mkdir -p "$location"
1106 # the cleanup script removes any directory that doesn't have a
1107 # .lastused, so let's try to prevent that as soon as we can
1108 # this solution still slightly racy with the cleanup script
1109 # but the race is a lot tighter now
1110 touch -t 197001010000 "$location/.lastused"
1111 ## use eval/echo here to make sure shell expansions are performed
1112 #if ! cp -a${linkflag} $(eval echo $articles) "$location"; then
1114 for article in $(eval echo $articles); do
1115 if ! cp -a${linkflag} "$article" "$location"; then
1116 error "Failed to copy \"$article\" to \"$location\" in store_for_reuse()"
1117 # rename the cache location so that it's not cached
1118 # product, but is around for analysis
1119 mv "$location"{,-bad-$(date +%s)} ||
1120 error "failed to clean up a failed cache attempt" \
1121 "in \"$location\" -- manual cleanup will be" \
1127 # flag the cache as complete (i.e. in case lbuild was previously
1128 # interrupted while caching)
1129 touch "$location/.lastused"
1131 # put the temporary location into the final location
1133 mkdir -p "${finallocation%/*}"
1134 mv "$location" "$finallocation"
1135 rmdir "${location%/*}"
1143 local use_links="${3:-false}"
1144 local signature="$4"
1146 if [ -n "$REUSEBUILD" ] && [ -d "$REUSEBUILD/$signature/$module" ]; then
1147 if [ ! -f "$REUSEBUILD/$signature/$module/.lastused" ]; then
1148 # the .lastused flag is populated at the end of the caching to
1149 # signal that the caching was completed. if that flag is not
1150 # there, then the cache is invalid (and should be removed in fact)
1151 mv "$REUSEBUILD/$signature/$module"{,-bad-$(date +%s)} ||
1152 fatal 1 "failed to clean up a bad cache in location $REUSEBUILD/$signature/$module\" -- manual cleanup will be necessary"
1156 # so that we know how stale this entry is
1157 touch $REUSEBUILD/$signature/$module/.lastused
1160 if ls $REUSEBUILD/$signature/$module/* >/dev/null 2>&1; then
1161 cp -al $REUSEBUILD/$signature/$module/* $dest/
1164 # copying is pretty heavy
1165 # cp -a $REUSEBUILD/$signature/$module/* $dest/
1166 # do some creative symlinking instead
1168 for dir in BUILD SRPMS SPECS; do
1169 if ls $REUSEBUILD/$signature/$module/$dir/* >/dev/null 2>&1; then
1170 ln -s $REUSEBUILD/$signature/$module/$dir/* $dest/$dir
1173 # sources have to be copied by file because we need SOURCES to
1174 # be a dir we can write into
1175 # could overrun ls's arg list here
1176 #ls $REUSEBUILD/$signature/$module/SOURCES/* |
1177 find $REUSEBUILD/$signature/$module/SOURCES/ -type f |
1178 xargs ln -t $dest/SOURCES -s
1180 # same for RPMS/* dirs
1181 # could overrun ls's arg list here
1182 #ls $REUSEBUILD/$signature/$module/RPMS/$TARGET_ARCH/* |
1184 for dir in $REUSEBUILD/$signature/$module/RPMS/*; do
1185 mkdir -p $dest/RPMS/${dir##*/}
1187 xargs ln -t $dest/RPMS/${dir##*/} -s
1199 if [[ $arch = i[3456]86 ]]; then
1207 build_kernel_with_srpm() {
1210 if [ -z "$outfd" ] || [ $outfd = 1 ]; then
1211 fatal 1 "You must supply a file descriptor to ${FUNCNAME[0]} and it cannot be 1"
1214 # need to generate the patch for this target
1215 do_patch_linux false >&${outfd} # sets global $FULL_PATCH (yeah, yuck)
1217 # get an md5sum of the kernel patch + config for reuse check
1218 # XXX really, there needs to be a signature and a CONFIG_FILE per arch
1222 local release_str="RELEASE=$RELEASE\n"
1225 if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
1226 local REUSE_SIGNATURE=$({ echo -en $release_str;
1228 cat $CONFIG_FILE $TARGET_FILE $FULL_PATCH; } |
1229 md5sum | cut -d" " -f1)
1230 # see if we can link to the reuse pool
1231 # XXX - hrm. i'm not convinced this doesn't belong in the reuse
1233 local CAN_LINK_FOR_REUSE=false
1234 touch $REUSEBUILD/$$
1235 if cp -al $REUSEBUILD/$$ $TOPDIR/ 2>/dev/null; then
1236 CAN_LINK_FOR_REUSE=true
1241 # the extra version string to use for the kernel (which might be a reused
1243 local kernel_extra_version=""
1244 if ! $USE_BUILD_CACHE || ! reuse kernel "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1245 "$REUSE_SIGNATURE"; then
1246 # nothing cached, build from scratch
1247 if [ ! -r "$KERNELDIR/$KERNEL_SRPM" ]; then
1248 echo "Downloading kernel SRPM" >&${outfd}
1249 download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM" >&${outfd}
1252 if ! rpm -ivh $KERNELDIR/$KERNEL_SRPM \
1253 --define "_topdir $TOPDIR" >&${outfd} 2>&1; then
1254 # should we clean this up or leave it for analysis?
1256 fatal 1 "Error installing kernel SRPM."
1259 # put the Lustre kernel patch into the RPM build tree
1260 cp $FULL_PATCH $TOPDIR/SOURCES/linux-${lnxmaj}-lustre.patch
1261 prepare_and_build_srpm >&${outfd} ||
1262 fatal 1 "failed to prepare_and_build_srpm"
1264 if [ -z "$REUSE_SIGNATURE" ]; then
1265 echo "No reuse signature was caculated so not storing the built kernel" >&${outfd}
1267 # store the resulting kernel RPM build tree for future use
1268 echo "Storing the built kernel for future reuse" >&${outfd}
1269 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,SRPMS,RPMS}" \
1270 "kernel" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1271 "$CAN_LINK_FOR_REUSE"; then
1272 error "Failed to store kernel RPMS for reuse"
1273 echo "unknown" >&${outfd}
1279 # figure out the EXTRA_VERSION of the kernel we built or are re-using
1281 if ! KERNEL_RPM=$(find_rpm "$TOPDIR/RPMS/$TARGET_ARCH/" provides "^kernel ="); then
1282 fatal 1 "Failed to find a kernel RPM in $TOPDIR/RPMS/$TARGET_ARCH/"
1284 kernel_extra_version=$(rpm -q --queryformat "%{RELEASE}" -p $TOPDIR/RPMS/$TARGET_ARCH/$KERNEL_RPM)
1286 # should now have the following RPMs
1287 # $TOPDIR/RPMS/$arch/kernel-lustre-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1288 # $TOPDIR/RPMS/$arch/kernel-lustre-devel-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1289 # $TOPDIR/RPMS/$arch/kernel-lustre-headers-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1290 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-common-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1291 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1293 echo $kernel_extra_version
1301 # REUSEBUILD, USE_BUILD_CACHE
1306 local ofed_version="$2"
1308 # if an ofed version is given, then it means use OFED proper,
1309 # not any vendor specific "inkernel" version
1310 if [ -z "$ofed_version" ]; then
1314 if [ "$ofed_version" = "inkernel" ]; then
1315 # see if there is a distro specific override for this and use
1317 # XXX we need to better integrate a distro specific override with
1318 # the rest of this function so that all of the reuse cache
1319 # stuff is leveraged given that 80% of this function is reuse
1320 if type -p build_ofed-${DISTRO}; then
1322 ofed_location=$(build_ofed-${DISTRO} ${STDOUT})
1323 local rc=${PIPESTATUS[0]}
1324 CONFIGURE_FLAGS="--with-o2ib=${ofed_location} ${CONFIGURE_FLAGS}"
1332 if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
1333 local REUSE_SIGNATURE=$({ echo "$ofed_version";
1334 echo "$(find_linux_release ${linux})";
1335 cat "${linux}/include/linux/autoconf.h"; } |
1336 md5sum | cut -d" " -f1)
1337 # see if we can link to the reuse pool
1338 # XXX - hrm. i'm not convinced this doesn't belong in the reuse
1340 local CAN_LINK_FOR_REUSE=false
1341 touch $REUSEBUILD/$$
1342 if cp -al $REUSEBUILD/$$ $TOPDIR/; then
1343 CAN_LINK_FOR_REUSE=true
1348 if ! $USE_BUILD_CACHE || ! reuse ofed "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1349 "$REUSE_SIGNATURE"; then
1350 if [ -n "$REUSE_SIGNATURE" ]; then
1351 # stash away the existing built articles for a moment
1353 mv {BUILD,{S,}RPMS,S{OURCE,PEC}S} bak
1356 find . | cpio -pudlm ..
1360 create_rpmbuild_dirs
1363 build_kernel_ib "${linux}"
1365 if [ -z "$REUSE_SIGNATURE" ]; then
1366 echo "No reuse signature was caculated so not storing the built ofed"
1368 # store the resulting RPM build tree for future use
1369 echo "Storing the built ofed for future reuse"
1370 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
1371 "ofed" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1372 "$CAN_LINK_FOR_REUSE"; then
1373 error "Failed to store OFED RPMS for reuse"
1377 # put the stuff we stashed away back
1382 pushd "$TOPDIR" >/dev/null
1383 rm -rf kernel-ib-devel
1384 mkdir kernel-ib-devel
1386 # the actual ofed RPMs don't have the -rc$n or -$date string appened that
1387 # might be present on the file
1388 local linuxrelease=$(find_linux_release "$linux")
1389 ofed_version=$(echo $ofed_version |
1390 sed -re 's/-(20[0-9]{6,6}-[0-9]{4,4}|rc[0-9]*)$//')
1391 local rpm=$(ls $TOPDIR/RPMS/*/kernel-ib-devel-${ofed_version}-${linuxrelease//-/_}.*.rpm)
1392 if ! rpm2cpio < $rpm | cpio -id; then
1393 fatal 1 "could not unpack the kernel-ib-devel rpm."
1395 CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/ofa_kernel ${CONFIGURE_FLAGS}"
1402 if ! $PATCHLESS; then
1403 local kernel_extra_version
1404 if ! kernel_extra_version=$(build_kernel_with_srpm ${STDOUT}); then
1405 fatal 1 "Failed to build the kernel from it's SRPM"
1408 for arch in $BUILD_ARCHS; do
1409 local kernel_devel_rpm
1410 if ! kernel_devel_rpm=$(find_rpm "$TOPDIR/RPMS/$arch/" provides "^$(devel_kernel_name $KERNEL_LUSTRE_NAMING) ="); then
1411 fatal 1 "Failed to find a kernel development RPM in $TOPDIR/RPMS/$arch/"
1414 # install the -devel RPM in preparation for modules builds
1415 if ! lnxrel="$kernel_extra_version" unpack_linux_devel_rpm \
1416 "$TOPDIR/RPMS/$arch/$kernel_devel_rpm"; then
1417 fatal 1 "Could not find the Linux tree in $TOPDIR/RPMS/$arch/$kernel_devel_rpm"
1421 # need to find and unpack the vendor's own kernel-devel for patchless
1424 if ! kernelrpm=$(find_linux_rpm "-$DEVEL_KERNEL_TYPE"); then
1425 fatal 1 "Could not find the kernel-$DEVEL_KERNEL_TYPE RPM in ${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
1427 if ! lnxrel="$lnxrel" unpack_linux_devel_rpm "$kernelrpm" "-"; then
1428 fatal 1 "Could not find the Linux tree in $kernelrpm"
1432 # ~sigh~ have to make copies of and modify some of the rpm
1433 # infrastructure files so that find-requires can find our unpacked
1434 # kernel-devel artifacts
1435 cp $RPM_HELPERS_DIR/{symset-table,find-requires{,.ksyms}} .
1436 FIND_REQUIRES="$(pwd)/find-requires"
1437 chmod 755 {symset-table,find-requires{,.ksyms}}
1439 tmp="${tmp//\//\\/}"
1440 ed find-requires <<EOF
1444 /|.*find-requires.ksyms/s/|/| bash -x/
1445 g/ [^ ]*\/\(find-requires\.ksyms\)/s// $tmp\/\1/g
1448 ed find-requires.ksyms <<EOF
1452 g/\/.*\/\(symset-table\)/s//$tmp\/\1/g
1455 ed symset-table <<EOF
1459 g/\(\/boot\/\)/s//$tmp\/reused\1/g
1460 g/\(\/usr\/src\/kernels\/\)/s//$tmp\/reused\1/g
1464 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
1465 fatal 1 "error building OFED"
1468 if build_lustre "$LINUX" "$LINUXOBJ"; then
1469 # the build worked. resolve any symlinked files (i.e. from reuse)
1470 # in RPMS/$arch to real files so that that that huge mess of
1471 # complication known as LTS can copy them yet somewhere else.
1472 # is it any wonder this whole process is so damn so? anyone ever
1473 # heard of hardlinks? it's this cool new thing that allows you save
1474 # tons of time and space by creating... well you can go read about
1475 # them if you have not heard about them yet.
1476 # can i say how much the implemenation of all of this really impedes
1479 for dir in RPMS/*; do
1481 for file in $(ls); do
1482 if [ -h $file ]; then
1489 # also, for i?86, make sure all of the RPMs are in RPMS/$TARGET_ARCH
1490 # as that's where LTS expects to find them
1491 for dir in RPMS/*; do
1492 if [ $dir = RPMS/$TARGET_ARCH ]; then
1497 if [ -n "$files" ]; then
1498 cp -al $files ../$TARGET_ARCH
1508 create_rpmbuild_dirs() {
1510 [ -d RPMS ] || mkdir RPMS
1511 for arch in $BUILD_ARCHS; do
1512 if [[ $arch = i?86 ]]; then
1513 # some stupidity in the sles11 kernel spec requires an RPMS/i386
1514 # even if the target arch is i686
1515 [ -d RPMS/i386 ] || mkdir RPMS/i386
1517 [ -d RPMS/$arch ] || mkdir RPMS/$arch
1519 [ -d BUILD ] || mkdir BUILD
1520 [ -d SOURCES ] || mkdir SOURCES
1521 [ -d SPECS ] || mkdir SPECS
1522 [ -d SRPMS ] || mkdir SRPMS
1544 [[ $list\ == *\ $item\ * ]]
1548 #########################################################################
1549 # Generate a backtrace through the call stack.
1553 #########################################################################
1557 local funcname="" sourcefile="" lineno="" n
1559 echo "Call stack: (most recent first)"
1560 for (( n = $strip ; n < ${#FUNCNAME[@]} ; ++n )) ; do
1561 funcname=${FUNCNAME[$n - 1]}
1562 sourcefile=$(basename ${BASH_SOURCE[$n]})
1563 lineno=${BASH_LINENO[$n - 1]}
1567 # Display function arguments
1568 if [[ ! -z "${BASH_ARGV[@]}" ]]; then
1569 local args newarg j p=0
1570 for (( j = ${BASH_ARGC[$n - 1]}; j > 0; j-- )); do
1571 newarg=${BASH_ARGV[$j + $p - 1]}
1572 args="${args:+${args} }'${newarg}'"
1574 let p+=${BASH_ARGC[$n - 1]}
1576 echo " ${funcname} ${args:+${args} }at ${sourcefile}:${lineno}"
1580 echo "BEGIN BACKTRACE"
1582 #echo ${BASH_LINENO[*]}
1583 #echo ${BASH_SOURCE[*]}
1584 #echo ${FUNCNAME[*]}
1585 local i=$((${#FUNCNAME[@]} - 1))
1586 while [ $i -ge 0 ]; do
1587 local lineno=${BASH_LINENO[$i]}
1591 local SOURCELINE="${BASH_SOURCE[$i + 1]}:${lineno}"
1592 # Can't figure out how to get function args from other frames...
1593 local FUNCTION="${FUNCNAME[$i]}()"
1594 echo "$SOURCELINE:$FUNCTION"
1598 echo "END BACKTRACE"
1604 seen_list=$(new_list)
1606 echo "An unexpected error has occurred at ${BASH_SOURCE[0]##*/}:$((LINENO-1)).
1607 Unfortunately the above line number in the message may or may not be correct,
1608 but details have been send to the lbuild maintainer. Attempting to continue."; (echo "Untrapped error"
1610 # have we seen this one
1611 echo "checking seen list for ${BASH_SOURCE[0]}:${BASH_LINENO[0]}"
1613 if is_list_member "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}"; then
1614 echo "seen this one already"
1616 seen_list=$(add_list "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}")
1622 ) | mail -s "Untrapped error at ${BASH_SOURCE[0]##*/}:$((LINENO-15)) on $HOSTNAME" brian@sun.com >&2; set $xtrace' ERR
1625 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
1627 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 -- "$@")
1629 if [ $? != 0 ]; then
1633 eval set -- "$options"
1668 if ! KERNELTREE=$(canon_path "$2"); then
1669 fatal 1 "Could not determine the canonical location of $2"
1673 --linux | --with-linux)
1674 if ! LINUX=$(canon_path "$2"); then
1675 fatal 1 "Could not determine the canonical location of $2"
1688 if ! REUSEBUILD=$(canon_path "$2"); then
1689 fatal 1 "Could not determine the canonical location of $2"
1706 if ! KERNELRPMSBASE=$(canon_path "$2"); then
1707 fatal 1 "Could not determine the canonical location of $2"
1716 if ! LUSTRE=$(canon_filepath "$2"); then
1717 fatal 1 "Could not determine the canonical location of $2"
1760 --disable-datestamp)
1774 # there are actually some lustre configure flags that we need to
1775 # handle ourselves (but we still give them to configure)
1776 if [[ \ $@\ == *\ --disable-tests\ * ]]; then
1780 CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-liblustre --enable-liblustre-tests"
1784 usage 1 "Unrecognized option: $1"
1793 # XXX - should we _always_ get the buildid from the META file? what are the
1794 # other (i.e. non-lustre-tarball use cases of lbuild)?
1795 BUILDID=$(sed -ne '/^BUILDID =/s/.*= *//p' lustre/META)
1799 if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
1801 unpack_ofed || fatal 1 "Error unpacking OFED tarball"
1804 # make sure the RPM build environment is set up
1805 create_rpmbuild_dirs
1807 # if an unpacked kernel source tree was given on the command line
1808 # just build lustre with it (nothing distro kernel specific here)
1809 if [ -n "$LINUX" ]; then
1810 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
1811 fatal 1 "error building OFED"
1812 build_lustre "$LINUX" "$LINUXOBJ"
1814 if [ -f "${0%/*}/lbuild-$DISTRO" ]; then
1815 source ${0%/*}/lbuild-$DISTRO
1817 build_with_srpm || fatal 1 "Failed to build_with_srpm"
1819 EXTRA_VERSION_DELIMITER=${EXTRA_VERSION_DELIMITER:-"-"}
1820 source ${0%/*}/lbuild.old_school
1822 old_school_download_kernel
1826 patchless_build_sequence && build_success=true
1828 [ "$DISTRO" = "sles9" ] && build_sequence_rpm_reuse && build_success=true
1829 if ! $build_success; then
1830 build_sequence_reuse && build_success=true
1831 if ! $build_success; then
1832 build_sequence && build_success=true
1833 if $build_success; then
1834 store_for_reuse || echo "Cannot store for future reuse"
1839 ( $build_success ) || fatal 1 "Cannot build lustre"