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
1105 if [ "$pkg" == "zfs" ]; then
1106 mkdir -p $TOPDIR/zfsdevel
1107 pushd $TOPDIR/zfsdevel
1108 # We also need to extract zfs-devel rpm
1109 local devel_rpm=$(ls -1 $TOPDIR/RPMS/*/$pkg-devel-*.rpm)
1110 rpm2cpio $devel_rpm | cpio -id
1112 CONFIGURE_FLAGS="--with-$pkg-devel=$TOPDIR/zfsdevel ${CONFIGURE_FLAGS}"
1116 CONFIGURE_FLAGS="--with-$pkg=$(ls -d $TOPDIR/usr/src/$pkg-*/|tail -1) ${CONFIGURE_FLAGS}"
1117 CONFIGURE_FLAGS="--with-$pkg-obj=$(ls -d $TOPDIR/usr/src/$pkg-*/$kver*|tail -1) ${CONFIGURE_FLAGS}"
1127 [ "$STAGEDIR" ] || return 0
1129 for arch in $BUILD_ARCHS; do
1130 rpmdir="${STAGEDIR}/${CANONICAL_TARGET}-${arch}"
1131 echo "${0##*/}: Copying RPMs into ${rpmdir}"
1132 mkdir -p "${rpmdir}"
1133 cp -v RPMS/${arch}/*.rpm "${rpmdir}"
1134 if [ -d RPMS/noarch ]; then
1135 cp -v RPMS/noarch/*.rpm "${rpmdir}"
1139 cp -v "$LUSTRE" "$STAGEDIR"
1143 #check if we need to build separate ldiskfs RPM
1144 skeep_ldiskfs_rpm() {
1149 if ! $LDISKFSRPM; then
1151 elif $PATCHLESS; then
1154 for skiptag in $SKIPLDISKFSRPM; do
1155 [[ $tag == $skiptag ]] && skip=true && break
1163 set_rpm_smp_type() {
1165 local infact_arch="${TARGET_ARCH}"
1168 [ "$infact_arch" == "i586" ] && infact_arch="i686"
1171 for smp_type in $SMP_ARCHS; do
1172 [ $infact_arch == $smp_type ] && RPMSMPTYPE=smp && break
1175 for smp_type in $BIGSMP_ARCHS; do
1176 [ $infact_arch == $smp_type ] && RPMSMPTYPE=bigsmp && break
1179 for smp_type in $PPC64_ARCHS; do
1180 [ $infact_arch == $smp_type ] && RPMSMPTYPE=ppc64 && break
1183 for smp_type in $DEFAULT_ARCHS; do
1184 [ $infact_arch == $smp_type ] && RPMSMPTYPE=default && break
1189 # This function takes a linux source pool and digs out the linux release
1191 find_linux_release() {
1194 local LINUXRELEASEHEADER=$SRCDIR/include/linux/version.h
1195 if [ -s $SRCDIR/include/linux/utsrelease.h ]; then
1196 LINUXRELEASEHEADER=$SRCDIR/include/linux/utsrelease.h
1199 sed -ne 's/#define UTS_RELEASE "\(.*\)"$/\1/p' $LINUXRELEASEHEADER
1202 # This funcition finds the buildroot directory for a given linux
1204 find_linux_builddir() {
1205 local linux=${1:-${LINUX}}
1206 local rel=$(find_linux_release $linux)
1208 echo ${linux%/usr/src/kernels/${rel}*}
1211 # unpack kernel(/source/devel) RPM
1213 # This function and it's setting of $LINUX and $LINUXOBJ is a total hack that
1214 # needs to completely refactored. It completely ingores that $BUILD_ARCHS may
1215 # contain a list of arches for which rpmbuild commands (including the one for
1217 unpack_linux_devel_rpm() {
1218 local kernelrpm="${1}"
1220 [ -f "$kernelrpm" ] || return 255
1221 [ -d $TOPDIR/reused ] || mkdir $TOPDIR/reused || return 255
1223 pushd $TOPDIR/reused &>/dev/null || return 255
1225 if ! rpm2cpio < "$kernelrpm" | cpio -id > /dev/null 2>&1; then
1229 # call a distro specific hook, if available
1230 if type -p unpack_linux_devel_rpm-$DISTRO; then
1231 if ! unpack_linux_devel_rpm-$DISTRO "$kernelrpm"; then
1238 find_linux_devel_paths $TOPDIR/reused
1246 local kib_prefix="$2"
1249 # build kernel-ib{,-devel}/compat-rdma{,-devel}
1251 # ofed 1.3 had a bug in the rpm spec
1252 if [ "$OFED_VERSION" = "1.3" ]; then
1256 local OFED_CORE="--with-core-mod --with-ipoib-mod --with-sdp-mod --with-user_mad-mod --with-user_access-mod --with-addr_trans-mod"
1257 local OFED_HARDWARE="--with-mthca-mod --with-mlx4-mod --with-mlx4_en-mod --with-cxgb3-mod --with-nes-mod"
1259 if compare_version $OFED_VERSION 3.0; then
1260 OFED_CORE="$OFED_CORE --with-madeye-mod --with-rds-mod"
1262 OFED_HARDWARE="$OFED_HARDWARE --with-cxgb4-mod"
1265 # some I/B drivers are architecture dependent and kernel-ib's configure
1266 # does not figure it out for us ~sigh~
1267 case "$TARGET_ARCH" in
1269 OFED_HARDWARE="$OFED_HARDWARE --with-ehca-mod"
1272 # we're no longer shipping the OFED iSCSI target
1273 #OFED_ISCSI="--with-srp-mod --with-srp-target-mod"
1274 OFED_ISCSI="--with-srp-mod"
1275 ## ISER module has no backport support as of OFED 1.5 (i.e. only builds on
1276 ##kernels >= 2.6.30)
1277 #if [[ $OFED_VERSION = 1.[0-4]* ]]; then
1278 # OFED_ISCSI="$OFED_ISCSI --with-iser-mod"
1281 # assume we are just rebuilding the SRPM
1282 local BUILD_TYPE=${BUILD_TYPE:-"--rebuild"}
1283 local SOURCE="${TOPDIR}/OFED/SRPMS/${kib_prefix}-*.src.rpm"
1285 # but switch to building from the SPEC if we need to apply patches
1286 if ls ${TOPDIR}/lustre/build/patches/ofed/* >/dev/null; then
1288 rpm --define "_topdir ${TOPDIR}" -ivh $SOURCE
1289 SOURCE="${TOPDIR}/SPECS/${kib_prefix}.spec"
1290 local file ed_fragment1 ed_fragment2 n=1
1291 for file in $(ls ${TOPDIR}/lustre/build/patches/ofed/*.patch); do
1292 ed_fragment1="$ed_fragment1
1293 Patch$n: ${file%%*/}"
1294 ed_fragment2="$ed_fragment2
1296 cp $file ${TOPDIR}/SOURCES
1299 for file in $(ls ${TOPDIR}/lustre/build/patches/ofed/*.ed); do
1300 # Only apply the ed-scripts that should be used for the canonical target
1301 # ed-files in ${TOPDIR}/lustre/build/patches/ofed/ have to follow the naming
1303 # <two-digits>-<descriptive-name>:<canonical_target_1>: ...:<canonical_target_N>.ed
1304 # To apply the same change to multiple canonical target simply specify
1305 # a list of colon separated canoncial target names in the file name.
1306 echo "$file" | grep -q -e ":${CANONICAL_TARGET}:" \
1307 -e ":${CANONICAL_TARGET}.ed$"
1308 if [ $? -eq 0 ] ; then
1309 ed_fragment3="$ed_fragment3
1315 if [ $n -gt 1 ]; then
1329 local linuxrelease=$(find_linux_release "$linux")
1330 if compare_version $OFED_VERSION 3.0; then
1331 local OFA_KERNEL_RELEASE=$(echo -n ${linuxrelease} | sed -e 's/-/_/g')
1333 if ! $RPMBUILD $BUILD_TYPE --define 'build_kernel_ib 1' --define 'build_kernel_ib_devel 1' \
1334 ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
1335 --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
1336 --define "KVERSION ${linuxrelease}" \
1337 --define "$K_SRC ${linux}" \
1338 --define "LIB_MOD_DIR /lib/modules/${linuxrelease}/updates" \
1339 ${OFA_KERNEL_RELEASE:+--define "_release $OFA_KERNEL_RELEASE"} \
1340 --define "configure_options --without-quilt $OFED_CORE $OFED_HARDWARE $OFED_ISCSI" \
1341 ${SOURCE} 2>&1; then
1342 fatal 1 "Error building ${kib_rpm}"
1351 local signature="$4"
1352 local use_links="$5"
1359 local default_iface=$(/sbin/ip route get 192.1.1.1 | sed -ne 's/.* dev \(.*\) * src .*/\1/p')
1360 if [ -z "$default_iface" ]; then
1361 fatal 1 "Failed to determine the default route interface"
1363 local unique_id=$(/sbin/ip addr show dev $default_iface | sed -ne '/ inet /s/ *inet \(.*\)\/.*/\1/p' | head -1)
1364 if [ -z "$unique_id" ]; then
1365 fatal 1 "Failed to determine a unique id from interface $default_interface"
1368 local finallocation="$location"/"$signature"/"$module"
1369 location="$location"/"$signature-${unique_id}"/"$module"
1370 mkdir -p "$location"
1371 # the cleanup script removes any directory that doesn't have a
1372 # .lastused, so let's try to prevent that as soon as we can
1373 # this solution still slightly racy with the cleanup script
1374 # but the race is a lot tighter now
1375 touch -t 197001010000 "$location/.lastused"
1376 ## use eval/echo here to make sure shell expansions are performed
1377 #if ! cp -a${linkflag} $(eval echo $articles) "$location"; then
1379 for article in $(eval echo $articles); do
1380 if ! cp -a${linkflag} "$article" "$location"; then
1381 error "Failed to copy \"$article\" to \"$location\" in store_for_reuse()"
1382 # rename the cache location so that it's not cached
1383 # product, but is around for analysis
1384 mv "$location"{,-bad-$(date +%s)} ||
1385 error "failed to clean up a failed cache attempt" \
1386 "in \"$location\" -- manual cleanup will be" \
1392 # flag the cache as complete (i.e. in case lbuild was previously
1393 # interrupted while caching)
1394 touch "$location/.lastused"
1396 # put the temporary location into the final location
1398 mkdir -p "${finallocation%/*}"
1399 mv "$location" "$finallocation"
1400 rmdir "${location%/*}"
1408 local use_links="${3:-false}"
1409 local signature="$4"
1411 if [ -n "$REUSEBUILD" ] && [ -d "$REUSEBUILD/$signature/$module" ]; then
1412 if [ ! -f "$REUSEBUILD/$signature/$module/.lastused" ]; then
1413 # the .lastused flag is populated at the end of the caching to
1414 # signal that the caching was completed. if that flag is not
1415 # there, then the cache is invalid (and should be removed in fact)
1416 mv "$REUSEBUILD/$signature/$module"{,-bad-$(date +%s)} ||
1417 fatal 1 "failed to clean up a bad cache in location $REUSEBUILD/$signature/$module\" -- manual cleanup will be necessary"
1421 # so that we know how stale this entry is
1422 touch $REUSEBUILD/$signature/$module/.lastused
1425 if ls $REUSEBUILD/$signature/$module/* >/dev/null 2>&1; then
1426 cp -al $REUSEBUILD/$signature/$module/* $dest/
1429 # copying is pretty heavy
1430 # cp -a $REUSEBUILD/$signature/$module/* $dest/
1431 # do some creative symlinking instead
1433 for dir in BUILD SRPMS SPECS; do
1434 if ls $REUSEBUILD/$signature/$module/$dir/* >/dev/null 2>&1; then
1435 ln -s $REUSEBUILD/$signature/$module/$dir/* $dest/$dir
1438 # sources have to be copied by file because we need SOURCES to
1439 # be a dir we can write into
1440 # could overrun ls's arg list here
1441 #ls $REUSEBUILD/$signature/$module/SOURCES/* |
1442 find $REUSEBUILD/$signature/$module/SOURCES/ -type f |
1443 xargs ln -t $dest/SOURCES -s
1445 # same for RPMS/* dirs
1446 # could overrun ls's arg list here
1447 #ls $REUSEBUILD/$signature/$module/RPMS/$TARGET_ARCH/* |
1449 for dir in $REUSEBUILD/$signature/$module/RPMS/*; do
1450 mkdir -p $dest/RPMS/${dir##*/}
1452 xargs ln -t $dest/RPMS/${dir##*/} -s
1464 if [[ $arch = i[3456]86 ]]; then
1472 build_kernel_with_srpm() {
1475 if [ -z "$outfd" ] || [ $outfd = 1 ]; then
1476 fatal 1 "You must supply a file descriptor to ${FUNCNAME[0]} and it cannot be 1"
1479 # need to generate the patch for this target
1480 do_patch_linux false >&${outfd} # sets global $FULL_PATCH (yeah, yuck)
1482 # get an md5sum of the kernel patch + config for reuse check
1483 # XXX really, there needs to be a signature and a CONFIG_FILE per arch
1487 local release_str="RELEASE=$RELEASE\n"
1490 if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
1491 local REUSE_SIGNATURE=$({ echo -en $release_str;
1493 cat $CONFIG_FILE $TARGET_FILE $FULL_PATCH;
1494 cat ${0%/lbuild}/lbuild ${0%/lbuild}/lbuild-${DISTRO}; } |
1495 md5sum | cut -d" " -f1)
1496 # see if we can link to the reuse pool
1497 # XXX - hrm. i'm not convinced this doesn't belong in the reuse
1499 local CAN_LINK_FOR_REUSE=false
1500 touch $REUSEBUILD/$$
1501 if cp -al $REUSEBUILD/$$ $TOPDIR/ 2>/dev/null; then
1502 CAN_LINK_FOR_REUSE=true
1507 # the extra version string to use for the kernel (which might be a reused
1509 local kernel_extra_version=""
1510 if ! $USE_BUILD_CACHE || ! reuse kernel "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1511 "$REUSE_SIGNATURE"; then
1512 # nothing cached, build from scratch
1513 if [ ! -r "$KERNELDIR/$KERNEL_SRPM" ]; then
1514 echo "Downloading kernel SRPM" >&${outfd}
1515 download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM" >&${outfd}
1518 if ! rpm -ivh $KERNELDIR/$KERNEL_SRPM \
1519 --define "_topdir $TOPDIR" >&${outfd} 2>&1; then
1520 # should we clean this up or leave it for analysis?
1522 fatal 1 "Error installing kernel SRPM."
1525 # put the Lustre kernel patch into the RPM build tree
1526 cp $FULL_PATCH $TOPDIR/SOURCES/linux-${lnxmaj}-lustre.patch
1527 prepare_and_build_srpm >&${outfd} ||
1528 fatal 1 "failed to prepare_and_build_srpm"
1530 if [ -z "$REUSE_SIGNATURE" ]; then
1531 echo "No reuse signature was caculated so not storing the built kernel" >&${outfd}
1533 # store the resulting kernel RPM build tree for future use
1534 echo "Storing the built kernel for future reuse" >&${outfd}
1535 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,SRPMS,RPMS}" \
1536 "kernel" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1537 "$CAN_LINK_FOR_REUSE"; then
1538 error "Failed to store kernel RPMS for reuse"
1539 echo "unknown" >&${outfd}
1545 # figure out the EXTRA_VERSION of the kernel we built or are re-using
1547 if ! KERNEL_RPM=$(find_rpm "$TOPDIR/RPMS/$TARGET_ARCH/" provides "^kernel ="); then
1548 fatal 1 "Failed to find a kernel RPM in $TOPDIR/RPMS/$TARGET_ARCH/"
1550 kernel_extra_version=$(rpm -q --queryformat "%{RELEASE}" -p $TOPDIR/RPMS/$TARGET_ARCH/$KERNEL_RPM)
1552 # should now have the following RPMs
1553 # $TOPDIR/RPMS/$arch/kernel-lustre-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1554 # $TOPDIR/RPMS/$arch/kernel-lustre-devel-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1555 # $TOPDIR/RPMS/$arch/kernel-lustre-headers-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1556 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-common-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1557 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1559 echo $kernel_extra_version
1567 # REUSEBUILD, USE_BUILD_CACHE
1572 local ofed_version="$2"
1576 # if an ofed version is given, then it means use OFED proper,
1577 # not any vendor specific "inkernel" version
1578 if [ -z "$ofed_version" ]; then
1582 if [ "$ofed_version" = "inkernel" ]; then
1583 # see if there is a distro specific override for this and use
1585 # XXX we need to better integrate a distro specific override with
1586 # the rest of this function so that all of the reuse cache
1587 # stuff is leveraged given that 80% of this function is reuse
1588 if type -p build_ofed-${DISTRO}; then
1590 ofed_location=$(build_ofed-${DISTRO} ${STDOUT})
1591 local rc=${PIPESTATUS[0]}
1592 CONFIGURE_FLAGS="--with-o2ib=${ofed_location} ${CONFIGURE_FLAGS}"
1597 elif compare_version $OFED_VERSION 3.0; then
1598 kib_prefix="ofa_kernel"
1601 kib_prefix="compat-rdma"
1602 kib_rpm="compat-rdma"
1605 # build kernel-ib/compat-rdma
1606 if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
1607 local REUSE_SIGNATURE=$({ echo "$ofed_version";
1608 echo "$(find_linux_release ${linux};
1609 echo "$BUILD_GEN")";
1610 cat "${linux}/include/linux/autoconf.h";
1611 cat "${0%/lbuild}/lbuild" ;
1612 cat "${0%/lbuild}/lbuild-${DISTRO}"; } |
1613 md5sum | cut -d" " -f1)
1614 # see if we can link to the reuse pool
1615 # XXX - hrm. i'm not convinced this doesn't belong in the reuse
1617 local CAN_LINK_FOR_REUSE=false
1618 touch $REUSEBUILD/$$
1619 if cp -al $REUSEBUILD/$$ $TOPDIR/; then
1620 CAN_LINK_FOR_REUSE=true
1625 if ! $USE_BUILD_CACHE || ! reuse ofed "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1626 "$REUSE_SIGNATURE"; then
1627 if [ -n "$REUSE_SIGNATURE" ]; then
1628 # stash away the existing built articles for a moment
1630 mv {BUILD,{S,}RPMS,S{OURCE,PEC}S} bak
1633 find . | cpio -pudlm ..
1637 create_rpmbuild_dirs
1640 build_kernel_ib "${linux}" "${kib_prefix}" "${kib_rpm}"
1642 if [ -z "$REUSE_SIGNATURE" ]; then
1643 echo "No reuse signature was caculated so not storing the built ofed"
1645 # store the resulting RPM build tree for future use
1646 echo "Storing the built ofed for future reuse"
1647 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
1648 "ofed" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1649 "$CAN_LINK_FOR_REUSE"; then
1650 error "Failed to store OFED RPMS for reuse"
1654 # put the stuff we stashed away back
1659 pushd "$TOPDIR" >/dev/null
1660 rm -rf ${kib_rpm}-devel
1661 mkdir ${kib_rpm}-devel
1663 # the actual ofed RPMs don't have the -rc$n or -$date string appened that
1664 # might be present on the file
1665 local linuxrelease=$(find_linux_release "$linux")
1666 ofed_version=$(echo $ofed_version |
1667 sed -re 's/-(20[0-9]{6,6}-[0-9]{4,4}|rc[0-9]*)$//')
1669 # OFED version will have 'hyphen' for minor release. (e.g. 3.5-1, instead
1670 # of 3.5.1) compat-rdma and compat-rdma-devel could have same version
1671 # number, but currectly not. Once OFED fix this in the future release, we
1672 # can remove following filter.
1673 ofed_version=$(echo $ofed_version |
1674 sed -re 's/-([0-9]*-[rR][cC][0-9]*)$//')
1675 local rpm=$(ls $TOPDIR/RPMS/*/${kib_rpm}-devel-${ofed_version}-${linuxrelease//-/_}.*.rpm)
1676 if ! rpm2cpio < $rpm | cpio -id; then
1677 fatal 1 "could not unpack the ${kib_rpm}-devel rpm."
1679 CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/${kib_prefix} ${CONFIGURE_FLAGS}"
1686 if ! $PATCHLESS; then
1687 local kernel_extra_version
1688 if ! kernel_extra_version=$(build_kernel_with_srpm ${STDOUT}); then
1689 fatal 1 "Failed to build the kernel from it's SRPM"
1692 for arch in $BUILD_ARCHS; do
1693 local kernel_devel_rpm
1694 if ! kernel_devel_rpm=$(find_rpm "$TOPDIR/RPMS/$arch/" provides "^$(devel_kernel_name $KERNEL_LUSTRE_NAMING) ="); then
1695 fatal 1 "Failed to find a kernel development RPM in $TOPDIR/RPMS/$arch/"
1698 # install the -devel RPM in preparation for modules builds
1699 if ! lnxrel="$kernel_extra_version" unpack_linux_devel_rpm \
1700 "$TOPDIR/RPMS/$arch/$kernel_devel_rpm"; then
1701 fatal 1 "Could not find the Linux tree in $TOPDIR/RPMS/$arch/$kernel_devel_rpm"
1705 # need to find and unpack the vendor's own kernel-devel for patchless
1708 if ! kernelrpm=$(find_linux_rpm "-$DEVEL_KERNEL_TYPE"); then
1709 fatal 1 "Could not find the kernel-$DEVEL_KERNEL_TYPE RPM in ${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
1711 if ! lnxrel="$lnxrel" unpack_linux_devel_rpm "$kernelrpm" "-"; then
1712 fatal 1 "Could not find the Linux tree in $kernelrpm"
1716 # ~sigh~ have to make copies of and modify some of the rpm
1717 # infrastructure files so that find-requires can find our unpacked
1718 # kernel-devel artifacts
1719 cp $RPM_HELPERS_DIR/{symset-table,find-requires{,.ksyms}} .
1720 FIND_REQUIRES="$(pwd)/find-requires"
1721 chmod 755 {symset-table,find-requires{,.ksyms}}
1723 tmp="${tmp//\//\\/}"
1724 ed find-requires <<EOF
1728 /|.*find-requires.ksyms/s/|/| bash -x/
1729 g/ [^ ]*\/\(find-requires\.ksyms\)/s// $tmp\/\1/g
1732 ed find-requires.ksyms <<EOF
1736 g/\/.*\/\(symset-table\)/s//$tmp\/\1/g
1739 ed symset-table <<EOF
1743 g/\(\/boot\/\)/s//$tmp\/reused\1/g
1744 g/\(\/usr\/src\/kernels\/\)/s//$tmp\/reused\1/g
1748 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
1749 fatal 1 "error building OFED"
1752 if build_lustre "$LINUX" "$LINUXOBJ"; then
1753 # the build worked. resolve any symlinked files (i.e. from reuse)
1754 # in RPMS/$arch to real files so that that that huge mess of
1755 # complication known as LTS can copy them yet somewhere else.
1756 # is it any wonder this whole process is so damn so? anyone ever
1757 # heard of hardlinks? it's this cool new thing that allows you save
1758 # tons of time and space by creating... well you can go read about
1759 # them if you have not heard about them yet.
1760 # can i say how much the implemenation of all of this really impedes
1763 for dir in RPMS/*; do
1765 for file in $(ls); do
1766 if [ -h $file ]; then
1773 # also, for i?86, make sure all of the RPMs are in RPMS/$TARGET_ARCH
1774 # as that's where LTS expects to find them
1775 for dir in RPMS/*; do
1776 if [ $dir = RPMS/$TARGET_ARCH ]; then
1781 if [ -n "$files" ]; then
1782 cp -al $files ../$TARGET_ARCH
1792 create_rpmbuild_dirs() {
1794 [ -d RPMS ] || mkdir RPMS
1795 for arch in $BUILD_ARCHS; do
1796 if [[ $arch = i?86 ]]; then
1797 # some stupidity in the sles11 kernel spec requires an RPMS/i386
1798 # even if the target arch is i686
1799 [ -d RPMS/i386 ] || mkdir RPMS/i386
1801 [ -d RPMS/$arch ] || mkdir RPMS/$arch
1803 [ -d RPMS/noarch ] || mkdir RPMS/noarch
1804 [ -d BUILD ] || mkdir BUILD
1805 [ -d SOURCES ] || mkdir SOURCES
1806 [ -d SPECS ] || mkdir SPECS
1807 [ -d SRPMS ] || mkdir SRPMS
1829 [[ $list\ == *\ $item\ * ]]
1833 #########################################################################
1834 # Generate a backtrace through the call stack.
1838 #########################################################################
1842 local funcname="" sourcefile="" lineno="" n
1844 echo "Call stack: (most recent first)"
1845 for (( n = $strip ; n < ${#FUNCNAME[@]} ; ++n )) ; do
1846 funcname=${FUNCNAME[$n - 1]}
1847 sourcefile=$(basename ${BASH_SOURCE[$n]})
1848 lineno=${BASH_LINENO[$n - 1]}
1852 # Display function arguments
1853 if [[ ! -z "${BASH_ARGV[@]}" ]]; then
1854 local args newarg j p=0
1855 for (( j = ${BASH_ARGC[$n - 1]}; j > 0; j-- )); do
1856 newarg=${BASH_ARGV[$j + $p - 1]}
1857 args="${args:+${args} }'${newarg}'"
1859 let p+=${BASH_ARGC[$n - 1]}
1861 echo " ${funcname} ${args:+${args} }at ${sourcefile}:${lineno}"
1865 echo "BEGIN BACKTRACE"
1867 #echo ${BASH_LINENO[*]}
1868 #echo ${BASH_SOURCE[*]}
1869 #echo ${FUNCNAME[*]}
1870 local i=$((${#FUNCNAME[@]} - 1))
1871 while [ $i -ge 0 ]; do
1872 local lineno=${BASH_LINENO[$i]}
1876 local SOURCELINE="${BASH_SOURCE[$i + 1]}:${lineno}"
1877 # Can't figure out how to get function args from other frames...
1878 local FUNCTION="${FUNCNAME[$i]}()"
1879 echo "$SOURCELINE:$FUNCTION"
1883 echo "END BACKTRACE"
1889 seen_list=$(new_list)
1891 echo "An unexpected error has occurred at ${BASH_SOURCE[0]##*/}:$((LINENO-1)).
1892 Unfortunately the above line number in the message may or may not be correct,
1893 but details have been send to the lbuild maintainer. Attempting to continue."; (echo "Untrapped error"
1895 # have we seen this one
1896 echo "checking seen list for ${BASH_SOURCE[0]}:${BASH_LINENO[0]}"
1898 if is_list_member "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}"; then
1899 echo "seen this one already"
1901 seen_list=$(add_list "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}")
1904 ) ; set $xtrace' ERR
1907 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
1909 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 -- "$@")
1911 if [ $? != 0 ]; then
1915 eval set -- "$options"
1950 if ! KERNELTREE=$(canon_path "$2"); then
1951 fatal 1 "Could not determine the canonical location of $2"
1955 --linux | --with-linux)
1956 if ! LINUX=$(canon_path "$2"); then
1957 fatal 1 "Could not determine the canonical location of $2"
1970 if ! REUSEBUILD=$(canon_path "$2"); then
1971 fatal 1 "Could not determine the canonical location of $2"
1992 if ! KERNELRPMSBASE=$(canon_path "$2"); then
1993 fatal 1 "Could not determine the canonical location of $2"
2002 if ! LUSTRE=$(canon_filepath "$2"); then
2003 fatal 1 "Could not determine the canonical location of $2"
2046 --disable-datestamp)
2060 # there are actually some lustre configure flags that we need to
2061 # handle ourselves (but we still give them to configure)
2062 if [[ \ $@\ == *\ --disable-tests\ * ]]; then
2066 CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-liblustre --enable-liblustre-tests"
2070 usage 1 "Unrecognized option: $1"
2079 # XXX - should we _always_ get the buildid from the META file? what are the
2080 # other (i.e. non-lustre-tarball use cases of lbuild)?
2081 BUILDID=$(sed -ne '/^BUILDID =/s/.*= *//p' lustre/META)
2085 if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
2087 unpack_ofed || fatal 1 "Error unpacking OFED tarball"
2090 # make sure the RPM build environment is set up
2091 create_rpmbuild_dirs
2093 # if an unpacked kernel source tree was given on the command line
2094 # just build lustre with it (nothing distro kernel specific here)
2095 if [ -n "$LINUX" ]; then
2096 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
2097 fatal 1 "error building OFED"
2098 build_lustre "$LINUX" "$LINUXOBJ"
2100 if [ ! -f "${LBUILD_DIR}/lbuild-$DISTRO" ]; then
2101 fatal 1 "${LBUILD_DIR}/lbuild-$DISTRO not found"
2103 source ${LBUILD_DIR}/lbuild-$DISTRO
2104 build_with_srpm || fatal 1 "Failed to build_with_srpm"