3 # vim:expandtab:shiftwidth=4:softtabstop=4:tabstop=4:
10 # CVSROOT is inherited from the environment
15 # XXX - some recent hacking has pretty much neutered this option.
16 # search through this file (and lbuild.old_school -- but that will
17 # be going away soon) for "-bb" and see how many places
18 # simply don't account for this option
24 TARGET_ARCH=$(uname -m)
26 TARGET_ARCHS_ALL=$TARGET_ARCH
27 [ "$TARGET_ARCH" = "i686" ] && TARGET_ARCHS_ALL="i686 i586 i386"
33 TMPDIR=${TMPDIR:-"/var/tmp"}
35 # XXX - i think these two parameters/arguments/variables need to be
36 # cleaned up and merged. they effectively do the same thing
39 # what does this do exactly? does it imply no kernel build?
42 SKIPLDISKFSRPM="v1_4_* b1_4"
43 SMPTYPES="smp bigsmp default ''"
65 # not in the target file any more
77 # Readlink is not present on some older distributions: emulate it.
81 if [ -L "$path" ]; then
82 ll="$(LC_ALL=C ls -l "$path" 2> /dev/null)" &&
97 [ -n "$msg" ] && echo -e "\n${0##*/}: $msg" >&2
111 Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
114 Specifies the CVS Root to use when pulling files from CVS. The
115 environment variable \$CVSROOT is used if this option is not
118 --external-patches=EXTERNAL_PATCHES
119 Directory similar to lustre/lustre/kernel_patches/ that lbuild should
120 look for seres and config files in before looking in the lustre
123 --extraversion=EXTRAVERSION
124 Text to use for the rpm release and kernel extraversion.
126 --timestamp=TIMESTAMP
127 Date of building lustre in format YYYYMMDDhhmmss
130 Try to reuse old kernel RPMs from DIR
133 Try to reuse old kernel builds from DIR
136 Path to distro kernel RPM collection
142 Do not build RPMs (compile only mode)
145 Build lustre client only
148 Which distro using. Autodetect by default
150 --kerneldir=KERNELDIR
151 Directory containing Linux source tarballs referenced by target
154 --kerneltree=KERNELTREE
155 Directory containing dirs with Linux source tarballs referenced by target
156 files. Dir names in format kernel version ('2.6.9', etc.)
158 --linux=LINUX --with-linux=LINUX
159 Directory of Linux kernel sources. When this option is used, only
160 Lustre modules and userspace are built.
163 Path to an existing lustre source tarball to use instead of
167 Do not try to download a kernel from downloads.lustre.org
170 Do not build a .src.rpm, a full kernel patch, or a patched kernel
174 Do ldiskfs RPM. Now true by default
180 Specifies that the files generated do not include timestamps, and
181 that this is an official release.
184 Build a .src.rpm, a full kernel patch, and a patched kernel tarball.
187 Directory used to stage packages for release. RPMs will be placed
188 more or less in DIR/<target>-<arch>, and the tarball will be
192 A CVS branch/tag name to build from when pulling from CVS.
195 The name of the target to build. The available targets are listed
198 --target-archs=TARGET_ARCHS
199 A (space delimited) list of architectures to build. By default,
200 all of the archs supported by the TARGET will be built, in
201 addition to a .src.rpm. This option can limit those, for machines
202 that can only build certain archs or if you only want a certain
203 arch built (for testing, or a one-off kernel).
205 Also note that by using a non-"base" arch (eg, i386) only kernels
206 will be built - there will be no lustre-lite-utils package.
209 Prevents the datestamp flag (-D) from being passed to cvs for
210 checkouts. This is a workaround for a problem encountered when
211 using lbuild with tinderbox.
214 Builds a Xen domX kernel.
223 # canonicalize a relative path
227 if [ ! -d "$PATH" ]; then
231 pushd "$PATH" >/dev/null || return 1
241 if [ "$LUSTRE" ]; then
242 [ -r "$LUSTRE" ] || \
243 usage 1 "Could not find Lustre source tarball '$LUSTRE'."
246 usage 1 "Either specify a CVS Root with -d, or a Lustre source tarball with --lustre."
248 usage 1 "A branch/tag name must be specified with --tag when not building from a tarball."
251 if [ -z "$LINUX" ]; then
252 [ "$KERNELDIR" -o "$KERNELTREE" ] || \
253 usage 1 "A kernel directory must be specified with --kerneldir or --kerneltree."
255 [ -d "$KERNELDIR" -o -d "$KERNELTREE" ] || \
256 usage 1 "$KERNELDIR and $KERNELTREE are not a directory."
260 usage 1 "When building a snapshot, a tag name must be used."
263 [ "$TARGET" ] || usage 1 "A target must be specified with --target."
264 # TARGET_FILE="$TOPDIR/lustre/kernel_patches/targets/$TARGET.target"
265 # [ -r "$TARGET_FILE" ] || \
266 # usage 1 "Target '$TARGET' was not found."
271 CANONICAL_TARGET="rhel5"
274 CANONICAL_TARGET="rhel-2.6"
277 CANONICAL_TARGET="sles-2.6"
280 CANONICAL_TARGET="sles10-2.6"
283 CANONICAL_TARGET="hp-pnnl-2.4"
291 CANONICAL_TARGET="$TARGET"
295 local timestampnodig=$(echo $TIMESTAMP | sed -e s/[0-9]*//g)
296 [ "$timestampnodig" = "" ] || TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M%S")
297 local timestamplength="${#TIMESTAMP}"
298 if [ $timestamplength -eq 12 ]; then
299 TIMESTAMP="${TIMESTAMP}00"
300 elif [ $timestamplength -ne 14 ]; then
301 TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M%S")
304 RPMBUILD=$(which rpmbuild 2>/dev/null | head -1)
305 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
306 RPMBUILD=$(which rpm 2>/dev/null | head -1)
307 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
308 usage 1 "Could not find binary for making rpms (tried rpmbuild and rpm)."
312 if [ -n "$CCACHE" ]; then
313 which "$DISTCC" 2>/dev/null && export DISTCC RPM_BUILD_NCPUS
315 if which "$CCACHE" 2>/dev/null; then
316 local ccache=$(which "$CCACHE")
317 local bindir="$TOPDIR/bin"
319 [ -d $bindir ] || mkdir -p $bindir
320 if [ -d $bindir ]; then
321 rm ${bindir}/* > /dev/null 2>&1
322 ln -s "$ccache" ${bindir}/ccache
323 ln -s "$ccache" ${bindir}/cc
324 ln -s "$ccache" ${bindir}/$CC
325 export PATH=$bindir:$PATH
327 export CCACHE && export CC="ccache $CC"
328 # zero the cache so we can see how effective we are being with it
333 [ -z "$DISTRO" ] && DISTRO=$(autodetect_distro)
336 # autodetect used Distro
337 autodetect_distro() {
342 if [ -f /etc/SuSE-release ]; then
344 version=$(grep ^VERSION /etc/SuSE-release)
345 version=${version#*= }
346 elif [ -f /etc/redhat-release ]; then
347 name=$(head -1 /etc/redhat-release)
348 version=$(echo "$distroname" |
349 sed -e 's/^[^0-9.]*//g' | sed -e 's/[ \.].*//')
351 if [ -z "$name" -o -z "$version" ]; then
352 fatal 1 "I don't know how to determine distro type/version.\n" \
353 "Either update autodetect_distro() or use the --distro argument"
356 echo ${name}${version}
363 echo $(echo "$*" | xargs -n 1 | sort -u)
371 echo "Downloading http://downloads.lustre.org/public/kernels/$target/old/$srpm..."
372 if ! wget -nv "http://downloads.lustre.org/public/kernels/$target/old/$srpm" \
373 -O "$KERNELDIR/$srpm"; then
374 fatal 1 "Could not download target $target's kernel SRPM $srpm from downloads.lustre.org."
376 [ -s "$KERNELDIR/$srpm" ] || {
377 rm -rf $KERNELDIR/$srpm
378 fatal 1 "Could not download target $target's kernel SRPM $srpm from downloads.lustre.org."
385 if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ] && \
386 [ ! -r "$KERNELTREE/OFED-${OFED_VERSION}.tgz" ]; then
388 local location="http://downloads.lustre.org/public/OFED/"
389 echo "Downloading $location/OFED-${OFED_VERSION}.tgz..."
390 if ! wget -nv "$location/OFED-${OFED_VERSION}.tgz" \
391 -O "$KERNELTREE/OFED-${OFED_VERSION}.tgz"; then
392 fatal 1 "Could not download OFED-${OFED_VERSION}.tgz" \
393 "from downloads.lustre.org."
396 fatal 1 "OFED-${OFED_VERSION}.tgz not found in kernel" \
397 "directory $KERNELTREE."
405 EXTRA_VERSION_save="$EXTRA_VERSION"
406 for patchesdir in "$EXTERNAL_PATCHES" \
407 "$TOPDIR/lustre/lustre/kernel_patches"; do
408 TARGET_FILE="$patchesdir/targets/$TARGET.target"
409 [ -r "$TARGET_FILE" ] && break
411 [ -r "$TARGET_FILE" ] || fatal 1 "Target $TARGET was not found."
413 echo "Loading target config file $TARGET.target..."
417 # doesn't make any sense to build OFED for xen domX's
422 # XXX - set_rpm_smp_type is an ugly undeterministic hack. it needs to
423 # go away and the target just specify the $RPMSMPTYPE
424 [ -z "$RPMSMPTYPE" ] && set_rpm_smp_type
426 # CC might have been overwriten in TARGET_FILE
427 if [[ $CC != ccache\ * ]] && which "$CCACHE" 2>/dev/null; then
428 export CCACHE && export CC="ccache $CC"
431 if [ ! "$KERNELTREE" = "" ] && [ -d "$KERNELTREE" ]; then
432 KERNELDIR="$KERNELTREE/${lnxmaj}"
433 [ -d "$KERNELDIR" ] || mkdir "$KERNELDIR"
436 # verify the series is available
437 if [ "$SERIES" ]; then
438 for series in $SERIES; do
439 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches"; do
440 [ -r "$patchesdir/series/$series" ] && continue 2
442 fatal 1 "Target $TARGET's series $SERIES could not be" \
443 "found.\nSearched:\n\t$EXTERNAL_PATCHES/series\n" \
444 "\t$TOPDIR/lustre/lustre/kernel_patches/series."
448 # set the location of the .config file
454 if [ -f $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET-$TARGET_ARCH.config ]; then
455 CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET$XENPOSTFIX-$TARGET_ARCH${RPMSMPTYPE:+-}${RPMSMPTYPE}.config"
458 local lnxrelnew=${lnxrel//-/_}
460 # remember the EXTRA_VERSION before we diddle it here
461 # XXX - we really should not diddle with any values read in from the
462 # target file. if we want to modify a value, we should create
464 PRISTINE_EXTRA_VERSION=$EXTRA_VERSION
466 if ! $PATCHLESS && [ ! -f "$CONFIG_FILE" ]; then
467 fatal 1 "Config file for target $TARGET missing from" \
468 "$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/."
471 if [ "$EXTRA_VERSION_save" ]; then
472 EXTRA_VERSION="$EXTRA_VERSION_save"
473 elif ! $RELEASE; then
474 # if there is no patch series, then this is not a lustre specific
475 # kernel. don't make it look like one
476 if [ -n "$SERIES" ]; then
477 #remove the @VERSION@ (lustre version)
478 # EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
479 # EXTRA_VERSION="${EXTRA_VERSION}-${TAG}.${TIMESTAMP}"
480 ! ( $PATCHLESS ) && EXTRA_VERSION="${EXTRA_VERSION}.${TIMESTAMP}"
483 # EXTRA_VERSION=${EXTRA_VERSION//-/_}
485 ALL_ARCHS="$BASE_ARCHS $BIGMEM_ARCHS $BOOT_ARCHS $JENSEN_ARCHS $SMP_ARCHS $BIGSMP_ARCHS $PSERIES64_ARCHS $UP_ARCHS"
488 for arch in $(uniqify "$ALL_ARCHS"); do
489 if [ -z "$TARGET_ARCHS" ] ||
490 [[ \ $TARGET_ARCHS\ = *\ $arch\ * ]]; then
491 BUILD_ARCHS="$BUILD_ARCHS $arch"
494 [ "$BUILD_ARCHS" ] || usage 1 "No available target archs to build."
495 echo "Building for: $BUILD_ARCHS"
503 fatal 1 "tarflags(): File name argument missing."
515 fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
524 echo "Untarring ${file##*/}..."
525 tar $(tarflags "$file") "$file"
531 untar "$KERNELTREE/OFED-${OFED_VERSION}.tgz" || fatal 1 "Error unpacking OFED tarball"
532 [ -d OFED ] || ln -sf OFED-[0-9].[0-9]* OFED
538 if [ -z "$LUSTRE" ]; then
541 if [ -n "$USE_DATESTAMP" ]; then
542 DATESTAMP="-D '$DATE'"
545 local DIRNAME="lustre-$TAG-$TIMESTAMP"
547 cvs -d "$CVSROOT" -qz3 co $DATESTAMP -d "$DIRNAME" lustre || \
548 fatal 1 "There was an error checking out toplevel Lustre from CVS."
549 pushd "$DIRNAME" > /dev/null
550 ./lustrecvs "$TAG" || \
551 fatal 1 "There was an error checking out Lustre/Portals/Build from CVS."
552 echo "Creating lustre tarball..."
553 sh autogen.sh || fatal 1 "There was an error running autogen.sh."
554 ./configure --disable-{modules,utils,liblustre,tests,doc} || \
555 fatal 1 "There was an error running ./configure to create makefiles."
556 make dist || fatal 1 "There was an error running 'make dist'."
557 LUSTRE=$PWD/lustre-*.tar.gz
561 untar "$LUSTRE" || fatal 1 "Error unpacking Lustre tarball"
562 [ -d lustre ] || ln -sf lustre-[0-9].[0-9]* lustre
568 local do_patch=${1:-true}
570 FULL_PATCH="$PWD/lustre-kernel-${TARGET}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}.patch"
571 [ -f "$FULL_PATCH" ] && rm -f "$FULL_PATCH"
572 $do_patch && pushd linux >/dev/null
573 for series in $SERIES; do
574 echo -n "Applying series $series:"
575 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches"; do
576 [ -r "$patchesdir/series/$series" ] || continue
577 SERIES_FILE="$patchesdir/series/$series"
578 for patch in $(<"$SERIES_FILE"); do
580 PATCH_FILE="$patchesdir/patches/$patch"
581 [ -r "$PATCH_FILE" ] || \
582 fatal 1 "Patch $patch does not exist in Lustre tree."
583 cat "$PATCH_FILE" >> "$FULL_PATCH" || {
585 fatal 1 "Error adding patch $patch to full patch."
588 patch -s -p1 < "$PATCH_FILE" || {
590 fatal 1 "Error applying patch $patch."
598 $do_patch && popd >/dev/null
599 echo "Full patch has been saved in ${FULL_PATCH##*/}."
607 pushd lustre >/dev/null
609 echo "Building Lustre RPMs for: $BUILD_ARCHS..."
611 for arch in $BUILD_ARCHS; do
612 targets="--target $arch $targets"
615 local confoptions="--with-linux=${LINUX}"
617 confoptions="--with-linux=${LINUX} --disable-server"
619 if [ ! "$LINUXOBJ" = "" ]; then
620 confoptions="$confoptions --with-linux-obj=${LINUXOBJ}"
623 ./configure $confoptions ${CONFIGURE_FLAGS}
624 if [ "$?" != "0" ]; then
625 local saved_config="../config.log.$(date +%s)"
626 cp config.log $saved_config
627 chmod a+r $saved_config
628 echo "Saved config.log is at $saved_config"
635 # hack. Somebody move build/lustre.spec to lustre.spec for b1_6
637 [ -f lustre.spec ] && lustre_spec=lustre.spec
638 [ -f build/lustre.spec ] && lustre_spec=build/lustre.spec
640 [ -f "$lustre_spec" ] && sed \
641 -e "s^Release: .*$^Release: $LUSTRE_EXTRA_VERSION^" \
645 local rpmbuildopt='-bb'
648 echo NORPM mode. Only compiling.
651 # convert the $PATCHLESS boolean to an empty/no-empty boolean
652 # as silly as this seems, it makes the syntax of the rpmbuild command
653 # simpler and not need an eval to deal with the quotes in the quotes
654 local is_patchless=""
658 $RPMBUILD $targets $rpmbuildopt ../lustre.spec \
659 ${is_patchless:+--define "lustre_name lustre-client"} \
660 --define "_tmppath $TMPDIR" \
661 --define "_topdir $TOPDIR" || \
662 fatal 1 "Error building rpms for $BUILD_ARCHS."
665 ( $(skeep_ldiskfs_rpm $TAG) ) && return
667 pushd lustre/ldiskfs || return 255
669 if [ "$?" != "0" ]; then
673 cp lustre-ldiskfs*.tar.gz $TOPDIR/SOURCES
677 local ldiskfs_spec=lustre-ldiskfs.spec
678 [ -f "$ldiskfs_spec" ] && sed \
679 -e "s^Release: .*$^Release: $LUSTRE_EXTRA_VERSION^" \
681 > ../lustre-ldiskfs.spec
683 $RPMBUILD $targets $rpmbuildopt ../lustre-ldiskfs.spec \
684 --define "_tmppath /var/tmp" \
685 --define "_topdir $TOPDIR"
686 if [ "$?" != "0" ]; then
692 $RPMBUILD -bs ../lustre-ldiskfs.spec \
693 --define "_tmppath /var/tmp" \
694 --define "_topdir $TOPDIR"
695 if [ "$?" != "0" ]; then
706 [ "$STAGEDIR" ] || return 0
708 for arch in $BUILD_ARCHS; do
709 rpmdir="${STAGEDIR}/${CANONICAL_TARGET}-${arch}"
710 echo "${0##*/}: Copying RPMs into ${rpmdir}"
712 cp -v RPMS/${arch}/*.rpm "${rpmdir}"
713 if [ -d RPMS/noarch ]; then
714 cp -v RPMS/noarch/*.rpm "${rpmdir}"
718 cp -v "$LUSTRE" "$STAGEDIR"
721 #check if we need to build separate ldiskfs RPM
722 skeep_ldiskfs_rpm() {
727 if ! $LDISKFSRPM; then
729 elif $PATCHLESS; then
732 for skiptag in $SKIPLDISKFSRPM; do
733 [[ $tag == $skiptag ]] && skip=true && break
740 #generate LUSTRE_EXTRA_VERSION from EXTRA_VERSION
741 gen_lustre_version() {
743 LUSTRE_EXTRA_VERSION="${lnxmaj}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}${TARGET_DELIMITER}${RPMSMPTYPE}"
744 LUSTRE_EXTRA_VERSION=${LUSTRE_EXTRA_VERSION//-/_}
750 local infact_arch="${TARGET_ARCH}"
753 [ "$infact_arch" == "i586" ] && infact_arch="i686"
756 for smp_type in $SMP_ARCHS; do
757 [ $infact_arch == $smp_type ] && RPMSMPTYPE=smp && break
760 for smp_type in $BIGSMP_ARCHS; do
761 [ $infact_arch == $smp_type ] && RPMSMPTYPE=bigsmp && break
766 # This function takes a linux source pool and digs out the linux release
768 find_linux_release() {
771 local LINUXRELEASEHEADER=$SRCDIR/include/linux/version.h
772 if [ -s $SRCDIR/include/linux/utsrelease.h ]; then
773 LINUXRELEASEHEADER=$SRCDIR/include/linux/utsrelease.h
776 sed -ne 's/#define UTS_RELEASE "\(.*\)"$/\1/p' $LINUXRELEASEHEADER
782 local delimiter=${2:-"-"}
784 local pathtorpms="${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
785 [ -d $pathtorpms ] || return 255
787 local kernelbinaryrpm rpmfile
788 local wanted_kernel="${lnxmaj}${delimiter}${lnxrel}"
791 for arch in $TARGET_ARCHS_ALL; do
792 local found_rpm="" rpm
793 for rpm in ${pathtorpms}/${arch}/*.rpm; do
794 if rpm -q --provides -p "$rpm" | grep -q "kernel${prefix} = $wanted_kernel"; then
800 [ -f "$found_rpm" ] && break
808 # unpack kernel(/source/devel) RPM
810 # This function and it's setting of $LINUX and $LINUXOBJ is a total hack that
811 # needs to completely refactored. It completely ingores that $BUILD_ARCHS may
812 # contain a list of arches for which rpmbuild commands (including the one for
815 local kernelrpm="${1}"
816 # it's worth noting that neither sles10 nor rhel5 appear to use their
817 # extra_version delimiter for the dirname under /usr/src, so we could
818 # probably just get rid of this parameter
819 local delimiter=${2:-"-"}
821 [ -f "$kernelrpm" ] || return 255
822 [ -d $TOPDIR/reused ] || mkdir $TOPDIR/reused
824 pushd $TOPDIR/reused || return 255
828 rpm2cpio < "$kernelrpm" | cpio -id > /dev/null 2>&1
829 if [ ${PIPESTATUS[0]} -eq 0 ]; then
830 # RHEL-style and SLES-style rpms
831 # XXX - this rhel/sles goop needs abstracting out into the
832 # lbuild-{rhel5,sles10} method files
833 # XXX - until bug 19336 cleans this up, we need to extricate the
834 # ${lnxmin}- from the $lnxrel
835 local paths="kernels/${lnxmaj}${lnxmin}${delimiter}${lnxrel}-${TARGET_ARCH} linux-${lnxmaj}${lnxmin}${delimiter}${lnxrel##${lnxmin#.}-}"
838 for path in $paths; do
841 if [ -d "$src/$path/" ]; then
842 LINUX="$(pwd)/$src/$path"
844 # SLES has a separate -obj tree
845 if [ -d "$src/${path}-obj" ]; then
846 local src="$src/${path}-obj"
847 local objects="$TARGET_ARCH/$RPMSMPTYPE"
849 # Novell, are you *TRYING* to make life hard for me?
850 if [ -d "$src/powerpc" ]; then
851 objects="powerpc/$TARGET_ARCH"
852 elif [ $TARGET_ARCH == 'i686' ]; then
853 objects="i386/$RPMSMPTYPE"
856 LINUXOBJ="$(pwd)/$src/$objects"
859 if [ -z "$LINUX" ]; then
862 # dig out the release version
863 LINUXRELEASE=$(find_linux_release ${LINUXOBJ:-$LINUX})
864 if [ -z "$LINUXRELEASE" ]; then
865 echo "Failed to find linux release in ${LINUXOBJ:-$LINUX}"
877 # build kernel-ib{,-devel}
878 # some I/B drivers are architecture dependent and kernel-ib's configure
879 # does not figure it out for us ~sigh~
880 local configure_options=""
881 case "$TARGET_ARCH" in
883 configure_options="--with-ipath_inf-mod"
886 configure_options="--with-ipath_inf-mod --with-ehca-mod"
890 # ofed 1.3 had a bug in the rpm spec
891 if [ "$OFED_VERSION" = "1.3" ]; then
894 $RPMBUILD --rebuild --define 'build_kernel_ib 1' --define 'build_kernel_ib_devel 1' \
895 --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
896 --define "KVERSION ${LINUXRELEASE}" \
897 --define "$K_SRC ${LINUXOBJ:-${LINUX}}" \
898 --define "LIB_MOD_DIR /lib/modules/${LINUXRELEASE}/updates" \
899 --define "configure_options --without-quilt --with-core-mod --with-user_mad-mod --with-user_access-mod --with-addr_trans-mod --with-srp-target-mod --with-core-mod --with-mthca-mod --with-mlx4-mod --with-cxgb3-mod --with-nes-mod --with-ipoib-mod --with-sdp-mod --with-srp-mod --without-srp-target-mod --with-rds-mod --with-iser-mod --with-qlgc_vnic-mod --with-madeye-mod $configure_options" ${TOPDIR}/OFED/SRPMS/ofa_kernel-${OFED_VERSION}-ofed${OFED_VERSION}.src.rpm
901 if [ ${PIPESTATUS[0]} != 0 ]; then
902 fatal 1 "Error building kernel-ib"
905 pushd "$TOPDIR" >/dev/null
906 rm -rf kernel-ib-devel
907 mkdir kernel-ib-devel
909 local rpm=$(ls $TOPDIR/RPMS/*/kernel-ib-devel-${OFED_VERSION}-${LINUXRELEASE//-/_}.*.rpm)
910 rpm2cpio -itv < $rpm | cpio -id
911 CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/ofa_kernel ${CONFIGURE_FLAGS}"
927 location="$location"/"$signature"/"$module"
929 ## use eval/echo here to make sure shell expansions are performed
930 #if ! cp -a${linkflag} $(eval echo $articles) "$location"; then
932 for article in $(eval echo $articles); do
933 if ! cp -a${linkflag} "$article" "$location"; then
934 error "Failed to copy \"$article\" to \"$location\" in store_for_reuse()"
935 # rename the cache location so that it's not cached
936 # product, but is around for analysis
937 mv "$location"{,-bad-$(date +%s)} ||
938 error "failed to clean up a failed cache attempt" \
939 "in \"$location\" -- manual cleanup will be" \
945 # flag the cache as complete (i.e. in case lbuild was previously
946 # interrupted while caching)
947 touch "$location/.lastused"
956 local use_links="${3:-false}"
959 if [ -n "$REUSEBUILD" ] && [ -d "$REUSEBUILD/$signature/$module" ]; then
960 if [ ! -f "$REUSEBUILD/$signature/$module/.lastused" ]; then
961 # the .lastused flag is populated at the end of the caching to
962 # signal that the caching was completeld. if that flag is not
963 # there, then the cache is invalid (and should be removed in fact)
964 mv "$REUSEBUILD/$signature/$module"{,-bad-$(date +%s)} ||
965 fatal 1 "failed to clean up a bad cache in location" \
966 "\"$REUSEBUILD/$signature/$module\" -- manual cleanup" \
971 # so that we know how stale this entry is
972 touch $REUSEBUILD/$signature/$module/.lastused
975 if ls $REUSEBUILD/$signature/$module/* >/dev/null 2>&1; then
976 cp -al $REUSEBUILD/$signature/$module/* $dest/
979 # copying is pretty heavy
980 # cp -a $REUSEBUILD/$signature/$module/* $dest/
981 # do some creative symlinking instead
983 for dir in BUILD SRPMS SPECS; do
984 if ls $REUSEBUILD/$signature/$module/$dir/* >/dev/null 2>&1; then
985 ln -s $REUSEBUILD/$signature/$module/$dir/* $dest/$dir
988 # sources have to be copied by file because we need SOURCES to
989 # be a dir we can write into
990 # could overrun ls's arg list here
991 #ls $REUSEBUILD/$signature/$module/SOURCES/* |
992 find $REUSEBUILD/$signature/$module/SOURCES/ -type f |
993 xargs ln -t $dest/SOURCES -s
995 # same for RPMS/* dirs
996 # could overrun ls's arg list here
997 #ls $REUSEBUILD/$signature/$module/RPMS/$TARGET_ARCH/* |
999 for dir in $REUSEBUILD/$signature/$module/RPMS/*; do
1000 mkdir -p $dest/RPMS/${dir##*/}
1002 xargs ln -t $dest/RPMS/${dir##*/} -s
1015 if [[ $arch = i[3456]86 ]]; then
1024 # in a given directory, find the first rpm matching given requirements
1028 local match_type="$2"
1031 pushd "$dir" > /dev/null || \
1032 fatal 1 "Unable to chdir to directory \"$dir\" in find_rpm()"
1035 for file in $(ls); do
1036 if [ ! -f "$file" ]; then
1039 case "$match_type" in
1041 # match is any valid ERE (i.e. given to egrep) match
1042 if rpm -q --provides -p "$file" | egrep -q "$match"; then
1050 fatal 1 "Unknown match type \"$match_type\" given to find_rpm()"
1059 build_kernel_with_srpm() {
1061 # need to generate the patch for this target
1062 do_patch_linux false >&2 # sets global $FULL_PATCH (yeah, yuck)
1064 # get an md5sum of the kernel patch + config for reuse check
1065 # XXX really, there needs to be a signature and a CONFIG_FILE per arch
1067 local REUSE_SIGNATURE=$(cat $CONFIG_FILE $TARGET_FILE $FULL_PATCH | md5sum | cut -d" " -f1)
1069 # see if we can link to the reuse pool
1070 # XXX - hrm. i'm not convinced this doesn't belong in the reuse "library"
1071 local CAN_LINK_FOR_REUSE=false
1072 touch $REUSEBUILD/$$
1073 if cp -al $REUSEBUILD/$$ $TOPDIR/; then
1074 CAN_LINK_FOR_REUSE=true
1078 # the extra version string to use for the kernel (which might be a reused
1080 local kernel_extra_version=""
1081 if $REUSERPM && reuse kernel "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1082 "$REUSE_SIGNATURE"; then
1083 # figure out the EXTRA_VERSION of the kernel we are re-using
1085 if ! KERNEL_RPM=$(find_rpm "$TOPDIR/RPMS/$TARGET_ARCH/" provides "^kernel ="); then
1086 fatal 1 "Failed to find a kernel RPM in $TOPDIR/RPMS/$TARGET_ARCH/"
1088 kernel_extra_version=$(rpm -q --queryformat "%{RELEASE}" -p $TOPDIR/RPMS/$TARGET_ARCH/$KERNEL_RPM)
1090 # nothing cached, build from scratch
1091 if [ ! -r "$KERNELDIR/$KERNEL_SRPM" ]; then
1092 download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM"
1095 rpm -ivh $KERNELDIR/$KERNEL_SRPM --define "_topdir $TOPDIR" >&2 || {
1096 # should we clean this up or leave it for analysis?
1098 fatal 1 "Error installing kernel SRPM."
1101 # put the Lustre kernel patch into the RPM build tree
1102 cp $FULL_PATCH $TOPDIR/SOURCES/linux-${lnxmaj}-lustre.patch
1103 prepare_and_build_srpm
1105 # store the resulting kernel RPM build tree for future use
1106 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
1107 "kernel" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1108 "$CAN_LINK_FOR_REUSE"; then
1109 error "Failed to store kernel RPMS for reuse"
1113 kernel_extra_version=$EXTRA_VERSION
1116 # should now have the following RPMs
1117 # $TOPDIR/RPMS/$arch/kernel-lustre-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1118 # $TOPDIR/RPMS/$arch/kernel-lustre-devel-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1119 # $TOPDIR/RPMS/$arch/kernel-lustre-headers-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1120 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-common-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1121 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1123 echo $kernel_extra_version
1130 if ! $PATCHLESS; then
1131 local kernel_extra_version
1132 if ! kernel_extra_version=$(build_kernel_with_srpm); then
1133 fatal 1 "Failed to build the kernel from it's SRPM"
1136 for arch in $BUILD_ARCHS; do
1138 local kernel_devel_rpm
1139 if ! kernel_devel_rpm=$(find_rpm "$TOPDIR/RPMS/$arch/" provides "^$(devel_kernel_name true) ="); then
1140 fatal 1 "Failed to find a kernel development RPM in $TOPDIR/RPMS/$arch/"
1143 # install the -devel RPM in preparation for the lustre build
1144 # note that the EXTRA_VERSION_DELIMITER is *NOT* used in the
1145 # version of the directory name under /usr/src
1146 if ! lnxrel="$kernel_extra_version" unpack_linux_rpm \
1147 "$TOPDIR/RPMS/$arch/$kernel_devel_rpm" "-"; then
1148 fatal 1 "Could not find the Linux tree in $TOPDIR/RPMS/$arch/$kernel_devel_rpm"
1152 # need to find and unpack the vendor's own kernel-devel for patchless
1155 if ! kernelrpm=$(find_linux_rpm "-$DEVEL_KERNEL_TYPE" ${EXTRA_VERSION_DELIMITER:-"-"}); then
1156 fatal 1 "Could not find the kernel-$DEVEL_KERNEL_TYPE RPM in ${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
1158 if ! lnxrel="$lnxrel" unpack_linux_rpm "$kernelrpm" "-"; then
1159 fatal 1 "Could not find the Linux tree in $kernelrpm"
1163 # before lustre, build kernel-ib
1164 if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
1165 # see if we can link to the reuse pool
1166 # XXX - hrm. i'm not convinced this doesn't belong in the reuse "library"
1167 local CAN_LINK_FOR_REUSE=false
1168 touch $REUSEBUILD/$$
1169 if cp -al $REUSEBUILD/$$ $TOPDIR/; then
1170 CAN_LINK_FOR_REUSE=true
1174 local REUSE_SIGNATURE=$({ echo "$OFED_VERSION"; echo "$(find_linux_release ${LINUXOBJ:-$LINUX})"; cat "${LINUXOBJ:-${LINUX}}/include/linux/autoconf.h"; } | md5sum | cut -d" " -f1)
1175 if ! reuse ofed "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1176 "$REUSE_SIGNATURE"; then
1177 # stash away the existing built articles for a moment
1179 mv {BUILD,{S,}RPMS,S{OURCE,PEC}S} bak
1182 find . | cpio -pudlm ..
1186 create_rpmbuild_dirs
1189 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
1190 "ofed" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1191 "$CAN_LINK_FOR_REUSE"; then
1192 error "Failed to store OFED RPMS for reuse"
1196 # put the stuff we stashed away back
1202 if build_lustre; then
1203 # the build worked. resolve any symlinked files (i.e. from reuse)
1204 # in RPMS/$arch to real files so that that that huge mess of
1205 # complication knows as LTS can copy them yet somewhere else.
1206 # is it any wonder this whole process is so damn so? anyone ever
1207 # heard of hardlinks? it this cool new thing that allows you save
1208 # tons of time and space by creating... well you can go read about
1209 # them if you have not heard about them yet.
1210 # can i say how much the implemenation of all of this really impedes
1212 pushd RPMS/$TARGET_ARCH
1214 if [ -h $file ]; then
1223 create_rpmbuild_dirs() {
1225 if [ ! -d RPMS ]; then
1227 for arch in $BUILD_ARCHS; do
1231 [ -d BUILD ] || mkdir BUILD
1232 [ -d SOURCES ] || mkdir SOURCES
1233 [ -d SPECS ] || mkdir SPECS
1234 [ -d SRPMS ] || mkdir SRPMS
1256 [[ $list\ == *\ $item\ * ]]
1260 #########################################################################
1261 # Generate a backtrace through the call stack.
1265 #########################################################################
1269 local funcname="" sourcefile="" lineno="" n
1271 echo "Call stack: (most recent first)"
1272 for (( n = $strip ; n < ${#FUNCNAME[@]} ; ++n )) ; do
1273 funcname=${FUNCNAME[$n - 1]}
1274 sourcefile=$(basename ${BASH_SOURCE[$n]})
1275 lineno=${BASH_LINENO[$n - 1]}
1276 # Display function arguments
1277 if [[ ! -z "${BASH_ARGV[@]}" ]]; then
1278 local args newarg j p=0
1279 for (( j = ${BASH_ARGC[$n - 1]}; j > 0; j-- )); do
1280 newarg=${BASH_ARGV[$j + $p - 1]}
1281 args="${args:+${args} }'${newarg}'"
1283 let p+=${BASH_ARGC[$n - 1]}
1285 echo " ${funcname} ${args:+${args} }at ${sourcefile}:${lineno}"
1289 echo "BEGIN BACKTRACE"
1291 #echo ${BASH_LINENO[*]}
1292 #echo ${BASH_SOURCE[*]}
1293 #echo ${FUNCNAME[*]}
1294 local i=$((${#FUNCNAME[@]} - 1))
1295 while [ $i -ge 0 ]; do
1296 local SOURCELINE="${BASH_SOURCE[$i + 1]}:${BASH_LINENO[$i]}"
1297 # Can't figure out how to get function args from other frames...
1298 local FUNCTION="${FUNCNAME[$i]}()"
1299 echo "$SOURCELINE:$FUNCTION"
1303 echo "END BACKTRACE"
1309 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
1311 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,publish,release,src,stage:,tag:,target:,target-archs:,with-linux:,xen -- "$@")
1313 if [ $? != 0 ]; then
1317 eval set -- "$options"
1352 if ! KERNELTREE=$(canon_path "$2"); then
1353 fatal 1 "Could not determine the canonical location of $2"
1357 --linux | --with-linux)
1358 if ! LINUX=$(canon_path "$2"); then
1359 fatal 1 "Could not determine the canonical location of $2"
1372 if ! REUSEBUILD=$(canon_path "$2"); then
1373 fatal 1 "Could not determine the canonical location of $2"
1390 if ! KERNELRPMSBASE=$(canon_path "$2"); then
1391 fatal 1 "Could not determine the canonical location of $2"
1438 --disable-datestamp)
1449 CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-liblustre --enable-liblustre-tests"
1453 usage 1 "Unrecognized option: $1"
1463 EXTRA_VERSION_DELIMITER=${EXTRA_VERSION_DELIMITER:-"-"}
1465 if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
1470 # make sure the RPM build environment is set up
1471 create_rpmbuild_dirs
1473 trap '[ -n "$CCACHE" ] && ccache -s' EXIT
1475 # if an unpacked kernel source tree was given on the command line
1476 # just build lustre with it (nothing distro kernel specific here)
1477 if [ -n "$LINUX" ]; then
1480 if [ -f "${0%/*}/lbuild-$DISTRO" ]; then
1481 seen_list=$(new_list)
1482 trap '(echo "Untrapped error"
1484 # have we seen this one
1485 echo "checking seen list for ${BASH_SOURCE[0]}:${BASH_LINENO[0]}"
1487 if is_list_member "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}"; then
1488 echo "seen this one already"
1490 seen_list=$(add_list "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}")
1496 ) | tee >(mail -s "Untrapped error at ${BASH_SOURCE[0]##*/}:${BASH_LINENO[0]} on $HOSTNAME" brian@sun.com) >&2' ERR
1499 source ${0%/*}/lbuild-$DISTRO
1501 build_with_srpm || fatal 1 "Failed to build_with_srpm"
1503 source ${0%/*}/lbuild.old_school
1505 old_school_download_kernel
1509 patchless_build_sequence && build_success=true
1511 [ "$DISTRO" = "sles9" ] && build_sequence_rpm_reuse && build_success=true
1512 if ! $build_success; then
1513 build_sequence_reuse && build_success=true
1514 if ! $build_success; then
1515 build_sequence && build_success=true
1516 if $build_success; then
1517 store_for_reuse || echo "Cannot store for future reuse"
1522 ( $build_success ) || fatal 1 "Cannot build lustre"