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)
370 local force="${3:-false}"
372 if $force || [ ! -r "$KERNELDIR/$srpm" ] ||
373 [ ! -s "$KERNELDIR/$srpm" ]; then
375 local location="http://downloads.lustre.org/public/kernels/$target/old"
376 echo "Downloading $location/$srpm..."
377 if ! wget -nv "$location/$srpm" -O "$KERNELDIR/$srpm" ||
378 [ ! -s "$KERNELDIR/$srpm" ]; then
379 rm -f $KERNELDIR/$srpm
380 fatal 1 "Could not download target $target's kernel SRPM" \
381 "$srpm from $location."
384 fatal 1 "$srpm not found in directory $KERNELDIR."
391 local force="${1:-false}"
393 if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ] &&
394 ( $force || [ ! -r "$KERNELTREE/OFED-${OFED_VERSION}.tgz" ] ||
395 [ ! -s "$KERNELTREE/OFED-${OFED_VERSION}.tgz" ] ); then
397 local location="http://downloads.lustre.org/public/OFED/"
398 echo "Downloading $location/OFED-${OFED_VERSION}.tgz..."
399 if ! wget -nv "$location/OFED-${OFED_VERSION}.tgz" \
400 -O "$KERNELTREE/OFED-${OFED_VERSION}.tgz" ||
401 [ ! -s "$KERNELTREE/OFED-${OFED_VERSION}.tgz" ]; then
402 rm -f $KERNELTREE/OFED-${OFED_VERSION}.tgz
403 fatal 1 "Could not download OFED-${OFED_VERSION}.tgz" \
404 "from downloads.lustre.org."
407 fatal 1 "OFED-${OFED_VERSION}.tgz not found in kernel" \
408 "directory $KERNELTREE."
416 EXTRA_VERSION_save="$EXTRA_VERSION"
417 for patchesdir in "$EXTERNAL_PATCHES" \
418 "$TOPDIR/lustre/lustre/kernel_patches"; do
419 TARGET_FILE="$patchesdir/targets/$TARGET.target"
420 [ -r "$TARGET_FILE" ] && break
422 [ -r "$TARGET_FILE" ] || fatal 1 "Target $TARGET was not found."
424 echo "Loading target config file $TARGET.target..."
428 # doesn't make any sense to build OFED for xen domX's
433 # XXX - set_rpm_smp_type is an ugly undeterministic hack. it needs to
434 # go away and the target just specify the $RPMSMPTYPE
435 [ -z "$RPMSMPTYPE" ] && set_rpm_smp_type
437 # CC might have been overwriten in TARGET_FILE
438 if [[ $CC != ccache\ * ]] && which "$CCACHE" 2>/dev/null; then
439 export CCACHE && export CC="ccache $CC"
442 if [ ! "$KERNELTREE" = "" ] && [ -d "$KERNELTREE" ]; then
443 KERNELDIR="$KERNELTREE/${lnxmaj}"
444 [ -d "$KERNELDIR" ] || mkdir "$KERNELDIR"
447 # verify the series is available
448 if [ "$SERIES" ]; then
449 for series in $SERIES; do
450 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches"; do
451 [ -r "$patchesdir/series/$series" ] && continue 2
453 fatal 1 "Target $TARGET's series $SERIES could not be" \
454 "found.\nSearched:\n\t$EXTERNAL_PATCHES/series\n" \
455 "\t$TOPDIR/lustre/lustre/kernel_patches/series."
459 # set the location of the .config file
465 if [ -f $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET-$TARGET_ARCH.config ]; then
466 CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET$XENPOSTFIX-$TARGET_ARCH${RPMSMPTYPE:+-}${RPMSMPTYPE}.config"
469 local lnxrelnew=${lnxrel//-/_}
471 # remember the EXTRA_VERSION before we diddle it here
472 # XXX - we really should not diddle with any values read in from the
473 # target file. if we want to modify a value, we should create
475 PRISTINE_EXTRA_VERSION=$EXTRA_VERSION
477 if ! $PATCHLESS && [ ! -f "$CONFIG_FILE" ]; then
478 fatal 1 "Config file for target $TARGET missing from" \
479 "$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/."
482 if [ "$EXTRA_VERSION_save" ]; then
483 EXTRA_VERSION="$EXTRA_VERSION_save"
484 elif ! $RELEASE; then
485 # if there is no patch series, then this is not a lustre specific
486 # kernel. don't make it look like one
487 if [ -n "$SERIES" ]; then
488 #remove the @VERSION@ (lustre version)
489 # EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
490 # EXTRA_VERSION="${EXTRA_VERSION}-${TAG}.${TIMESTAMP}"
491 ! ( $PATCHLESS ) && EXTRA_VERSION="${EXTRA_VERSION}.${TIMESTAMP}"
494 # EXTRA_VERSION=${EXTRA_VERSION//-/_}
496 ALL_ARCHS="$BASE_ARCHS $BIGMEM_ARCHS $BOOT_ARCHS $JENSEN_ARCHS $SMP_ARCHS $BIGSMP_ARCHS $PSERIES64_ARCHS $UP_ARCHS"
499 for arch in $(uniqify "$ALL_ARCHS"); do
500 if [ -z "$TARGET_ARCHS" ] ||
501 [[ \ $TARGET_ARCHS\ = *\ $arch\ * ]]; then
502 BUILD_ARCHS="$BUILD_ARCHS $arch"
505 [ "$BUILD_ARCHS" ] || usage 1 "No available target archs to build."
506 echo "Building for: $BUILD_ARCHS"
514 fatal 1 "tarflags(): File name argument missing."
526 fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
535 echo "Untarring ${file##*/}..."
536 tar $(tarflags "$file") "$file"
542 if ! untar "$KERNELTREE/OFED-${OFED_VERSION}.tgz"; then
545 [ -d OFED ] || ln -sf OFED-[0-9].[0-9]* OFED
551 if [ -z "$LUSTRE" ]; then
554 if [ -n "$USE_DATESTAMP" ]; then
555 DATESTAMP="-D '$DATE'"
558 local DIRNAME="lustre-$TAG-$TIMESTAMP"
560 cvs -d "$CVSROOT" -qz3 co $DATESTAMP -d "$DIRNAME" lustre || \
561 fatal 1 "There was an error checking out toplevel Lustre from CVS."
562 pushd "$DIRNAME" > /dev/null
563 ./lustrecvs "$TAG" || \
564 fatal 1 "There was an error checking out Lustre/Portals/Build from CVS."
565 echo "Creating lustre tarball..."
566 sh autogen.sh || fatal 1 "There was an error running autogen.sh."
567 ./configure --disable-{modules,utils,liblustre,tests,doc} || \
568 fatal 1 "There was an error running ./configure to create makefiles."
569 make dist || fatal 1 "There was an error running 'make dist'."
570 LUSTRE=$PWD/lustre-*.tar.gz
574 untar "$LUSTRE" || fatal 1 "Error unpacking Lustre tarball"
575 [ -d lustre ] || ln -sf lustre-[0-9].[0-9]* lustre
581 local do_patch=${1:-true}
583 FULL_PATCH="$PWD/lustre-kernel-${TARGET}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}.patch"
584 [ -f "$FULL_PATCH" ] && rm -f "$FULL_PATCH"
585 $do_patch && pushd linux >/dev/null
586 for series in $SERIES; do
587 echo -n "Applying series $series:"
588 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches"; do
589 [ -r "$patchesdir/series/$series" ] || continue
590 SERIES_FILE="$patchesdir/series/$series"
591 for patch in $(<"$SERIES_FILE"); do
593 PATCH_FILE="$patchesdir/patches/$patch"
594 [ -r "$PATCH_FILE" ] || \
595 fatal 1 "Patch $patch does not exist in Lustre tree."
596 cat "$PATCH_FILE" >> "$FULL_PATCH" || {
598 fatal 1 "Error adding patch $patch to full patch."
601 patch -s -p1 < "$PATCH_FILE" || {
603 fatal 1 "Error applying patch $patch."
611 $do_patch && popd >/dev/null
612 echo "Full patch has been saved in ${FULL_PATCH##*/}."
620 pushd lustre >/dev/null
622 echo "Building Lustre RPMs for: $BUILD_ARCHS..."
624 for arch in $BUILD_ARCHS; do
625 targets="--target $arch $targets"
628 local confoptions="--with-linux=${LINUX}"
630 confoptions="--with-linux=${LINUX} --disable-server"
632 if [ ! "$LINUXOBJ" = "" ]; then
633 confoptions="$confoptions --with-linux-obj=${LINUXOBJ}"
636 ./configure $confoptions ${CONFIGURE_FLAGS}
637 if [ "$?" != "0" ]; then
638 local saved_config="../config.log.$(date +%s)"
639 cp config.log $saved_config
640 chmod a+r $saved_config
641 echo "Saved config.log is at $saved_config"
645 echo "config.log contents:"
653 # hack. Somebody move build/lustre.spec to lustre.spec for b1_6
655 [ -f lustre.spec ] && lustre_spec=lustre.spec
656 [ -f build/lustre.spec ] && lustre_spec=build/lustre.spec
658 [ -f "$lustre_spec" ] && sed \
659 -e "s^Release: .*$^Release: $LUSTRE_EXTRA_VERSION^" \
663 local rpmbuildopt='-bb'
666 echo NORPM mode. Only compiling.
669 # convert the $PATCHLESS boolean to an empty/no-empty boolean
670 # as silly as this seems, it makes the syntax of the rpmbuild command
671 # simpler and not need an eval to deal with the quotes in the quotes
672 local is_patchless=""
676 $RPMBUILD $targets $rpmbuildopt ../lustre.spec \
677 ${is_patchless:+--define "lustre_name lustre-client"} \
678 --define "_tmppath $TMPDIR" \
679 --define "_topdir $TOPDIR" || \
680 fatal 1 "Error building rpms for $BUILD_ARCHS."
683 ( $(skeep_ldiskfs_rpm $TAG) ) && return
685 pushd lustre/ldiskfs || return 255
687 if [ "$?" != "0" ]; then
691 cp lustre-ldiskfs*.tar.gz $TOPDIR/SOURCES
695 local ldiskfs_spec=lustre-ldiskfs.spec
696 [ -f "$ldiskfs_spec" ] && sed \
697 -e "s^Release: .*$^Release: $LUSTRE_EXTRA_VERSION^" \
699 > ../lustre-ldiskfs.spec
701 $RPMBUILD $targets $rpmbuildopt ../lustre-ldiskfs.spec \
702 --define "_tmppath /var/tmp" \
703 --define "_topdir $TOPDIR"
704 if [ "$?" != "0" ]; then
710 $RPMBUILD -bs ../lustre-ldiskfs.spec \
711 --define "_tmppath /var/tmp" \
712 --define "_topdir $TOPDIR"
713 if [ "$?" != "0" ]; then
724 [ "$STAGEDIR" ] || return 0
726 for arch in $BUILD_ARCHS; do
727 rpmdir="${STAGEDIR}/${CANONICAL_TARGET}-${arch}"
728 echo "${0##*/}: Copying RPMs into ${rpmdir}"
730 cp -v RPMS/${arch}/*.rpm "${rpmdir}"
731 if [ -d RPMS/noarch ]; then
732 cp -v RPMS/noarch/*.rpm "${rpmdir}"
736 cp -v "$LUSTRE" "$STAGEDIR"
740 #check if we need to build separate ldiskfs RPM
741 skeep_ldiskfs_rpm() {
746 if ! $LDISKFSRPM; then
748 elif $PATCHLESS; then
751 for skiptag in $SKIPLDISKFSRPM; do
752 [[ $tag == $skiptag ]] && skip=true && break
759 #generate LUSTRE_EXTRA_VERSION from EXTRA_VERSION
760 gen_lustre_version() {
762 LUSTRE_EXTRA_VERSION="${lnxmaj}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}${TARGET_DELIMITER}${RPMSMPTYPE}"
763 LUSTRE_EXTRA_VERSION=${LUSTRE_EXTRA_VERSION//-/_}
769 local infact_arch="${TARGET_ARCH}"
772 [ "$infact_arch" == "i586" ] && infact_arch="i686"
775 for smp_type in $SMP_ARCHS; do
776 [ $infact_arch == $smp_type ] && RPMSMPTYPE=smp && break
779 for smp_type in $BIGSMP_ARCHS; do
780 [ $infact_arch == $smp_type ] && RPMSMPTYPE=bigsmp && break
785 # This function takes a linux source pool and digs out the linux release
787 find_linux_release() {
790 local LINUXRELEASEHEADER=$SRCDIR/include/linux/version.h
791 if [ -s $SRCDIR/include/linux/utsrelease.h ]; then
792 LINUXRELEASEHEADER=$SRCDIR/include/linux/utsrelease.h
795 sed -ne 's/#define UTS_RELEASE "\(.*\)"$/\1/p' $LINUXRELEASEHEADER
801 local delimiter=${2:-"-"}
803 local pathtorpms="${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
804 [ -d $pathtorpms ] || return 255
806 local kernelbinaryrpm rpmfile
807 local wanted_kernel="${lnxmaj}${delimiter}${lnxrel}"
810 for arch in $TARGET_ARCHS_ALL; do
811 local found_rpm="" rpm
812 for rpm in ${pathtorpms}/${arch}/*.rpm; do
813 if rpm -q --provides -p "$rpm" | grep -q "kernel${prefix} = $wanted_kernel"; then
819 [ -f "$found_rpm" ] && break
827 # unpack kernel(/source/devel) RPM
829 # This function and it's setting of $LINUX and $LINUXOBJ is a total hack that
830 # needs to completely refactored. It completely ingores that $BUILD_ARCHS may
831 # contain a list of arches for which rpmbuild commands (including the one for
834 local kernelrpm="${1}"
835 # it's worth noting that neither sles10 nor rhel5 appear to use their
836 # extra_version delimiter for the dirname under /usr/src, so we could
837 # probably just get rid of this parameter
838 local delimiter=${2:-"-"}
840 [ -f "$kernelrpm" ] || return 255
841 [ -d $TOPDIR/reused ] || mkdir $TOPDIR/reused
843 pushd $TOPDIR/reused || return 255
847 rpm2cpio < "$kernelrpm" | cpio -id > /dev/null 2>&1
848 if [ ${PIPESTATUS[0]} -eq 0 ]; then
849 # RHEL-style and SLES-style rpms
850 # XXX - this rhel/sles goop needs abstracting out into the
851 # lbuild-{rhel5,sles10} method files
852 # XXX - until bug 19336 cleans this up, we need to extricate the
853 # ${lnxmin}- from the $lnxrel
854 local paths="kernels/${lnxmaj}${lnxmin}${delimiter}${lnxrel}-${TARGET_ARCH} linux-${lnxmaj}${lnxmin}${delimiter}${lnxrel##${lnxmin#.}-}"
857 for path in $paths; do
860 if [ -d "$src/$path/" ]; then
861 LINUX="$(pwd)/$src/$path"
863 # SLES has a separate -obj tree
864 if [ -d "$src/${path}-obj" ]; then
865 local src="$src/${path}-obj"
866 local objects="$TARGET_ARCH/$RPMSMPTYPE"
868 # Novell, are you *TRYING* to make life hard for me?
869 if [ -d "$src/powerpc" ]; then
870 objects="powerpc/$TARGET_ARCH"
871 elif [ $TARGET_ARCH == 'i686' ]; then
872 objects="i386/$RPMSMPTYPE"
875 LINUXOBJ="$(pwd)/$src/$objects"
878 if [ -z "$LINUX" ]; then
881 # dig out the release version
882 LINUXRELEASE=$(find_linux_release ${LINUXOBJ:-$LINUX})
883 if [ -z "$LINUXRELEASE" ]; then
884 echo "Failed to find linux release in ${LINUXOBJ:-$LINUX}"
896 # build kernel-ib{,-devel}
897 # some I/B drivers are architecture dependent and kernel-ib's configure
898 # does not figure it out for us ~sigh~
899 local configure_options=""
900 case "$TARGET_ARCH" in
902 configure_options="--with-ipath_inf-mod"
905 configure_options="--with-ipath_inf-mod --with-ehca-mod"
909 # ofed 1.3 had a bug in the rpm spec
910 if [ "$OFED_VERSION" = "1.3" ]; then
913 $RPMBUILD --rebuild --define 'build_kernel_ib 1' --define 'build_kernel_ib_devel 1' \
914 --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
915 --define "KVERSION ${LINUXRELEASE}" \
916 --define "$K_SRC ${LINUXOBJ:-${LINUX}}" \
917 --define "LIB_MOD_DIR /lib/modules/${LINUXRELEASE}/updates" \
918 --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-*.src.rpm
920 if [ ${PIPESTATUS[0]} != 0 ]; then
921 fatal 1 "Error building kernel-ib"
938 location="$location"/"$signature"/"$module"
940 ## use eval/echo here to make sure shell expansions are performed
941 #if ! cp -a${linkflag} $(eval echo $articles) "$location"; then
943 for article in $(eval echo $articles); do
944 if ! cp -a${linkflag} "$article" "$location"; then
945 error "Failed to copy \"$article\" to \"$location\" in store_for_reuse()"
946 # rename the cache location so that it's not cached
947 # product, but is around for analysis
948 mv "$location"{,-bad-$(date +%s)} ||
949 error "failed to clean up a failed cache attempt" \
950 "in \"$location\" -- manual cleanup will be" \
956 # flag the cache as complete (i.e. in case lbuild was previously
957 # interrupted while caching)
958 touch "$location/.lastused"
967 local use_links="${3:-false}"
970 if [ -n "$REUSEBUILD" ] && [ -d "$REUSEBUILD/$signature/$module" ]; then
971 if [ ! -f "$REUSEBUILD/$signature/$module/.lastused" ]; then
972 # the .lastused flag is populated at the end of the caching to
973 # signal that the caching was completeld. if that flag is not
974 # there, then the cache is invalid (and should be removed in fact)
975 mv "$REUSEBUILD/$signature/$module"{,-bad-$(date +%s)} ||
976 fatal 1 "failed to clean up a bad cache in location" \
977 "\"$REUSEBUILD/$signature/$module\" -- manual cleanup" \
982 # so that we know how stale this entry is
983 touch $REUSEBUILD/$signature/$module/.lastused
986 if ls $REUSEBUILD/$signature/$module/* >/dev/null 2>&1; then
987 cp -al $REUSEBUILD/$signature/$module/* $dest/
990 # copying is pretty heavy
991 # cp -a $REUSEBUILD/$signature/$module/* $dest/
992 # do some creative symlinking instead
994 for dir in BUILD SRPMS SPECS; do
995 if ls $REUSEBUILD/$signature/$module/$dir/* >/dev/null 2>&1; then
996 ln -s $REUSEBUILD/$signature/$module/$dir/* $dest/$dir
999 # sources have to be copied by file because we need SOURCES to
1000 # be a dir we can write into
1001 # could overrun ls's arg list here
1002 #ls $REUSEBUILD/$signature/$module/SOURCES/* |
1003 find $REUSEBUILD/$signature/$module/SOURCES/ -type f |
1004 xargs ln -t $dest/SOURCES -s
1006 # same for RPMS/* dirs
1007 # could overrun ls's arg list here
1008 #ls $REUSEBUILD/$signature/$module/RPMS/$TARGET_ARCH/* |
1010 for dir in $REUSEBUILD/$signature/$module/RPMS/*; do
1011 mkdir -p $dest/RPMS/${dir##*/}
1013 xargs ln -t $dest/RPMS/${dir##*/} -s
1026 if [[ $arch = i[3456]86 ]]; then
1035 # in a given directory, find the first rpm matching given requirements
1039 local match_type="$2"
1042 pushd "$dir" > /dev/null || \
1043 fatal 1 "Unable to chdir to directory \"$dir\" in find_rpm()"
1046 for file in $(ls); do
1047 if [ ! -f "$file" ]; then
1050 case "$match_type" in
1052 # match is any valid ERE (i.e. given to egrep) match
1053 if rpm -q --provides -p "$file" | egrep -q "$match"; then
1061 fatal 1 "Unknown match type \"$match_type\" given to find_rpm()"
1070 build_kernel_with_srpm() {
1072 # need to generate the patch for this target
1073 do_patch_linux false >&2 # sets global $FULL_PATCH (yeah, yuck)
1075 # get an md5sum of the kernel patch + config for reuse check
1076 # XXX really, there needs to be a signature and a CONFIG_FILE per arch
1078 local REUSE_SIGNATURE=$((echo $BUILD_GEN; cat $CONFIG_FILE $TARGET_FILE $FULL_PATCH) | md5sum | cut -d" " -f1)
1080 # see if we can link to the reuse pool
1081 # XXX - hrm. i'm not convinced this doesn't belong in the reuse "library"
1082 local CAN_LINK_FOR_REUSE=false
1083 touch $REUSEBUILD/$$
1084 if cp -al $REUSEBUILD/$$ $TOPDIR/; then
1085 CAN_LINK_FOR_REUSE=true
1089 # the extra version string to use for the kernel (which might be a reused
1091 local kernel_extra_version=""
1092 if $REUSERPM && reuse kernel "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1093 "$REUSE_SIGNATURE"; then
1094 # figure out the EXTRA_VERSION of the kernel we are re-using
1096 if ! KERNEL_RPM=$(find_rpm "$TOPDIR/RPMS/$TARGET_ARCH/" provides "^kernel ="); then
1097 fatal 1 "Failed to find a kernel RPM in $TOPDIR/RPMS/$TARGET_ARCH/"
1099 kernel_extra_version=$(rpm -q --queryformat "%{RELEASE}" -p $TOPDIR/RPMS/$TARGET_ARCH/$KERNEL_RPM)
1101 # nothing cached, build from scratch
1102 if [ ! -r "$KERNELDIR/$KERNEL_SRPM" ]; then
1103 download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM"
1106 rpm -ivh $KERNELDIR/$KERNEL_SRPM --define "_topdir $TOPDIR" >&2 || {
1107 # should we clean this up or leave it for analysis?
1109 fatal 1 "Error installing kernel SRPM."
1112 # put the Lustre kernel patch into the RPM build tree
1113 cp $FULL_PATCH $TOPDIR/SOURCES/linux-${lnxmaj}-lustre.patch
1114 prepare_and_build_srpm
1116 # store the resulting kernel RPM build tree for future use
1117 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
1118 "kernel" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1119 "$CAN_LINK_FOR_REUSE"; then
1120 error "Failed to store kernel RPMS for reuse"
1124 kernel_extra_version=$EXTRA_VERSION
1127 # should now have the following RPMs
1128 # $TOPDIR/RPMS/$arch/kernel-lustre-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1129 # $TOPDIR/RPMS/$arch/kernel-lustre-devel-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1130 # $TOPDIR/RPMS/$arch/kernel-lustre-headers-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1131 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-common-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1132 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1134 echo $kernel_extra_version
1141 if ! $PATCHLESS; then
1142 local kernel_extra_version
1143 if ! kernel_extra_version=$(build_kernel_with_srpm); then
1144 fatal 1 "Failed to build the kernel from it's SRPM"
1147 for arch in $BUILD_ARCHS; do
1149 local kernel_devel_rpm
1150 if ! kernel_devel_rpm=$(find_rpm "$TOPDIR/RPMS/$arch/" provides "^$(devel_kernel_name true) ="); then
1151 fatal 1 "Failed to find a kernel development RPM in $TOPDIR/RPMS/$arch/"
1154 # install the -devel RPM in preparation for the lustre build
1155 # note that the EXTRA_VERSION_DELIMITER is *NOT* used in the
1156 # version of the directory name under /usr/src
1157 if ! lnxrel="$kernel_extra_version" unpack_linux_rpm \
1158 "$TOPDIR/RPMS/$arch/$kernel_devel_rpm" "-"; then
1159 fatal 1 "Could not find the Linux tree in $TOPDIR/RPMS/$arch/$kernel_devel_rpm"
1163 # need to find and unpack the vendor's own kernel-devel for patchless
1166 if ! kernelrpm=$(find_linux_rpm "-$DEVEL_KERNEL_TYPE" ${EXTRA_VERSION_DELIMITER:-"-"}); then
1167 fatal 1 "Could not find the kernel-$DEVEL_KERNEL_TYPE RPM in ${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
1169 if ! lnxrel="$lnxrel" unpack_linux_rpm "$kernelrpm" "-"; then
1170 fatal 1 "Could not find the Linux tree in $kernelrpm"
1174 # before lustre, build kernel-ib
1175 if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
1176 # see if we can link to the reuse pool
1177 # XXX - hrm. i'm not convinced this doesn't belong in the reuse "library"
1178 local CAN_LINK_FOR_REUSE=false
1179 touch $REUSEBUILD/$$
1180 if cp -al $REUSEBUILD/$$ $TOPDIR/; then
1181 CAN_LINK_FOR_REUSE=true
1185 local REUSE_SIGNATURE=$({ echo "$OFED_VERSION"; echo "$(find_linux_release ${LINUXOBJ:-$LINUX})"; cat "${LINUXOBJ:-${LINUX}}/include/linux/autoconf.h"; } | md5sum | cut -d" " -f1)
1186 if ! reuse ofed "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1187 "$REUSE_SIGNATURE"; then
1188 # stash away the existing built articles for a moment
1190 mv {BUILD,{S,}RPMS,S{OURCE,PEC}S} bak
1193 find . | cpio -pudlm ..
1197 create_rpmbuild_dirs
1200 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
1201 "ofed" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1202 "$CAN_LINK_FOR_REUSE"; then
1203 error "Failed to store OFED RPMS for reuse"
1207 # put the stuff we stashed away back
1211 pushd "$TOPDIR" >/dev/null
1212 rm -rf kernel-ib-devel
1213 mkdir kernel-ib-devel
1215 # the actual ofed RPMs don't have the -rc$n or -$date string appened that
1216 # might be present on the file
1217 local ofed_version=$(echo $OFED_VERSION |
1218 sed -re 's/-(20[0-9]{6,6}-[0-9]{4,4}|rc[0-9]*)$//')
1219 local rpm=$(ls $TOPDIR/RPMS/*/kernel-ib-devel-${ofed_version}-${LINUXRELEASE//-/_}.*.rpm)
1220 rpm2cpio -itv < $rpm | cpio -id
1221 CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/ofa_kernel ${CONFIGURE_FLAGS}"
1226 if build_lustre; then
1227 # the build worked. resolve any symlinked files (i.e. from reuse)
1228 # in RPMS/$arch to real files so that that that huge mess of
1229 # complication knows as LTS can copy them yet somewhere else.
1230 # is it any wonder this whole process is so damn so? anyone ever
1231 # heard of hardlinks? it this cool new thing that allows you save
1232 # tons of time and space by creating... well you can go read about
1233 # them if you have not heard about them yet.
1234 # can i say how much the implemenation of all of this really impedes
1236 pushd RPMS/$TARGET_ARCH
1238 if [ -h $file ]; then
1250 create_rpmbuild_dirs() {
1252 if [ ! -d RPMS ]; then
1254 for arch in $BUILD_ARCHS; do
1258 [ -d BUILD ] || mkdir BUILD
1259 [ -d SOURCES ] || mkdir SOURCES
1260 [ -d SPECS ] || mkdir SPECS
1261 [ -d SRPMS ] || mkdir SRPMS
1283 [[ $list\ == *\ $item\ * ]]
1287 #########################################################################
1288 # Generate a backtrace through the call stack.
1292 #########################################################################
1296 local funcname="" sourcefile="" lineno="" n
1298 echo "Call stack: (most recent first)"
1299 for (( n = $strip ; n < ${#FUNCNAME[@]} ; ++n )) ; do
1300 funcname=${FUNCNAME[$n - 1]}
1301 sourcefile=$(basename ${BASH_SOURCE[$n]})
1302 lineno=${BASH_LINENO[$n - 1]}
1303 # Display function arguments
1304 if [[ ! -z "${BASH_ARGV[@]}" ]]; then
1305 local args newarg j p=0
1306 for (( j = ${BASH_ARGC[$n - 1]}; j > 0; j-- )); do
1307 newarg=${BASH_ARGV[$j + $p - 1]}
1308 args="${args:+${args} }'${newarg}'"
1310 let p+=${BASH_ARGC[$n - 1]}
1312 echo " ${funcname} ${args:+${args} }at ${sourcefile}:${lineno}"
1316 echo "BEGIN BACKTRACE"
1318 #echo ${BASH_LINENO[*]}
1319 #echo ${BASH_SOURCE[*]}
1320 #echo ${FUNCNAME[*]}
1321 local i=$((${#FUNCNAME[@]} - 1))
1322 while [ $i -ge 0 ]; do
1323 local SOURCELINE="${BASH_SOURCE[$i + 1]}:${BASH_LINENO[$i]}"
1324 # Can't figure out how to get function args from other frames...
1325 local FUNCTION="${FUNCNAME[$i]}()"
1326 echo "$SOURCELINE:$FUNCTION"
1330 echo "END BACKTRACE"
1336 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
1338 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 -- "$@")
1340 if [ $? != 0 ]; then
1344 eval set -- "$options"
1379 if ! KERNELTREE=$(canon_path "$2"); then
1380 fatal 1 "Could not determine the canonical location of $2"
1384 --linux | --with-linux)
1385 if ! LINUX=$(canon_path "$2"); then
1386 fatal 1 "Could not determine the canonical location of $2"
1399 if ! REUSEBUILD=$(canon_path "$2"); then
1400 fatal 1 "Could not determine the canonical location of $2"
1417 if ! KERNELRPMSBASE=$(canon_path "$2"); then
1418 fatal 1 "Could not determine the canonical location of $2"
1465 --disable-datestamp)
1476 CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-liblustre --enable-liblustre-tests"
1480 usage 1 "Unrecognized option: $1"
1490 EXTRA_VERSION_DELIMITER=${EXTRA_VERSION_DELIMITER:-"-"}
1492 if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
1494 unpack_ofed || fatal 1 "Error unpacking OFED tarball"
1497 # make sure the RPM build environment is set up
1498 create_rpmbuild_dirs
1500 trap '[ -n "$CCACHE" ] && ccache -s' EXIT
1502 # if an unpacked kernel source tree was given on the command line
1503 # just build lustre with it (nothing distro kernel specific here)
1504 if [ -n "$LINUX" ]; then
1507 if [ -f "${0%/*}/lbuild-$DISTRO" ]; then
1508 seen_list=$(new_list)
1509 trap '(echo "Untrapped error"
1511 # have we seen this one
1512 echo "checking seen list for ${BASH_SOURCE[0]}:${BASH_LINENO[0]}"
1514 if is_list_member "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}"; then
1515 echo "seen this one already"
1517 seen_list=$(add_list "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}")
1523 ) | tee >(mail -s "Untrapped error at ${BASH_SOURCE[0]##*/}:${BASH_LINENO[0]} on $HOSTNAME" brian@sun.com) >&2' ERR
1526 source ${0%/*}/lbuild-$DISTRO
1528 build_with_srpm || fatal 1 "Failed to build_with_srpm"
1530 source ${0%/*}/lbuild.old_school
1532 old_school_download_kernel
1536 patchless_build_sequence && build_success=true
1538 [ "$DISTRO" = "sles9" ] && build_sequence_rpm_reuse && build_success=true
1539 if ! $build_success; then
1540 build_sequence_reuse && build_success=true
1541 if ! $build_success; then
1542 build_sequence && build_success=true
1543 if $build_success; then
1544 store_for_reuse || echo "Cannot store for future reuse"
1549 ( $build_success ) || fatal 1 "Cannot build lustre"