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-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 target
1022 #OFED_ISCSI="--with-srp-mod --with-srp-target-mod"
1023 OFED_ISCSI="--with-srp-mod"
1024 ## ISER module has no backport support as of OFED 1.5 (i.e. only builds on
1025 ##kernels >= 2.6.30)
1026 #if [[ $OFED_VERSION = 1.[0-4]* ]]; then
1027 # OFED_ISCSI="$OFED_ISCSI --with-iser-mod"
1030 # assume we are just rebuilding the SRPM
1031 local BUILD_TYPE=${BUILD_TYPE:-"--rebuild"}
1032 local SOURCE="${TOPDIR}/OFED/SRPMS/ofa_kernel-*.src.rpm"
1034 # but switch to building from the SPEC if we need to apply patches
1035 if ls ${TOPDIR}/lustre/build/patches/ofed/* >/dev/null; then
1037 rpm --define "_topdir ${TOPDIR}" -ivh $SOURCE
1038 SOURCE="${TOPDIR}/SPECS/ofa_kernel.spec"
1039 local file ed_fragment1 ed_fragment2 n=1
1040 for file in $(ls ${TOPDIR}/lustre/build/patches/ofed/*.patch); do
1041 ed_fragment1="$ed_fragment1
1042 Patch$n: ${file%%*/}"
1043 ed_fragment2="$ed_fragment2
1045 cp $file ${TOPDIR}/SOURCES
1048 for file in $(ls ${TOPDIR}/lustre/build/patches/ofed/*.ed); do
1049 ed_fragment3="$ed_fragment3
1054 if [ $n -gt 1 ]; then
1068 local linuxrelease=$(find_linux_release "$linux")
1069 if ! $RPMBUILD $BUILD_TYPE --define 'build_kernel_ib 1' --define 'build_kernel_ib_devel 1' \
1070 ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
1071 --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
1072 --define "KVERSION ${linuxrelease}" \
1073 --define "$K_SRC ${linux}" \
1074 --define "LIB_MOD_DIR /lib/modules/${linuxrelease}/updates" \
1075 ${OFA_KERNEL_RELEASE:+--define "_release $OFA_KERNEL_RELEASE"} \
1076 --define "configure_options --without-quilt $OFED_CORE $OFED_HARDWARE $OFED_ISCSI" \
1077 ${SOURCE} 2>&1; then
1078 fatal 1 "Error building kernel-ib"
1087 local signature="$4"
1088 local use_links="$5"
1095 local default_iface=$(/sbin/ip route get 192.1.1.1 | sed -ne 's/.* dev \(.*\) * src .*/\1/p')
1096 if [ -z "$default_iface" ]; then
1097 fatal 1 "Failed to determine the default route interface"
1099 local unique_id=$(/sbin/ip addr show dev $default_iface | sed -ne '/ inet /s/ *inet \(.*\)\/.*/\1/p' | head -1)
1100 if [ -z "$unique_id" ]; then
1101 fatal 1 "Failed to determine a unique id from interface $default_interface"
1104 local finallocation="$location"/"$signature"/"$module"
1105 location="$location"/"$signature-${unique_id}"/"$module"
1106 mkdir -p "$location"
1107 # the cleanup script removes any directory that doesn't have a
1108 # .lastused, so let's try to prevent that as soon as we can
1109 # this solution still slightly racy with the cleanup script
1110 # but the race is a lot tighter now
1111 touch -t 197001010000 "$location/.lastused"
1112 ## use eval/echo here to make sure shell expansions are performed
1113 #if ! cp -a${linkflag} $(eval echo $articles) "$location"; then
1115 for article in $(eval echo $articles); do
1116 if ! cp -a${linkflag} "$article" "$location"; then
1117 error "Failed to copy \"$article\" to \"$location\" in store_for_reuse()"
1118 # rename the cache location so that it's not cached
1119 # product, but is around for analysis
1120 mv "$location"{,-bad-$(date +%s)} ||
1121 error "failed to clean up a failed cache attempt" \
1122 "in \"$location\" -- manual cleanup will be" \
1128 # flag the cache as complete (i.e. in case lbuild was previously
1129 # interrupted while caching)
1130 touch "$location/.lastused"
1132 # put the temporary location into the final location
1134 mkdir -p "${finallocation%/*}"
1135 mv "$location" "$finallocation"
1136 rmdir "${location%/*}"
1144 local use_links="${3:-false}"
1145 local signature="$4"
1147 if [ -n "$REUSEBUILD" ] && [ -d "$REUSEBUILD/$signature/$module" ]; then
1148 if [ ! -f "$REUSEBUILD/$signature/$module/.lastused" ]; then
1149 # the .lastused flag is populated at the end of the caching to
1150 # signal that the caching was completed. if that flag is not
1151 # there, then the cache is invalid (and should be removed in fact)
1152 mv "$REUSEBUILD/$signature/$module"{,-bad-$(date +%s)} ||
1153 fatal 1 "failed to clean up a bad cache in location $REUSEBUILD/$signature/$module\" -- manual cleanup will be necessary"
1157 # so that we know how stale this entry is
1158 touch $REUSEBUILD/$signature/$module/.lastused
1161 if ls $REUSEBUILD/$signature/$module/* >/dev/null 2>&1; then
1162 cp -al $REUSEBUILD/$signature/$module/* $dest/
1165 # copying is pretty heavy
1166 # cp -a $REUSEBUILD/$signature/$module/* $dest/
1167 # do some creative symlinking instead
1169 for dir in BUILD SRPMS SPECS; do
1170 if ls $REUSEBUILD/$signature/$module/$dir/* >/dev/null 2>&1; then
1171 ln -s $REUSEBUILD/$signature/$module/$dir/* $dest/$dir
1174 # sources have to be copied by file because we need SOURCES to
1175 # be a dir we can write into
1176 # could overrun ls's arg list here
1177 #ls $REUSEBUILD/$signature/$module/SOURCES/* |
1178 find $REUSEBUILD/$signature/$module/SOURCES/ -type f |
1179 xargs ln -t $dest/SOURCES -s
1181 # same for RPMS/* dirs
1182 # could overrun ls's arg list here
1183 #ls $REUSEBUILD/$signature/$module/RPMS/$TARGET_ARCH/* |
1185 for dir in $REUSEBUILD/$signature/$module/RPMS/*; do
1186 mkdir -p $dest/RPMS/${dir##*/}
1188 xargs ln -t $dest/RPMS/${dir##*/} -s
1200 if [[ $arch = i[3456]86 ]]; then
1208 build_kernel_with_srpm() {
1211 if [ -z "$outfd" ] || [ $outfd = 1 ]; then
1212 fatal 1 "You must supply a file descriptor to ${FUNCNAME[0]} and it cannot be 1"
1215 # need to generate the patch for this target
1216 do_patch_linux false >&${outfd} # sets global $FULL_PATCH (yeah, yuck)
1218 # get an md5sum of the kernel patch + config for reuse check
1219 # XXX really, there needs to be a signature and a CONFIG_FILE per arch
1223 local release_str="RELEASE=$RELEASE\n"
1226 if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
1227 local REUSE_SIGNATURE=$({ echo -en $release_str;
1229 cat $CONFIG_FILE $TARGET_FILE $FULL_PATCH; } |
1230 md5sum | cut -d" " -f1)
1231 # see if we can link to the reuse pool
1232 # XXX - hrm. i'm not convinced this doesn't belong in the reuse
1234 local CAN_LINK_FOR_REUSE=false
1235 touch $REUSEBUILD/$$
1236 if cp -al $REUSEBUILD/$$ $TOPDIR/ 2>/dev/null; then
1237 CAN_LINK_FOR_REUSE=true
1242 # the extra version string to use for the kernel (which might be a reused
1244 local kernel_extra_version=""
1245 if ! $USE_BUILD_CACHE || ! reuse kernel "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1246 "$REUSE_SIGNATURE"; then
1247 # nothing cached, build from scratch
1248 if [ ! -r "$KERNELDIR/$KERNEL_SRPM" ]; then
1249 echo "Downloading kernel SRPM" >&${outfd}
1250 download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM" >&${outfd}
1253 if ! rpm -ivh $KERNELDIR/$KERNEL_SRPM \
1254 --define "_topdir $TOPDIR" >&${outfd} 2>&1; then
1255 # should we clean this up or leave it for analysis?
1257 fatal 1 "Error installing kernel SRPM."
1260 # put the Lustre kernel patch into the RPM build tree
1261 cp $FULL_PATCH $TOPDIR/SOURCES/linux-${lnxmaj}-lustre.patch
1262 prepare_and_build_srpm >&${outfd} ||
1263 fatal 1 "failed to prepare_and_build_srpm"
1265 if [ -z "$REUSE_SIGNATURE" ]; then
1266 echo "No reuse signature was caculated so not storing the built kernel" >&${outfd}
1268 # store the resulting kernel RPM build tree for future use
1269 echo "Storing the built kernel for future reuse" >&${outfd}
1270 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,SRPMS,RPMS}" \
1271 "kernel" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1272 "$CAN_LINK_FOR_REUSE"; then
1273 error "Failed to store kernel RPMS for reuse"
1274 echo "unknown" >&${outfd}
1280 # figure out the EXTRA_VERSION of the kernel we built or are re-using
1282 if ! KERNEL_RPM=$(find_rpm "$TOPDIR/RPMS/$TARGET_ARCH/" provides "^kernel ="); then
1283 fatal 1 "Failed to find a kernel RPM in $TOPDIR/RPMS/$TARGET_ARCH/"
1285 kernel_extra_version=$(rpm -q --queryformat "%{RELEASE}" -p $TOPDIR/RPMS/$TARGET_ARCH/$KERNEL_RPM)
1287 # should now have the following RPMs
1288 # $TOPDIR/RPMS/$arch/kernel-lustre-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1289 # $TOPDIR/RPMS/$arch/kernel-lustre-devel-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1290 # $TOPDIR/RPMS/$arch/kernel-lustre-headers-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1291 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-common-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1292 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1294 echo $kernel_extra_version
1302 # REUSEBUILD, USE_BUILD_CACHE
1307 local ofed_version="$2"
1309 # if an ofed version is given, then it means use OFED proper,
1310 # not any vendor specific "inkernel" version
1311 if [ -z "$ofed_version" ]; then
1315 if [ "$ofed_version" = "inkernel" ]; then
1316 # see if there is a distro specific override for this and use
1318 # XXX we need to better integrate a distro specific override with
1319 # the rest of this function so that all of the reuse cache
1320 # stuff is leveraged given that 80% of this function is reuse
1321 if type -p build_ofed-${DISTRO}; then
1323 ofed_location=$(build_ofed-${DISTRO} ${STDOUT})
1324 local rc=${PIPESTATUS[0]}
1325 CONFIGURE_FLAGS="--with-o2ib=${ofed_location} ${CONFIGURE_FLAGS}"
1333 if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
1334 local REUSE_SIGNATURE=$({ echo "$ofed_version";
1335 echo "$(find_linux_release ${linux})";
1336 cat "${linux}/include/linux/autoconf.h"; } |
1337 md5sum | cut -d" " -f1)
1338 # see if we can link to the reuse pool
1339 # XXX - hrm. i'm not convinced this doesn't belong in the reuse
1341 local CAN_LINK_FOR_REUSE=false
1342 touch $REUSEBUILD/$$
1343 if cp -al $REUSEBUILD/$$ $TOPDIR/; then
1344 CAN_LINK_FOR_REUSE=true
1349 if ! $USE_BUILD_CACHE || ! reuse ofed "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1350 "$REUSE_SIGNATURE"; then
1351 if [ -n "$REUSE_SIGNATURE" ]; then
1352 # stash away the existing built articles for a moment
1354 mv {BUILD,{S,}RPMS,S{OURCE,PEC}S} bak
1357 find . | cpio -pudlm ..
1361 create_rpmbuild_dirs
1364 build_kernel_ib "${linux}"
1366 if [ -z "$REUSE_SIGNATURE" ]; then
1367 echo "No reuse signature was caculated so not storing the built ofed"
1369 # store the resulting RPM build tree for future use
1370 echo "Storing the built ofed for future reuse"
1371 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
1372 "ofed" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1373 "$CAN_LINK_FOR_REUSE"; then
1374 error "Failed to store OFED RPMS for reuse"
1378 # put the stuff we stashed away back
1383 pushd "$TOPDIR" >/dev/null
1384 rm -rf kernel-ib-devel
1385 mkdir kernel-ib-devel
1387 # the actual ofed RPMs don't have the -rc$n or -$date string appened that
1388 # might be present on the file
1389 local linuxrelease=$(find_linux_release "$linux")
1390 ofed_version=$(echo $ofed_version |
1391 sed -re 's/-(20[0-9]{6,6}-[0-9]{4,4}|rc[0-9]*)$//')
1392 local rpm=$(ls $TOPDIR/RPMS/*/kernel-ib-devel-${ofed_version}-${linuxrelease//-/_}.*.rpm)
1393 if ! rpm2cpio < $rpm | cpio -id; then
1394 fatal 1 "could not unpack the kernel-ib-devel rpm."
1396 CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/ofa_kernel ${CONFIGURE_FLAGS}"
1403 if ! $PATCHLESS; then
1404 local kernel_extra_version
1405 if ! kernel_extra_version=$(build_kernel_with_srpm ${STDOUT}); then
1406 fatal 1 "Failed to build the kernel from it's SRPM"
1409 for arch in $BUILD_ARCHS; do
1410 local kernel_devel_rpm
1411 if ! kernel_devel_rpm=$(find_rpm "$TOPDIR/RPMS/$arch/" provides "^$(devel_kernel_name $KERNEL_LUSTRE_NAMING) ="); then
1412 fatal 1 "Failed to find a kernel development RPM in $TOPDIR/RPMS/$arch/"
1415 # install the -devel RPM in preparation for modules builds
1416 if ! lnxrel="$kernel_extra_version" unpack_linux_devel_rpm \
1417 "$TOPDIR/RPMS/$arch/$kernel_devel_rpm"; then
1418 fatal 1 "Could not find the Linux tree in $TOPDIR/RPMS/$arch/$kernel_devel_rpm"
1422 # need to find and unpack the vendor's own kernel-devel for patchless
1425 if ! kernelrpm=$(find_linux_rpm "-$DEVEL_KERNEL_TYPE"); then
1426 fatal 1 "Could not find the kernel-$DEVEL_KERNEL_TYPE RPM in ${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
1428 if ! lnxrel="$lnxrel" unpack_linux_devel_rpm "$kernelrpm" "-"; then
1429 fatal 1 "Could not find the Linux tree in $kernelrpm"
1433 # ~sigh~ have to make copies of and modify some of the rpm
1434 # infrastructure files so that find-requires can find our unpacked
1435 # kernel-devel artifacts
1436 cp $RPM_HELPERS_DIR/{symset-table,find-requires{,.ksyms}} .
1437 FIND_REQUIRES="$(pwd)/find-requires"
1438 chmod 755 {symset-table,find-requires{,.ksyms}}
1440 tmp="${tmp//\//\\/}"
1441 ed find-requires <<EOF
1445 /|.*find-requires.ksyms/s/|/| bash -x/
1446 g/ [^ ]*\/\(find-requires\.ksyms\)/s// $tmp\/\1/g
1449 ed find-requires.ksyms <<EOF
1453 g/\/.*\/\(symset-table\)/s//$tmp\/\1/g
1456 ed symset-table <<EOF
1460 g/\(\/boot\/\)/s//$tmp\/reused\1/g
1461 g/\(\/usr\/src\/kernels\/\)/s//$tmp\/reused\1/g
1465 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
1466 fatal 1 "error building OFED"
1469 if build_lustre "$LINUX" "$LINUXOBJ"; then
1470 # the build worked. resolve any symlinked files (i.e. from reuse)
1471 # in RPMS/$arch to real files so that that that huge mess of
1472 # complication known as LTS can copy them yet somewhere else.
1473 # is it any wonder this whole process is so damn so? anyone ever
1474 # heard of hardlinks? it's this cool new thing that allows you save
1475 # tons of time and space by creating... well you can go read about
1476 # them if you have not heard about them yet.
1477 # can i say how much the implemenation of all of this really impedes
1480 for dir in RPMS/*; do
1482 for file in $(ls); do
1483 if [ -h $file ]; then
1490 # also, for i?86, make sure all of the RPMs are in RPMS/$TARGET_ARCH
1491 # as that's where LTS expects to find them
1492 for dir in RPMS/*; do
1493 if [ $dir = RPMS/$TARGET_ARCH ]; then
1498 if [ -n "$files" ]; then
1499 cp -al $files ../$TARGET_ARCH
1509 create_rpmbuild_dirs() {
1511 [ -d RPMS ] || mkdir RPMS
1512 for arch in $BUILD_ARCHS; do
1513 if [[ $arch = i?86 ]]; then
1514 # some stupidity in the sles11 kernel spec requires an RPMS/i386
1515 # even if the target arch is i686
1516 [ -d RPMS/i386 ] || mkdir RPMS/i386
1518 [ -d RPMS/$arch ] || mkdir RPMS/$arch
1520 [ -d BUILD ] || mkdir BUILD
1521 [ -d SOURCES ] || mkdir SOURCES
1522 [ -d SPECS ] || mkdir SPECS
1523 [ -d SRPMS ] || mkdir SRPMS
1545 [[ $list\ == *\ $item\ * ]]
1549 #########################################################################
1550 # Generate a backtrace through the call stack.
1554 #########################################################################
1558 local funcname="" sourcefile="" lineno="" n
1560 echo "Call stack: (most recent first)"
1561 for (( n = $strip ; n < ${#FUNCNAME[@]} ; ++n )) ; do
1562 funcname=${FUNCNAME[$n - 1]}
1563 sourcefile=$(basename ${BASH_SOURCE[$n]})
1564 lineno=${BASH_LINENO[$n - 1]}
1568 # Display function arguments
1569 if [[ ! -z "${BASH_ARGV[@]}" ]]; then
1570 local args newarg j p=0
1571 for (( j = ${BASH_ARGC[$n - 1]}; j > 0; j-- )); do
1572 newarg=${BASH_ARGV[$j + $p - 1]}
1573 args="${args:+${args} }'${newarg}'"
1575 let p+=${BASH_ARGC[$n - 1]}
1577 echo " ${funcname} ${args:+${args} }at ${sourcefile}:${lineno}"
1581 echo "BEGIN BACKTRACE"
1583 #echo ${BASH_LINENO[*]}
1584 #echo ${BASH_SOURCE[*]}
1585 #echo ${FUNCNAME[*]}
1586 local i=$((${#FUNCNAME[@]} - 1))
1587 while [ $i -ge 0 ]; do
1588 local lineno=${BASH_LINENO[$i]}
1592 local SOURCELINE="${BASH_SOURCE[$i + 1]}:${lineno}"
1593 # Can't figure out how to get function args from other frames...
1594 local FUNCTION="${FUNCNAME[$i]}()"
1595 echo "$SOURCELINE:$FUNCTION"
1599 echo "END BACKTRACE"
1605 seen_list=$(new_list)
1607 echo "An unexpected error has occurred at ${BASH_SOURCE[0]##*/}:$((LINENO-1)).
1608 Unfortunately the above line number in the message may or may not be correct,
1609 but details have been send to the lbuild maintainer. Attempting to continue."; (echo "Untrapped error"
1611 # have we seen this one
1612 echo "checking seen list for ${BASH_SOURCE[0]}:${BASH_LINENO[0]}"
1614 if is_list_member "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}"; then
1615 echo "seen this one already"
1617 seen_list=$(add_list "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}")
1623 ) | mail -s "Untrapped error at ${BASH_SOURCE[0]##*/}:$((LINENO-15)) on $HOSTNAME" brian@sun.com >&2; set $xtrace' ERR
1626 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
1628 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 -- "$@")
1630 if [ $? != 0 ]; then
1634 eval set -- "$options"
1669 if ! KERNELTREE=$(canon_path "$2"); then
1670 fatal 1 "Could not determine the canonical location of $2"
1674 --linux | --with-linux)
1675 if ! LINUX=$(canon_path "$2"); then
1676 fatal 1 "Could not determine the canonical location of $2"
1689 if ! REUSEBUILD=$(canon_path "$2"); then
1690 fatal 1 "Could not determine the canonical location of $2"
1707 if ! KERNELRPMSBASE=$(canon_path "$2"); then
1708 fatal 1 "Could not determine the canonical location of $2"
1717 if ! LUSTRE=$(canon_filepath "$2"); then
1718 fatal 1 "Could not determine the canonical location of $2"
1761 --disable-datestamp)
1775 # there are actually some lustre configure flags that we need to
1776 # handle ourselves (but we still give them to configure)
1777 if [[ \ $@\ == *\ --disable-tests\ * ]]; then
1781 CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-liblustre --enable-liblustre-tests"
1785 usage 1 "Unrecognized option: $1"
1794 # XXX - should we _always_ get the buildid from the META file? what are the
1795 # other (i.e. non-lustre-tarball use cases of lbuild)?
1796 BUILDID=$(sed -ne '/^BUILDID =/s/.*= *//p' lustre/META)
1800 if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
1802 unpack_ofed || fatal 1 "Error unpacking OFED tarball"
1805 # make sure the RPM build environment is set up
1806 create_rpmbuild_dirs
1808 # if an unpacked kernel source tree was given on the command line
1809 # just build lustre with it (nothing distro kernel specific here)
1810 if [ -n "$LINUX" ]; then
1811 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
1812 fatal 1 "error building OFED"
1813 build_lustre "$LINUX" "$LINUXOBJ"
1815 if [ -f "${0%/*}/lbuild-$DISTRO" ]; then
1816 source ${0%/*}/lbuild-$DISTRO
1818 build_with_srpm || fatal 1 "Failed to build_with_srpm"
1820 EXTRA_VERSION_DELIMITER=${EXTRA_VERSION_DELIMITER:-"-"}
1821 source ${0%/*}/lbuild.old_school
1823 old_school_download_kernel
1827 patchless_build_sequence && build_success=true
1829 [ "$DISTRO" = "sles9" ] && build_sequence_rpm_reuse && build_success=true
1830 if ! $build_success; then
1831 build_sequence_reuse && build_success=true
1832 if ! $build_success; then
1833 build_sequence && build_success=true
1834 if $build_success; then
1835 store_for_reuse || echo "Cannot store for future reuse"
1840 ( $build_success ) || fatal 1 "Cannot build lustre"