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 # Assume that lbuild's support files can be found in the same
19 # canonicalized path as this very script.
20 LBUILD_SCRIPT=$(readlink -f ${0})
21 LBUILD_DIR=${LBUILD_DIR:-$(dirname ${LBUILD_SCRIPT})}
23 # include the exit_traps library
24 . ${LBUILD_DIR}/exit_traps.sh
25 . ${LBUILD_DIR}/funcs.sh
27 # our children should die when we do
28 push_exit_trap "kill -INT -$$ || true" kill_children
30 # increment this if you have made a change that should force a new kernel
33 #BUILD_GEN=2 # bz19952: remove -lustre tag from kernel RPM names
34 #BUILD_GEN=3 # bz19975: enable the building of src.rpms by default
35 #BUILD_GEN=4 # bz22281: use the git hash in the kernel extra version
36 #BUILD_GEN=5 # TT-107: don't cache the BUILD dir
37 BUILD_GEN=6 # TT-1092: don't cache the BUILD dir, to rebuild external OFED
41 # CVSROOT is inherited from the environment
46 # XXX - some recent hacking has pretty much neutered this option.
47 # search through this file for "-bb" and see how many places
48 # simply don't account for this option
54 TARGET_ARCH="$(uname -m)"
55 # change default behavior to only build for the current arch
56 TARGET_ARCHS="$TARGET_ARCH"
57 TARGET_ARCHS_ALL="$TARGET_ARCH"
58 [ "$TARGET_ARCH" = "i686" ] && TARGET_ARCHS_ALL="i686 i586 i386"
63 TMPDIR=${TMPDIR:-"/var/tmp"}
65 # this is a dir to try reuse old kernel RPMs in (although, it seems to be
66 # unused in any real manner
68 # this is the dir that should be used to store reuse products
70 # should cached products be used or force rebuilding?
72 # what does this do exactly? does it imply no kernel build?
78 SKIPLDISKFSRPM="v1_4_* b1_4"
79 SMPTYPES="smp bigsmp default ''"
85 # default to not adding -lustre- into the kernel RPM package names
86 KERNEL_LUSTRE_NAMING=false
87 # default not use kabi check.
105 # not in the target file any more
108 # build the lustre-tests rpm?
118 # Readlink is not present on some older distributions: emulate it.
122 if [ -L "$path" ]; then
123 ll="$(LC_ALL=C ls -l "$path" 2> /dev/null)" &&
132 Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
135 Specifies the CVS Root to use when pulling files from CVS. The
136 environment variable \$CVSROOT is used if this option is not
139 --external-patches=EXTERNAL_PATCHES
140 Directory similar to lustre/lustre/kernel_patches/ that lbuild should
141 look for seres and config files in before looking in the lustre
144 --extraversion=EXTRAVERSION
145 Text to use for the rpm release and kernel extraversion.
147 --timestamp=TIMESTAMP
148 Date of building lustre in format YYYYMMDDhhmmss
151 Try to reuse old kernel RPMs from DIR
154 Try to reuse old kernel builds from DIR
157 Path to distro kernel RPM collection
163 Do not build RPMs (compile only mode)
166 Build lustre client only
169 Which distro using. Autodetect by default
171 --kerneldir=KERNELDIR
172 Directory containing Linux source tarballs referenced by target
175 --kerneltree=KERNELTREE
176 Directory containing dirs with Linux source tarballs referenced by target
177 files. Dir names in format kernel version ('2.6.9', etc.)
179 --linux=LINUX --with-linux=LINUX
180 Directory of Linux kernel sources. When this option is used, only
181 Lustre modules and userspace are built.
184 Path to an existing lustre source tarball to use instead of
188 Do not try to download a kernel from downloads.lustre.org
191 Do not build a .src.rpm, a full kernel patch, or a patched kernel
195 Do ldiskfs RPM. Now true by default
198 Do not build lustre-iokit RPM. Now true by default
204 Specifies that the files generated do not include timestamps, and
205 that this is an official release.
208 Build a .src.rpm, a full kernel patch, and a patched kernel tarball.
211 Directory used to stage packages for release. RPMs will be placed
212 more or less in DIR/<target>-<arch>, and the tarball will be
216 A CVS branch/tag name to build from when pulling from CVS.
219 The name of the target to build. The available targets are listed
222 --target-archs=TARGET_ARCHS
223 A (space delimited) list of architectures to build. By default,
224 all of the archs supported by the TARGET will be built, in
225 addition to a .src.rpm. This option can limit those, for machines
226 that can only build certain archs or if you only want a certain
227 arch built (for testing, or a one-off kernel).
229 Also note that by using a non-"base" arch (eg, i386) only kernels
230 will be built - there will be no lustre-lite-utils package.
233 Prevents the datestamp flag (-D) from being passed to cvs for
234 checkouts. This is a workaround for a problem encountered when
235 using lbuild with tinderbox.
238 Builds a Xen domX kernel.
241 Set's a variable to a given value.
250 # canonicalize a relative path to a file
254 if [ ! -f "$PATH" ]; then
258 local FILE=${PATH##*/}
261 echo $(canon_path "$DIR")/$FILE
265 # canonicalize a relative path to a dir
269 if [ ! -d "$PATH" ]; then
273 pushd "$PATH" >/dev/null || return 1
283 if [ "$LUSTRE" ]; then
284 [ -r "$LUSTRE" ] || \
285 usage 1 "Could not find Lustre source tarball '$LUSTRE'."
288 usage 1 "Either specify a CVS Root with -d, or a Lustre source tarball with --lustre."
290 usage 1 "A branch/tag name must be specified with --tag when not building from a tarball."
293 [ -z "$DISTRO" ] && DISTRO=$(autodetect_distro)
295 if [ -z "$LINUX" ]; then
296 [ "$KERNELDIR" -o "$KERNELTREE" ] || \
297 usage 1 "A kernel directory must be specified with --kerneldir or --kerneltree."
299 [ -d "$KERNELDIR" -o -d "$KERNELTREE" ] || \
300 usage 1 "$KERNELDIR and $KERNELTREE are not a directory."
304 usage 1 "When building a snapshot, a tag name must be used."
307 [ "$TARGET" ] || TARGET=$(autodetect_target "$DISTRO")
308 # TARGET_FILE="$TOPDIR/lustre/kernel_patches/targets/$TARGET.target"
309 # [ -r "$TARGET_FILE" ] || \
310 # usage 1 "Target '$TARGET' was not found."
315 CANONICAL_TARGET="rhel6"
318 CANONICAL_TARGET="rhel5"
321 CANONICAL_TARGET="rhel-2.6"
324 CANONICAL_TARGET="sles-2.6"
327 CANONICAL_TARGET="sles10-2.6"
329 2.6-sles11 | 3.0-sles11)
330 CANONICAL_TARGET="sles11"
333 CANONICAL_TARGET="oel5"
336 CANONICAL_TARGET="hp-pnnl-2.4"
344 CANONICAL_TARGET="$TARGET"
348 local timestampnodig=$(echo $TIMESTAMP | sed -e s/[0-9]*//g)
349 [ "$timestampnodig" = "" ] || TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M%S")
350 local timestamplength="${#TIMESTAMP}"
351 if [ $timestamplength -eq 12 ]; then
352 TIMESTAMP="${TIMESTAMP}00"
353 elif [ $timestamplength -ne 14 ]; then
354 TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M%S")
357 RPMBUILD=$(which rpmbuild 2>/dev/null | head -1)
358 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
359 RPMBUILD=$(which rpm 2>/dev/null | head -1)
360 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
361 usage 1 "Could not find binary for making rpms (tried rpmbuild and rpm)."
365 if [ -n "$CCACHE" ]; then
366 which "$DISTCC" &>/dev/null && export DISTCC RPM_BUILD_NCPUS
368 if which "$CCACHE" &>/dev/null; then
369 local ccache=$(which "$CCACHE")
370 local bindir="$TOPDIR/bin"
372 if [ ! -d $bindir ]; then
373 mkdir -p $bindir || fatal 1 "error trying to create $bindir"
375 rm ${bindir}/* > /dev/null 2>&1 || true
377 ln -s "$ccache" ${bindir}/ccache
378 ln -s "$ccache" ${bindir}/cc
379 ln -s "$ccache" ${bindir}/$CC
380 export PATH=$bindir:$PATH
381 export CCACHE && export CC="ccache $CC"
382 # zero the cache so we can see how effective we are being with it
386 # get some ccache stats when we are done
387 push_exit_trap '[ -n "$CCACHE" ] && ccache -s' "ccache_summary"
388 # should remove the ccache trap if lbuild is interrupted
389 trap 'echo "Received an INT TERM or HUP signal, terminating."; delete_exit_trap "ccache_summary"; exit 1' INT TERM HUP
397 # compare two versions $1 and $2. if $1 < $2, return 0 otherwise return 1.
399 [[ $1 == $2 ]] && return 1
401 local i val1=($1) val2=($2)
403 # padding zero to val1 if it needs
404 for ((i=${#val1[@]}; i<${#val2[@]}; i++)); do
407 for ((i=0; i<${#val1[@]}; i++)); do
408 [[ -z ${val2[i]} ]] && return 1
410 if [[ ${val1[i]} < ${val2[i]} ]]; then
412 elif [[ ${val1[i]} > ${val2[i]} ]]; then
420 echo $(echo "$*" | xargs -n 1 | sort -u)
429 if which wget >/dev/null 2>&1; then
430 if ! wget -nv "$url" -O "$target"; then
433 elif which curl >/dev/null 2>&1; then
434 if ! curl -L -s -o "$target" "$url"; then
438 fatal 1 "Could not find either wget or curl to fetch URLs."
448 local force="${3:-false}"
450 if $force || [ ! -r "$KERNELDIR/$srpm" ] ||
451 [ ! -s "$KERNELDIR/$srpm" ]; then
453 local location="http://downloads.lustre.org/public/kernels/$target/old"
454 # get the location from a distro specific method if it exists
455 if type -p kernel_srpm_location; then
456 location=$(kernel_srpm_location)
458 echo "Downloading $location/$srpm..."
459 if ! fetch_url "$location/$srpm" "$KERNELDIR/$srpm" 2>&1 ||
460 [ ! -s "$KERNELDIR/$srpm" ]; then
461 rm -f $KERNELDIR/$srpm
462 # punt to a distro specific method if it exists
463 if ! type -p download_srpm-$DISTRO; then
464 fatal 1 "Could not download target $target's kernel SRPM $srpm from $location."
466 if ! download_srpm-$DISTRO "$target" "$srpm" "$force"; then
467 fatal 1 "Could not download target $target's kernel SRPM $srpm using download_srpm-$DISTRO."
472 fatal 1 "$srpm not found in directory $KERNELDIR."
483 local file=${from##*/}
489 local semaphore="$to-downloading"
492 if [ ! -f $semaphore ]; then
496 # make sure the download has not been aborted
497 local now=$(date +%s)
498 local file_mtime=$(stat -c %Y "$to")
499 local staleness=$((now - file_mtime))
500 # let's assume an active download will write at least once a minute
501 if [ $staleness -gt 60 ]; then
509 # if the semaphore file exists, the file is either still downloading
510 # or a download was aborted and we cannot trust the target file
511 if [ -f $semaphore ]; then
515 if ! is_downloading && [ -r "$to" ] && [ -s "$to" ]; then
522 if $force || ! is_downloaded; then
523 if is_downloading; then
524 echo "Somebody else is downloading $from..."
525 while is_downloading; do
526 echo "Waiting for $to to finish downloading"
529 if is_downloaded; then
532 echo "The download we were waiting for seems to have been aborted"
538 echo "Downloading $from..."
539 # flag others so they don't try to download also
540 push_exit_trap "rm -f $to $semaphore" "download"
542 if ! fetch_url "$from" "$to" || [ ! -s "$to" ]; then
543 # the trap will remove the files via the fatal below
544 fatal 1 "Could not download ${to##*/} from ${from%/*}/."
547 delete_exit_trap "download"
549 fatal 1 "${to##*/} not found in directory ${to%/*}."
558 local force="${1:-false}"
560 if [ -z "$OFED_VERSION" -o "$OFED_VERSION" = "inkernel" ]; then
564 local OFED_BASE_VERSION=$OFED_VERSION
565 if [[ $OFED_VERSION = *.*.*.* ]]; then
566 OFED_BASE_VERSION=${OFED_VERSION%.*}
569 local location="http://www.openfabrics.org/downloads/OFED/ofed-${OFED_BASE_VERSION}/"
571 if [[ $OFED_VERSION = *-rc[0-9] ]]; then
573 Mmv=${OFED_VERSION%%-*}
574 location="http://www.openfabrics.org/downloads/OFED/ofed-${Mmv}/"
577 if [[ $OFED_VERSION = daily-* ]]; then
579 OFED_VERSION=${OFED_VERSION/daily-/}
580 Mmv=${OFED_VERSION%%-*}
581 daily=${OFED_VERSION##$Mmv-}
582 location="http://www.openfabrics.org/downloads/OFED/ofed-${Mmv}-daily/"
583 # find the filename for the version for the date specified
584 OFED_VERSION=$(curl -s "$location" | sed -nre "/${daily}-/s/.*href=\"OFED-(${Mmv//./\\.}-${daily}-[0-9]{4,4}).tgz.*$/\1/p" | tail -1)
585 if [ -z "$OFED_VERSION" ]; then
586 fatal 1 "Could not determine the filename of the OFED snapshot for ${daily}"
590 local file="OFED-${OFED_VERSION}.tgz"
591 download_file "$location/$file" "$KERNELTREE" "$force"
597 EXTRA_VERSION_save="$EXTRA_VERSION"
598 for patchesdir in "$EXTERNAL_PATCHES" \
599 "$TOPDIR/lustre/lustre/kernel_patches"; do
600 TARGET_FILE="$patchesdir/targets/$TARGET.target"
601 [ -r "$TARGET_FILE" ] && break
603 [ -r "$TARGET_FILE" ] || fatal 1 "Target $TARGET was not found."
605 echo "Loading target config file $TARGET.target..."
607 # if the caller specified an OFED_VERSION it should override whatever
608 # the target file specifies
609 local env_OFED_VERSION="$OFED_VERSION"
613 if [ -n "$env_OFED_VERSION" ]; then
614 OFED_VERSION="$env_OFED_VERSION"
617 # doesn't make any sense to build OFED for xen domX's
622 # XXX - set_rpm_smp_type is an ugly undeterministic hack. it needs to
623 # go away and the target just specify the $RPMSMPTYPE
624 [ -z "$RPMSMPTYPE" ] && set_rpm_smp_type
626 # CC might have been overwriten in TARGET_FILE
627 if [[ $CC != ccache\ * ]] && which "$CCACHE" &>/dev/null; then
628 export CCACHE && export CC="ccache $CC"
631 if [ ! "$KERNELTREE" = "" ] && [ -d "$KERNELTREE" ]; then
632 KERNELDIR="$KERNELTREE/${lnxmaj}"
633 [ -d "$KERNELDIR" ] || mkdir "$KERNELDIR"
636 # verify the series is available
637 if [ "$SERIES" ]; then
638 for series in $SERIES; do
639 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches"; do
640 [ -r "$patchesdir/series/$series" ] && continue 2
642 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."
646 # set the location of the .config file
652 if [ -f $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET-$TARGET_ARCH.config ]; then
653 CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET$XENPOSTFIX-$TARGET_ARCH${RPMSMPTYPE:+-}${RPMSMPTYPE}.config"
656 local lnxrelnew=${lnxrel//-/_}
658 # remember the EXTRA_VERSION before we diddle it here
659 # XXX - we really should not diddle with any values read in from the
660 # target file. if we want to modify a value, we should create
662 PRISTINE_EXTRA_VERSION=$EXTRA_VERSION
664 if ! $PATCHLESS && [ ! -f "$CONFIG_FILE" ]; then
665 fatal 1 "Config file for target $TARGET missing from $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/."
668 if [ "$EXTRA_VERSION_save" ]; then
669 EXTRA_VERSION="$EXTRA_VERSION_save"
670 elif ! $RELEASE; then
671 # if there is no patch series, then this is not a lustre specific
672 # kernel. don't make it look like one
673 if $PATCHLESS || [ -n "$SERIES" ]; then
674 EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
675 # EXTRA_VERSION="${EXTRA_VERSION}-${TAG}.${TIMESTAMP}"
676 if ! $PATCHLESS && [ -n "$BUILDID" ]; then
677 EXTRA_VERSION="${EXTRA_VERSION}.${BUILDID}"
681 # EXTRA_VERSION=${EXTRA_VERSION//-/_}
683 ALL_ARCHS="$BASE_ARCHS $BIGMEM_ARCHS $BOOT_ARCHS $JENSEN_ARCHS $SMP_ARCHS $BIGSMP_ARCHS $PSERIES64_ARCHS $UP_ARCHS"
686 for arch in $(uniqify "$ALL_ARCHS"); do
687 if [ -z "$TARGET_ARCHS" ] ||
688 [[ \ $TARGET_ARCHS\ = *\ $arch\ * ]]; then
689 BUILD_ARCHS="$BUILD_ARCHS $arch"
692 [ "$BUILD_ARCHS" ] || usage 1 "No available target archs to build."
693 echo "Building for: $BUILD_ARCHS"
701 fatal 1 "tarflags(): File name argument missing."
713 fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
722 local extractfile="$@"
724 echo "Untarring ${tarfile##*/}..."
725 tar $(tarflags "$tarfile") "$tarfile" $extractfile
731 if ! untar "$KERNELTREE/OFED-${OFED_VERSION}.tgz"; then
734 [ -d OFED ] || ln -sf OFED-[0-9].[0-9]* OFED
740 if [ -z "$LUSTRE" ]; then
743 if [ -n "$USE_DATESTAMP" ]; then
744 DATESTAMP="-D '$DATE'"
747 local DIRNAME="lustre-$TAG-$TIMESTAMP"
749 cvs -d "$CVSROOT" -qz3 co $DATESTAMP -d "$DIRNAME" lustre || \
750 fatal 1 "There was an error checking out toplevel Lustre from CVS."
751 pushd "$DIRNAME" > /dev/null
752 ./lustrecvs "$TAG" || \
753 fatal 1 "There was an error checking out Lustre/Portals/Build from CVS."
754 echo "Creating lustre tarball..."
755 sh autogen.sh || fatal 1 "There was an error running autogen.sh."
756 ./configure --enable-dist || \
757 fatal 1 "There was an error running ./configure to create makefiles."
758 make dist || fatal 1 "There was an error running 'make dist'."
759 LUSTRE=$PWD/lustre-*.tar.gz
763 untar "$LUSTRE" || fatal 1 "Error unpacking Lustre tarball"
764 [ -d lustre ] || ln -sf lustre-[0-9].[0-9]* lustre
770 local do_patch=${1:-true}
772 FULL_PATCH="$PWD/lustre-kernel-${TARGET}-${EXTRA_VERSION}.patch"
773 [ -f "$FULL_PATCH" ] && rm -f "$FULL_PATCH"
774 $do_patch && pushd linux >/dev/null
775 for series in $SERIES; do
776 echo -n "Applying series $series:"
777 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches"; do
778 [ -r "$patchesdir/series/$series" ] || continue
779 SERIES_FILE="$patchesdir/series/$series"
780 for patch in $(<"$SERIES_FILE"); do
782 PATCH_FILE="$patchesdir/patches/$patch"
783 [ -r "$PATCH_FILE" ] || \
784 fatal 1 "Patch $patch does not exist in Lustre tree."
785 cat "$PATCH_FILE" >> "$FULL_PATCH" || {
787 fatal 1 "Error adding patch $patch to full patch."
790 patch -s -p1 < "$PATCH_FILE" 2>&1 || {
792 fatal 1 "Error applying patch $patch."
800 $do_patch && popd >/dev/null
801 echo "Full patch has been saved in ${FULL_PATCH##*/}."
806 local rpmbuildopt="$1"
808 pushd lustre-iokit > /dev/null || return 255
810 if ! ./configure; then
811 echo "failed to configure in lustre-iokit"
812 popd >/dev/null # pushd lustre-iokit
817 echo "failed to make dist in lustre-iokit"
818 popd >/dev/null # pushd lustre-iokit
822 if ! $RPMBUILD $rpmbuildopt lustre-iokit*.tar.gz \
823 --define "_tmppath /var/tmp" \
824 --define "_topdir $TOPDIR" 2>&1; then
825 popd >/dev/null # pushd lustre-iokit
829 if $DO_SRC && ! $RPMBUILD -ts lustre-iokit*.tar.gz \
830 --define "_tmppath /var/tmp" \
831 --define "_topdir $TOPDIR" 2>&1; then
832 popd >/dev/null # pushd lustre-iokit
835 popd >/dev/null # pushd lustre-iokit
844 pushd lustre >/dev/null
846 echo "Building Lustre RPMs for: $BUILD_ARCHS..."
848 for arch in $BUILD_ARCHS; do
849 targets="--target $arch $targets"
855 confoptions="$confoptions --disable-server"
858 local rpmbuildopt='-tb'
861 echo NORPM mode. Only compiling.
864 # If server we now build the spl and zfs modules against the lustre kernel.
865 # These are required prior to the building of lustre server. Client does
866 # not require spl/zfs. Use !PATCHLESS to indicate server which follows the
867 # line above so is at least consistant.
868 if [ $PATCHLESS == false ] && [ "x$ZFSNOTSUPPORTED" == "x" ]; then
869 if ! build_spl_zfs; then
870 popd >/dev/null # pushd lustre
875 ( $(skeep_ldiskfs_rpm $TAG) ) || {
877 pushd ldiskfs > /dev/null || return 255
879 if ! ./configure --enable-dist; then
880 echo "failed to configure in ldiskfs"
881 popd >/dev/null # pushd ldiskfs
882 popd >/dev/null # pushd lustre
886 if ! make dist 2>&1; then
887 popd >/dev/null # pushd ldiskfs
888 popd >/dev/null # pushd lustre
892 #cp lustre-ldiskfs*.tar.gz $TOPDIR/SOURCES || \
893 # fatal 1 "Could not copy lustre-ldiskfs*.tar.gz to $TOPDIR/SOURCES"
895 if ! $RPMBUILD $targets $rpmbuildopt lustre-ldiskfs*.tar.gz \
896 --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
897 --define "kdir $linux" \
898 ${linuxobj:+--define "kobjdir $linuxobj"} \
899 --define "_tmppath /var/tmp" \
900 --define "_topdir $TOPDIR" 2>&1; then
901 popd >/dev/null # pushd ldiskfs
902 popd >/dev/null # pushd lustre
907 if ! $RPMBUILD -ts lustre-ldiskfs*.tar.gz \
908 --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
909 --define "kdir $linux" \
910 ${linuxobj:+--define "kobjdir $linuxobj"} \
911 --define "_tmppath /var/tmp" \
912 --define "_topdir $TOPDIR" 2>&1; then
913 popd >/dev/null # pushd ldiskfs
914 popd >/dev/null # pushd lustre
918 popd >/dev/null # pushd ldiskfs
920 # tell lustre where ldiskfs is
921 # XXX - pointing to the RPM BUILD dir is a hack. we need to flesh
922 # out the ldiskfs RPM build so that it builds a
923 # lustre-ldiskfs-devel RPM and install that and point lustre
925 confoptions="$confoptions --with-ldiskfs=$(ls -d $TOPDIR/BUILD/lustre-ldiskfs-*)"
929 if ! build_iokit $rpmbuildopt; then
930 echo "failed to build lustre-iokit"
931 popd >/dev/null # pushd lustre
936 # convert the $PATCHLESS boolean to an empty/not-empty boolean
937 # as silly as this seems, it makes the syntax of the rpmbuild command
938 # simpler and not need an eval to deal with the quotes in the quotes
939 local is_patchless=""
944 # ditto for the lustre-tests boolean
945 local lustre_tests=""
946 if ! $LUSTRE_TESTS; then
956 if $OSDLDISKFSRPM; then
960 $RPMBUILD $targets $rpmbuildopt "$LUSTRE" \
961 ${is_patchless:+--define "lustre_name lustre-client"} \
962 ${lustre_tests:+--define "build_lustre_tests 0"} \
963 ${osd_zfs:+--define "build_lustre_osd_zfs 1"} \
964 ${osd_ldiskfs:+--define "build_lustre_osd_ldiskfs 1"} \
965 ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
966 --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
967 --define "kdir $linux" \
968 ${linuxobj:+--define "kobjdir $linuxobj"} \
969 --define "_tmppath $TMPDIR" \
970 --define "_topdir $TOPDIR" 2>&1 || \
971 fatal 1 "Error building rpms for $BUILD_ARCHS."
974 if ! $RPMBUILD -ts "$LUSTRE" \
975 ${is_patchless:+--define "lustre_name lustre-client"} \
976 ${lustre_tests:+--define "build_lustre_tests 0"} \
977 ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
978 --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
979 --define "kdir $linux" \
980 ${linuxobj:+--define "kobjdir $linuxobj"} \
981 --define "_tmppath $TMPDIR" \
982 --define "_topdir $TOPDIR" 2>&1; then
994 # Fetch spl/zfs from the git repo and prepare for lustre build
996 # return 0 if successful, else 255
998 # make sure the RPM build environment is set up
1001 # The spl/zfs spec files expect RPM_BUILD_ROOT to point to the root of the
1002 # destination for the rpms
1003 export RPM_BUILD_ROOT=$TOPDIR
1005 # The files expect a kver to be set to the kernel version .
1006 kver=$(cat ${LINUX}/include/config/kernel.release)
1008 # build and install the spl and zfs (and -devel) RPMs for lustre to use
1010 for pkg in spl zfs; do
1014 [ "$pkg" == "zfs" ] && spldir="$(ls -d $TOPDIR/usr/src/spl-*/*)"
1017 # need to fetch the repo in order to build it.
1018 # default to github but allow override
1019 git clone ${SPLZFSGITREPO:-"https://github.com/zfsonlinux"}/$pkg.git $pkg 2>&1
1021 pushd $pkg || return 255
1023 # XXX - _having_ to give a package a kernel just to have it configure
1024 # enough to do a "make dist" is truely bogus!
1025 if ! ./configure --with-linux=${LINUX} \
1026 ${spldir:+--with-spl="${spldir}"} 2>&1 ||
1027 ! make dist 2>&1; then
1033 # XXX - dirty hack time. ~sigh~
1034 # because the spl tarball contains two .spec files, we cannot
1035 # simply rebuild the tarball
1036 ln $pkg/$pkg-*.tar.gz $TOPDIR/SOURCES ||
1037 error "failed to link $pkg/$pkg-*.tar.gz into $TOPDIR/SOURCES"
1039 # First build the userspace tools RPMs
1040 if ! $RPMBUILD $targets -bb $pkg/$pkg.spec \
1042 --define "configure_args ${CONFIGURE_FLAGS}" \
1043 --define "_tmppath /var/tmp" \
1044 --define "_topdir $TOPDIR" 2>&1; then
1049 if ! $RPMBUILD -bs $pkg/$pkg.spec \
1051 --define "configure_args ${CONFIGURE_FLAGS}" \
1052 --define "_tmppath /var/tmp" \
1053 --define "_topdir $TOPDIR" 2>&1; then
1058 # Now the kernel module RPMs
1059 # Need to provide pointers to the lustre kernel source, objects, usr/src
1060 if ! $RPMBUILD $targets -bb $pkg/$rpmmod.spec \
1062 --define "require_kdir ${linux}" \
1063 ${linuxobj:+--define "require_kobj ${linuxobj}"} \
1064 ${spldir:+--define "require_spldir ${spldir}"} \
1065 --define "configure_args ${CONFIGURE_FLAGS}" \
1066 --define "_usrsrc $TOPDIR/usr/src" \
1067 --define "kver $kver" \
1068 --define "_tmppath /var/tmp" \
1069 --define "_topdir $TOPDIR" 2>&1; then
1074 if ! $RPMBUILD -bs $pkg/$rpmmod.spec \
1076 --define "require_kdir ${linux}" \
1077 ${linuxobj:+--define "require_kobj ${linuxobj}"} \
1078 ${spldir:+--define "require_spldir ${spldir}"} \
1079 --define "configure_args ${CONFIGURE_FLAGS}" \
1080 --define "_usrsrc $TOPDIR/usr/src" \
1081 --define "kver $kver" \
1082 --define "_tmppath /var/tmp" \
1083 --define "_topdir $TOPDIR" 2>&1; then
1088 # We have built the rpms for the package. No we need to extract the
1089 # contained files so we can build further things against them
1090 local rpm=$(ls $TOPDIR/RPMS/*/$rpmmod-devel-*.rpm)
1092 # cpio only extract to pwd so we need to go there.
1094 rpm2cpio < $rpm | cpio -id
1097 CONFIGURE_FLAGS="--with-$pkg=$(ls -d $TOPDIR/usr/src/$pkg-*/*) ${CONFIGURE_FLAGS}"
1107 [ "$STAGEDIR" ] || return 0
1109 for arch in $BUILD_ARCHS; do
1110 rpmdir="${STAGEDIR}/${CANONICAL_TARGET}-${arch}"
1111 echo "${0##*/}: Copying RPMs into ${rpmdir}"
1112 mkdir -p "${rpmdir}"
1113 cp -v RPMS/${arch}/*.rpm "${rpmdir}"
1114 if [ -d RPMS/noarch ]; then
1115 cp -v RPMS/noarch/*.rpm "${rpmdir}"
1119 cp -v "$LUSTRE" "$STAGEDIR"
1123 #check if we need to build separate ldiskfs RPM
1124 skeep_ldiskfs_rpm() {
1129 if ! $LDISKFSRPM; then
1131 elif $PATCHLESS; then
1134 for skiptag in $SKIPLDISKFSRPM; do
1135 [[ $tag == $skiptag ]] && skip=true && break
1143 set_rpm_smp_type() {
1145 local infact_arch="${TARGET_ARCH}"
1148 [ "$infact_arch" == "i586" ] && infact_arch="i686"
1151 for smp_type in $SMP_ARCHS; do
1152 [ $infact_arch == $smp_type ] && RPMSMPTYPE=smp && break
1155 for smp_type in $BIGSMP_ARCHS; do
1156 [ $infact_arch == $smp_type ] && RPMSMPTYPE=bigsmp && break
1159 for smp_type in $PPC64_ARCHS; do
1160 [ $infact_arch == $smp_type ] && RPMSMPTYPE=ppc64 && break
1163 for smp_type in $DEFAULT_ARCHS; do
1164 [ $infact_arch == $smp_type ] && RPMSMPTYPE=default && break
1169 # This function takes a linux source pool and digs out the linux release
1171 find_linux_release() {
1174 local LINUXRELEASEHEADER=$SRCDIR/include/linux/version.h
1175 if [ -s $SRCDIR/include/linux/utsrelease.h ]; then
1176 LINUXRELEASEHEADER=$SRCDIR/include/linux/utsrelease.h
1179 sed -ne 's/#define UTS_RELEASE "\(.*\)"$/\1/p' $LINUXRELEASEHEADER
1183 # unpack kernel(/source/devel) RPM
1185 # This function and it's setting of $LINUX and $LINUXOBJ is a total hack that
1186 # needs to completely refactored. It completely ingores that $BUILD_ARCHS may
1187 # contain a list of arches for which rpmbuild commands (including the one for
1189 unpack_linux_devel_rpm() {
1190 local kernelrpm="${1}"
1192 [ -f "$kernelrpm" ] || return 255
1193 [ -d $TOPDIR/reused ] || mkdir $TOPDIR/reused || return 255
1195 pushd $TOPDIR/reused &>/dev/null || return 255
1197 if ! rpm2cpio < "$kernelrpm" | cpio -id > /dev/null 2>&1; then
1201 # call a distro specific hook, if available
1202 if type -p unpack_linux_devel_rpm-$DISTRO; then
1203 if ! unpack_linux_devel_rpm-$DISTRO "$kernelrpm"; then
1210 find_linux_devel_paths $TOPDIR/reused
1218 local kib_prefix="$2"
1221 # build kernel-ib{,-devel}/compat-rdma{,-devel}
1223 # ofed 1.3 had a bug in the rpm spec
1224 if [ "$OFED_VERSION" = "1.3" ]; then
1228 local OFED_CORE="--with-core-mod --with-ipoib-mod --with-sdp-mod --with-user_mad-mod --with-user_access-mod --with-addr_trans-mod"
1229 local OFED_HARDWARE="--with-mthca-mod --with-mlx4-mod --with-mlx4_en-mod --with-cxgb3-mod --with-nes-mod"
1231 if compare_version $OFED_VERSION 3.0; then
1232 OFED_CORE="$OFED_CORE --with-madeye-mod --with-rds-mod"
1234 OFED_HARDWARE="$OFED_HARDWARE --with-cxgb4-mod"
1237 # some I/B drivers are architecture dependent and kernel-ib's configure
1238 # does not figure it out for us ~sigh~
1239 case "$TARGET_ARCH" in
1241 OFED_HARDWARE="$OFED_HARDWARE --with-ehca-mod"
1244 # we're no longer shipping the OFED iSCSI target
1245 #OFED_ISCSI="--with-srp-mod --with-srp-target-mod"
1246 OFED_ISCSI="--with-srp-mod"
1247 ## ISER module has no backport support as of OFED 1.5 (i.e. only builds on
1248 ##kernels >= 2.6.30)
1249 #if [[ $OFED_VERSION = 1.[0-4]* ]]; then
1250 # OFED_ISCSI="$OFED_ISCSI --with-iser-mod"
1253 # assume we are just rebuilding the SRPM
1254 local BUILD_TYPE=${BUILD_TYPE:-"--rebuild"}
1255 local SOURCE="${TOPDIR}/OFED/SRPMS/${kib_prefix}-*.src.rpm"
1257 # but switch to building from the SPEC if we need to apply patches
1258 if ls ${TOPDIR}/lustre/build/patches/ofed/* >/dev/null; then
1260 rpm --define "_topdir ${TOPDIR}" -ivh $SOURCE
1261 SOURCE="${TOPDIR}/SPECS/${kib_prefix}.spec"
1262 local file ed_fragment1 ed_fragment2 n=1
1263 for file in $(ls ${TOPDIR}/lustre/build/patches/ofed/*.patch); do
1264 ed_fragment1="$ed_fragment1
1265 Patch$n: ${file%%*/}"
1266 ed_fragment2="$ed_fragment2
1268 cp $file ${TOPDIR}/SOURCES
1271 for file in $(ls ${TOPDIR}/lustre/build/patches/ofed/*.ed); do
1272 # Only apply the ed-scripts that should be used for the canonical target
1273 # ed-files in ${TOPDIR}/lustre/build/patches/ofed/ have to follow the naming
1275 # <two-digits>-<descriptive-name>:<canonical_target_1>: ...:<canonical_target_N>.ed
1276 # To apply the same change to multiple canonical target simply specify
1277 # a list of colon separated canoncial target names in the file name.
1278 echo "$file" | grep -q -e ":${CANONICAL_TARGET}:" \
1279 -e ":${CANONICAL_TARGET}.ed$"
1280 if [ $? -eq 0 ] ; then
1281 ed_fragment3="$ed_fragment3
1287 if [ $n -gt 1 ]; then
1301 local linuxrelease=$(find_linux_release "$linux")
1302 if compare_version $OFED_VERSION 3.0; then
1303 local OFA_KERNEL_RELEASE=$(echo -n ${linuxrelease} | sed -e 's/-/_/g')
1305 if ! $RPMBUILD $BUILD_TYPE --define 'build_kernel_ib 1' --define 'build_kernel_ib_devel 1' \
1306 ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
1307 --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
1308 --define "KVERSION ${linuxrelease}" \
1309 --define "$K_SRC ${linux}" \
1310 --define "LIB_MOD_DIR /lib/modules/${linuxrelease}/updates" \
1311 ${OFA_KERNEL_RELEASE:+--define "_release $OFA_KERNEL_RELEASE"} \
1312 --define "configure_options --without-quilt $OFED_CORE $OFED_HARDWARE $OFED_ISCSI" \
1313 ${SOURCE} 2>&1; then
1314 fatal 1 "Error building ${kib_rpm}"
1323 local signature="$4"
1324 local use_links="$5"
1331 local default_iface=$(/sbin/ip route get 192.1.1.1 | sed -ne 's/.* dev \(.*\) * src .*/\1/p')
1332 if [ -z "$default_iface" ]; then
1333 fatal 1 "Failed to determine the default route interface"
1335 local unique_id=$(/sbin/ip addr show dev $default_iface | sed -ne '/ inet /s/ *inet \(.*\)\/.*/\1/p' | head -1)
1336 if [ -z "$unique_id" ]; then
1337 fatal 1 "Failed to determine a unique id from interface $default_interface"
1340 local finallocation="$location"/"$signature"/"$module"
1341 location="$location"/"$signature-${unique_id}"/"$module"
1342 mkdir -p "$location"
1343 # the cleanup script removes any directory that doesn't have a
1344 # .lastused, so let's try to prevent that as soon as we can
1345 # this solution still slightly racy with the cleanup script
1346 # but the race is a lot tighter now
1347 touch -t 197001010000 "$location/.lastused"
1348 ## use eval/echo here to make sure shell expansions are performed
1349 #if ! cp -a${linkflag} $(eval echo $articles) "$location"; then
1351 for article in $(eval echo $articles); do
1352 if ! cp -a${linkflag} "$article" "$location"; then
1353 error "Failed to copy \"$article\" to \"$location\" in store_for_reuse()"
1354 # rename the cache location so that it's not cached
1355 # product, but is around for analysis
1356 mv "$location"{,-bad-$(date +%s)} ||
1357 error "failed to clean up a failed cache attempt" \
1358 "in \"$location\" -- manual cleanup will be" \
1364 # flag the cache as complete (i.e. in case lbuild was previously
1365 # interrupted while caching)
1366 touch "$location/.lastused"
1368 # put the temporary location into the final location
1370 mkdir -p "${finallocation%/*}"
1371 mv "$location" "$finallocation"
1372 rmdir "${location%/*}"
1380 local use_links="${3:-false}"
1381 local signature="$4"
1383 if [ -n "$REUSEBUILD" ] && [ -d "$REUSEBUILD/$signature/$module" ]; then
1384 if [ ! -f "$REUSEBUILD/$signature/$module/.lastused" ]; then
1385 # the .lastused flag is populated at the end of the caching to
1386 # signal that the caching was completed. if that flag is not
1387 # there, then the cache is invalid (and should be removed in fact)
1388 mv "$REUSEBUILD/$signature/$module"{,-bad-$(date +%s)} ||
1389 fatal 1 "failed to clean up a bad cache in location $REUSEBUILD/$signature/$module\" -- manual cleanup will be necessary"
1393 # so that we know how stale this entry is
1394 touch $REUSEBUILD/$signature/$module/.lastused
1397 if ls $REUSEBUILD/$signature/$module/* >/dev/null 2>&1; then
1398 cp -al $REUSEBUILD/$signature/$module/* $dest/
1401 # copying is pretty heavy
1402 # cp -a $REUSEBUILD/$signature/$module/* $dest/
1403 # do some creative symlinking instead
1405 for dir in BUILD SRPMS SPECS; do
1406 if ls $REUSEBUILD/$signature/$module/$dir/* >/dev/null 2>&1; then
1407 ln -s $REUSEBUILD/$signature/$module/$dir/* $dest/$dir
1410 # sources have to be copied by file because we need SOURCES to
1411 # be a dir we can write into
1412 # could overrun ls's arg list here
1413 #ls $REUSEBUILD/$signature/$module/SOURCES/* |
1414 find $REUSEBUILD/$signature/$module/SOURCES/ -type f |
1415 xargs ln -t $dest/SOURCES -s
1417 # same for RPMS/* dirs
1418 # could overrun ls's arg list here
1419 #ls $REUSEBUILD/$signature/$module/RPMS/$TARGET_ARCH/* |
1421 for dir in $REUSEBUILD/$signature/$module/RPMS/*; do
1422 mkdir -p $dest/RPMS/${dir##*/}
1424 xargs ln -t $dest/RPMS/${dir##*/} -s
1436 if [[ $arch = i[3456]86 ]]; then
1444 build_kernel_with_srpm() {
1447 if [ -z "$outfd" ] || [ $outfd = 1 ]; then
1448 fatal 1 "You must supply a file descriptor to ${FUNCNAME[0]} and it cannot be 1"
1451 # need to generate the patch for this target
1452 do_patch_linux false >&${outfd} # sets global $FULL_PATCH (yeah, yuck)
1454 # get an md5sum of the kernel patch + config for reuse check
1455 # XXX really, there needs to be a signature and a CONFIG_FILE per arch
1459 local release_str="RELEASE=$RELEASE\n"
1462 if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
1463 local REUSE_SIGNATURE=$({ echo -en $release_str;
1465 cat $CONFIG_FILE $TARGET_FILE $FULL_PATCH;
1466 cat ${0%/lbuild}/lbuild ${0%/lbuild}/lbuild-${DISTRO}; } |
1467 md5sum | cut -d" " -f1)
1468 # see if we can link to the reuse pool
1469 # XXX - hrm. i'm not convinced this doesn't belong in the reuse
1471 local CAN_LINK_FOR_REUSE=false
1472 touch $REUSEBUILD/$$
1473 if cp -al $REUSEBUILD/$$ $TOPDIR/ 2>/dev/null; then
1474 CAN_LINK_FOR_REUSE=true
1479 # the extra version string to use for the kernel (which might be a reused
1481 local kernel_extra_version=""
1482 if ! $USE_BUILD_CACHE || ! reuse kernel "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1483 "$REUSE_SIGNATURE"; then
1484 # nothing cached, build from scratch
1485 if [ ! -r "$KERNELDIR/$KERNEL_SRPM" ]; then
1486 echo "Downloading kernel SRPM" >&${outfd}
1487 download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM" >&${outfd}
1490 if ! rpm -ivh $KERNELDIR/$KERNEL_SRPM \
1491 --define "_topdir $TOPDIR" >&${outfd} 2>&1; then
1492 # should we clean this up or leave it for analysis?
1494 fatal 1 "Error installing kernel SRPM."
1497 # put the Lustre kernel patch into the RPM build tree
1498 cp $FULL_PATCH $TOPDIR/SOURCES/linux-${lnxmaj}-lustre.patch
1499 prepare_and_build_srpm >&${outfd} ||
1500 fatal 1 "failed to prepare_and_build_srpm"
1502 if [ -z "$REUSE_SIGNATURE" ]; then
1503 echo "No reuse signature was caculated so not storing the built kernel" >&${outfd}
1505 # store the resulting kernel RPM build tree for future use
1506 echo "Storing the built kernel for future reuse" >&${outfd}
1507 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,SRPMS,RPMS}" \
1508 "kernel" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1509 "$CAN_LINK_FOR_REUSE"; then
1510 error "Failed to store kernel RPMS for reuse"
1511 echo "unknown" >&${outfd}
1517 # figure out the EXTRA_VERSION of the kernel we built or are re-using
1519 if ! KERNEL_RPM=$(find_rpm "$TOPDIR/RPMS/$TARGET_ARCH/" provides "^kernel ="); then
1520 fatal 1 "Failed to find a kernel RPM in $TOPDIR/RPMS/$TARGET_ARCH/"
1522 kernel_extra_version=$(rpm -q --queryformat "%{RELEASE}" -p $TOPDIR/RPMS/$TARGET_ARCH/$KERNEL_RPM)
1524 # should now have the following RPMs
1525 # $TOPDIR/RPMS/$arch/kernel-lustre-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1526 # $TOPDIR/RPMS/$arch/kernel-lustre-devel-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1527 # $TOPDIR/RPMS/$arch/kernel-lustre-headers-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1528 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-common-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1529 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1531 echo $kernel_extra_version
1539 # REUSEBUILD, USE_BUILD_CACHE
1544 local ofed_version="$2"
1548 # if an ofed version is given, then it means use OFED proper,
1549 # not any vendor specific "inkernel" version
1550 if [ -z "$ofed_version" ]; then
1554 if [ "$ofed_version" = "inkernel" ]; then
1555 # see if there is a distro specific override for this and use
1557 # XXX we need to better integrate a distro specific override with
1558 # the rest of this function so that all of the reuse cache
1559 # stuff is leveraged given that 80% of this function is reuse
1560 if type -p build_ofed-${DISTRO}; then
1562 ofed_location=$(build_ofed-${DISTRO} ${STDOUT})
1563 local rc=${PIPESTATUS[0]}
1564 CONFIGURE_FLAGS="--with-o2ib=${ofed_location} ${CONFIGURE_FLAGS}"
1569 elif compare_version $OFED_VERSION 3.0; then
1570 kib_prefix="ofa_kernel"
1573 kib_prefix="compat-rdma"
1574 kib_rpm="compat-rdma"
1577 # build kernel-ib/compat-rdma
1578 if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
1579 local REUSE_SIGNATURE=$({ echo "$ofed_version";
1580 echo "$(find_linux_release ${linux};
1581 echo "$BUILD_GEN")";
1582 cat "${linux}/include/linux/autoconf.h";
1583 cat "${0%/lbuild}/lbuild" ;
1584 cat "${0%/lbuild}/lbuild-${DISTRO}"; } |
1585 md5sum | cut -d" " -f1)
1586 # see if we can link to the reuse pool
1587 # XXX - hrm. i'm not convinced this doesn't belong in the reuse
1589 local CAN_LINK_FOR_REUSE=false
1590 touch $REUSEBUILD/$$
1591 if cp -al $REUSEBUILD/$$ $TOPDIR/; then
1592 CAN_LINK_FOR_REUSE=true
1597 if ! $USE_BUILD_CACHE || ! reuse ofed "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1598 "$REUSE_SIGNATURE"; then
1599 if [ -n "$REUSE_SIGNATURE" ]; then
1600 # stash away the existing built articles for a moment
1602 mv {BUILD,{S,}RPMS,S{OURCE,PEC}S} bak
1605 find . | cpio -pudlm ..
1609 create_rpmbuild_dirs
1612 build_kernel_ib "${linux}" "${kib_prefix}" "${kib_rpm}"
1614 if [ -z "$REUSE_SIGNATURE" ]; then
1615 echo "No reuse signature was caculated so not storing the built ofed"
1617 # store the resulting RPM build tree for future use
1618 echo "Storing the built ofed for future reuse"
1619 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
1620 "ofed" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1621 "$CAN_LINK_FOR_REUSE"; then
1622 error "Failed to store OFED RPMS for reuse"
1626 # put the stuff we stashed away back
1631 pushd "$TOPDIR" >/dev/null
1632 rm -rf ${kib_rpm}-devel
1633 mkdir ${kib_rpm}-devel
1635 # the actual ofed RPMs don't have the -rc$n or -$date string appened that
1636 # might be present on the file
1637 local linuxrelease=$(find_linux_release "$linux")
1638 ofed_version=$(echo $ofed_version |
1639 sed -re 's/-(20[0-9]{6,6}-[0-9]{4,4}|rc[0-9]*)$//')
1640 local rpm=$(ls $TOPDIR/RPMS/*/${kib_rpm}-devel-${ofed_version}-${linuxrelease//-/_}.*.rpm)
1641 if ! rpm2cpio < $rpm | cpio -id; then
1642 fatal 1 "could not unpack the ${kib_rpm}-devel rpm."
1644 CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/${kib_prefix} ${CONFIGURE_FLAGS}"
1651 if ! $PATCHLESS; then
1652 local kernel_extra_version
1653 if ! kernel_extra_version=$(build_kernel_with_srpm ${STDOUT}); then
1654 fatal 1 "Failed to build the kernel from it's SRPM"
1657 for arch in $BUILD_ARCHS; do
1658 local kernel_devel_rpm
1659 if ! kernel_devel_rpm=$(find_rpm "$TOPDIR/RPMS/$arch/" provides "^$(devel_kernel_name $KERNEL_LUSTRE_NAMING) ="); then
1660 fatal 1 "Failed to find a kernel development RPM in $TOPDIR/RPMS/$arch/"
1663 # install the -devel RPM in preparation for modules builds
1664 if ! lnxrel="$kernel_extra_version" unpack_linux_devel_rpm \
1665 "$TOPDIR/RPMS/$arch/$kernel_devel_rpm"; then
1666 fatal 1 "Could not find the Linux tree in $TOPDIR/RPMS/$arch/$kernel_devel_rpm"
1670 # need to find and unpack the vendor's own kernel-devel for patchless
1673 if ! kernelrpm=$(find_linux_rpm "-$DEVEL_KERNEL_TYPE"); then
1674 fatal 1 "Could not find the kernel-$DEVEL_KERNEL_TYPE RPM in ${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
1676 if ! lnxrel="$lnxrel" unpack_linux_devel_rpm "$kernelrpm" "-"; then
1677 fatal 1 "Could not find the Linux tree in $kernelrpm"
1681 # ~sigh~ have to make copies of and modify some of the rpm
1682 # infrastructure files so that find-requires can find our unpacked
1683 # kernel-devel artifacts
1684 cp $RPM_HELPERS_DIR/{symset-table,find-requires{,.ksyms}} .
1685 FIND_REQUIRES="$(pwd)/find-requires"
1686 chmod 755 {symset-table,find-requires{,.ksyms}}
1688 tmp="${tmp//\//\\/}"
1689 ed find-requires <<EOF
1693 /|.*find-requires.ksyms/s/|/| bash -x/
1694 g/ [^ ]*\/\(find-requires\.ksyms\)/s// $tmp\/\1/g
1697 ed find-requires.ksyms <<EOF
1701 g/\/.*\/\(symset-table\)/s//$tmp\/\1/g
1704 ed symset-table <<EOF
1708 g/\(\/boot\/\)/s//$tmp\/reused\1/g
1709 g/\(\/usr\/src\/kernels\/\)/s//$tmp\/reused\1/g
1713 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
1714 fatal 1 "error building OFED"
1717 if build_lustre "$LINUX" "$LINUXOBJ"; then
1718 # the build worked. resolve any symlinked files (i.e. from reuse)
1719 # in RPMS/$arch to real files so that that that huge mess of
1720 # complication known as LTS can copy them yet somewhere else.
1721 # is it any wonder this whole process is so damn so? anyone ever
1722 # heard of hardlinks? it's this cool new thing that allows you save
1723 # tons of time and space by creating... well you can go read about
1724 # them if you have not heard about them yet.
1725 # can i say how much the implemenation of all of this really impedes
1728 for dir in RPMS/*; do
1730 for file in $(ls); do
1731 if [ -h $file ]; then
1738 # also, for i?86, make sure all of the RPMs are in RPMS/$TARGET_ARCH
1739 # as that's where LTS expects to find them
1740 for dir in RPMS/*; do
1741 if [ $dir = RPMS/$TARGET_ARCH ]; then
1746 if [ -n "$files" ]; then
1747 cp -al $files ../$TARGET_ARCH
1757 create_rpmbuild_dirs() {
1759 [ -d RPMS ] || mkdir RPMS
1760 for arch in $BUILD_ARCHS; do
1761 if [[ $arch = i?86 ]]; then
1762 # some stupidity in the sles11 kernel spec requires an RPMS/i386
1763 # even if the target arch is i686
1764 [ -d RPMS/i386 ] || mkdir RPMS/i386
1766 [ -d RPMS/$arch ] || mkdir RPMS/$arch
1768 [ -d BUILD ] || mkdir BUILD
1769 [ -d SOURCES ] || mkdir SOURCES
1770 [ -d SPECS ] || mkdir SPECS
1771 [ -d SRPMS ] || mkdir SRPMS
1793 [[ $list\ == *\ $item\ * ]]
1797 #########################################################################
1798 # Generate a backtrace through the call stack.
1802 #########################################################################
1806 local funcname="" sourcefile="" lineno="" n
1808 echo "Call stack: (most recent first)"
1809 for (( n = $strip ; n < ${#FUNCNAME[@]} ; ++n )) ; do
1810 funcname=${FUNCNAME[$n - 1]}
1811 sourcefile=$(basename ${BASH_SOURCE[$n]})
1812 lineno=${BASH_LINENO[$n - 1]}
1816 # Display function arguments
1817 if [[ ! -z "${BASH_ARGV[@]}" ]]; then
1818 local args newarg j p=0
1819 for (( j = ${BASH_ARGC[$n - 1]}; j > 0; j-- )); do
1820 newarg=${BASH_ARGV[$j + $p - 1]}
1821 args="${args:+${args} }'${newarg}'"
1823 let p+=${BASH_ARGC[$n - 1]}
1825 echo " ${funcname} ${args:+${args} }at ${sourcefile}:${lineno}"
1829 echo "BEGIN BACKTRACE"
1831 #echo ${BASH_LINENO[*]}
1832 #echo ${BASH_SOURCE[*]}
1833 #echo ${FUNCNAME[*]}
1834 local i=$((${#FUNCNAME[@]} - 1))
1835 while [ $i -ge 0 ]; do
1836 local lineno=${BASH_LINENO[$i]}
1840 local SOURCELINE="${BASH_SOURCE[$i + 1]}:${lineno}"
1841 # Can't figure out how to get function args from other frames...
1842 local FUNCTION="${FUNCNAME[$i]}()"
1843 echo "$SOURCELINE:$FUNCTION"
1847 echo "END BACKTRACE"
1853 seen_list=$(new_list)
1855 echo "An unexpected error has occurred at ${BASH_SOURCE[0]##*/}:$((LINENO-1)).
1856 Unfortunately the above line number in the message may or may not be correct,
1857 but details have been send to the lbuild maintainer. Attempting to continue."; (echo "Untrapped error"
1859 # have we seen this one
1860 echo "checking seen list for ${BASH_SOURCE[0]}:${BASH_LINENO[0]}"
1862 if is_list_member "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}"; then
1863 echo "seen this one already"
1865 seen_list=$(add_list "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}")
1871 ) | mail -s "Untrapped error at ${BASH_SOURCE[0]##*/}:$((LINENO-15)) on $HOSTNAME" brian@whamcloud.com >&2; set $xtrace' ERR
1874 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
1876 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 -- "$@")
1878 if [ $? != 0 ]; then
1882 eval set -- "$options"
1917 if ! KERNELTREE=$(canon_path "$2"); then
1918 fatal 1 "Could not determine the canonical location of $2"
1922 --linux | --with-linux)
1923 if ! LINUX=$(canon_path "$2"); then
1924 fatal 1 "Could not determine the canonical location of $2"
1937 if ! REUSEBUILD=$(canon_path "$2"); then
1938 fatal 1 "Could not determine the canonical location of $2"
1959 if ! KERNELRPMSBASE=$(canon_path "$2"); then
1960 fatal 1 "Could not determine the canonical location of $2"
1969 if ! LUSTRE=$(canon_filepath "$2"); then
1970 fatal 1 "Could not determine the canonical location of $2"
2013 --disable-datestamp)
2027 # there are actually some lustre configure flags that we need to
2028 # handle ourselves (but we still give them to configure)
2029 if [[ \ $@\ == *\ --disable-tests\ * ]]; then
2033 CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-liblustre --enable-liblustre-tests"
2037 usage 1 "Unrecognized option: $1"
2046 # XXX - should we _always_ get the buildid from the META file? what are the
2047 # other (i.e. non-lustre-tarball use cases of lbuild)?
2048 BUILDID=$(sed -ne '/^BUILDID =/s/.*= *//p' lustre/META)
2052 if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
2054 unpack_ofed || fatal 1 "Error unpacking OFED tarball"
2057 # make sure the RPM build environment is set up
2058 create_rpmbuild_dirs
2060 # if an unpacked kernel source tree was given on the command line
2061 # just build lustre with it (nothing distro kernel specific here)
2062 if [ -n "$LINUX" ]; then
2063 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
2064 fatal 1 "error building OFED"
2065 build_lustre "$LINUX" "$LINUXOBJ"
2067 if [ ! -f "${LBUILD_DIR}/lbuild-$DISTRO" ]; then
2068 fatal 1 "${LBUILD_DIR}/lbuild-$DISTRO not found"
2070 source ${LBUILD_DIR}/lbuild-$DISTRO
2071 build_with_srpm || fatal 1 "Failed to build_with_srpm"