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 ''"
66 # not in the target file any more
78 # Readlink is not present on some older distributions: emulate it.
82 if [ -L "$path" ]; then
83 ll="$(LC_ALL=C ls -l "$path" 2> /dev/null)" &&
98 [ -n "$msg" ] && echo -e "\n${0##*/}: $msg" >&2
112 Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
115 Specifies the CVS Root to use when pulling files from CVS. The
116 environment variable \$CVSROOT is used if this option is not
119 --external-patches=EXTERNAL_PATCHES
120 Directory similar to lustre/lustre/kernel_patches/ that lbuild should
121 look for seres and config files in before looking in the lustre
124 --extraversion=EXTRAVERSION
125 Text to use for the rpm release and kernel extraversion.
127 --timestamp=TIMESTAMP
128 Date of building lustre in format YYYYMMDDhhmmss
131 Try to reuse old kernel RPMs from DIR
134 Try to reuse old kernel builds from DIR
137 Path to distro kernel RPM collection
143 Do not build RPMs (compile only mode)
146 Build lustre client only
149 Which distro using. Autodetect by default
151 --kerneldir=KERNELDIR
152 Directory containing Linux source tarballs referenced by target
155 --kerneltree=KERNELTREE
156 Directory containing dirs with Linux source tarballs referenced by target
157 files. Dir names in format kernel version ('2.6.9', etc.)
159 --linux=LINUX --with-linux=LINUX
160 Directory of Linux kernel sources. When this option is used, only
161 Lustre modules and userspace are built.
164 Path to an existing lustre source tarball to use instead of
168 Do not try to download a kernel from downloads.lustre.org
171 Do not build a .src.rpm, a full kernel patch, or a patched kernel
175 Do ldiskfs RPM. Now true by default
181 Specifies that the files generated do not include timestamps, and
182 that this is an official release.
185 Build a .src.rpm, a full kernel patch, and a patched kernel tarball.
188 Directory used to stage packages for release. RPMs will be placed
189 more or less in DIR/<target>-<arch>, and the tarball will be
193 A CVS branch/tag name to build from when pulling from CVS.
196 The name of the target to build. The available targets are listed
199 --target-archs=TARGET_ARCHS
200 A (space delimited) list of architectures to build. By default,
201 all of the archs supported by the TARGET will be built, in
202 addition to a .src.rpm. This option can limit those, for machines
203 that can only build certain archs or if you only want a certain
204 arch built (for testing, or a one-off kernel).
206 Also note that by using a non-"base" arch (eg, i386) only kernels
207 will be built - there will be no lustre-lite-utils package.
210 Prevents the datestamp flag (-D) from being passed to cvs for
211 checkouts. This is a workaround for a problem encountered when
212 using lbuild with tinderbox.
215 Builds a Xen domX kernel.
224 # canonicalize a relative path
228 if [ ! -d "$PATH" ]; then
232 pushd "$PATH" >/dev/null || return 1
242 if [ "$LUSTRE" ]; then
243 [ -r "$LUSTRE" ] || \
244 usage 1 "Could not find Lustre source tarball '$LUSTRE'."
247 usage 1 "Either specify a CVS Root with -d, or a Lustre source tarball with --lustre."
249 usage 1 "A branch/tag name must be specified with --tag when not building from a tarball."
252 if [ -z "$LINUX" ]; then
253 [ "$KERNELDIR" -o "$KERNELTREE" ] || \
254 usage 1 "A kernel directory must be specified with --kerneldir or --kerneltree."
256 [ -d "$KERNELDIR" -o -d "$KERNELTREE" ] || \
257 usage 1 "$KERNELDIR and $KERNELTREE are not a directory."
261 usage 1 "When building a snapshot, a tag name must be used."
264 [ "$TARGET" ] || usage 1 "A target must be specified with --target."
265 # TARGET_FILE="$TOPDIR/lustre/kernel_patches/targets/$TARGET.target"
266 # [ -r "$TARGET_FILE" ] || \
267 # usage 1 "Target '$TARGET' was not found."
272 CANONICAL_TARGET="rhel5"
275 CANONICAL_TARGET="rhel-2.6"
278 CANONICAL_TARGET="sles-2.6"
281 CANONICAL_TARGET="sles10-2.6"
284 CANONICAL_TARGET="hp-pnnl-2.4"
292 CANONICAL_TARGET="$TARGET"
296 local timestampnodig=$(echo $TIMESTAMP | sed -e s/[0-9]*//g)
297 [ "$timestampnodig" = "" ] || TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M%S")
298 local timestamplength="${#TIMESTAMP}"
299 if [ $timestamplength -eq 12 ]; then
300 TIMESTAMP="${TIMESTAMP}00"
301 elif [ $timestamplength -ne 14 ]; then
302 TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M%S")
305 RPMBUILD=$(which rpmbuild 2>/dev/null | head -1)
306 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
307 RPMBUILD=$(which rpm 2>/dev/null | head -1)
308 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
309 usage 1 "Could not find binary for making rpms (tried rpmbuild and rpm)."
313 if [ -n "$CCACHE" ]; then
314 which "$DISTCC" 2>/dev/null && export DISTCC RPM_BUILD_NCPUS
316 if which "$CCACHE" 2>/dev/null; then
317 local ccache=$(which "$CCACHE")
318 local bindir="$TOPDIR/bin"
320 [ -d $bindir ] || mkdir -p $bindir
321 if [ -d $bindir ]; then
322 rm ${bindir}/* > /dev/null 2>&1
323 ln -s "$ccache" ${bindir}/ccache
324 ln -s "$ccache" ${bindir}/cc
325 ln -s "$ccache" ${bindir}/$CC
326 export PATH=$bindir:$PATH
328 export CCACHE && export CC="ccache $CC"
329 # zero the cache so we can see how effective we are being with it
334 [ -z "$DISTRO" ] && DISTRO=$(autodetect_distro)
337 # autodetect used Distro
338 autodetect_distro() {
343 if [ -f /etc/SuSE-release ]; then
345 version=$(grep ^VERSION /etc/SuSE-release)
346 version=${version#*= }
347 elif [ -f /etc/redhat-release ]; then
348 name=$(head -1 /etc/redhat-release)
349 version=$(echo "$distroname" |
350 sed -e 's/^[^0-9.]*//g' | sed -e 's/[ \.].*//')
352 if [ -z "$name" -o -z "$version" ]; then
353 fatal 1 "I don't know how to determine distro type/version.\n" \
354 "Either update autodetect_distro() or use the --distro argument"
357 echo ${name}${version}
364 echo $(echo "$*" | xargs -n 1 | sort -u)
372 echo "Downloading http://downloads.lustre.org/public/kernels/$target/old/$srpm..."
373 if ! wget -nv "http://downloads.lustre.org/public/kernels/$target/old/$srpm" \
374 -O "$KERNELDIR/$srpm"; then
375 fatal 1 "Could not download target $target's kernel SRPM $srpm from downloads.lustre.org."
377 [ -s "$KERNELDIR/$srpm" ] || {
378 rm -rf $KERNELDIR/$srpm
379 fatal 1 "Could not download target $target's kernel SRPM $srpm from downloads.lustre.org."
386 if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ] && \
387 [ ! -r "$KERNELTREE/OFED-${OFED_VERSION}.tgz" ]; then
389 local location="http://downloads.lustre.org/public/OFED/"
390 echo "Downloading $location/OFED-${OFED_VERSION}.tgz..."
391 if ! wget -nv "$location/OFED-${OFED_VERSION}.tgz" \
392 -O "$KERNELTREE/OFED-${OFED_VERSION}.tgz"; then
393 fatal 1 "Could not download OFED-${OFED_VERSION}.tgz" \
394 "from downloads.lustre.org."
397 fatal 1 "OFED-${OFED_VERSION}.tgz not found in kernel" \
398 "directory $KERNELTREE."
406 EXTRA_VERSION_save="$EXTRA_VERSION"
407 for patchesdir in "$EXTERNAL_PATCHES" \
408 "$TOPDIR/lustre/lustre/kernel_patches"; do
409 TARGET_FILE="$patchesdir/targets/$TARGET.target"
410 [ -r "$TARGET_FILE" ] && break
412 [ -r "$TARGET_FILE" ] || fatal 1 "Target $TARGET was not found."
414 echo "Loading target config file $TARGET.target..."
418 # doesn't make any sense to build OFED for xen domX's
423 # XXX - set_rpm_smp_type is an ugly undeterministic hack. it needs to
424 # go away and the target just specify the $RPMSMPTYPE
425 [ -z "$RPMSMPTYPE" ] && set_rpm_smp_type
427 # CC might have been overwriten in TARGET_FILE
428 if [[ $CC != ccache\ * ]] && which "$CCACHE" 2>/dev/null; then
429 export CCACHE && export CC="ccache $CC"
432 if [ ! "$KERNELTREE" = "" ] && [ -d "$KERNELTREE" ]; then
433 KERNELDIR="$KERNELTREE/${lnxmaj}"
434 [ -d "$KERNELDIR" ] || mkdir "$KERNELDIR"
437 # verify the series is available
438 if [ "$SERIES" ]; then
439 for series in $SERIES; do
440 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches"; do
441 [ -r "$patchesdir/series/$series" ] && continue 2
443 fatal 1 "Target $TARGET's series $SERIES could not be" \
444 "found.\nSearched:\n\t$EXTERNAL_PATCHES/series\n" \
445 "\t$TOPDIR/lustre/lustre/kernel_patches/series."
449 # 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.config"
458 # figure out our smp kernel type and set the .config if we have one
460 for smptype in $SMPTYPES; do
461 [ "$smptype" = "''" ] && smptype=
462 if [ -f $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET-$TARGET_ARCH-${smptype}.config ]; then
463 CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET$XENPOSTFIX-$TARGET_ARCH-${smptype}.config"
464 KERNCONFSMPTYPE=$smptype
468 local lnxrelnew=${lnxrel//-/_}
470 # remember the EXTRA_VERSION before we diddle it here
471 # XXX - we really should not diddle with any values read in from the
472 # target file. if we want to modify a value, we should create
474 PRISTINE_EXTRA_VERSION=$EXTRA_VERSION
476 if ! $PATCHLESS && [ ! -f "$CONFIG_FILE" ]; then
477 fatal 1 "Config file for target $TARGET missing from" \
478 "$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/."
481 if [ "$EXTRA_VERSION_save" ]; then
482 EXTRA_VERSION="$EXTRA_VERSION_save"
483 elif ! $RELEASE; then
484 # if there is no patch series, then this is not a lustre specific
485 # kernel. don't make it look like one
486 if [ -n "$SERIES" ]; then
487 #remove the @VERSION@ (lustre version)
488 # EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
489 # EXTRA_VERSION="${EXTRA_VERSION}-${TAG}.${TIMESTAMP}"
490 ! ( $PATCHLESS ) && EXTRA_VERSION="${EXTRA_VERSION}.${TIMESTAMP}"
493 # EXTRA_VERSION=${EXTRA_VERSION//-/_}
495 ALL_ARCHS="$BASE_ARCHS $BIGMEM_ARCHS $BOOT_ARCHS $JENSEN_ARCHS $SMP_ARCHS $BIGSMP_ARCHS $PSERIES64_ARCHS $UP_ARCHS"
498 for arch in $(uniqify "$ALL_ARCHS"); do
499 if [ -z "$TARGET_ARCHS" ] ||
500 [[ \ $TARGET_ARCHS\ = *\ $arch\ * ]]; then
501 BUILD_ARCHS="$BUILD_ARCHS $arch"
504 [ "$BUILD_ARCHS" ] || usage 1 "No available target archs to build."
505 echo "Building for: $BUILD_ARCHS"
513 fatal 1 "tarflags(): File name argument missing."
525 fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
534 echo "Untarring ${file##*/}..."
535 tar $(tarflags "$file") "$file"
541 untar "$KERNELTREE/OFED-${OFED_VERSION}.tgz" || fatal 1 "Error unpacking OFED tarball"
542 [ -d OFED ] || ln -sf OFED-[0-9].[0-9]* OFED
548 if [ -z "$LUSTRE" ]; then
551 if [ -n "$USE_DATESTAMP" ]; then
552 DATESTAMP="-D '$DATE'"
555 local DIRNAME="lustre-$TAG-$TIMESTAMP"
557 cvs -d "$CVSROOT" -qz3 co $DATESTAMP -d "$DIRNAME" lustre || \
558 fatal 1 "There was an error checking out toplevel Lustre from CVS."
559 pushd "$DIRNAME" > /dev/null
560 ./lustrecvs "$TAG" || \
561 fatal 1 "There was an error checking out Lustre/Portals/Build from CVS."
562 echo "Creating lustre tarball..."
563 sh autogen.sh || fatal 1 "There was an error running autogen.sh."
564 ./configure --disable-{modules,utils,liblustre,tests,doc} || \
565 fatal 1 "There was an error running ./configure to create makefiles."
566 make dist || fatal 1 "There was an error running 'make dist'."
567 LUSTRE=$PWD/lustre-*.tar.gz
571 untar "$LUSTRE" || fatal 1 "Error unpacking Lustre tarball"
572 [ -d lustre ] || ln -sf lustre-[0-9].[0-9]* lustre
578 local do_patch=${1:-true}
580 FULL_PATCH="$PWD/lustre-kernel-${TARGET}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}.patch"
581 [ -f "$FULL_PATCH" ] && rm -f "$FULL_PATCH"
582 $do_patch && pushd linux >/dev/null
583 for series in $SERIES; do
584 echo -n "Applying series $series:"
585 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches"; do
586 [ -r "$patchesdir/series/$series" ] || continue
587 SERIES_FILE="$patchesdir/series/$series"
588 for patch in $(<"$SERIES_FILE"); do
590 PATCH_FILE="$patchesdir/patches/$patch"
591 [ -r "$PATCH_FILE" ] || \
592 fatal 1 "Patch $patch does not exist in Lustre tree."
593 cat "$PATCH_FILE" >> "$FULL_PATCH" || {
595 fatal 1 "Error adding patch $patch to full patch."
598 patch -s -p1 < "$PATCH_FILE" || {
600 fatal 1 "Error applying patch $patch."
608 $do_patch && popd >/dev/null
609 echo "Full patch has been saved in ${FULL_PATCH##*/}."
617 pushd lustre >/dev/null
619 echo "Building Lustre RPMs for: $BUILD_ARCHS..."
621 for arch in $BUILD_ARCHS; do
622 targets="--target $arch $targets"
625 local confoptions="--with-linux=${LINUX}"
627 confoptions="--with-linux=${LINUX} --disable-server"
629 if [ ! "$LINUXOBJ" = "" ]; then
630 confoptions="$confoptions --with-linux-obj=${LINUXOBJ}"
633 ./configure $confoptions ${CONFIGURE_FLAGS}
634 if [ "$?" != "0" ]; then
635 local saved_config="../config.log.$(date +%s)"
636 cp config.log $saved_config
637 chmod a+r $saved_config
638 echo "Saved config.log is at $saved_config"
645 # hack. Somebody move build/lustre.spec to lustre.spec for b1_6
647 [ -f lustre.spec ] && lustre_spec=lustre.spec
648 [ -f build/lustre.spec ] && lustre_spec=build/lustre.spec
650 [ -f "$lustre_spec" ] && sed \
651 -e "s^Release: .*$^Release: $LUSTRE_EXTRA_VERSION^" \
655 local rpmbuildopt='-bb'
658 echo NORPM mode. Only compiling.
662 rpmbuildopt="$rpmbuildopt --define \"lustre_name lustre-client\""
665 $RPMBUILD $targets $rpmbuildopt ../lustre.spec \
666 --define "_tmppath $TMPDIR" \
667 --define "_topdir $TOPDIR" || \
668 fatal 1 "Error building rpms for $BUILD_ARCHS."
671 ( $(skeep_ldiskfs_rpm $TAG) ) && return
673 pushd lustre/ldiskfs || return 255
675 if [ "$?" != "0" ]; then
679 cp lustre-ldiskfs*.tar.gz $TOPDIR/SOURCES
683 local ldiskfs_spec=lustre-ldiskfs.spec
684 [ -f "$ldiskfs_spec" ] && sed \
685 -e "s^Release: .*$^Release: $LUSTRE_EXTRA_VERSION^" \
687 > ../lustre-ldiskfs.spec
689 $RPMBUILD $targets $rpmbuildopt ../lustre-ldiskfs.spec \
690 --define "_tmppath /var/tmp" \
691 --define "_topdir $TOPDIR"
692 if [ "$?" != "0" ]; then
698 $RPMBUILD -bs ../lustre-ldiskfs.spec \
699 --define "_tmppath /var/tmp" \
700 --define "_topdir $TOPDIR"
701 if [ "$?" != "0" ]; then
712 [ "$STAGEDIR" ] || return 0
714 for arch in $BUILD_ARCHS; do
715 rpmdir="${STAGEDIR}/${CANONICAL_TARGET}-${arch}"
716 echo "${0##*/}: Copying RPMs into ${rpmdir}"
718 cp -v RPMS/${arch}/*.rpm "${rpmdir}"
719 if [ -d RPMS/noarch ]; then
720 cp -v RPMS/noarch/*.rpm "${rpmdir}"
724 cp -v "$LUSTRE" "$STAGEDIR"
727 #check if we need to build separate ldiskfs RPM
728 skeep_ldiskfs_rpm() {
733 if ! $LDISKFSRPM; then
735 elif $PATCHLESS; then
738 for skiptag in $SKIPLDISKFSRPM; do
739 [[ $tag == $skiptag ]] && skip=true && break
746 #generate LUSTRE_EXTRA_VERSION from EXTRA_VERSION
747 gen_lustre_version() {
749 LUSTRE_EXTRA_VERSION="${lnxmaj}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}${TARGET_DELIMITER}${RPMSMPTYPE:-${KERNCONFSMPTYPE:-"smp"}}"
750 LUSTRE_EXTRA_VERSION=${LUSTRE_EXTRA_VERSION//-/_}
756 local infact_arch="${TARGET_ARCH}"
759 [ "$infact_arch" == "i586" ] && infact_arch="i686"
762 for smp_type in $SMP_ARCHS; do
763 [ $infact_arch == $smp_type ] && RPMSMPTYPE=smp && break
766 for smp_type in $BIGSMP_ARCHS; do
767 [ $infact_arch == $smp_type ] && RPMSMPTYPE=bigsmp && break
772 # This function takes a linux source pool and digs out the linux release
774 find_linux_release() {
777 local LINUXRELEASEHEADER=$SRCDIR/include/linux/version.h
778 if [ -s $SRCDIR/include/linux/utsrelease.h ]; then
779 LINUXRELEASEHEADER=$SRCDIR/include/linux/utsrelease.h
782 sed -ne 's/#define UTS_RELEASE "\(.*\)"$/\1/p' $LINUXRELEASEHEADER
788 local delimiter=${2:-"-"}
790 local pathtorpms="${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
791 [ -d $pathtorpms ] || return 255
793 local kernelbinaryrpm rpmfile
794 local wanted_kernel="${lnxmaj}${delimiter}${lnxrel}"
797 for arch in $TARGET_ARCHS_ALL; do
798 local found_rpm="" rpm
799 for rpm in ${pathtorpms}/${arch}/*.rpm; do
800 if rpm -q --provides -p "$rpm" | grep -q "kernel${prefix} = $wanted_kernel"; then
806 [ -f "$found_rpm" ] && TARGET_ARCH="$arch" && BUILD_ARCHS="$arch" && break
814 #unpack kernel(/source/devel) RPM
816 # This function and it's setting of $LINUX and $LINUXOBJ is a total hack that
817 # needs to completely refactored. It completely ingores that $BUILD_ARCHS may
818 # contain a list of arches for which rpmbuild commands (including the one for
821 local kernelrpm="${1}"
822 local delimiter=${2:-"-"}
824 [ -f "$kernelrpm" ] || return 255
825 [ -d $TOPDIR/reused ] || mkdir $TOPDIR/reused
827 pushd $TOPDIR/reused || return 255
831 rpm2cpio < "$kernelrpm" | cpio -id > /dev/null 2>&1
832 if [ ${PIPESTATUS[0]} -eq 0 ]; then
833 # RHEL-style and SLES-style rpms
834 local paths="kernels/${lnxmaj}${delimiter}${lnxrel}-${TARGET_ARCH} linux-${lnxmaj}${delimiter}${lnxrel}"
837 for path in $paths; do
840 if [ -d "$src/$path/" ]; then
841 LINUX="$(pwd)/$src/$path"
843 # SLES has a separate -obj tree
844 if [ -d "$src/${path}-obj" ]; then
845 local src="$src/${path}-obj"
846 local objects="$TARGET_ARCH/$RPMSMPTYPE"
848 # Novell, are you *TRYING* to make life hard for me?
849 if [ -d "$src/powerpc" ]; then
850 objects="powerpc/$TARGET_ARCH"
851 elif [ $TARGET_ARCH == 'i686' ]; then
852 objects="i386/$RPMSMPTYPE"
855 LINUXOBJ="$(pwd)/$src/$objects"
858 if [ -z "$LINUX" ]; then
861 # dig out the release version
862 LINUXRELEASE=$(find_linux_release ${LINUXOBJ:-$LINUX})
863 if [ -z "$LINUXRELEASE" ]; then
864 echo "Failed to find linux release in ${LINUXOBJ:-$LINUX}"
876 # build kernel-ib{,-devel}
877 # some I/B drivers are architecture dependent and kernel-ib's configure
878 # does not figure it out for us ~sigh~
879 local configure_options=""
880 case "$TARGET_ARCH" in
882 configure_options="--with-ipath_inf-mod"
885 configure_options="--with-ipath_inf-mod --with-ehca-mod"
889 # ofed 1.3 had a bug in the rpm spec
890 if [ "$OFED_VERSION" = "1.3" ]; then
893 $RPMBUILD --rebuild --define 'build_kernel_ib 1' --define 'build_kernel_ib_devel 1' \
894 --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
895 --define "KVERSION ${LINUXRELEASE}" \
896 --define "$K_SRC ${LINUXOBJ:-${LINUX}}" \
897 --define "LIB_MOD_DIR /lib/modules/${LINUXRELEASE}/updates" \
898 --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
900 if [ ${PIPESTATUS[0]} != 0 ]; then
901 fatal 1 "Error building kernel-ib"
904 pushd "$TOPDIR" >/dev/null
905 rm -rf kernel-ib-devel
906 mkdir kernel-ib-devel
908 local rpm=$(ls $TOPDIR/RPMS/*/kernel-ib-devel-${OFED_VERSION}-${LINUXRELEASE//-/_}.*.rpm)
909 rpm2cpio -itv < $rpm | cpio -id
910 CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/ofa_kernel ${CONFIGURE_FLAGS}"
926 location="$location"/"$signature"/"$module"
928 ## use eval/echo here to make sure shell expansions are performed
929 #if ! cp -a${linkflag} $(eval echo $articles) "$location"; then
931 for article in $(eval echo $articles); do
932 if ! cp -a${linkflag} "$article" "$location"; then
933 error "Failed to copy \"$article\" to \"$location\" in store_for_reuse()"
945 local use_links="${3:-false}"
948 if [ -n "$REUSEBUILD" ] && [ -d $REUSEBUILD/$signature/$module ]; then
949 # so that we know how stale this entry is
950 touch $REUSEBUILD/$signature/$module/.lastused
952 if ls $REUSEBUILD/$signature/$module/* >/dev/null 2>&1; then
953 cp -al $REUSEBUILD/$signature/$module/* $dest/
956 # copying is pretty heavy
957 # cp -a $REUSEBUILD/$signature/$module/* $dest/
958 # do some creative symlinking instead
960 for dir in BUILD SRPMS SPECS; do
961 if ls $REUSEBUILD/$signature/$module/$dir/* >/dev/null 2>&1; then
962 ln -s $REUSEBUILD/$signature/$module/$dir/* $dest/$dir
965 # sources have to be copied by file because we need SOURCES to
966 # be a dir we can write into
967 # could overrun ls's arg list here
968 #ls $REUSEBUILD/$signature/$module/SOURCES/* |
969 find $REUSEBUILD/$signature/$module/SOURCES/ -type f |
970 xargs ln -t $dest/SOURCES -s
972 # same for RPMS/* dirs
973 # could overrun ls's arg list here
974 #ls $REUSEBUILD/$signature/$module/RPMS/$TARGET_ARCH/* |
976 for dir in $REUSEBUILD/$signature/$module/RPMS/*; do
977 mkdir -p $dest/RPMS/${dir##*/}
979 xargs ln -t $dest/RPMS/${dir##*/} -s
992 if [[ $arch = i[3456]86 ]]; then
1000 build_kernel_with_srpm() {
1002 # need to generate the patch for this target
1003 do_patch_linux false >&2 # sets global $FULL_PATCH (yeah, yuck)
1005 # get an md5sum of the kernel patch + config for reuse check
1006 # XXX really, there needs to be a signature and a CONFIG_FILE per arch
1008 local REUSE_SIGNATURE=$(cat $CONFIG_FILE $TARGET_FILE $FULL_PATCH | md5sum | cut -d" " -f1)
1010 # see if we can link to the reuse pool
1011 # XXX - hrm. i'm not convinced this doesn't belong in the reuse "library"
1012 local CAN_LINK_FOR_REUSE=false
1013 touch $REUSEBUILD/$$
1014 if cp -al $REUSEBUILD/$$ $TOPDIR/; then
1015 CAN_LINK_FOR_REUSE=true
1019 # the extra version string to use for the kernel (which might be a reused
1021 local kernel_extra_version=""
1022 if $REUSERPM && reuse kernel "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1023 "$REUSE_SIGNATURE"; then
1024 # figure out the EXTRA_VERSION of the kernel we are re-using
1025 kernel_extra_version=$(ls $TOPDIR/RPMS/$TARGET_ARCH/kernel-lustre-*${lnxmaj}${EXTRA_VERSION_DELIMITER}${PRISTINE_EXTRA_VERSION}.*.$TARGET_ARCH.rpm)
1026 kernel_extra_version=${kernel_extra_version##*kernel-lustre-*${lnxmaj}${EXTRA_VERSION_DELIMITER}}
1027 kernel_extra_version=${kernel_extra_version%%.$TARGET_ARCH.rpm}
1029 # nothing cached, build from scratch
1030 if [ ! -r "$KERNELDIR/$KERNEL_SRPM" ]; then
1031 download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM"
1034 rpm -ivh $KERNELDIR/$KERNEL_SRPM --define "_topdir $TOPDIR" >&2 || {
1035 # should we clean this up or leave it for analysis?
1037 fatal 1 "Error installing kernel SRPM."
1040 # put the Lustre kernel patch into the RPM build tree
1041 cp $FULL_PATCH $TOPDIR/SOURCES/linux-${lnxmaj}-lustre.patch
1042 prepare_and_build_srpm
1044 # store the resulting kernel RPM build tree for future use
1045 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
1046 "kernel" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1047 "$CAN_LINK_FOR_REUSE"; then
1048 error "Failed to store kernel RPMS for reuse"
1052 kernel_extra_version=$EXTRA_VERSION
1055 # should now have the following RPMs
1056 # $TOPDIR/RPMS/$arch/kernel-lustre-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1057 # $TOPDIR/RPMS/$arch/kernel-lustre-devel-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1058 # $TOPDIR/RPMS/$arch/kernel-lustre-headers-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1059 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-common-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1060 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1062 echo $kernel_extra_version
1069 if ! $PATCHLESS; then
1070 local kernel_extra_version
1071 if ! kernel_extra_version=$(build_kernel_with_srpm); then
1072 fatal 1 "Failed to build the kernel from it's SRPM"
1074 #local kernel_extra_version="60-0.33_lustre.1.8.0.50.20090311172757"
1076 for arch in $BUILD_ARCHS; do
1078 local kernel_devel_rpm="$TOPDIR/RPMS/$arch/$(devel_kernel_name true)-$lnxmaj$EXTRA_VERSION_DELIMITER$kernel_extra_version.$arch.rpm"
1080 # install the -devel RPM in preparation for the lustre build
1081 if ! lnxrel="$kernel_extra_version" unpack_linux_rpm \
1082 $kernel_devel_rpm $EXTRA_VERSION_DELIMITER; then
1083 fatal 1 "Could not find the Linux tree in $kernel_devel_rpm"
1086 # XXX - superhack of all superhacks! kernel-lustre-devel doesn't
1087 # have have sources in it, so we need to pull them out of
1090 cp BUILD/kernel-lustre-${lnxmaj}/linux-${lnxmaj}.$arch/fs/ext3/*.[ch] \
1091 $TOPDIR/reused/usr/src/kernels/${lnxmaj}${EXTRA_VERSION_DELIMITER}${kernel_extra_version}-${arch}/fs/ext3
1094 # need to find and unpack the vendor's own kernel-devel for patchless
1097 if ! kernelrpm=$(find_linux_rpm "-$DEVEL_KERNEL_TYPE" ${EXTRA_VERSION_DELIMITER:-"-"}); then
1098 fatal 1 "Could not find the kernel-$DEVEL_KERNEL_TYPE RPM in ${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
1100 if ! lnxrel="$lnxrel" unpack_linux_rpm "$kernelrpm" \
1101 "${EXTRA_VERSION_DELIMITER:--}"; then
1102 fatal 1 "Could not find the Linux tree in $kernelrpm"
1106 # before lustre, build kernel-ib
1107 if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
1108 # see if we can link to the reuse pool
1109 # XXX - hrm. i'm not convinced this doesn't belong in the reuse "library"
1110 local CAN_LINK_FOR_REUSE=false
1111 touch $REUSEBUILD/$$
1112 if cp -al $REUSEBUILD/$$ $TOPDIR/; then
1113 CAN_LINK_FOR_REUSE=true
1117 local REUSE_SIGNATURE=$({ echo "$OFED_VERSION"; echo "$(find_linux_release ${LINUXOBJ:-$LINUX})"; cat "${LINUXOBJ:-${LINUX}}/include/linux/autoconf.h"; } | md5sum | cut -d" " -f1)
1118 if ! reuse ofed "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1119 "$REUSE_SIGNATURE"; then
1120 # stash away the existing built articles for a moment
1122 mv {BUILD,{S,}RPMS,S{OURCE,PEC}S} bak
1125 find . | cpio -pudlm ..
1129 create_rpmbuild_dirs
1132 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
1133 "ofed" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1134 "$CAN_LINK_FOR_REUSE"; then
1135 error "Failed to store OFED RPMS for reuse"
1139 # put the stuff we stashed away back
1145 if build_lustre; then
1146 # the build worked. resolve any symlinked files (i.e. from reuse)
1147 # in RPMS/$arch to real files so that that that huge mess of
1148 # complication knows as LTS can copy them yet somewhere else.
1149 # is it any wonder this whole process is so damn so? anyone ever
1150 # heard of hardlinks? it this cool new thing that allows you save
1151 # tons of time and space by creating... well you can go read about
1152 # them if you have not heard about them yet.
1153 # can i say how much the implemenation of all of this really impedes
1155 pushd RPMS/$TARGET_ARCH
1157 if [ -h $file ]; then
1166 create_rpmbuild_dirs() {
1168 if [ ! -d RPMS ]; then
1170 for arch in $BUILD_ARCHS; do
1174 [ -d BUILD ] || mkdir BUILD
1175 [ -d SOURCES ] || mkdir SOURCES
1176 [ -d SPECS ] || mkdir SPECS
1177 [ -d SRPMS ] || mkdir SRPMS
1199 [[ $list\ == *\ $item\ * ]]
1203 #########################################################################
1204 # Generate a backtrace through the call stack.
1208 #########################################################################
1212 local funcname="" sourcefile="" lineno="" n
1214 echo "Call stack: (most recent first)"
1215 for (( n = $strip ; n < ${#FUNCNAME[@]} ; ++n )) ; do
1216 funcname=${FUNCNAME[$n - 1]}
1217 sourcefile=$(basename ${BASH_SOURCE[$n]})
1218 lineno=${BASH_LINENO[$n - 1]}
1219 # Display function arguments
1220 if [[ ! -z "${BASH_ARGV[@]}" ]]; then
1221 local args newarg j p=0
1222 for (( j = ${BASH_ARGC[$n - 1]}; j > 0; j-- )); do
1223 newarg=${BASH_ARGV[$j + $p - 1]}
1224 args="${args:+${args} }'${newarg}'"
1226 let p+=${BASH_ARGC[$n - 1]}
1228 echo " ${funcname} ${args:+${args} }at ${sourcefile}:${lineno}"
1232 echo "BEGIN BACKTRACE"
1234 #echo ${BASH_LINENO[*]}
1235 #echo ${BASH_SOURCE[*]}
1236 #echo ${FUNCNAME[*]}
1237 local i=$((${#FUNCNAME[@]} - 1))
1238 while [ $i -ge 0 ]; do
1239 local SOURCELINE="${BASH_SOURCE[$i + 1]}:${BASH_LINENO[$i]}"
1240 # Can't figure out how to get function args from other frames...
1241 local FUNCTION="${FUNCNAME[$i]}()"
1242 echo "$SOURCELINE:$FUNCTION"
1246 echo "END BACKTRACE"
1252 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
1254 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 -- "$@")
1256 if [ $? != 0 ]; then
1260 eval set -- "$options"
1295 if ! KERNELTREE=$(canon_path "$2"); then
1296 fatal 1 "Could not determine the canonical location of $2"
1300 --linux | --with-linux)
1301 if ! LINUX=$(canon_path "$2"); then
1302 fatal 1 "Could not determine the canonical location of $2"
1315 if ! REUSEBUILD=$(canon_path "$2"); then
1316 fatal 1 "Could not determine the canonical location of $2"
1333 if ! KERNELRPMSBASE=$(canon_path "$2"); then
1334 fatal 1 "Could not determine the canonical location of $2"
1381 --disable-datestamp)
1392 CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-liblustre --enable-liblustre-tests"
1396 usage 1 "Unrecognized option: $1"
1406 EXTRA_VERSION_DELIMITER=${EXTRA_VERSION_DELIMITER:-"-"}
1408 if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
1413 # make sure the RPM build environment is set up
1414 create_rpmbuild_dirs
1416 trap '[ -n "$CCACHE" ] && ccache -s' EXIT
1418 # if an unpacked kernel source tree was given on the command line
1419 # just build lustre with it (nothing distro kernel specific here)
1420 if [ -n "$LINUX" ]; then
1423 if [ -f "${0%/*}/lbuild-$DISTRO" ]; then
1424 seen_list=$(new_list)
1425 trap '(echo "Untrapped error"
1427 # have we seen this one
1428 echo "checking seen list for ${BASH_SOURCE[0]}:${BASH_LINENO[0]}"
1430 if is_list_member "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}"; then
1431 echo "seen this one already"
1433 seen_list=$(add_list "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}")
1439 ) | tee >(mail -s "Untrapped error in lbuild on $MACHINENAME" brian@sun.com) >&2' ERR
1442 source ${0%/*}/lbuild-$DISTRO
1444 build_with_srpm || fatal 1 "Failed to build_with_srpm"
1446 source ${0%/*}/lbuild.old_school
1448 old_school_download_kernel
1452 patchless_build_sequence && build_success=true
1454 [ "$DISTRO" = "sles9" ] && build_sequence_rpm_reuse && build_success=true
1455 if ! $build_success; then
1456 build_sequence_reuse && build_success=true
1457 if ! $build_success; then
1458 build_sequence && build_success=true
1459 if $build_success; then
1460 store_for_reuse || echo "Cannot store for future reuse"
1465 ( $build_success ) || fatal 1 "Cannot build lustre"