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 Sets 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 = *-[rR][cC][0-9] ]]; then
573 Mmv=${OFED_VERSION%%-[rR][cC][0-9]}
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
997 # SPLZFSGITREPO - URI of directory where spl.git and zfs.git are located
998 # SPLZFSTAG - Tag to checkout of clone repositories
999 # SPLZFSVER - Version to checkout of both (format zfs/spl-$SPLZFSVER)
1001 # return 0 if successful, else 255
1003 # make sure the RPM build environment is set up
1005 create_rpmbuild_dirs
1008 # The spl/zfs spec files expect RPM_BUILD_ROOT to point to the root of the
1009 # destination for the rpms
1010 export RPM_BUILD_ROOT=$TOPDIR
1011 SPLZFSVER=${SPLZFSVER:-0.6.1}
1012 SPLZFSTAG=${SPLZFSTAG:-lustre-zfs}
1014 # The files expect a kver to be set to the kernel version .
1015 local kver=$(find_linux_release ${LINUX})
1017 # build and install the spl and zfs (and -devel) RPMs for lustre to use
1019 for pkg in spl zfs; do
1023 [ "$pkg" == "zfs" ] && spldir="$(ls -d $TOPDIR/usr/src/spl-*/|tail -1)"
1025 # need to fetch the repo in order to build it.
1026 # default to github but allow override
1027 git clone ${SPLZFSGITREPO:-"https://github.com/zfsonlinux"}/$pkg.git $pkg 2>&1
1029 pushd $pkg || return 255
1030 if [ -n "$SPLZFSTAG" ]; then
1031 git checkout $SPLZFSTAG
1033 git checkout -b lbuild $pkg-$SPLZFSVER
1036 # This differentiates between older zfs versions
1037 if [ -f $pkg-modules.spec.in ]; then
1040 speclist="$pkg.spec $rpmpkg.spec"
1042 rpmpkg=kmod-$pkg-devel
1044 speclist="$pkg.spec $pkg-kmod.spec $pkg-dkms.spec"
1047 sh autogen.sh || return 255
1049 if ! ./configure --with-linux=${LINUX} --with-linux-obj=${LINUX} \
1050 ${spldir:+--with-spl="${spldir}"} 2>&1 ||
1051 ! make dist 2>&1; then
1057 ln -f $pkg/$pkg-*.tar.gz $TOPDIR/SOURCES ||
1058 error "failed to link $pkg/$pkg-*.tar.gz into $TOPDIR/SOURCES"
1059 if [ -f $pkg/scripts/kmodtool ]; then
1060 ln -f $pkg/scripts/kmodtool $TOPDIR/SOURCES/
1070 # set search dir for our own kmodtool to find correct
1072 export KERNELSOURCE=$(dirname ${LINUX})
1073 # Manually build rpms
1074 for spec in $speclist; do
1075 echo "Building RPMs from $pkg/$specdir/$spec"
1076 if ! $RPMBUILD $rpmb $pkg/$specdir/$spec \
1078 --define "require_kdir ${LINUX}" \
1079 ${LINUXOBJ:+--define "require_kobj ${LINUXOBJ}"} \
1080 ${spldir:+--define "require_spldir ${spldir}"} \
1081 --define "kver $kver" \
1082 --define "kernels $kver" \
1083 --define "_tmppath /var/tmp" \
1084 --define "kernelbuildroot $(find_linux_builddir $LINUX)" \
1085 --define "_topdir $TOPDIR" 2>&1; then
1090 # $DO_SRC && mv $pkg*.src.rpm $TOPDIR/SRPMS/
1091 # mv $pkg*.noarch.rpm $TOPDIR/RPMS/noarch/
1092 # mv *$pkg*.$TARGET_ARCH.rpm $TOPDIR/RPMS/$(basearch $TARGET_ARCH)/
1094 # We have built the rpms for the package. Now we need to extract the
1095 # contained files so we can build further things against them
1096 local rpms=$(ls -1 $TOPDIR/RPMS/*/$rpmpkg-*.rpm)
1098 # cpio only extract to pwd so we need to go there.
1101 for rpm in $rpms; do
1102 rpm2cpio $rpm | cpio -id
1106 CONFIGURE_FLAGS="--with-$pkg=$(ls -d $TOPDIR/usr/src/$pkg-*/|tail -1) ${CONFIGURE_FLAGS}"
1107 CONFIGURE_FLAGS="--with-$pkg-obj=$(ls -d $TOPDIR/usr/src/$pkg-*/$kver*|tail -1) ${CONFIGURE_FLAGS}"
1117 [ "$STAGEDIR" ] || return 0
1119 for arch in $BUILD_ARCHS; do
1120 rpmdir="${STAGEDIR}/${CANONICAL_TARGET}-${arch}"
1121 echo "${0##*/}: Copying RPMs into ${rpmdir}"
1122 mkdir -p "${rpmdir}"
1123 cp -v RPMS/${arch}/*.rpm "${rpmdir}"
1124 if [ -d RPMS/noarch ]; then
1125 cp -v RPMS/noarch/*.rpm "${rpmdir}"
1129 cp -v "$LUSTRE" "$STAGEDIR"
1133 #check if we need to build separate ldiskfs RPM
1134 skeep_ldiskfs_rpm() {
1139 if ! $LDISKFSRPM; then
1141 elif $PATCHLESS; then
1144 for skiptag in $SKIPLDISKFSRPM; do
1145 [[ $tag == $skiptag ]] && skip=true && break
1153 set_rpm_smp_type() {
1155 local infact_arch="${TARGET_ARCH}"
1158 [ "$infact_arch" == "i586" ] && infact_arch="i686"
1161 for smp_type in $SMP_ARCHS; do
1162 [ $infact_arch == $smp_type ] && RPMSMPTYPE=smp && break
1165 for smp_type in $BIGSMP_ARCHS; do
1166 [ $infact_arch == $smp_type ] && RPMSMPTYPE=bigsmp && break
1169 for smp_type in $PPC64_ARCHS; do
1170 [ $infact_arch == $smp_type ] && RPMSMPTYPE=ppc64 && break
1173 for smp_type in $DEFAULT_ARCHS; do
1174 [ $infact_arch == $smp_type ] && RPMSMPTYPE=default && break
1179 # This function takes a linux source pool and digs out the linux release
1181 find_linux_release() {
1184 local LINUXRELEASEHEADER=$SRCDIR/include/linux/version.h
1185 if [ -s $SRCDIR/include/linux/utsrelease.h ]; then
1186 LINUXRELEASEHEADER=$SRCDIR/include/linux/utsrelease.h
1189 sed -ne 's/#define UTS_RELEASE "\(.*\)"$/\1/p' $LINUXRELEASEHEADER
1192 # This funcition finds the buildroot directory for a given linux
1194 find_linux_builddir() {
1195 local linux=${1:-${LINUX}}
1196 local rel=$(find_linux_release $linux)
1198 echo ${linux%/usr/src/kernels/${rel}*}
1201 # unpack kernel(/source/devel) RPM
1203 # This function and it's setting of $LINUX and $LINUXOBJ is a total hack that
1204 # needs to completely refactored. It completely ingores that $BUILD_ARCHS may
1205 # contain a list of arches for which rpmbuild commands (including the one for
1207 unpack_linux_devel_rpm() {
1208 local kernelrpm="${1}"
1210 [ -f "$kernelrpm" ] || return 255
1211 [ -d $TOPDIR/reused ] || mkdir $TOPDIR/reused || return 255
1213 pushd $TOPDIR/reused &>/dev/null || return 255
1215 if ! rpm2cpio < "$kernelrpm" | cpio -id > /dev/null 2>&1; then
1219 # call a distro specific hook, if available
1220 if type -p unpack_linux_devel_rpm-$DISTRO; then
1221 if ! unpack_linux_devel_rpm-$DISTRO "$kernelrpm"; then
1228 find_linux_devel_paths $TOPDIR/reused
1236 local kib_prefix="$2"
1239 # build kernel-ib{,-devel}/compat-rdma{,-devel}
1241 # ofed 1.3 had a bug in the rpm spec
1242 if [ "$OFED_VERSION" = "1.3" ]; then
1246 local OFED_CORE="--with-core-mod --with-ipoib-mod --with-sdp-mod --with-user_mad-mod --with-user_access-mod --with-addr_trans-mod"
1247 local OFED_HARDWARE="--with-mthca-mod --with-mlx4-mod --with-mlx4_en-mod --with-cxgb3-mod --with-nes-mod"
1249 if compare_version $OFED_VERSION 3.0; then
1250 OFED_CORE="$OFED_CORE --with-madeye-mod --with-rds-mod"
1252 OFED_HARDWARE="$OFED_HARDWARE --with-cxgb4-mod"
1255 # some I/B drivers are architecture dependent and kernel-ib's configure
1256 # does not figure it out for us ~sigh~
1257 case "$TARGET_ARCH" in
1259 OFED_HARDWARE="$OFED_HARDWARE --with-ehca-mod"
1262 # we're no longer shipping the OFED iSCSI target
1263 #OFED_ISCSI="--with-srp-mod --with-srp-target-mod"
1264 OFED_ISCSI="--with-srp-mod"
1265 ## ISER module has no backport support as of OFED 1.5 (i.e. only builds on
1266 ##kernels >= 2.6.30)
1267 #if [[ $OFED_VERSION = 1.[0-4]* ]]; then
1268 # OFED_ISCSI="$OFED_ISCSI --with-iser-mod"
1271 # assume we are just rebuilding the SRPM
1272 local BUILD_TYPE=${BUILD_TYPE:-"--rebuild"}
1273 local SOURCE="${TOPDIR}/OFED/SRPMS/${kib_prefix}-*.src.rpm"
1275 # but switch to building from the SPEC if we need to apply patches
1276 if ls ${TOPDIR}/lustre/build/patches/ofed/* >/dev/null; then
1278 rpm --define "_topdir ${TOPDIR}" -ivh $SOURCE
1279 SOURCE="${TOPDIR}/SPECS/${kib_prefix}.spec"
1280 local file ed_fragment1 ed_fragment2 n=1
1281 for file in $(ls ${TOPDIR}/lustre/build/patches/ofed/*.patch); do
1282 ed_fragment1="$ed_fragment1
1283 Patch$n: ${file%%*/}"
1284 ed_fragment2="$ed_fragment2
1286 cp $file ${TOPDIR}/SOURCES
1289 for file in $(ls ${TOPDIR}/lustre/build/patches/ofed/*.ed); do
1290 # Only apply the ed-scripts that should be used for the canonical target
1291 # ed-files in ${TOPDIR}/lustre/build/patches/ofed/ have to follow the naming
1293 # <two-digits>-<descriptive-name>:<canonical_target_1>: ...:<canonical_target_N>.ed
1294 # To apply the same change to multiple canonical target simply specify
1295 # a list of colon separated canoncial target names in the file name.
1296 echo "$file" | grep -q -e ":${CANONICAL_TARGET}:" \
1297 -e ":${CANONICAL_TARGET}.ed$"
1298 if [ $? -eq 0 ] ; then
1299 ed_fragment3="$ed_fragment3
1305 if [ $n -gt 1 ]; then
1319 local linuxrelease=$(find_linux_release "$linux")
1320 if compare_version $OFED_VERSION 3.0; then
1321 local OFA_KERNEL_RELEASE=$(echo -n ${linuxrelease} | sed -e 's/-/_/g')
1323 if ! $RPMBUILD $BUILD_TYPE --define 'build_kernel_ib 1' --define 'build_kernel_ib_devel 1' \
1324 ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
1325 --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
1326 --define "KVERSION ${linuxrelease}" \
1327 --define "$K_SRC ${linux}" \
1328 --define "LIB_MOD_DIR /lib/modules/${linuxrelease}/updates" \
1329 ${OFA_KERNEL_RELEASE:+--define "_release $OFA_KERNEL_RELEASE"} \
1330 --define "configure_options --without-quilt $OFED_CORE $OFED_HARDWARE $OFED_ISCSI" \
1331 ${SOURCE} 2>&1; then
1332 fatal 1 "Error building ${kib_rpm}"
1341 local signature="$4"
1342 local use_links="$5"
1349 local default_iface=$(/sbin/ip route get 192.1.1.1 | sed -ne 's/.* dev \(.*\) * src .*/\1/p')
1350 if [ -z "$default_iface" ]; then
1351 fatal 1 "Failed to determine the default route interface"
1353 local unique_id=$(/sbin/ip addr show dev $default_iface | sed -ne '/ inet /s/ *inet \(.*\)\/.*/\1/p' | head -1)
1354 if [ -z "$unique_id" ]; then
1355 fatal 1 "Failed to determine a unique id from interface $default_interface"
1358 local finallocation="$location"/"$signature"/"$module"
1359 location="$location"/"$signature-${unique_id}"/"$module"
1360 mkdir -p "$location"
1361 # the cleanup script removes any directory that doesn't have a
1362 # .lastused, so let's try to prevent that as soon as we can
1363 # this solution still slightly racy with the cleanup script
1364 # but the race is a lot tighter now
1365 touch -t 197001010000 "$location/.lastused"
1366 ## use eval/echo here to make sure shell expansions are performed
1367 #if ! cp -a${linkflag} $(eval echo $articles) "$location"; then
1369 for article in $(eval echo $articles); do
1370 if ! cp -a${linkflag} "$article" "$location"; then
1371 error "Failed to copy \"$article\" to \"$location\" in store_for_reuse()"
1372 # rename the cache location so that it's not cached
1373 # product, but is around for analysis
1374 mv "$location"{,-bad-$(date +%s)} ||
1375 error "failed to clean up a failed cache attempt" \
1376 "in \"$location\" -- manual cleanup will be" \
1382 # flag the cache as complete (i.e. in case lbuild was previously
1383 # interrupted while caching)
1384 touch "$location/.lastused"
1386 # put the temporary location into the final location
1388 mkdir -p "${finallocation%/*}"
1389 mv "$location" "$finallocation"
1390 rmdir "${location%/*}"
1398 local use_links="${3:-false}"
1399 local signature="$4"
1401 if [ -n "$REUSEBUILD" ] && [ -d "$REUSEBUILD/$signature/$module" ]; then
1402 if [ ! -f "$REUSEBUILD/$signature/$module/.lastused" ]; then
1403 # the .lastused flag is populated at the end of the caching to
1404 # signal that the caching was completed. if that flag is not
1405 # there, then the cache is invalid (and should be removed in fact)
1406 mv "$REUSEBUILD/$signature/$module"{,-bad-$(date +%s)} ||
1407 fatal 1 "failed to clean up a bad cache in location $REUSEBUILD/$signature/$module\" -- manual cleanup will be necessary"
1411 # so that we know how stale this entry is
1412 touch $REUSEBUILD/$signature/$module/.lastused
1415 if ls $REUSEBUILD/$signature/$module/* >/dev/null 2>&1; then
1416 cp -al $REUSEBUILD/$signature/$module/* $dest/
1419 # copying is pretty heavy
1420 # cp -a $REUSEBUILD/$signature/$module/* $dest/
1421 # do some creative symlinking instead
1423 for dir in BUILD SRPMS SPECS; do
1424 if ls $REUSEBUILD/$signature/$module/$dir/* >/dev/null 2>&1; then
1425 ln -s $REUSEBUILD/$signature/$module/$dir/* $dest/$dir
1428 # sources have to be copied by file because we need SOURCES to
1429 # be a dir we can write into
1430 # could overrun ls's arg list here
1431 #ls $REUSEBUILD/$signature/$module/SOURCES/* |
1432 find $REUSEBUILD/$signature/$module/SOURCES/ -type f |
1433 xargs ln -t $dest/SOURCES -s
1435 # same for RPMS/* dirs
1436 # could overrun ls's arg list here
1437 #ls $REUSEBUILD/$signature/$module/RPMS/$TARGET_ARCH/* |
1439 for dir in $REUSEBUILD/$signature/$module/RPMS/*; do
1440 mkdir -p $dest/RPMS/${dir##*/}
1442 xargs ln -t $dest/RPMS/${dir##*/} -s
1454 if [[ $arch = i[3456]86 ]]; then
1462 build_kernel_with_srpm() {
1465 if [ -z "$outfd" ] || [ $outfd = 1 ]; then
1466 fatal 1 "You must supply a file descriptor to ${FUNCNAME[0]} and it cannot be 1"
1469 # need to generate the patch for this target
1470 do_patch_linux false >&${outfd} # sets global $FULL_PATCH (yeah, yuck)
1472 # get an md5sum of the kernel patch + config for reuse check
1473 # XXX really, there needs to be a signature and a CONFIG_FILE per arch
1477 local release_str="RELEASE=$RELEASE\n"
1480 if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
1481 local REUSE_SIGNATURE=$({ echo -en $release_str;
1483 cat $CONFIG_FILE $TARGET_FILE $FULL_PATCH;
1484 cat ${0%/lbuild}/lbuild ${0%/lbuild}/lbuild-${DISTRO}; } |
1485 md5sum | cut -d" " -f1)
1486 # see if we can link to the reuse pool
1487 # XXX - hrm. i'm not convinced this doesn't belong in the reuse
1489 local CAN_LINK_FOR_REUSE=false
1490 touch $REUSEBUILD/$$
1491 if cp -al $REUSEBUILD/$$ $TOPDIR/ 2>/dev/null; then
1492 CAN_LINK_FOR_REUSE=true
1497 # the extra version string to use for the kernel (which might be a reused
1499 local kernel_extra_version=""
1500 if ! $USE_BUILD_CACHE || ! reuse kernel "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1501 "$REUSE_SIGNATURE"; then
1502 # nothing cached, build from scratch
1503 if [ ! -r "$KERNELDIR/$KERNEL_SRPM" ]; then
1504 echo "Downloading kernel SRPM" >&${outfd}
1505 download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM" >&${outfd}
1508 if ! rpm -ivh $KERNELDIR/$KERNEL_SRPM \
1509 --define "_topdir $TOPDIR" >&${outfd} 2>&1; then
1510 # should we clean this up or leave it for analysis?
1512 fatal 1 "Error installing kernel SRPM."
1515 # put the Lustre kernel patch into the RPM build tree
1516 cp $FULL_PATCH $TOPDIR/SOURCES/linux-${lnxmaj}-lustre.patch
1517 prepare_and_build_srpm >&${outfd} ||
1518 fatal 1 "failed to prepare_and_build_srpm"
1520 if [ -z "$REUSE_SIGNATURE" ]; then
1521 echo "No reuse signature was caculated so not storing the built kernel" >&${outfd}
1523 # store the resulting kernel RPM build tree for future use
1524 echo "Storing the built kernel for future reuse" >&${outfd}
1525 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,SRPMS,RPMS}" \
1526 "kernel" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1527 "$CAN_LINK_FOR_REUSE"; then
1528 error "Failed to store kernel RPMS for reuse"
1529 echo "unknown" >&${outfd}
1535 # figure out the EXTRA_VERSION of the kernel we built or are re-using
1537 if ! KERNEL_RPM=$(find_rpm "$TOPDIR/RPMS/$TARGET_ARCH/" provides "^kernel ="); then
1538 fatal 1 "Failed to find a kernel RPM in $TOPDIR/RPMS/$TARGET_ARCH/"
1540 kernel_extra_version=$(rpm -q --queryformat "%{RELEASE}" -p $TOPDIR/RPMS/$TARGET_ARCH/$KERNEL_RPM)
1542 # should now have the following RPMs
1543 # $TOPDIR/RPMS/$arch/kernel-lustre-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1544 # $TOPDIR/RPMS/$arch/kernel-lustre-devel-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1545 # $TOPDIR/RPMS/$arch/kernel-lustre-headers-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1546 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-common-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1547 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1549 echo $kernel_extra_version
1557 # REUSEBUILD, USE_BUILD_CACHE
1562 local ofed_version="$2"
1566 # if an ofed version is given, then it means use OFED proper,
1567 # not any vendor specific "inkernel" version
1568 if [ -z "$ofed_version" ]; then
1572 if [ "$ofed_version" = "inkernel" ]; then
1573 # see if there is a distro specific override for this and use
1575 # XXX we need to better integrate a distro specific override with
1576 # the rest of this function so that all of the reuse cache
1577 # stuff is leveraged given that 80% of this function is reuse
1578 if type -p build_ofed-${DISTRO}; then
1580 ofed_location=$(build_ofed-${DISTRO} ${STDOUT})
1581 local rc=${PIPESTATUS[0]}
1582 CONFIGURE_FLAGS="--with-o2ib=${ofed_location} ${CONFIGURE_FLAGS}"
1587 elif compare_version $OFED_VERSION 3.0; then
1588 kib_prefix="ofa_kernel"
1591 kib_prefix="compat-rdma"
1592 kib_rpm="compat-rdma"
1595 # build kernel-ib/compat-rdma
1596 if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
1597 local REUSE_SIGNATURE=$({ echo "$ofed_version";
1598 echo "$(find_linux_release ${linux};
1599 echo "$BUILD_GEN")";
1600 cat "${linux}/include/linux/autoconf.h";
1601 cat "${0%/lbuild}/lbuild" ;
1602 cat "${0%/lbuild}/lbuild-${DISTRO}"; } |
1603 md5sum | cut -d" " -f1)
1604 # see if we can link to the reuse pool
1605 # XXX - hrm. i'm not convinced this doesn't belong in the reuse
1607 local CAN_LINK_FOR_REUSE=false
1608 touch $REUSEBUILD/$$
1609 if cp -al $REUSEBUILD/$$ $TOPDIR/; then
1610 CAN_LINK_FOR_REUSE=true
1615 if ! $USE_BUILD_CACHE || ! reuse ofed "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1616 "$REUSE_SIGNATURE"; then
1617 if [ -n "$REUSE_SIGNATURE" ]; then
1618 # stash away the existing built articles for a moment
1620 mv {BUILD,{S,}RPMS,S{OURCE,PEC}S} bak
1623 find . | cpio -pudlm ..
1627 create_rpmbuild_dirs
1630 build_kernel_ib "${linux}" "${kib_prefix}" "${kib_rpm}"
1632 if [ -z "$REUSE_SIGNATURE" ]; then
1633 echo "No reuse signature was caculated so not storing the built ofed"
1635 # store the resulting RPM build tree for future use
1636 echo "Storing the built ofed for future reuse"
1637 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
1638 "ofed" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1639 "$CAN_LINK_FOR_REUSE"; then
1640 error "Failed to store OFED RPMS for reuse"
1644 # put the stuff we stashed away back
1649 pushd "$TOPDIR" >/dev/null
1650 rm -rf ${kib_rpm}-devel
1651 mkdir ${kib_rpm}-devel
1653 # the actual ofed RPMs don't have the -rc$n or -$date string appened that
1654 # might be present on the file
1655 local linuxrelease=$(find_linux_release "$linux")
1656 ofed_version=$(echo $ofed_version |
1657 sed -re 's/-(20[0-9]{6,6}-[0-9]{4,4}|rc[0-9]*)$//')
1659 # OFED version will have 'hyphen' for minor release. (e.g. 3.5-1, instead
1660 # of 3.5.1) compat-rdma and compat-rdma-devel could have same version
1661 # number, but currectly not. Once OFED fix this in the future release, we
1662 # can remove following filter.
1663 ofed_version=$(echo $ofed_version |
1664 sed -re 's/-([0-9]*-[rR][cC][0-9]*)$//')
1665 local rpm=$(ls $TOPDIR/RPMS/*/${kib_rpm}-devel-${ofed_version}-${linuxrelease//-/_}.*.rpm)
1666 if ! rpm2cpio < $rpm | cpio -id; then
1667 fatal 1 "could not unpack the ${kib_rpm}-devel rpm."
1669 CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/${kib_prefix} ${CONFIGURE_FLAGS}"
1676 if ! $PATCHLESS; then
1677 local kernel_extra_version
1678 if ! kernel_extra_version=$(build_kernel_with_srpm ${STDOUT}); then
1679 fatal 1 "Failed to build the kernel from it's SRPM"
1682 for arch in $BUILD_ARCHS; do
1683 local kernel_devel_rpm
1684 if ! kernel_devel_rpm=$(find_rpm "$TOPDIR/RPMS/$arch/" provides "^$(devel_kernel_name $KERNEL_LUSTRE_NAMING) ="); then
1685 fatal 1 "Failed to find a kernel development RPM in $TOPDIR/RPMS/$arch/"
1688 # install the -devel RPM in preparation for modules builds
1689 if ! lnxrel="$kernel_extra_version" unpack_linux_devel_rpm \
1690 "$TOPDIR/RPMS/$arch/$kernel_devel_rpm"; then
1691 fatal 1 "Could not find the Linux tree in $TOPDIR/RPMS/$arch/$kernel_devel_rpm"
1695 # need to find and unpack the vendor's own kernel-devel for patchless
1698 if ! kernelrpm=$(find_linux_rpm "-$DEVEL_KERNEL_TYPE"); then
1699 fatal 1 "Could not find the kernel-$DEVEL_KERNEL_TYPE RPM in ${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
1701 if ! lnxrel="$lnxrel" unpack_linux_devel_rpm "$kernelrpm" "-"; then
1702 fatal 1 "Could not find the Linux tree in $kernelrpm"
1706 # ~sigh~ have to make copies of and modify some of the rpm
1707 # infrastructure files so that find-requires can find our unpacked
1708 # kernel-devel artifacts
1709 cp $RPM_HELPERS_DIR/{symset-table,find-requires{,.ksyms}} .
1710 FIND_REQUIRES="$(pwd)/find-requires"
1711 chmod 755 {symset-table,find-requires{,.ksyms}}
1713 tmp="${tmp//\//\\/}"
1714 ed find-requires <<EOF
1718 /|.*find-requires.ksyms/s/|/| bash -x/
1719 g/ [^ ]*\/\(find-requires\.ksyms\)/s// $tmp\/\1/g
1722 ed find-requires.ksyms <<EOF
1726 g/\/.*\/\(symset-table\)/s//$tmp\/\1/g
1729 ed symset-table <<EOF
1733 g/\(\/boot\/\)/s//$tmp\/reused\1/g
1734 g/\(\/usr\/src\/kernels\/\)/s//$tmp\/reused\1/g
1738 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
1739 fatal 1 "error building OFED"
1742 if build_lustre "$LINUX" "$LINUXOBJ"; then
1743 # the build worked. resolve any symlinked files (i.e. from reuse)
1744 # in RPMS/$arch to real files so that that that huge mess of
1745 # complication known as LTS can copy them yet somewhere else.
1746 # is it any wonder this whole process is so damn so? anyone ever
1747 # heard of hardlinks? it's this cool new thing that allows you save
1748 # tons of time and space by creating... well you can go read about
1749 # them if you have not heard about them yet.
1750 # can i say how much the implemenation of all of this really impedes
1753 for dir in RPMS/*; do
1755 for file in $(ls); do
1756 if [ -h $file ]; then
1763 # also, for i?86, make sure all of the RPMs are in RPMS/$TARGET_ARCH
1764 # as that's where LTS expects to find them
1765 for dir in RPMS/*; do
1766 if [ $dir = RPMS/$TARGET_ARCH ]; then
1771 if [ -n "$files" ]; then
1772 cp -al $files ../$TARGET_ARCH
1782 create_rpmbuild_dirs() {
1784 [ -d RPMS ] || mkdir RPMS
1785 for arch in $BUILD_ARCHS; do
1786 if [[ $arch = i?86 ]]; then
1787 # some stupidity in the sles11 kernel spec requires an RPMS/i386
1788 # even if the target arch is i686
1789 [ -d RPMS/i386 ] || mkdir RPMS/i386
1791 [ -d RPMS/$arch ] || mkdir RPMS/$arch
1793 [ -d RPMS/noarch ] || mkdir RPMS/noarch
1794 [ -d BUILD ] || mkdir BUILD
1795 [ -d SOURCES ] || mkdir SOURCES
1796 [ -d SPECS ] || mkdir SPECS
1797 [ -d SRPMS ] || mkdir SRPMS
1819 [[ $list\ == *\ $item\ * ]]
1823 #########################################################################
1824 # Generate a backtrace through the call stack.
1828 #########################################################################
1832 local funcname="" sourcefile="" lineno="" n
1834 echo "Call stack: (most recent first)"
1835 for (( n = $strip ; n < ${#FUNCNAME[@]} ; ++n )) ; do
1836 funcname=${FUNCNAME[$n - 1]}
1837 sourcefile=$(basename ${BASH_SOURCE[$n]})
1838 lineno=${BASH_LINENO[$n - 1]}
1842 # Display function arguments
1843 if [[ ! -z "${BASH_ARGV[@]}" ]]; then
1844 local args newarg j p=0
1845 for (( j = ${BASH_ARGC[$n - 1]}; j > 0; j-- )); do
1846 newarg=${BASH_ARGV[$j + $p - 1]}
1847 args="${args:+${args} }'${newarg}'"
1849 let p+=${BASH_ARGC[$n - 1]}
1851 echo " ${funcname} ${args:+${args} }at ${sourcefile}:${lineno}"
1855 echo "BEGIN BACKTRACE"
1857 #echo ${BASH_LINENO[*]}
1858 #echo ${BASH_SOURCE[*]}
1859 #echo ${FUNCNAME[*]}
1860 local i=$((${#FUNCNAME[@]} - 1))
1861 while [ $i -ge 0 ]; do
1862 local lineno=${BASH_LINENO[$i]}
1866 local SOURCELINE="${BASH_SOURCE[$i + 1]}:${lineno}"
1867 # Can't figure out how to get function args from other frames...
1868 local FUNCTION="${FUNCNAME[$i]}()"
1869 echo "$SOURCELINE:$FUNCTION"
1873 echo "END BACKTRACE"
1879 seen_list=$(new_list)
1881 echo "An unexpected error has occurred at ${BASH_SOURCE[0]##*/}:$((LINENO-1)).
1882 Unfortunately the above line number in the message may or may not be correct,
1883 but details have been send to the lbuild maintainer. Attempting to continue."; (echo "Untrapped error"
1885 # have we seen this one
1886 echo "checking seen list for ${BASH_SOURCE[0]}:${BASH_LINENO[0]}"
1888 if is_list_member "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}"; then
1889 echo "seen this one already"
1891 seen_list=$(add_list "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}")
1894 ) ; set $xtrace' ERR
1897 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
1899 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,noiokit,ofed-version:,publish,release,set-value:,src,stage:,tag:,target:,target-archs:,with-linux:,xen -- "$@")
1901 if [ $? != 0 ]; then
1905 eval set -- "$options"
1940 if ! KERNELTREE=$(canon_path "$2"); then
1941 fatal 1 "Could not determine the canonical location of $2"
1945 --linux | --with-linux)
1946 if ! LINUX=$(canon_path "$2"); then
1947 fatal 1 "Could not determine the canonical location of $2"
1960 if ! REUSEBUILD=$(canon_path "$2"); then
1961 fatal 1 "Could not determine the canonical location of $2"
1982 if ! KERNELRPMSBASE=$(canon_path "$2"); then
1983 fatal 1 "Could not determine the canonical location of $2"
1992 if ! LUSTRE=$(canon_filepath "$2"); then
1993 fatal 1 "Could not determine the canonical location of $2"
2036 --disable-datestamp)
2050 # there are actually some lustre configure flags that we need to
2051 # handle ourselves (but we still give them to configure)
2052 if [[ \ $@\ == *\ --disable-tests\ * ]]; then
2056 CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-liblustre --enable-liblustre-tests"
2060 usage 1 "Unrecognized option: $1"
2069 # XXX - should we _always_ get the buildid from the META file? what are the
2070 # other (i.e. non-lustre-tarball use cases of lbuild)?
2071 BUILDID=$(sed -ne '/^BUILDID =/s/.*= *//p' lustre/META)
2075 if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
2077 unpack_ofed || fatal 1 "Error unpacking OFED tarball"
2080 # make sure the RPM build environment is set up
2081 create_rpmbuild_dirs
2083 # if an unpacked kernel source tree was given on the command line
2084 # just build lustre with it (nothing distro kernel specific here)
2085 if [ -n "$LINUX" ]; then
2086 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
2087 fatal 1 "error building OFED"
2088 build_lustre "$LINUX" "$LINUXOBJ"
2090 if [ ! -f "${LBUILD_DIR}/lbuild-$DISTRO" ]; then
2091 fatal 1 "${LBUILD_DIR}/lbuild-$DISTRO not found"
2093 source ${LBUILD_DIR}/lbuild-$DISTRO
2094 build_with_srpm || fatal 1 "Failed to build_with_srpm"