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
34 # CVSROOT is inherited from the environment
39 # XXX - some recent hacking has pretty much neutered this option.
40 # search through this file (and lbuild.old_school -- but that will
41 # be going away soon) for "-bb" and see how many places
42 # simply don't account for this option
48 TARGET_ARCH="$(uname -m)"
49 # change default behavior to only build for the current arch
50 TARGET_ARCHS="$TARGET_ARCH"
51 TARGET_ARCHS_ALL="$TARGET_ARCH"
52 [ "$TARGET_ARCH" = "i686" ] && TARGET_ARCHS_ALL="i686 i586 i386"
57 TMPDIR=${TMPDIR:-"/var/tmp"}
59 # this is a dir to try reuse old kernel RPMs in (although, it seems to be
60 # unused in any real manner
62 # this is the dir that should be used to store reuse products
64 # should cached products be used or force rebuilding?
66 # what does this do exactly? does it imply no kernel build?
69 SKIPLDISKFSRPM="v1_4_* b1_4"
70 SMPTYPES="smp bigsmp default ''"
76 # default to not adding -lustre- into the kernel RPM package names
77 KERNEL_LUSTRE_NAMING=false
94 # not in the target file any more
97 # build the lustre-tests rpm?
109 # Readlink is not present on some older distributions: emulate it.
113 if [ -L "$path" ]; then
114 ll="$(LC_ALL=C ls -l "$path" 2> /dev/null)" &&
123 Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
126 Specifies the CVS Root to use when pulling files from CVS. The
127 environment variable \$CVSROOT is used if this option is not
130 --external-patches=EXTERNAL_PATCHES
131 Directory similar to lustre/lustre/kernel_patches/ that lbuild should
132 look for seres and config files in before looking in the lustre
135 --extraversion=EXTRAVERSION
136 Text to use for the rpm release and kernel extraversion.
138 --timestamp=TIMESTAMP
139 Date of building lustre in format YYYYMMDDhhmmss
142 Try to reuse old kernel RPMs from DIR
145 Try to reuse old kernel builds from DIR
148 Path to distro kernel RPM collection
154 Do not build RPMs (compile only mode)
157 Build lustre client only
160 Which distro using. Autodetect by default
162 --kerneldir=KERNELDIR
163 Directory containing Linux source tarballs referenced by target
166 --kerneltree=KERNELTREE
167 Directory containing dirs with Linux source tarballs referenced by target
168 files. Dir names in format kernel version ('2.6.9', etc.)
170 --linux=LINUX --with-linux=LINUX
171 Directory of Linux kernel sources. When this option is used, only
172 Lustre modules and userspace are built.
175 Path to an existing lustre source tarball to use instead of
179 Do not try to download a kernel from downloads.lustre.org
182 Do not build a .src.rpm, a full kernel patch, or a patched kernel
186 Do ldiskfs RPM. Now true by default
192 Specifies that the files generated do not include timestamps, and
193 that this is an official release.
196 Build a .src.rpm, a full kernel patch, and a patched kernel tarball.
199 Directory used to stage packages for release. RPMs will be placed
200 more or less in DIR/<target>-<arch>, and the tarball will be
204 A CVS branch/tag name to build from when pulling from CVS.
207 The name of the target to build. The available targets are listed
210 --target-archs=TARGET_ARCHS
211 A (space delimited) list of architectures to build. By default,
212 all of the archs supported by the TARGET will be built, in
213 addition to a .src.rpm. This option can limit those, for machines
214 that can only build certain archs or if you only want a certain
215 arch built (for testing, or a one-off kernel).
217 Also note that by using a non-"base" arch (eg, i386) only kernels
218 will be built - there will be no lustre-lite-utils package.
221 Prevents the datestamp flag (-D) from being passed to cvs for
222 checkouts. This is a workaround for a problem encountered when
223 using lbuild with tinderbox.
226 Builds a Xen domX kernel.
229 Set's a variable to a given value.
238 # canonicalize a relative path to a file
242 if [ ! -f "$PATH" ]; then
246 local FILE=${PATH##*/}
249 echo $(canon_path "$DIR")/$FILE
253 # canonicalize a relative path to a dir
257 if [ ! -d "$PATH" ]; then
261 pushd "$PATH" >/dev/null || return 1
271 if [ "$LUSTRE" ]; then
272 [ -r "$LUSTRE" ] || \
273 usage 1 "Could not find Lustre source tarball '$LUSTRE'."
276 usage 1 "Either specify a CVS Root with -d, or a Lustre source tarball with --lustre."
278 usage 1 "A branch/tag name must be specified with --tag when not building from a tarball."
281 [ -z "$DISTRO" ] && DISTRO=$(autodetect_distro)
283 if [ -z "$LINUX" ]; then
284 [ "$KERNELDIR" -o "$KERNELTREE" ] || \
285 usage 1 "A kernel directory must be specified with --kerneldir or --kerneltree."
287 [ -d "$KERNELDIR" -o -d "$KERNELTREE" ] || \
288 usage 1 "$KERNELDIR and $KERNELTREE are not a directory."
292 usage 1 "When building a snapshot, a tag name must be used."
295 [ "$TARGET" ] || TARGET=$(autodetect_target "$DISTRO")
296 # TARGET_FILE="$TOPDIR/lustre/kernel_patches/targets/$TARGET.target"
297 # [ -r "$TARGET_FILE" ] || \
298 # usage 1 "Target '$TARGET' was not found."
303 CANONICAL_TARGET="rhel6"
306 CANONICAL_TARGET="rhel5"
309 CANONICAL_TARGET="rhel-2.6"
312 CANONICAL_TARGET="sles-2.6"
315 CANONICAL_TARGET="sles10-2.6"
318 CANONICAL_TARGET="sles11"
321 CANONICAL_TARGET="oel5"
324 CANONICAL_TARGET="hp-pnnl-2.4"
332 CANONICAL_TARGET="$TARGET"
336 local timestampnodig=$(echo $TIMESTAMP | sed -e s/[0-9]*//g)
337 [ "$timestampnodig" = "" ] || TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M%S")
338 local timestamplength="${#TIMESTAMP}"
339 if [ $timestamplength -eq 12 ]; then
340 TIMESTAMP="${TIMESTAMP}00"
341 elif [ $timestamplength -ne 14 ]; then
342 TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M%S")
345 RPMBUILD=$(which rpmbuild 2>/dev/null | head -1)
346 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
347 RPMBUILD=$(which rpm 2>/dev/null | head -1)
348 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
349 usage 1 "Could not find binary for making rpms (tried rpmbuild and rpm)."
353 if [ -n "$CCACHE" ]; then
354 which "$DISTCC" &>/dev/null && export DISTCC RPM_BUILD_NCPUS
356 if which "$CCACHE" &>/dev/null; then
357 local ccache=$(which "$CCACHE")
358 local bindir="$TOPDIR/bin"
360 if [ ! -d $bindir ]; then
361 mkdir -p $bindir || fatal 1 "error trying to create $bindir"
363 rm ${bindir}/* > /dev/null 2>&1 || true
365 ln -s "$ccache" ${bindir}/ccache
366 ln -s "$ccache" ${bindir}/cc
367 ln -s "$ccache" ${bindir}/$CC
368 export PATH=$bindir:$PATH
369 export CCACHE && export CC="ccache $CC"
370 # zero the cache so we can see how effective we are being with it
374 # get some ccache stats when we are done
375 push_exit_trap '[ -n "$CCACHE" ] && ccache -s' "ccache_summary"
376 # should remove the ccache trap if lbuild is interrupted
377 trap 'echo "Received an INT TERM or HUP signal, terminating."; delete_exit_trap "ccache_summary"; exit 1' INT TERM HUP
387 echo $(echo "$*" | xargs -n 1 | sort -u)
396 if which wget >/dev/null 2>&1; then
397 if ! wget -nv "$url" -O "$target"; then
400 elif which curl >/dev/null 2>&1; then
401 if ! curl -L -s -o "$target" "$url"; then
405 fatal 1 "Could not find either wget or curl to fetch URLs."
415 local force="${3:-false}"
417 if $force || [ ! -r "$KERNELDIR/$srpm" ] ||
418 [ ! -s "$KERNELDIR/$srpm" ]; then
420 local location="http://downloads.lustre.org/public/kernels/$target/old"
421 # get the location from a distro specific method if it exists
422 if type -p kernel_srpm_location; then
423 location=$(kernel_srpm_location)
425 echo "Downloading $location/$srpm..."
426 if ! fetch_url "$location/$srpm" "$KERNELDIR/$srpm" 2>&1 ||
427 [ ! -s "$KERNELDIR/$srpm" ]; then
428 rm -f $KERNELDIR/$srpm
429 # punt to a distro specific method if it exists
430 if ! type -p download_srpm-$DISTRO; then
431 fatal 1 "Could not download target $target's kernel SRPM $srpm from $location."
433 if ! download_srpm-$DISTRO "$target" "$srpm" "$force"; then
434 fatal 1 "Could not download target $target's kernel SRPM $srpm using download_srpm-$DISTRO."
439 fatal 1 "$srpm not found in directory $KERNELDIR."
450 local file=${from##*/}
456 local semaphore="$to-downloading"
459 if [ ! -f $semaphore ]; then
463 # make sure the download has not been aborted
464 local now=$(date +%s)
465 local file_mtime=$(stat -c %Y "$to")
466 local staleness=$((now - file_mtime))
467 # let's assume an active download will write at least once a minute
468 if [ $staleness -gt 60 ]; then
476 # if the semaphore file exists, the file is either still downloading
477 # or a download was aborted and we cannot trust the target file
478 if [ -f $semaphore ]; then
482 if ! is_downloading && [ -r "$to" ] && [ -s "$to" ]; then
489 if $force || ! is_downloaded; then
490 if is_downloading; then
491 echo "Somebody else is downloading $from..."
492 while is_downloading; do
493 echo "Waiting for $to to finish downloading"
496 if is_downloaded; then
499 echo "The download we were waiting for seems to have been aborted"
505 echo "Downloading $from..."
506 # flag others so they don't try to download also
507 push_exit_trap "rm -f $to $semaphore" "download"
509 if ! fetch_url "$from" "$to" || [ ! -s "$to" ]; then
510 # the trap will remove the files via the fatal below
511 fatal 1 "Could not download ${to##*/} from ${from%/*}/."
514 delete_exit_trap "download"
516 fatal 1 "${to##*/} not found in directory ${to%/*}."
525 local force="${1:-false}"
527 if [ -z "$OFED_VERSION" -o "$OFED_VERSION" = "inkernel" ]; then
531 local location="http://www.openfabrics.org/downloads/OFED/ofed-${OFED_VERSION}/"
533 if [[ $OFED_VERSION = daily-* ]]; then
535 OFED_VERSION=${OFED_VERSION/daily-/}
536 Mmv=${OFED_VERSION%%-*}
537 daily=${OFED_VERSION##$Mmv-}
538 location="http://www.openfabrics.org/downloads/OFED/ofed-${Mmv}-daily/"
539 # find the filename for the version for the date specified
540 OFED_VERSION=$(curl -s "$location" | sed -nre "/${daily}-/s/.*href=\"OFED-(${Mmv//./\\.}-${daily}-[0-9]{4,4}).tgz.*$/\1/p" | tail -1)
541 if [ -z "$OFED_VERSION" ]; then
542 fatal 1 "Could not determine the filename of the OFED snapshot for ${daily}"
546 local file="OFED-${OFED_VERSION}.tgz"
547 download_file "$location/$file" "$KERNELTREE" "$force"
553 EXTRA_VERSION_save="$EXTRA_VERSION"
554 for patchesdir in "$EXTERNAL_PATCHES" \
555 "$TOPDIR/lustre/lustre/kernel_patches"; do
556 TARGET_FILE="$patchesdir/targets/$TARGET.target"
557 [ -r "$TARGET_FILE" ] && break
559 [ -r "$TARGET_FILE" ] || fatal 1 "Target $TARGET was not found."
561 echo "Loading target config file $TARGET.target..."
563 # if the caller specified an OFED_VERSION it should override whatever
564 # the target file specifies
565 local env_OFED_VERSION="$OFED_VERSION"
569 if [ -n "$env_OFED_VERSION" ]; then
570 OFED_VERSION="$env_OFED_VERSION"
573 # doesn't make any sense to build OFED for xen domX's
578 # XXX - set_rpm_smp_type is an ugly undeterministic hack. it needs to
579 # go away and the target just specify the $RPMSMPTYPE
580 [ -z "$RPMSMPTYPE" ] && set_rpm_smp_type
582 # CC might have been overwriten in TARGET_FILE
583 if [[ $CC != ccache\ * ]] && which "$CCACHE" &>/dev/null; then
584 export CCACHE && export CC="ccache $CC"
587 if [ ! "$KERNELTREE" = "" ] && [ -d "$KERNELTREE" ]; then
588 KERNELDIR="$KERNELTREE/${lnxmaj}"
589 [ -d "$KERNELDIR" ] || mkdir "$KERNELDIR"
592 # verify the series is available
593 if [ "$SERIES" ]; then
594 for series in $SERIES; do
595 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches"; do
596 [ -r "$patchesdir/series/$series" ] && continue 2
598 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."
602 # set the location of the .config file
608 if [ -f $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET-$TARGET_ARCH.config ]; then
609 CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET$XENPOSTFIX-$TARGET_ARCH${RPMSMPTYPE:+-}${RPMSMPTYPE}.config"
612 local lnxrelnew=${lnxrel//-/_}
614 # remember the EXTRA_VERSION before we diddle it here
615 # XXX - we really should not diddle with any values read in from the
616 # target file. if we want to modify a value, we should create
618 PRISTINE_EXTRA_VERSION=$EXTRA_VERSION
620 if ! $PATCHLESS && [ ! -f "$CONFIG_FILE" ]; then
621 fatal 1 "Config file for target $TARGET missing from $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/."
624 if [ "$EXTRA_VERSION_save" ]; then
625 EXTRA_VERSION="$EXTRA_VERSION_save"
626 elif ! $RELEASE; then
627 # if there is no patch series, then this is not a lustre specific
628 # kernel. don't make it look like one
629 if $PATCHLESS || [ -n "$SERIES" ]; then
630 EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
631 # EXTRA_VERSION="${EXTRA_VERSION}-${TAG}.${TIMESTAMP}"
632 if ! $PATCHLESS && [ -n "$BUILDID" ]; then
633 EXTRA_VERSION="${EXTRA_VERSION}.${BUILDID}"
637 # EXTRA_VERSION=${EXTRA_VERSION//-/_}
639 ALL_ARCHS="$BASE_ARCHS $BIGMEM_ARCHS $BOOT_ARCHS $JENSEN_ARCHS $SMP_ARCHS $BIGSMP_ARCHS $PSERIES64_ARCHS $UP_ARCHS"
642 for arch in $(uniqify "$ALL_ARCHS"); do
643 if [ -z "$TARGET_ARCHS" ] ||
644 [[ \ $TARGET_ARCHS\ = *\ $arch\ * ]]; then
645 BUILD_ARCHS="$BUILD_ARCHS $arch"
648 [ "$BUILD_ARCHS" ] || usage 1 "No available target archs to build."
649 echo "Building for: $BUILD_ARCHS"
657 fatal 1 "tarflags(): File name argument missing."
669 fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
678 local extractfile="$@"
680 echo "Untarring ${tarfile##*/}..."
681 tar $(tarflags "$tarfile") "$tarfile" $extractfile
687 if ! untar "$KERNELTREE/OFED-${OFED_VERSION}.tgz"; then
690 [ -d OFED ] || ln -sf OFED-[0-9].[0-9]* OFED
696 if [ -z "$LUSTRE" ]; then
699 if [ -n "$USE_DATESTAMP" ]; then
700 DATESTAMP="-D '$DATE'"
703 local DIRNAME="lustre-$TAG-$TIMESTAMP"
705 cvs -d "$CVSROOT" -qz3 co $DATESTAMP -d "$DIRNAME" lustre || \
706 fatal 1 "There was an error checking out toplevel Lustre from CVS."
707 pushd "$DIRNAME" > /dev/null
708 ./lustrecvs "$TAG" || \
709 fatal 1 "There was an error checking out Lustre/Portals/Build from CVS."
710 echo "Creating lustre tarball..."
711 sh autogen.sh || fatal 1 "There was an error running autogen.sh."
712 ./configure --enable-dist || \
713 fatal 1 "There was an error running ./configure to create makefiles."
714 make dist || fatal 1 "There was an error running 'make dist'."
715 LUSTRE=$PWD/lustre-*.tar.gz
719 untar "$LUSTRE" || fatal 1 "Error unpacking Lustre tarball"
720 [ -d lustre ] || ln -sf lustre-[0-9].[0-9]* lustre
726 local do_patch=${1:-true}
728 FULL_PATCH="$PWD/lustre-kernel-${TARGET}-${EXTRA_VERSION}.patch"
729 [ -f "$FULL_PATCH" ] && rm -f "$FULL_PATCH"
730 $do_patch && pushd linux >/dev/null
731 for series in $SERIES; do
732 echo -n "Applying series $series:"
733 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches"; do
734 [ -r "$patchesdir/series/$series" ] || continue
735 SERIES_FILE="$patchesdir/series/$series"
736 for patch in $(<"$SERIES_FILE"); do
738 PATCH_FILE="$patchesdir/patches/$patch"
739 [ -r "$PATCH_FILE" ] || \
740 fatal 1 "Patch $patch does not exist in Lustre tree."
741 cat "$PATCH_FILE" >> "$FULL_PATCH" || {
743 fatal 1 "Error adding patch $patch to full patch."
746 patch -s -p1 < "$PATCH_FILE" 2>&1 || {
748 fatal 1 "Error applying patch $patch."
756 $do_patch && popd >/dev/null
757 echo "Full patch has been saved in ${FULL_PATCH##*/}."
767 pushd lustre >/dev/null
769 echo "Building Lustre RPMs for: $BUILD_ARCHS..."
771 for arch in $BUILD_ARCHS; do
772 targets="--target $arch $targets"
778 confoptions="$confoptions --disable-server"
781 local rpmbuildopt='-tb'
784 echo NORPM mode. Only compiling.
787 ( $(skeep_ldiskfs_rpm $TAG) ) || {
789 pushd ldiskfs > /dev/null || return 255
791 if ! ./configure --enable-dist; then
792 echo "failed to configure in ldiskfs"
793 popd >/dev/null # pushd ldiskfs
794 popd >/dev/null # pushd lustre
798 if ! make dist 2>&1; then
799 popd >/dev/null # pushd ldiskfs
800 popd >/dev/null # pushd lustre
804 #cp lustre-ldiskfs*.tar.gz $TOPDIR/SOURCES || \
805 # fatal 1 "Could not copy lustre-ldiskfs*.tar.gz to $TOPDIR/SOURCES"
807 if ! $RPMBUILD $targets $rpmbuildopt lustre-ldiskfs*.tar.gz \
808 --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
809 --define "kdir $linux" \
810 ${linuxobj:+--define "kobjdir $linuxobj"} \
811 --define "_tmppath /var/tmp" \
812 --define "_topdir $TOPDIR" 2>&1; then
813 popd >/dev/null # pushd ldiskfs
814 popd >/dev/null # pushd lustre
819 if ! $RPMBUILD -ts lustre-ldiskfs*.tar.gz \
820 --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
821 --define "kdir $linux" \
822 ${linuxobj:+--define "kobjdir $linuxobj"} \
823 --define "_tmppath /var/tmp" \
824 --define "_topdir $TOPDIR" 2>&1; then
825 popd >/dev/null # pushd ldiskfs
826 popd >/dev/null # pushd lustre
830 popd >/dev/null # pushd ldiskfs
832 # tell lustre where ldiskfs is
833 # XXX - pointing to the RPM BUILD dir is a hack. we need to flesh
834 # out the ldiskfs RPM build so that it builds a
835 # lustre-ldiskfs-devel RPM and install that and point lustre
837 confoptions="$confoptions --with-ldiskfs=$(ls -d $TOPDIR/BUILD/lustre-ldiskfs-*)"
840 # convert the $PATCHLESS boolean to an empty/not-empty boolean
841 # as silly as this seems, it makes the syntax of the rpmbuild command
842 # simpler and not need an eval to deal with the quotes in the quotes
843 local is_patchless=""
848 # ditto for the lustre-tests boolean
849 local lustre_tests=""
850 if ! $LUSTRE_TESTS; then
854 $RPMBUILD $targets $rpmbuildopt "$LUSTRE" \
855 ${is_patchless:+--define "lustre_name lustre-client"} \
856 ${lustre_tests:+--define "build_lustre_tests 0"} \
857 ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
858 --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
859 --define "kdir $linux" \
860 ${linuxobj:+--define "kobjdir $linuxobj"} \
861 --define "_tmppath $TMPDIR" \
862 --define "_topdir $TOPDIR" 2>&1 || \
863 fatal 1 "Error building rpms for $BUILD_ARCHS."
866 if ! $RPMBUILD -ts "$LUSTRE" \
867 ${is_patchless:+--define "lustre_name lustre-client"} \
868 ${lustre_tests:+--define "build_lustre_tests 0"} \
869 ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
870 --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
871 --define "kdir $linux" \
872 ${linuxobj:+--define "kobjdir $linuxobj"} \
873 --define "_tmppath $TMPDIR" \
874 --define "_topdir $TOPDIR" 2>&1; then
885 [ "$STAGEDIR" ] || return 0
887 for arch in $BUILD_ARCHS; do
888 rpmdir="${STAGEDIR}/${CANONICAL_TARGET}-${arch}"
889 echo "${0##*/}: Copying RPMs into ${rpmdir}"
891 cp -v RPMS/${arch}/*.rpm "${rpmdir}"
892 if [ -d RPMS/noarch ]; then
893 cp -v RPMS/noarch/*.rpm "${rpmdir}"
897 cp -v "$LUSTRE" "$STAGEDIR"
901 #check if we need to build separate ldiskfs RPM
902 skeep_ldiskfs_rpm() {
907 if ! $LDISKFSRPM; then
909 elif $PATCHLESS; then
912 for skiptag in $SKIPLDISKFSRPM; do
913 [[ $tag == $skiptag ]] && skip=true && break
923 local infact_arch="${TARGET_ARCH}"
926 [ "$infact_arch" == "i586" ] && infact_arch="i686"
929 for smp_type in $SMP_ARCHS; do
930 [ $infact_arch == $smp_type ] && RPMSMPTYPE=smp && break
933 for smp_type in $BIGSMP_ARCHS; do
934 [ $infact_arch == $smp_type ] && RPMSMPTYPE=bigsmp && break
937 for smp_type in $PPC64_ARCHS; do
938 [ $infact_arch == $smp_type ] && RPMSMPTYPE=ppc64 && break
941 for smp_type in $DEFAULT_ARCHS; do
942 [ $infact_arch == $smp_type ] && RPMSMPTYPE=default && break
947 # This function takes a linux source pool and digs out the linux release
949 find_linux_release() {
952 local LINUXRELEASEHEADER=$SRCDIR/include/linux/version.h
953 if [ -s $SRCDIR/include/linux/utsrelease.h ]; then
954 LINUXRELEASEHEADER=$SRCDIR/include/linux/utsrelease.h
957 sed -ne 's/#define UTS_RELEASE "\(.*\)"$/\1/p' $LINUXRELEASEHEADER
961 # unpack kernel(/source/devel) RPM
963 # This function and it's setting of $LINUX and $LINUXOBJ is a total hack that
964 # needs to completely refactored. It completely ingores that $BUILD_ARCHS may
965 # contain a list of arches for which rpmbuild commands (including the one for
967 unpack_linux_devel_rpm() {
968 local kernelrpm="${1}"
970 [ -f "$kernelrpm" ] || return 255
971 [ -d $TOPDIR/reused ] || mkdir $TOPDIR/reused || return 255
973 pushd $TOPDIR/reused &>/dev/null || return 255
975 if ! rpm2cpio < "$kernelrpm" | cpio -id > /dev/null 2>&1; then
979 # call a distro specific hook, if available
980 if type -p unpack_linux_devel_rpm-$DISTRO; then
981 if ! unpack_linux_devel_rpm-$DISTRO "$kernelrpm"; then
988 find_linux_devel_paths $TOPDIR/reused
997 # build kernel-ib{,-devel}
999 # ofed 1.3 had a bug in the rpm spec
1000 if [ "$OFED_VERSION" = "1.3" ]; then
1004 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"
1005 local OFED_HARDWARE="--with-mthca-mod --with-mlx4-mod --with-mlx4_en-mod --with-cxgb3-mod --with-nes-mod"
1006 # some I/B drivers are architecture dependent and kernel-ib's configure
1007 # does not figure it out for us ~sigh~
1008 case "$TARGET_ARCH" in
1010 OFED_HARDWARE="$OFED_HARDWARE --with-ehca-mod"
1013 # we're no longer shipping the OFED iSCSI
1014 #OFED_ISCSI="--with-srp-mod --with-srp-target-mod"
1015 ## ISER module has no backport support as of OFED 1.5 (i.e. only builds on
1016 ##kernels >= 2.6.30)
1017 #if [[ $OFED_VERSION = 1.[0-4]* ]]; then
1018 # OFED_ISCSI="$OFED_ISCSI --with-iser-mod"
1021 # assume we are just rebuilding the SRPM
1022 local BUILD_TYPE=${BUILD_TYPE:-"--rebuild"}
1023 local SOURCE="${TOPDIR}/OFED/SRPMS/ofa_kernel-*.src.rpm"
1025 # but switch to building from the SPEC if we need to apply patches
1026 if ls ${TOPDIR}/lustre/build/patches/ofed/* >/dev/null; then
1028 rpm --define "_topdir ${TOPDIR}" -ivh $SOURCE
1029 SOURCE="${TOPDIR}/SPECS/ofa_kernel.spec"
1030 local file ed_fragment1 ed_fragment2 n=1
1031 for file in $(ls ${TOPDIR}/lustre/build/patches/ofed/*); do
1032 ed_fragment1="$ed_fragment1
1033 Patch$n: ${file%%*/}"
1034 ed_fragment2="$ed_fragment2
1036 cp $file ${TOPDIR}/SOURCES
1040 if [ $n -gt 1 ]; then
1053 local linuxrelease=$(find_linux_release "$linux")
1054 if ! $RPMBUILD $BUILD_TYPE --define 'build_kernel_ib 1' --define 'build_kernel_ib_devel 1' \
1055 ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
1056 --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
1057 --define "KVERSION ${linuxrelease}" \
1058 --define "$K_SRC ${linux}" \
1059 --define "LIB_MOD_DIR /lib/modules/${linuxrelease}/updates" \
1060 ${OFA_KERNEL_RELEASE:+--define "_release $OFA_KERNEL_RELEASE"} \
1061 --define "configure_options --without-quilt $OFED_CORE $OFED_HARDWARE $OFED_ISCSI" \
1062 ${SOURCE} 2>&1; then
1063 fatal 1 "Error building kernel-ib"
1072 local signature="$4"
1073 local use_links="$5"
1080 local default_iface=$(/sbin/ip route get 192.1.1.1 | sed -ne 's/.* dev \(.*\) * src .*/\1/p')
1081 if [ -z "$default_iface" ]; then
1082 fatal 1 "Failed to determine the default route interface"
1084 local unique_id=$(/sbin/ip addr show dev $default_iface | sed -ne '/ inet /s/ *inet \(.*\)\/.*/\1/p' | head -1)
1085 if [ -z "$unique_id" ]; then
1086 fatal 1 "Failed to determine a unique id from interface $default_interface"
1089 local finallocation="$location"/"$signature"/"$module"
1090 location="$location"/"$signature-${unique_id}"/"$module"
1091 mkdir -p "$location"
1092 # the cleanup script removes any directory that doesn't have a
1093 # .lastused, so let's try to prevent that as soon as we can
1094 # this solution still slightly racy with the cleanup script
1095 # but the race is a lot tighter now
1096 touch -t 197001010000 "$location/.lastused"
1097 ## use eval/echo here to make sure shell expansions are performed
1098 #if ! cp -a${linkflag} $(eval echo $articles) "$location"; then
1100 for article in $(eval echo $articles); do
1101 if ! cp -a${linkflag} "$article" "$location"; then
1102 error "Failed to copy \"$article\" to \"$location\" in store_for_reuse()"
1103 # rename the cache location so that it's not cached
1104 # product, but is around for analysis
1105 mv "$location"{,-bad-$(date +%s)} ||
1106 error "failed to clean up a failed cache attempt" \
1107 "in \"$location\" -- manual cleanup will be" \
1113 # flag the cache as complete (i.e. in case lbuild was previously
1114 # interrupted while caching)
1115 touch "$location/.lastused"
1117 # put the temporary location into the final location
1119 mkdir -p "${finallocation%/*}"
1120 mv "$location" "$finallocation"
1121 rmdir "${location%/*}"
1129 local use_links="${3:-false}"
1130 local signature="$4"
1132 if [ -n "$REUSEBUILD" ] && [ -d "$REUSEBUILD/$signature/$module" ]; then
1133 if [ ! -f "$REUSEBUILD/$signature/$module/.lastused" ]; then
1134 # the .lastused flag is populated at the end of the caching to
1135 # signal that the caching was completed. if that flag is not
1136 # there, then the cache is invalid (and should be removed in fact)
1137 mv "$REUSEBUILD/$signature/$module"{,-bad-$(date +%s)} ||
1138 fatal 1 "failed to clean up a bad cache in location $REUSEBUILD/$signature/$module\" -- manual cleanup will be necessary"
1142 # so that we know how stale this entry is
1143 touch $REUSEBUILD/$signature/$module/.lastused
1146 if ls $REUSEBUILD/$signature/$module/* >/dev/null 2>&1; then
1147 cp -al $REUSEBUILD/$signature/$module/* $dest/
1150 # copying is pretty heavy
1151 # cp -a $REUSEBUILD/$signature/$module/* $dest/
1152 # do some creative symlinking instead
1154 for dir in BUILD SRPMS SPECS; do
1155 if ls $REUSEBUILD/$signature/$module/$dir/* >/dev/null 2>&1; then
1156 ln -s $REUSEBUILD/$signature/$module/$dir/* $dest/$dir
1159 # sources have to be copied by file because we need SOURCES to
1160 # be a dir we can write into
1161 # could overrun ls's arg list here
1162 #ls $REUSEBUILD/$signature/$module/SOURCES/* |
1163 find $REUSEBUILD/$signature/$module/SOURCES/ -type f |
1164 xargs ln -t $dest/SOURCES -s
1166 # same for RPMS/* dirs
1167 # could overrun ls's arg list here
1168 #ls $REUSEBUILD/$signature/$module/RPMS/$TARGET_ARCH/* |
1170 for dir in $REUSEBUILD/$signature/$module/RPMS/*; do
1171 mkdir -p $dest/RPMS/${dir##*/}
1173 xargs ln -t $dest/RPMS/${dir##*/} -s
1185 if [[ $arch = i[3456]86 ]]; then
1193 build_kernel_with_srpm() {
1196 if [ -z "$outfd" ] || [ $outfd = 1 ]; then
1197 fatal 1 "You must supply a file descriptor to ${FUNCNAME[0]} and it cannot be 1"
1200 # need to generate the patch for this target
1201 do_patch_linux false >&${outfd} # sets global $FULL_PATCH (yeah, yuck)
1203 # get an md5sum of the kernel patch + config for reuse check
1204 # XXX really, there needs to be a signature and a CONFIG_FILE per arch
1208 local release_str="RELEASE=$RELEASE\n"
1211 if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
1212 local REUSE_SIGNATURE=$({ echo -en $release_str;
1214 cat $CONFIG_FILE $TARGET_FILE $FULL_PATCH; } |
1215 md5sum | cut -d" " -f1)
1216 # see if we can link to the reuse pool
1217 # XXX - hrm. i'm not convinced this doesn't belong in the reuse
1219 local CAN_LINK_FOR_REUSE=false
1220 touch $REUSEBUILD/$$
1221 if cp -al $REUSEBUILD/$$ $TOPDIR/ 2>/dev/null; then
1222 CAN_LINK_FOR_REUSE=true
1227 # the extra version string to use for the kernel (which might be a reused
1229 local kernel_extra_version=""
1230 if ! $USE_BUILD_CACHE || ! reuse kernel "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1231 "$REUSE_SIGNATURE"; then
1232 # nothing cached, build from scratch
1233 if [ ! -r "$KERNELDIR/$KERNEL_SRPM" ]; then
1234 echo "Downloading kernel SRPM" >&${outfd}
1235 download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM" >&${outfd}
1238 if ! rpm -ivh $KERNELDIR/$KERNEL_SRPM \
1239 --define "_topdir $TOPDIR" >&${outfd} 2>&1; then
1240 # should we clean this up or leave it for analysis?
1242 fatal 1 "Error installing kernel SRPM."
1245 # put the Lustre kernel patch into the RPM build tree
1246 cp $FULL_PATCH $TOPDIR/SOURCES/linux-${lnxmaj}-lustre.patch
1247 prepare_and_build_srpm >&${outfd} ||
1248 fatal 1 "failed to prepare_and_build_srpm"
1250 if [ -z "$REUSE_SIGNATURE" ]; then
1251 echo "No reuse signature was caculated so not storing the built kernel" >&${outfd}
1253 # store the resulting kernel RPM build tree for future use
1254 echo "Storing the built kernel for future reuse" >&${outfd}
1255 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
1256 "kernel" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1257 "$CAN_LINK_FOR_REUSE"; then
1258 error "Failed to store kernel RPMS for reuse"
1259 echo "unknown" >&${outfd}
1265 # figure out the EXTRA_VERSION of the kernel we built or are re-using
1267 if ! KERNEL_RPM=$(find_rpm "$TOPDIR/RPMS/$TARGET_ARCH/" provides "^kernel ="); then
1268 fatal 1 "Failed to find a kernel RPM in $TOPDIR/RPMS/$TARGET_ARCH/"
1270 kernel_extra_version=$(rpm -q --queryformat "%{RELEASE}" -p $TOPDIR/RPMS/$TARGET_ARCH/$KERNEL_RPM)
1272 # should now have the following RPMs
1273 # $TOPDIR/RPMS/$arch/kernel-lustre-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1274 # $TOPDIR/RPMS/$arch/kernel-lustre-devel-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1275 # $TOPDIR/RPMS/$arch/kernel-lustre-headers-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1276 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-common-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1277 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1279 echo $kernel_extra_version
1287 # REUSEBUILD, USE_BUILD_CACHE
1292 local ofed_version="$2"
1294 # if an ofed version is given, then it means use OFED proper,
1295 # not any vendor specific "inkernel" version
1296 if [ -z "$ofed_version" ]; then
1300 if [ "$ofed_version" = "inkernel" ]; then
1301 # see if there is a distro specific override for this and use
1303 # XXX we need to better integrate a distro specific override with
1304 # the rest of this function so that all of the reuse cache
1305 # stuff is leveraged given that 80% of this function is reuse
1306 if type -p build_ofed-${DISTRO}; then
1308 ofed_location=$(build_ofed-${DISTRO} ${STDOUT})
1309 local rc=${PIPESTATUS[0]}
1310 CONFIGURE_FLAGS="--with-o2ib=${ofed_location} ${CONFIGURE_FLAGS}"
1318 if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
1319 local REUSE_SIGNATURE=$({ echo "$ofed_version";
1320 echo "$(find_linux_release ${linux})";
1321 cat "${linux}/include/linux/autoconf.h"; } |
1322 md5sum | cut -d" " -f1)
1323 # see if we can link to the reuse pool
1324 # XXX - hrm. i'm not convinced this doesn't belong in the reuse
1326 local CAN_LINK_FOR_REUSE=false
1327 touch $REUSEBUILD/$$
1328 if cp -al $REUSEBUILD/$$ $TOPDIR/; then
1329 CAN_LINK_FOR_REUSE=true
1334 if ! $USE_BUILD_CACHE || ! reuse ofed "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1335 "$REUSE_SIGNATURE"; then
1336 if [ -n "$REUSE_SIGNATURE" ]; then
1337 # stash away the existing built articles for a moment
1339 mv {BUILD,{S,}RPMS,S{OURCE,PEC}S} bak
1342 find . | cpio -pudlm ..
1346 create_rpmbuild_dirs
1349 build_kernel_ib "${linux}"
1351 if [ -z "$REUSE_SIGNATURE" ]; then
1352 echo "No reuse signature was caculated so not storing the built ofed"
1354 # store the resulting RPM build tree for future use
1355 echo "Storing the built ofed for future reuse"
1356 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
1357 "ofed" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1358 "$CAN_LINK_FOR_REUSE"; then
1359 error "Failed to store OFED RPMS for reuse"
1363 # put the stuff we stashed away back
1368 pushd "$TOPDIR" >/dev/null
1369 rm -rf kernel-ib-devel
1370 mkdir kernel-ib-devel
1372 # the actual ofed RPMs don't have the -rc$n or -$date string appened that
1373 # might be present on the file
1374 local linuxrelease=$(find_linux_release "$linux")
1375 ofed_version=$(echo $ofed_version |
1376 sed -re 's/-(20[0-9]{6,6}-[0-9]{4,4}|rc[0-9]*)$//')
1377 local rpm=$(ls $TOPDIR/RPMS/*/kernel-ib-devel-${ofed_version}-${linuxrelease//-/_}.*.rpm)
1378 if ! rpm2cpio < $rpm | cpio -id; then
1379 fatal 1 "could not unpack the kernel-ib-devel rpm."
1381 CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/ofa_kernel ${CONFIGURE_FLAGS}"
1388 if ! $PATCHLESS; then
1389 local kernel_extra_version
1390 if ! kernel_extra_version=$(build_kernel_with_srpm ${STDOUT}); then
1391 fatal 1 "Failed to build the kernel from it's SRPM"
1394 for arch in $BUILD_ARCHS; do
1395 local kernel_devel_rpm
1396 if ! kernel_devel_rpm=$(find_rpm "$TOPDIR/RPMS/$arch/" provides "^$(devel_kernel_name $KERNEL_LUSTRE_NAMING) ="); then
1397 fatal 1 "Failed to find a kernel development RPM in $TOPDIR/RPMS/$arch/"
1400 # install the -devel RPM in preparation for modules builds
1401 if ! lnxrel="$kernel_extra_version" unpack_linux_devel_rpm \
1402 "$TOPDIR/RPMS/$arch/$kernel_devel_rpm"; then
1403 fatal 1 "Could not find the Linux tree in $TOPDIR/RPMS/$arch/$kernel_devel_rpm"
1407 # need to find and unpack the vendor's own kernel-devel for patchless
1410 if ! kernelrpm=$(find_linux_rpm "-$DEVEL_KERNEL_TYPE"); then
1411 fatal 1 "Could not find the kernel-$DEVEL_KERNEL_TYPE RPM in ${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
1413 if ! lnxrel="$lnxrel" unpack_linux_devel_rpm "$kernelrpm" "-"; then
1414 fatal 1 "Could not find the Linux tree in $kernelrpm"
1418 # ~sigh~ have to make copies of and modify some of the rpm
1419 # infrastructure files so that find-requires can find our unpacked
1420 # kernel-devel artifacts
1421 cp $RPM_HELPERS_DIR/{symset-table,find-requires{,.ksyms}} .
1422 FIND_REQUIRES="$(pwd)/find-requires"
1423 chmod 755 {symset-table,find-requires{,.ksyms}}
1425 tmp="${tmp//\//\\/}"
1426 ed find-requires <<EOF
1430 /|.*find-requires.ksyms/s/|/| bash -x/
1431 g/ [^ ]*\/\(find-requires\.ksyms\)/s// $tmp\/\1/g
1434 ed find-requires.ksyms <<EOF
1438 g/\/.*\/\(symset-table\)/s//$tmp\/\1/g
1441 ed symset-table <<EOF
1445 g/\(\/boot\/\)/s//$tmp\/reused\1/g
1446 g/\(\/usr\/src\/kernels\/\)/s//$tmp\/reused\1/g
1450 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
1451 fatal 1 "error building OFED"
1454 if build_lustre "$LINUX" "$LINUXOBJ"; then
1455 # the build worked. resolve any symlinked files (i.e. from reuse)
1456 # in RPMS/$arch to real files so that that that huge mess of
1457 # complication known as LTS can copy them yet somewhere else.
1458 # is it any wonder this whole process is so damn so? anyone ever
1459 # heard of hardlinks? it's this cool new thing that allows you save
1460 # tons of time and space by creating... well you can go read about
1461 # them if you have not heard about them yet.
1462 # can i say how much the implemenation of all of this really impedes
1465 for dir in RPMS/*; do
1467 for file in $(ls); do
1468 if [ -h $file ]; then
1475 # also, for i?86, make sure all of the RPMs are in RPMS/$TARGET_ARCH
1476 # as that's where LTS expects to find them
1477 for dir in RPMS/*; do
1478 if [ $dir = RPMS/$TARGET_ARCH ]; then
1483 if [ -n "$files" ]; then
1484 cp -al $files ../$TARGET_ARCH
1494 create_rpmbuild_dirs() {
1496 [ -d RPMS ] || mkdir RPMS
1497 for arch in $BUILD_ARCHS; do
1498 if [[ $arch = i?86 ]]; then
1499 # some stupidity in the sles11 kernel spec requires an RPMS/i386
1500 # even if the target arch is i686
1501 [ -d RPMS/i386 ] || mkdir RPMS/i386
1503 [ -d RPMS/$arch ] || mkdir RPMS/$arch
1505 [ -d BUILD ] || mkdir BUILD
1506 [ -d SOURCES ] || mkdir SOURCES
1507 [ -d SPECS ] || mkdir SPECS
1508 [ -d SRPMS ] || mkdir SRPMS
1530 [[ $list\ == *\ $item\ * ]]
1534 #########################################################################
1535 # Generate a backtrace through the call stack.
1539 #########################################################################
1543 local funcname="" sourcefile="" lineno="" n
1545 echo "Call stack: (most recent first)"
1546 for (( n = $strip ; n < ${#FUNCNAME[@]} ; ++n )) ; do
1547 funcname=${FUNCNAME[$n - 1]}
1548 sourcefile=$(basename ${BASH_SOURCE[$n]})
1549 lineno=${BASH_LINENO[$n - 1]}
1553 # Display function arguments
1554 if [[ ! -z "${BASH_ARGV[@]}" ]]; then
1555 local args newarg j p=0
1556 for (( j = ${BASH_ARGC[$n - 1]}; j > 0; j-- )); do
1557 newarg=${BASH_ARGV[$j + $p - 1]}
1558 args="${args:+${args} }'${newarg}'"
1560 let p+=${BASH_ARGC[$n - 1]}
1562 echo " ${funcname} ${args:+${args} }at ${sourcefile}:${lineno}"
1566 echo "BEGIN BACKTRACE"
1568 #echo ${BASH_LINENO[*]}
1569 #echo ${BASH_SOURCE[*]}
1570 #echo ${FUNCNAME[*]}
1571 local i=$((${#FUNCNAME[@]} - 1))
1572 while [ $i -ge 0 ]; do
1573 local lineno=${BASH_LINENO[$i]}
1577 local SOURCELINE="${BASH_SOURCE[$i + 1]}:${lineno}"
1578 # Can't figure out how to get function args from other frames...
1579 local FUNCTION="${FUNCNAME[$i]}()"
1580 echo "$SOURCELINE:$FUNCTION"
1584 echo "END BACKTRACE"
1590 seen_list=$(new_list)
1592 echo "An unexpected error has occurred at ${BASH_SOURCE[0]##*/}:$((LINENO-1)).
1593 Unfortunately the above line number in the message may or may not be correct,
1594 but details have been send to the lbuild maintainer. Attempting to continue."; (echo "Untrapped error"
1596 # have we seen this one
1597 echo "checking seen list for ${BASH_SOURCE[0]}:${BASH_LINENO[0]}"
1599 if is_list_member "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}"; then
1600 echo "seen this one already"
1602 seen_list=$(add_list "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}")
1608 ) | mail -s "Untrapped error at ${BASH_SOURCE[0]##*/}:$((LINENO-15)) on $HOSTNAME" brian@sun.com >&2; set $xtrace' ERR
1611 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
1613 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 -- "$@")
1615 if [ $? != 0 ]; then
1619 eval set -- "$options"
1654 if ! KERNELTREE=$(canon_path "$2"); then
1655 fatal 1 "Could not determine the canonical location of $2"
1659 --linux | --with-linux)
1660 if ! LINUX=$(canon_path "$2"); then
1661 fatal 1 "Could not determine the canonical location of $2"
1674 if ! REUSEBUILD=$(canon_path "$2"); then
1675 fatal 1 "Could not determine the canonical location of $2"
1692 if ! KERNELRPMSBASE=$(canon_path "$2"); then
1693 fatal 1 "Could not determine the canonical location of $2"
1702 if ! LUSTRE=$(canon_filepath "$2"); then
1703 fatal 1 "Could not determine the canonical location of $2"
1746 --disable-datestamp)
1760 # there are actually some lustre configure flags that we need to
1761 # handle ourselves (but we still give them to configure)
1762 if [[ \ $@\ == *\ --disable-tests\ * ]]; then
1766 CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-liblustre --enable-liblustre-tests"
1770 usage 1 "Unrecognized option: $1"
1779 # XXX - should we _always_ get the buildid from the META file? what are the
1780 # other (i.e. non-lustre-tarball use cases of lbuild)?
1781 BUILDID=$(sed -ne '/^BUILDID =/s/.*= *//p' lustre/META)
1785 if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
1787 unpack_ofed || fatal 1 "Error unpacking OFED tarball"
1790 # make sure the RPM build environment is set up
1791 create_rpmbuild_dirs
1793 # if an unpacked kernel source tree was given on the command line
1794 # just build lustre with it (nothing distro kernel specific here)
1795 if [ -n "$LINUX" ]; then
1796 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
1797 fatal 1 "error building OFED"
1798 build_lustre "$LINUX" "$LINUXOBJ"
1800 if [ -f "${0%/*}/lbuild-$DISTRO" ]; then
1801 source ${0%/*}/lbuild-$DISTRO
1803 build_with_srpm || fatal 1 "Failed to build_with_srpm"
1805 EXTRA_VERSION_DELIMITER=${EXTRA_VERSION_DELIMITER:-"-"}
1806 source ${0%/*}/lbuild.old_school
1808 old_school_download_kernel
1812 patchless_build_sequence && build_success=true
1814 [ "$DISTRO" = "sles9" ] && build_sequence_rpm_reuse && build_success=true
1815 if ! $build_success; then
1816 build_sequence_reuse && build_success=true
1817 if ! $build_success; then
1818 build_sequence && build_success=true
1819 if $build_success; then
1820 store_for_reuse || echo "Cannot store for future reuse"
1825 ( $build_success ) || fatal 1 "Cannot build lustre"