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 = *-rc[0-9] ]]; then
573 Mmv=${OFED_VERSION%%-*}
574 location="http://www.openfabrics.org/downloads/OFED/ofed-${Mmv}/"
577 if [[ $OFED_VERSION = daily-* ]]; then
579 OFED_VERSION=${OFED_VERSION/daily-/}
580 Mmv=${OFED_VERSION%%-*}
581 daily=${OFED_VERSION##$Mmv-}
582 location="http://www.openfabrics.org/downloads/OFED/ofed-${Mmv}-daily/"
583 # find the filename for the version for the date specified
584 OFED_VERSION=$(curl -s "$location" | sed -nre "/${daily}-/s/.*href=\"OFED-(${Mmv//./\\.}-${daily}-[0-9]{4,4}).tgz.*$/\1/p" | tail -1)
585 if [ -z "$OFED_VERSION" ]; then
586 fatal 1 "Could not determine the filename of the OFED snapshot for ${daily}"
590 local file="OFED-${OFED_VERSION}.tgz"
591 download_file "$location/$file" "$KERNELTREE" "$force"
597 EXTRA_VERSION_save="$EXTRA_VERSION"
598 for patchesdir in "$EXTERNAL_PATCHES" \
599 "$TOPDIR/lustre/lustre/kernel_patches"; do
600 TARGET_FILE="$patchesdir/targets/$TARGET.target"
601 [ -r "$TARGET_FILE" ] && break
603 [ -r "$TARGET_FILE" ] || fatal 1 "Target $TARGET was not found."
605 echo "Loading target config file $TARGET.target..."
607 # if the caller specified an OFED_VERSION it should override whatever
608 # the target file specifies
609 local env_OFED_VERSION="$OFED_VERSION"
613 if [ -n "$env_OFED_VERSION" ]; then
614 OFED_VERSION="$env_OFED_VERSION"
617 # doesn't make any sense to build OFED for xen domX's
622 # XXX - set_rpm_smp_type is an ugly undeterministic hack. it needs to
623 # go away and the target just specify the $RPMSMPTYPE
624 [ -z "$RPMSMPTYPE" ] && set_rpm_smp_type
626 # CC might have been overwriten in TARGET_FILE
627 if [[ $CC != ccache\ * ]] && which "$CCACHE" &>/dev/null; then
628 export CCACHE && export CC="ccache $CC"
631 if [ ! "$KERNELTREE" = "" ] && [ -d "$KERNELTREE" ]; then
632 KERNELDIR="$KERNELTREE/${lnxmaj}"
633 [ -d "$KERNELDIR" ] || mkdir "$KERNELDIR"
636 # verify the series is available
637 if [ "$SERIES" ]; then
638 for series in $SERIES; do
639 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches"; do
640 [ -r "$patchesdir/series/$series" ] && continue 2
642 fatal 1 "Target $TARGET's series $SERIES could not be found.\nSearched:\n\t$EXTERNAL_PATCHES/series\n\t$TOPDIR/lustre/lustre/kernel_patches/series."
646 # set the location of the .config file
652 if [ -f $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET-$TARGET_ARCH.config ]; then
653 CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET$XENPOSTFIX-$TARGET_ARCH${RPMSMPTYPE:+-}${RPMSMPTYPE}.config"
656 local lnxrelnew=${lnxrel//-/_}
658 # remember the EXTRA_VERSION before we diddle it here
659 # XXX - we really should not diddle with any values read in from the
660 # target file. if we want to modify a value, we should create
662 PRISTINE_EXTRA_VERSION=$EXTRA_VERSION
664 if ! $PATCHLESS && [ ! -f "$CONFIG_FILE" ]; then
665 fatal 1 "Config file for target $TARGET missing from $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/."
668 if [ "$EXTRA_VERSION_save" ]; then
669 EXTRA_VERSION="$EXTRA_VERSION_save"
670 elif ! $RELEASE; then
671 # if there is no patch series, then this is not a lustre specific
672 # kernel. don't make it look like one
673 if $PATCHLESS || [ -n "$SERIES" ]; then
674 EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
675 # EXTRA_VERSION="${EXTRA_VERSION}-${TAG}.${TIMESTAMP}"
676 if ! $PATCHLESS && [ -n "$BUILDID" ]; then
677 EXTRA_VERSION="${EXTRA_VERSION}.${BUILDID}"
681 # EXTRA_VERSION=${EXTRA_VERSION//-/_}
683 ALL_ARCHS="$BASE_ARCHS $BIGMEM_ARCHS $BOOT_ARCHS $JENSEN_ARCHS $SMP_ARCHS $BIGSMP_ARCHS $PSERIES64_ARCHS $UP_ARCHS"
686 for arch in $(uniqify "$ALL_ARCHS"); do
687 if [ -z "$TARGET_ARCHS" ] ||
688 [[ \ $TARGET_ARCHS\ = *\ $arch\ * ]]; then
689 BUILD_ARCHS="$BUILD_ARCHS $arch"
692 [ "$BUILD_ARCHS" ] || usage 1 "No available target archs to build."
693 echo "Building for: $BUILD_ARCHS"
701 fatal 1 "tarflags(): File name argument missing."
713 fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
722 local extractfile="$@"
724 echo "Untarring ${tarfile##*/}..."
725 tar $(tarflags "$tarfile") "$tarfile" $extractfile
731 if ! untar "$KERNELTREE/OFED-${OFED_VERSION}.tgz"; then
734 [ -d OFED ] || ln -sf OFED-[0-9].[0-9]* OFED
740 if [ -z "$LUSTRE" ]; then
743 if [ -n "$USE_DATESTAMP" ]; then
744 DATESTAMP="-D '$DATE'"
747 local DIRNAME="lustre-$TAG-$TIMESTAMP"
749 cvs -d "$CVSROOT" -qz3 co $DATESTAMP -d "$DIRNAME" lustre || \
750 fatal 1 "There was an error checking out toplevel Lustre from CVS."
751 pushd "$DIRNAME" > /dev/null
752 ./lustrecvs "$TAG" || \
753 fatal 1 "There was an error checking out Lustre/Portals/Build from CVS."
754 echo "Creating lustre tarball..."
755 sh autogen.sh || fatal 1 "There was an error running autogen.sh."
756 ./configure --enable-dist || \
757 fatal 1 "There was an error running ./configure to create makefiles."
758 make dist || fatal 1 "There was an error running 'make dist'."
759 LUSTRE=$PWD/lustre-*.tar.gz
763 untar "$LUSTRE" || fatal 1 "Error unpacking Lustre tarball"
764 [ -d lustre ] || ln -sf lustre-[0-9].[0-9]* lustre
770 local do_patch=${1:-true}
772 FULL_PATCH="$PWD/lustre-kernel-${TARGET}-${EXTRA_VERSION}.patch"
773 [ -f "$FULL_PATCH" ] && rm -f "$FULL_PATCH"
774 $do_patch && pushd linux >/dev/null
775 for series in $SERIES; do
776 echo -n "Applying series $series:"
777 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches"; do
778 [ -r "$patchesdir/series/$series" ] || continue
779 SERIES_FILE="$patchesdir/series/$series"
780 for patch in $(<"$SERIES_FILE"); do
782 PATCH_FILE="$patchesdir/patches/$patch"
783 [ -r "$PATCH_FILE" ] || \
784 fatal 1 "Patch $patch does not exist in Lustre tree."
785 cat "$PATCH_FILE" >> "$FULL_PATCH" || {
787 fatal 1 "Error adding patch $patch to full patch."
790 patch -s -p1 < "$PATCH_FILE" 2>&1 || {
792 fatal 1 "Error applying patch $patch."
800 $do_patch && popd >/dev/null
801 echo "Full patch has been saved in ${FULL_PATCH##*/}."
806 local rpmbuildopt="$1"
808 pushd lustre-iokit > /dev/null || return 255
810 if ! ./configure; then
811 echo "failed to configure in lustre-iokit"
812 popd >/dev/null # pushd lustre-iokit
817 echo "failed to make dist in lustre-iokit"
818 popd >/dev/null # pushd lustre-iokit
822 if ! $RPMBUILD $rpmbuildopt lustre-iokit*.tar.gz \
823 --define "_tmppath /var/tmp" \
824 --define "_topdir $TOPDIR" 2>&1; then
825 popd >/dev/null # pushd lustre-iokit
829 if $DO_SRC && ! $RPMBUILD -ts lustre-iokit*.tar.gz \
830 --define "_tmppath /var/tmp" \
831 --define "_topdir $TOPDIR" 2>&1; then
832 popd >/dev/null # pushd lustre-iokit
835 popd >/dev/null # pushd lustre-iokit
844 pushd lustre >/dev/null
846 echo "Building Lustre RPMs for: $BUILD_ARCHS..."
848 for arch in $BUILD_ARCHS; do
849 targets="--target $arch $targets"
855 confoptions="$confoptions --disable-server"
858 local rpmbuildopt='-tb'
861 echo NORPM mode. Only compiling.
864 # If server we now build the spl and zfs modules against the lustre kernel.
865 # These are required prior to the building of lustre server. Client does
866 # not require spl/zfs. Use !PATCHLESS to indicate server which follows the
867 # line above so is at least consistant.
868 if [ $PATCHLESS == false ] && [ "x$ZFSNOTSUPPORTED" == "x" ]; then
869 if ! build_spl_zfs; then
870 popd >/dev/null # pushd lustre
875 ( $(skeep_ldiskfs_rpm $TAG) ) || {
877 pushd ldiskfs > /dev/null || return 255
879 if ! ./configure --enable-dist; then
880 echo "failed to configure in ldiskfs"
881 popd >/dev/null # pushd ldiskfs
882 popd >/dev/null # pushd lustre
886 if ! make dist 2>&1; then
887 popd >/dev/null # pushd ldiskfs
888 popd >/dev/null # pushd lustre
892 #cp lustre-ldiskfs*.tar.gz $TOPDIR/SOURCES || \
893 # fatal 1 "Could not copy lustre-ldiskfs*.tar.gz to $TOPDIR/SOURCES"
895 if ! $RPMBUILD $targets $rpmbuildopt lustre-ldiskfs*.tar.gz \
896 --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
897 --define "kdir $linux" \
898 ${linuxobj:+--define "kobjdir $linuxobj"} \
899 --define "_tmppath /var/tmp" \
900 --define "_topdir $TOPDIR" 2>&1; then
901 popd >/dev/null # pushd ldiskfs
902 popd >/dev/null # pushd lustre
907 if ! $RPMBUILD -ts lustre-ldiskfs*.tar.gz \
908 --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
909 --define "kdir $linux" \
910 ${linuxobj:+--define "kobjdir $linuxobj"} \
911 --define "_tmppath /var/tmp" \
912 --define "_topdir $TOPDIR" 2>&1; then
913 popd >/dev/null # pushd ldiskfs
914 popd >/dev/null # pushd lustre
918 popd >/dev/null # pushd ldiskfs
920 # tell lustre where ldiskfs is
921 # XXX - pointing to the RPM BUILD dir is a hack. we need to flesh
922 # out the ldiskfs RPM build so that it builds a
923 # lustre-ldiskfs-devel RPM and install that and point lustre
925 confoptions="$confoptions --with-ldiskfs=$(ls -d $TOPDIR/BUILD/lustre-ldiskfs-*)"
929 if ! build_iokit $rpmbuildopt; then
930 echo "failed to build lustre-iokit"
931 popd >/dev/null # pushd lustre
936 # convert the $PATCHLESS boolean to an empty/not-empty boolean
937 # as silly as this seems, it makes the syntax of the rpmbuild command
938 # simpler and not need an eval to deal with the quotes in the quotes
939 local is_patchless=""
944 # ditto for the lustre-tests boolean
945 local lustre_tests=""
946 if ! $LUSTRE_TESTS; then
956 if $OSDLDISKFSRPM; then
960 $RPMBUILD $targets $rpmbuildopt "$LUSTRE" \
961 ${is_patchless:+--define "lustre_name lustre-client"} \
962 ${lustre_tests:+--define "build_lustre_tests 0"} \
963 ${osd_zfs:+--define "build_lustre_osd_zfs 1"} \
964 ${osd_ldiskfs:+--define "build_lustre_osd_ldiskfs 1"} \
965 ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
966 --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
967 --define "kdir $linux" \
968 ${linuxobj:+--define "kobjdir $linuxobj"} \
969 --define "_tmppath $TMPDIR" \
970 --define "_topdir $TOPDIR" 2>&1 || \
971 fatal 1 "Error building rpms for $BUILD_ARCHS."
974 if ! $RPMBUILD -ts "$LUSTRE" \
975 ${is_patchless:+--define "lustre_name lustre-client"} \
976 ${lustre_tests:+--define "build_lustre_tests 0"} \
977 ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
978 --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
979 --define "kdir $linux" \
980 ${linuxobj:+--define "kobjdir $linuxobj"} \
981 --define "_tmppath $TMPDIR" \
982 --define "_topdir $TOPDIR" 2>&1; then
994 # Fetch spl/zfs from the git repo and prepare for lustre build
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)
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=${LINUXOBJ:-$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 $TOPDIR/reused" \
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 include tree and digs out the linux release
1180 # from it. It is never called directly, only called from the distro
1181 # specific function find_linux_release() in lbuild-{rhel,sles}.
1182 _find_linux_release() {
1184 local LINUXRELEASEHEADER=""
1186 LINUXRELEASEHEADER=$SRC/include/linux/version.h
1187 if [ -s $SRC/include/generated/utsrelease.h ]; then
1188 LINUXRELEASEHEADER=$SRC/include/generated/utsrelease.h
1189 elif [ -s $SRC/include/linux/utsrelease.h ]; then
1190 LINUXRELEASEHEADER=$SRC/include/linux/utsrelease.h
1193 if [ ! -s $LINUXRELEASEHEADER ]; then
1194 fatal 1 "could not find UTS_RELEASE"
1197 sed -ne 's/#define UTS_RELEASE "\(.*\)"$/\1/p' $LINUXRELEASEHEADER
1200 # unpack kernel(/source/devel) RPM
1202 # This function and it's setting of $LINUX and $LINUXOBJ is a total hack that
1203 # needs to completely refactored. It completely ingores that $BUILD_ARCHS may
1204 # contain a list of arches for which rpmbuild commands (including the one for
1206 unpack_linux_devel_rpm() {
1207 local kernelrpm="${1}"
1209 [ -f "$kernelrpm" ] || return 255
1210 [ -d $TOPDIR/reused ] || mkdir $TOPDIR/reused || return 255
1212 pushd $TOPDIR/reused &>/dev/null || return 255
1214 if ! rpm2cpio < "$kernelrpm" | cpio -id > /dev/null 2>&1; then
1218 # call a distro specific hook, if available
1219 if type -p unpack_linux_devel_rpm-$DISTRO; then
1220 if ! unpack_linux_devel_rpm-$DISTRO "$kernelrpm"; then
1227 find_linux_devel_paths $TOPDIR/reused
1235 local kib_prefix="$2"
1238 # build kernel-ib{,-devel}/compat-rdma{,-devel}
1240 # ofed 1.3 had a bug in the rpm spec
1241 if [ "$OFED_VERSION" = "1.3" ]; then
1245 local OFED_CORE="--with-core-mod --with-ipoib-mod --with-sdp-mod --with-user_mad-mod --with-user_access-mod --with-addr_trans-mod"
1246 local OFED_HARDWARE="--with-mthca-mod --with-mlx4-mod --with-mlx4_en-mod --with-cxgb3-mod --with-nes-mod"
1248 if compare_version $OFED_VERSION 3.0; then
1249 OFED_CORE="$OFED_CORE --with-madeye-mod --with-rds-mod"
1251 OFED_HARDWARE="$OFED_HARDWARE --with-cxgb4-mod"
1254 # some I/B drivers are architecture dependent and kernel-ib's configure
1255 # does not figure it out for us ~sigh~
1256 case "$TARGET_ARCH" in
1258 OFED_HARDWARE="$OFED_HARDWARE --with-ehca-mod"
1261 # we're no longer shipping the OFED iSCSI target
1262 #OFED_ISCSI="--with-srp-mod --with-srp-target-mod"
1263 OFED_ISCSI="--with-srp-mod"
1264 ## ISER module has no backport support as of OFED 1.5 (i.e. only builds on
1265 ##kernels >= 2.6.30)
1266 #if [[ $OFED_VERSION = 1.[0-4]* ]]; then
1267 # OFED_ISCSI="$OFED_ISCSI --with-iser-mod"
1270 # assume we are just rebuilding the SRPM
1271 local BUILD_TYPE=${BUILD_TYPE:-"--rebuild"}
1272 local SOURCE="${TOPDIR}/OFED/SRPMS/${kib_prefix}-*.src.rpm"
1274 # but switch to building from the SPEC if we need to apply patches
1275 if ls ${TOPDIR}/lustre/build/patches/ofed/* >/dev/null; then
1277 rpm --define "_topdir ${TOPDIR}" -ivh $SOURCE
1278 SOURCE="${TOPDIR}/SPECS/${kib_prefix}.spec"
1279 local file ed_fragment1 ed_fragment2 n=1
1280 for file in $(ls ${TOPDIR}/lustre/build/patches/ofed/*.patch); do
1281 ed_fragment1="$ed_fragment1
1282 Patch$n: ${file%%*/}"
1283 ed_fragment2="$ed_fragment2
1285 cp $file ${TOPDIR}/SOURCES
1288 for file in $(ls ${TOPDIR}/lustre/build/patches/ofed/*.ed); do
1289 # Only apply the ed-scripts that should be used for the canonical target
1290 # ed-files in ${TOPDIR}/lustre/build/patches/ofed/ have to follow the naming
1292 # <two-digits>-<descriptive-name>:<canonical_target_1>: ...:<canonical_target_N>.ed
1293 # To apply the same change to multiple canonical target simply specify
1294 # a list of colon separated canoncial target names in the file name.
1295 echo "$file" | grep -q -e ":${CANONICAL_TARGET}:" \
1296 -e ":${CANONICAL_TARGET}.ed$"
1297 if [ $? -eq 0 ] ; then
1298 ed_fragment3="$ed_fragment3
1304 if [ $n -gt 1 ]; then
1318 local linuxrelease=$(find_linux_release)
1319 if compare_version $OFED_VERSION 3.0; then
1320 local OFA_KERNEL_RELEASE=$(echo -n ${linuxrelease} | sed -e 's/-/_/g')
1322 if ! $RPMBUILD $BUILD_TYPE --define 'build_kernel_ib 1' --define 'build_kernel_ib_devel 1' \
1323 ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
1324 --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
1325 --define "KVERSION ${linuxrelease}" \
1326 --define "$K_SRC ${linux}" \
1327 --define "LIB_MOD_DIR /lib/modules/${linuxrelease}/updates" \
1328 ${OFA_KERNEL_RELEASE:+--define "_release $OFA_KERNEL_RELEASE"} \
1329 --define "configure_options --without-quilt $OFED_CORE $OFED_HARDWARE $OFED_ISCSI" \
1330 ${SOURCE} 2>&1; then
1331 fatal 1 "Error building ${kib_rpm}"
1340 local signature="$4"
1341 local use_links="$5"
1348 local default_iface=$(/sbin/ip route get 192.1.1.1 | sed -ne 's/.* dev \(.*\) * src .*/\1/p')
1349 if [ -z "$default_iface" ]; then
1350 fatal 1 "Failed to determine the default route interface"
1352 local unique_id=$(/sbin/ip addr show dev $default_iface | sed -ne '/ inet /s/ *inet \(.*\)\/.*/\1/p' | head -1)
1353 if [ -z "$unique_id" ]; then
1354 fatal 1 "Failed to determine a unique id from interface $default_interface"
1357 local finallocation="$location"/"$signature"/"$module"
1358 location="$location"/"$signature-${unique_id}"/"$module"
1359 mkdir -p "$location"
1360 # the cleanup script removes any directory that doesn't have a
1361 # .lastused, so let's try to prevent that as soon as we can
1362 # this solution still slightly racy with the cleanup script
1363 # but the race is a lot tighter now
1364 touch -t 197001010000 "$location/.lastused"
1365 ## use eval/echo here to make sure shell expansions are performed
1366 #if ! cp -a${linkflag} $(eval echo $articles) "$location"; then
1368 for article in $(eval echo $articles); do
1369 if ! cp -a${linkflag} "$article" "$location"; then
1370 error "Failed to copy \"$article\" to \"$location\" in store_for_reuse()"
1371 # rename the cache location so that it's not cached
1372 # product, but is around for analysis
1373 mv "$location"{,-bad-$(date +%s)} ||
1374 error "failed to clean up a failed cache attempt" \
1375 "in \"$location\" -- manual cleanup will be" \
1381 # flag the cache as complete (i.e. in case lbuild was previously
1382 # interrupted while caching)
1383 touch "$location/.lastused"
1385 # put the temporary location into the final location
1387 mkdir -p "${finallocation%/*}"
1388 mv "$location" "$finallocation"
1389 rmdir "${location%/*}"
1397 local use_links="${3:-false}"
1398 local signature="$4"
1400 if [ -n "$REUSEBUILD" ] && [ -d "$REUSEBUILD/$signature/$module" ]; then
1401 if [ ! -f "$REUSEBUILD/$signature/$module/.lastused" ]; then
1402 # the .lastused flag is populated at the end of the caching to
1403 # signal that the caching was completed. if that flag is not
1404 # there, then the cache is invalid (and should be removed in fact)
1405 mv "$REUSEBUILD/$signature/$module"{,-bad-$(date +%s)} ||
1406 fatal 1 "failed to clean up a bad cache in location $REUSEBUILD/$signature/$module\" -- manual cleanup will be necessary"
1410 # so that we know how stale this entry is
1411 touch $REUSEBUILD/$signature/$module/.lastused
1414 if ls $REUSEBUILD/$signature/$module/* >/dev/null 2>&1; then
1415 cp -al $REUSEBUILD/$signature/$module/* $dest/
1418 # copying is pretty heavy
1419 # cp -a $REUSEBUILD/$signature/$module/* $dest/
1420 # do some creative symlinking instead
1422 for dir in BUILD SRPMS SPECS; do
1423 if ls $REUSEBUILD/$signature/$module/$dir/* >/dev/null 2>&1; then
1424 ln -s $REUSEBUILD/$signature/$module/$dir/* $dest/$dir
1427 # sources have to be copied by file because we need SOURCES to
1428 # be a dir we can write into
1429 # could overrun ls's arg list here
1430 #ls $REUSEBUILD/$signature/$module/SOURCES/* |
1431 find $REUSEBUILD/$signature/$module/SOURCES/ -type f |
1432 xargs ln -t $dest/SOURCES -s
1434 # same for RPMS/* dirs
1435 # could overrun ls's arg list here
1436 #ls $REUSEBUILD/$signature/$module/RPMS/$TARGET_ARCH/* |
1438 for dir in $REUSEBUILD/$signature/$module/RPMS/*; do
1439 mkdir -p $dest/RPMS/${dir##*/}
1441 xargs ln -t $dest/RPMS/${dir##*/} -s
1453 if [[ $arch = i[3456]86 ]]; then
1461 build_kernel_with_srpm() {
1464 if [ -z "$outfd" ] || [ $outfd = 1 ]; then
1465 fatal 1 "You must supply a file descriptor to ${FUNCNAME[0]} and it cannot be 1"
1468 # need to generate the patch for this target
1469 do_patch_linux false >&${outfd} # sets global $FULL_PATCH (yeah, yuck)
1471 # get an md5sum of the kernel patch + config for reuse check
1472 # XXX really, there needs to be a signature and a CONFIG_FILE per arch
1476 local release_str="RELEASE=$RELEASE\n"
1479 if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
1480 local REUSE_SIGNATURE=$({ echo -en $release_str;
1482 cat $CONFIG_FILE $TARGET_FILE $FULL_PATCH;
1483 cat ${0%/lbuild}/lbuild ${0%/lbuild}/lbuild-${DISTRO}; } |
1484 md5sum | cut -d" " -f1)
1485 # see if we can link to the reuse pool
1486 # XXX - hrm. i'm not convinced this doesn't belong in the reuse
1488 local CAN_LINK_FOR_REUSE=false
1489 touch $REUSEBUILD/$$
1490 if cp -al $REUSEBUILD/$$ $TOPDIR/ 2>/dev/null; then
1491 CAN_LINK_FOR_REUSE=true
1496 # the extra version string to use for the kernel (which might be a reused
1498 local kernel_extra_version=""
1499 if ! $USE_BUILD_CACHE || ! reuse kernel "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1500 "$REUSE_SIGNATURE"; then
1501 # nothing cached, build from scratch
1502 if [ ! -r "$KERNELDIR/$KERNEL_SRPM" ]; then
1503 echo "Downloading kernel SRPM" >&${outfd}
1504 download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM" >&${outfd}
1507 if ! rpm -ivh $KERNELDIR/$KERNEL_SRPM \
1508 --define "_topdir $TOPDIR" >&${outfd} 2>&1; then
1509 # should we clean this up or leave it for analysis?
1511 fatal 1 "Error installing kernel SRPM."
1514 # put the Lustre kernel patch into the RPM build tree
1515 cp $FULL_PATCH $TOPDIR/SOURCES/linux-${lnxmaj}-lustre.patch
1516 prepare_and_build_srpm >&${outfd} ||
1517 fatal 1 "failed to prepare_and_build_srpm"
1519 if [ -z "$REUSE_SIGNATURE" ]; then
1520 echo "No reuse signature was caculated so not storing the built kernel" >&${outfd}
1522 # store the resulting kernel RPM build tree for future use
1523 echo "Storing the built kernel for future reuse" >&${outfd}
1524 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,SRPMS,RPMS}" \
1525 "kernel" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1526 "$CAN_LINK_FOR_REUSE"; then
1527 error "Failed to store kernel RPMS for reuse"
1528 echo "unknown" >&${outfd}
1534 # figure out the EXTRA_VERSION of the kernel we built or are re-using
1536 if ! KERNEL_RPM=$(find_rpm "$TOPDIR/RPMS/$TARGET_ARCH/" provides "^kernel(-default)? ="); then
1537 fatal 1 "Failed to find a kernel RPM in $TOPDIR/RPMS/$TARGET_ARCH/"
1539 kernel_extra_version=$(rpm -q --queryformat "%{RELEASE}" -p $TOPDIR/RPMS/$TARGET_ARCH/$KERNEL_RPM)
1541 # should now have the following RPMs
1542 # $TOPDIR/RPMS/$arch/kernel-lustre-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1543 # $TOPDIR/RPMS/$arch/kernel-lustre-devel-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1544 # $TOPDIR/RPMS/$arch/kernel-lustre-headers-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1545 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-common-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1546 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1548 echo $kernel_extra_version
1556 # REUSEBUILD, USE_BUILD_CACHE
1561 local ofed_version="$2"
1565 # if an ofed version is given, then it means use OFED proper,
1566 # not any vendor specific "inkernel" version
1567 if [ -z "$ofed_version" ]; then
1571 if [ "$ofed_version" = "inkernel" ]; then
1572 # see if there is a distro specific override for this and use
1574 # XXX we need to better integrate a distro specific override with
1575 # the rest of this function so that all of the reuse cache
1576 # stuff is leveraged given that 80% of this function is reuse
1577 if type -p build_ofed-${DISTRO}; then
1579 ofed_location=$(build_ofed-${DISTRO} ${STDOUT})
1580 local rc=${PIPESTATUS[0]}
1581 CONFIGURE_FLAGS="--with-o2ib=${ofed_location} ${CONFIGURE_FLAGS}"
1586 elif compare_version $OFED_VERSION 3.0; then
1587 kib_prefix="ofa_kernel"
1590 kib_prefix="compat-rdma"
1591 kib_rpm="compat-rdma"
1594 # build kernel-ib/compat-rdma
1595 if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
1596 local REUSE_SIGNATURE=$({ echo "$ofed_version";
1597 echo "$(find_linux_release;
1598 echo "$BUILD_GEN")";
1599 cat "${linux}/include/linux/autoconf.h";
1600 cat "${0%/lbuild}/lbuild" ;
1601 cat "${0%/lbuild}/lbuild-${DISTRO}"; } |
1602 md5sum | cut -d" " -f1)
1603 # see if we can link to the reuse pool
1604 # XXX - hrm. i'm not convinced this doesn't belong in the reuse
1606 local CAN_LINK_FOR_REUSE=false
1607 touch $REUSEBUILD/$$
1608 if cp -al $REUSEBUILD/$$ $TOPDIR/; then
1609 CAN_LINK_FOR_REUSE=true
1614 if ! $USE_BUILD_CACHE || ! reuse ofed "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1615 "$REUSE_SIGNATURE"; then
1616 if [ -n "$REUSE_SIGNATURE" ]; then
1617 # stash away the existing built articles for a moment
1619 mv {BUILD,{S,}RPMS,S{OURCE,PEC}S} bak
1622 find . | cpio -pudlm ..
1626 create_rpmbuild_dirs
1629 build_kernel_ib "${linux}" "${kib_prefix}" "${kib_rpm}"
1631 if [ -z "$REUSE_SIGNATURE" ]; then
1632 echo "No reuse signature was caculated so not storing the built ofed"
1634 # store the resulting RPM build tree for future use
1635 echo "Storing the built ofed for future reuse"
1636 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
1637 "ofed" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1638 "$CAN_LINK_FOR_REUSE"; then
1639 error "Failed to store OFED RPMS for reuse"
1643 # put the stuff we stashed away back
1648 pushd "$TOPDIR" >/dev/null
1649 rm -rf ${kib_rpm}-devel
1650 mkdir ${kib_rpm}-devel
1652 # the actual ofed RPMs don't have the -rc$n or -$date string appened that
1653 # might be present on the file
1654 local linuxrelease=$(find_linux_release)
1655 ofed_version=$(echo $ofed_version |
1656 sed -re 's/-(20[0-9]{6,6}-[0-9]{4,4}|rc[0-9]*)$//')
1657 local rpm=$(ls $TOPDIR/RPMS/*/${kib_rpm}-devel-${ofed_version}-${linuxrelease//-/_}.*.rpm)
1658 if ! rpm2cpio < $rpm | cpio -id; then
1659 fatal 1 "could not unpack the ${kib_rpm}-devel rpm."
1661 CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/${kib_prefix} ${CONFIGURE_FLAGS}"
1668 if ! $PATCHLESS; then
1669 local kernel_extra_version
1670 if ! kernel_extra_version=$(build_kernel_with_srpm ${STDOUT}); then
1671 fatal 1 "Failed to build the kernel from it's SRPM"
1674 for arch in $BUILD_ARCHS; do
1675 local kernel_devel_rpm
1676 if ! kernel_devel_rpm=$(find_rpm "$TOPDIR/RPMS/$arch/" provides "^$(devel_kernel_name $KERNEL_LUSTRE_NAMING) ="); then
1677 fatal 1 "Failed to find a kernel development RPM in $TOPDIR/RPMS/$arch/"
1680 # install the -devel RPM in preparation for modules builds
1681 if ! lnxrel="$kernel_extra_version" unpack_linux_devel_rpm \
1682 "$TOPDIR/RPMS/$arch/$kernel_devel_rpm"; then
1683 fatal 1 "Could not find the Linux tree in $TOPDIR/RPMS/$arch/$kernel_devel_rpm"
1687 # need to find and unpack the vendor's own kernel-devel for patchless
1690 if ! kernelrpm=$(find_linux_rpm "-$DEVEL_KERNEL_TYPE"); then
1691 fatal 1 "Could not find the kernel-$DEVEL_KERNEL_TYPE RPM in ${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
1693 if ! lnxrel="$lnxrel" unpack_linux_devel_rpm "$kernelrpm" "-"; then
1694 fatal 1 "Could not find the Linux tree in $kernelrpm"
1698 # ~sigh~ have to make copies of and modify some of the rpm
1699 # infrastructure files so that find-requires can find our unpacked
1700 # kernel-devel artifacts
1701 cp $RPM_HELPERS_DIR/{symset-table,find-requires{,.ksyms}} .
1702 FIND_REQUIRES="$(pwd)/find-requires"
1703 chmod 755 {symset-table,find-requires{,.ksyms}}
1705 tmp="${tmp//\//\\/}"
1706 ed find-requires <<EOF
1710 /|.*find-requires.ksyms/s/|/| bash -x/
1711 g/ [^ ]*\/\(find-requires\.ksyms\)/s// $tmp\/\1/g
1714 ed find-requires.ksyms <<EOF
1718 g/\/.*\/\(symset-table\)/s//$tmp\/\1/g
1721 ed symset-table <<EOF
1725 g/\(\/boot\/\)/s//$tmp\/reused\1/g
1726 g/\(\/usr\/src\/kernels\/\)/s//$tmp\/reused\1/g
1730 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
1731 fatal 1 "error building OFED"
1734 if build_lustre "$LINUX" "$LINUXOBJ"; then
1735 # the build worked. resolve any symlinked files (i.e. from reuse)
1736 # in RPMS/$arch to real files so that that that huge mess of
1737 # complication known as LTS can copy them yet somewhere else.
1738 # is it any wonder this whole process is so damn so? anyone ever
1739 # heard of hardlinks? it's this cool new thing that allows you save
1740 # tons of time and space by creating... well you can go read about
1741 # them if you have not heard about them yet.
1742 # can i say how much the implemenation of all of this really impedes
1745 for dir in RPMS/*; do
1747 for file in $(ls); do
1748 if [ -h $file ]; then
1755 # also, for i?86, make sure all of the RPMs are in RPMS/$TARGET_ARCH
1756 # as that's where LTS expects to find them
1757 for dir in RPMS/*; do
1758 if [ $dir = RPMS/$TARGET_ARCH ]; then
1763 if [ -n "$files" ]; then
1764 cp -al $files ../$TARGET_ARCH
1774 create_rpmbuild_dirs() {
1776 [ -d RPMS ] || mkdir RPMS
1777 for arch in $BUILD_ARCHS; do
1778 if [[ $arch = i?86 ]]; then
1779 # some stupidity in the sles11 kernel spec requires an RPMS/i386
1780 # even if the target arch is i686
1781 [ -d RPMS/i386 ] || mkdir RPMS/i386
1783 [ -d RPMS/$arch ] || mkdir RPMS/$arch
1785 [ -d RPMS/noarch ] || mkdir RPMS/noarch
1786 [ -d BUILD ] || mkdir BUILD
1787 [ -d SOURCES ] || mkdir SOURCES
1788 [ -d SPECS ] || mkdir SPECS
1789 [ -d SRPMS ] || mkdir SRPMS
1811 [[ $list\ == *\ $item\ * ]]
1815 #########################################################################
1816 # Generate a backtrace through the call stack.
1820 #########################################################################
1824 local funcname="" sourcefile="" lineno="" n
1826 echo "Call stack: (most recent first)"
1827 for (( n = $strip ; n < ${#FUNCNAME[@]} ; ++n )) ; do
1828 funcname=${FUNCNAME[$n - 1]}
1829 sourcefile=$(basename ${BASH_SOURCE[$n]})
1830 lineno=${BASH_LINENO[$n - 1]}
1834 # Display function arguments
1835 if [[ ! -z "${BASH_ARGV[@]}" ]]; then
1836 local args newarg j p=0
1837 for (( j = ${BASH_ARGC[$n - 1]}; j > 0; j-- )); do
1838 newarg=${BASH_ARGV[$j + $p - 1]}
1839 args="${args:+${args} }'${newarg}'"
1841 let p+=${BASH_ARGC[$n - 1]}
1843 echo " ${funcname} ${args:+${args} }at ${sourcefile}:${lineno}"
1847 echo "BEGIN BACKTRACE"
1849 #echo ${BASH_LINENO[*]}
1850 #echo ${BASH_SOURCE[*]}
1851 #echo ${FUNCNAME[*]}
1852 local i=$((${#FUNCNAME[@]} - 1))
1853 while [ $i -ge 0 ]; do
1854 local lineno=${BASH_LINENO[$i]}
1858 local SOURCELINE="${BASH_SOURCE[$i + 1]}:${lineno}"
1859 # Can't figure out how to get function args from other frames...
1860 local FUNCTION="${FUNCNAME[$i]}()"
1861 echo "$SOURCELINE:$FUNCTION"
1865 echo "END BACKTRACE"
1871 seen_list=$(new_list)
1873 echo "An unexpected error has occurred at ${BASH_SOURCE[0]##*/}:$((LINENO-1)).
1874 Unfortunately the above line number in the message may or may not be correct,
1875 but details have been send to the lbuild maintainer. Attempting to continue."; (echo "Untrapped error"
1877 # have we seen this one
1878 echo "checking seen list for ${BASH_SOURCE[0]}:${BASH_LINENO[0]}"
1880 if is_list_member "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}"; then
1881 echo "seen this one already"
1883 seen_list=$(add_list "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}")
1886 ) ; set $xtrace' ERR
1889 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
1891 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 -- "$@")
1893 if [ $? != 0 ]; then
1897 eval set -- "$options"
1932 if ! KERNELTREE=$(canon_path "$2"); then
1933 fatal 1 "Could not determine the canonical location of $2"
1937 --linux | --with-linux)
1938 if ! LINUX=$(canon_path "$2"); then
1939 fatal 1 "Could not determine the canonical location of $2"
1952 if ! REUSEBUILD=$(canon_path "$2"); then
1953 fatal 1 "Could not determine the canonical location of $2"
1974 if ! KERNELRPMSBASE=$(canon_path "$2"); then
1975 fatal 1 "Could not determine the canonical location of $2"
1984 if ! LUSTRE=$(canon_filepath "$2"); then
1985 fatal 1 "Could not determine the canonical location of $2"
2028 --disable-datestamp)
2042 # there are actually some lustre configure flags that we need to
2043 # handle ourselves (but we still give them to configure)
2044 if [[ \ $@\ == *\ --disable-tests\ * ]]; then
2048 CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-liblustre --enable-liblustre-tests"
2052 usage 1 "Unrecognized option: $1"
2061 # XXX - should we _always_ get the buildid from the META file? what are the
2062 # other (i.e. non-lustre-tarball use cases of lbuild)?
2063 BUILDID=$(sed -ne '/^BUILDID =/s/.*= *//p' lustre/META)
2067 if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
2069 unpack_ofed || fatal 1 "Error unpacking OFED tarball"
2072 # make sure the RPM build environment is set up
2073 create_rpmbuild_dirs
2075 # if an unpacked kernel source tree was given on the command line
2076 # just build lustre with it (nothing distro kernel specific here)
2077 if [ -n "$LINUX" ]; then
2078 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
2079 fatal 1 "error building OFED"
2080 build_lustre "$LINUX" "$LINUXOBJ"
2082 if [ ! -f "${LBUILD_DIR}/lbuild-$DISTRO" ]; then
2083 fatal 1 "${LBUILD_DIR}/lbuild-$DISTRO not found"
2085 source ${LBUILD_DIR}/lbuild-$DISTRO
2086 build_with_srpm || fatal 1 "Failed to build_with_srpm"