# search through this file (and lbuild.old_school -- but that will
# be going away soon) for "-bb" and see how many places
# simply don't account for this option
-DO_SRC=false
+DO_SRC=true
DOWNLOAD=true
TAG=
CANONICAL_TARGET=
LDISKFSRPM=true
SKIPLDISKFSRPM="v1_4_* b1_4"
SMPTYPES="smp bigsmp default ''"
-KERNCONFSMPTYPE=
PATCHLESS=false
XEN=false
LINUXOBJ=
DISTRO=
KERNELTREE=
+# default to not adding -lustre- into the kernel RPM package names
+KERNEL_LUSTRE_NAMING=false
# patchless build
KERNELRPMSBASE=
2.6-sles10)
CANONICAL_TARGET="sles10-2.6"
;;
+ 2.6-sles11)
+ CANONICAL_TARGET="sles11"
+ ;;
+ 2.6-oel5)
+ CANONICAL_TARGET="oel5"
+ ;;
hp_pnnl-2.4)
CANONICAL_TARGET="hp-pnnl-2.4"
;;
download_srpm() {
local target=$1
local srpm=$2
+ local force="${3:-false}"
- # ~sigh~ the download site doesn't actually have these kernels
- echo "Downloading http://downloads.lustre.org/public/kernels/$target/old/$srpm..."
- if ! wget -nv "http://downloads.lustre.org/public/kernels/$target/old/$srpm" \
- -O "$KERNELDIR/$srpm"; then
- fatal 1 "Could not download target $target's kernel SRPM $srpm from downloads.lustre.org."
+ if $force || [ ! -r "$KERNELDIR/$srpm" ] ||
+ [ ! -s "$KERNELDIR/$srpm" ]; then
+ if $DOWNLOAD; then
+ local location="http://downloads.lustre.org/public/kernels/$target/old"
+ echo "Downloading $location/$srpm..."
+ if ! wget -nv "$location/$srpm" -O "$KERNELDIR/$srpm" ||
+ [ ! -s "$KERNELDIR/$srpm" ]; then
+ rm -f $KERNELDIR/$srpm
+ fatal 1 "Could not download target $target's kernel SRPM" \
+ "$srpm from $location."
+ fi
+ else
+ fatal 1 "$srpm not found in directory $KERNELDIR."
+ fi
fi
- [ -s "$KERNELDIR/$srpm" ] || {
- rm -rf $KERNELDIR/$srpm
- fatal 1 "Could not download target $target's kernel SRPM $srpm from downloads.lustre.org."
- }
}
download_ofed() {
+ local force="${1:-false}"
- if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ] && \
- [ ! -r "$KERNELTREE/OFED-${OFED_VERSION}.tgz" ]; then
+ if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ] &&
+ ( $force || [ ! -r "$KERNELTREE/OFED-${OFED_VERSION}.tgz" ] ||
+ [ ! -s "$KERNELTREE/OFED-${OFED_VERSION}.tgz" ] ); then
if $DOWNLOAD; then
local location="http://downloads.lustre.org/public/OFED/"
echo "Downloading $location/OFED-${OFED_VERSION}.tgz..."
if ! wget -nv "$location/OFED-${OFED_VERSION}.tgz" \
- -O "$KERNELTREE/OFED-${OFED_VERSION}.tgz"; then
+ -O "$KERNELTREE/OFED-${OFED_VERSION}.tgz" ||
+ [ ! -s "$KERNELTREE/OFED-${OFED_VERSION}.tgz" ]; then
+ rm -f $KERNELTREE/OFED-${OFED_VERSION}.tgz
fatal 1 "Could not download OFED-${OFED_VERSION}.tgz" \
"from downloads.lustre.org."
fi
if $XEN; then
XENPOSTFIX="-xen"
fi
+
if [ -f $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET-$TARGET_ARCH.config ]; then
- CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET$XENPOSTFIX-$TARGET_ARCH.config"
+ CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET$XENPOSTFIX-$TARGET_ARCH${RPMSMPTYPE:+-}${RPMSMPTYPE}.config"
fi
- # figure out our smp kernel type and set the .config if we have one
- local smptype
- for smptype in $SMPTYPES; do
- [ "$smptype" = "''" ] && smptype=
- if [ -f $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET-$TARGET_ARCH-${smptype}.config ]; then
- CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET$XENPOSTFIX-$TARGET_ARCH-${smptype}.config"
- KERNCONFSMPTYPE=$smptype
- fi
- done
-
local lnxrelnew=${lnxrel//-/_}
# remember the EXTRA_VERSION before we diddle it here
unpack_ofed() {
- untar "$KERNELTREE/OFED-${OFED_VERSION}.tgz" || fatal 1 "Error unpacking OFED tarball"
+ if ! untar "$KERNELTREE/OFED-${OFED_VERSION}.tgz"; then
+ return 1
+ fi
[ -d OFED ] || ln -sf OFED-[0-9].[0-9]* OFED
}
cp config.log $saved_config
chmod a+r $saved_config
echo "Saved config.log is at $saved_config"
+ cat /proc/mounts
+ ls -l /proc/$$
+ pwd
+ echo "config.log contents:"
+ cat config.log
popd
return 255
fi
echo NORPM mode. Only compiling.
fi
+ # convert the $PATCHLESS boolean to an empty/no-empty boolean
+ # as silly as this seems, it makes the syntax of the rpmbuild command
+ # simpler and not need an eval to deal with the quotes in the quotes
+ local is_patchless=""
+ if $PATCHLESS; then
+ is_patchless="yes"
+ fi
$RPMBUILD $targets $rpmbuildopt ../lustre.spec \
- ${PATCHLESS:+--define "lustre_name lustre-client"} \
+ ${is_patchless:+--define "lustre_name lustre-client"} \
--define "_tmppath $TMPDIR" \
--define "_topdir $TOPDIR" || \
fatal 1 "Error building rpms for $BUILD_ARCHS."
done
cp -v "$LUSTRE" "$STAGEDIR"
+
}
#check if we need to build separate ldiskfs RPM
[[ $tag == $skiptag ]] && skip=true && break
done
fi
+
+ pushd $TOPDIR/BUILD/lustre-[1-9]* >/dev/null
+ grep -q '^SERVER_TRUE[ \t]=[ \t]#$' autoMakefile && skip=true
+ popd >/dev/null
+
echo $skip
}
#generate LUSTRE_EXTRA_VERSION from EXTRA_VERSION
gen_lustre_version() {
- LUSTRE_EXTRA_VERSION="${lnxmaj}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}${TARGET_DELIMITER}${RPMSMPTYPE:-${KERNCONFSMPTYPE:-"smp"}}"
+ LUSTRE_EXTRA_VERSION="${lnxmaj}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}${TARGET_DELIMITER}${RPMSMPTYPE}"
LUSTRE_EXTRA_VERSION=${LUSTRE_EXTRA_VERSION//-/_}
}
local infact_arch="${TARGET_ARCH}"
- RPMSMPTYPE=default
+ RPMSMPTYPE=""
[ "$infact_arch" == "i586" ] && infact_arch="i686"
local smp_type
[ $infact_arch == $smp_type ] && RPMSMPTYPE=bigsmp && break
done
+ for smp_type in $DEFAULT_ARCHS; do
+ [ $infact_arch == $smp_type ] && RPMSMPTYPE=default && break
+ done
+
}
# This function takes a linux source pool and digs out the linux release
}
+# XXX this needs to be re-written as a wrapper around find_rpm
+# or just gotten rid of. :-)
find_linux_rpm() {
local prefix="$1"
local delimiter=${2:-"-"}
break
fi
done
- [ -f "$found_rpm" ] && TARGET_ARCH="$arch" && BUILD_ARCHS="$arch" && break
+ [ -f "$found_rpm" ] && break
done
echo "$found_rpm"
}
-#unpack kernel(/source/devel) RPM
+# unpack kernel(/source/devel) RPM
#
# This function and it's setting of $LINUX and $LINUXOBJ is a total hack that
# needs to completely refactored. It completely ingores that $BUILD_ARCHS may
# contain a list of arches for which rpmbuild commands (including the one for
# lustre itself)
-unpack_linux_rpm() {
+unpack_linux_devel_rpm() {
local kernelrpm="${1}"
+ # it's worth noting that neither sles10 nor rhel5 appear to use their
+ # extra_version delimiter for the dirname under /usr/src, so we could
+ # probably just get rid of this parameter
local delimiter=${2:-"-"}
[ -f "$kernelrpm" ] || return 255
- [ -d $TOPDIR/reused ] || mkdir $TOPDIR/reused
+ [ -d $TOPDIR/reused ] || mkdir $TOPDIR/reused || return 255
pushd $TOPDIR/reused || return 255
+ if ! rpm2cpio < "$kernelrpm" | cpio -id > /dev/null 2>&1; then
+ return 255
+ fi
+
+ # call a distro specific hook, if available
+ if type -p unpack_linux_devel_rpm-$DISTRO; then
+ unpack_linux_devel_rpm-$DISTRO "$kernelrpm"
+ fi
+
+ popd
+
+ find_linux_devel_paths $TOPDIR/reused
+
+ return 0
+
+}
+
+# XXX - this rhel/sles goop needs abstracting out into the
+# lbuild-{rhel5,sles10} method files
+find_linux_devel_paths() {
+ local path="$1"
+
local RC=0
- rpm2cpio < "$kernelrpm" | cpio -id > /dev/null 2>&1
- if [ ${PIPESTATUS[0]} -eq 0 ]; then
+ pushd $path
# RHEL-style and SLES-style rpms
- local paths="kernels/${lnxmaj}${delimiter}${lnxrel}-${TARGET_ARCH} linux-${lnxmaj}${delimiter}${lnxrel}"
+ # XXX - until bug 19336 cleans this up, we need to extricate the
+ # ${lnxmin}- from the $lnxrel
+ local paths="kernels/${lnxmaj}${lnxmin}${delimiter}${lnxrel}-${TARGET_ARCH} linux-${lnxmaj}${lnxmin}${delimiter}${lnxrel##${lnxmin#.}-}"
local path
for path in $paths; do
RC=255
fi
fi
- else
- RC=255
- fi
popd
return $RC
}
--define "KVERSION ${LINUXRELEASE}" \
--define "$K_SRC ${LINUXOBJ:-${LINUX}}" \
--define "LIB_MOD_DIR /lib/modules/${LINUXRELEASE}/updates" \
- --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
+ --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-mlx4_en-mod --with-cxgb3-mod --with-nes-mod --with-ipoib-mod --with-sdp-mod --with-srp-mod --with-rds-mod --with-iser-mod --with-qlgc_vnic-mod --with-madeye-mod $configure_options" ${TOPDIR}/OFED/SRPMS/ofa_kernel-*.src.rpm
if [ ${PIPESTATUS[0]} != 0 ]; then
fatal 1 "Error building kernel-ib"
fi
- pushd "$TOPDIR" >/dev/null
- rm -rf kernel-ib-devel
- mkdir kernel-ib-devel
- cd kernel-ib-devel
- local rpm=$(ls $TOPDIR/RPMS/*/kernel-ib-devel-${OFED_VERSION}-${LINUXRELEASE//-/_}.*.rpm)
- rpm2cpio -itv < $rpm | cpio -id
- CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/ofa_kernel ${CONFIGURE_FLAGS}"
- popd >/dev/null
}
store_for_reuse() {
location="$location"/"$signature"/"$module"
mkdir -p "$location"
+ # the cleanup script removes any directory that doesn't have a
+ # .lastused, so let's try to prevent that as soon as we can
+ # this solution still slightly racy with the cleanup script
+ # but the race is a lot tighter now
+ touch -t 197001010000 "$location/.lastused"
## use eval/echo here to make sure shell expansions are performed
#if ! cp -a${linkflag} $(eval echo $articles) "$location"; then
local article
for article in $(eval echo $articles); do
if ! cp -a${linkflag} "$article" "$location"; then
error "Failed to copy \"$article\" to \"$location\" in store_for_reuse()"
+ # rename the cache location so that it's not cached
+ # product, but is around for analysis
+ mv "$location"{,-bad-$(date +%s)} ||
+ error "failed to clean up a failed cache attempt" \
+ "in \"$location\" -- manual cleanup will be" \
+ "necessary"
return 1
fi
done
+ # flag the cache as complete (i.e. in case lbuild was previously
+ # interrupted while caching)
+ touch "$location/.lastused"
+
return 0
}
local use_links="${3:-false}"
local signature="$4"
- if [ -n "$REUSEBUILD" ] && [ -d $REUSEBUILD/$signature/$module ]; then
+ if [ -n "$REUSEBUILD" ] && [ -d "$REUSEBUILD/$signature/$module" ]; then
+ if [ ! -f "$REUSEBUILD/$signature/$module/.lastused" ]; then
+ # the .lastused flag is populated at the end of the caching to
+ # signal that the caching was completeld. if that flag is not
+ # there, then the cache is invalid (and should be removed in fact)
+ mv "$REUSEBUILD/$signature/$module"{,-bad-$(date +%s)} ||
+ fatal 1 "failed to clean up a bad cache in location" \
+ "\"$REUSEBUILD/$signature/$module\" -- manual cleanup" \
+ "will be necessary"
+ return 1
+ fi
+
# so that we know how stale this entry is
touch $REUSEBUILD/$signature/$module/.lastused
+
if $use_links; then
if ls $REUSEBUILD/$signature/$module/* >/dev/null 2>&1; then
cp -al $REUSEBUILD/$signature/$module/* $dest/
}
+#
+# in a given directory, find the first rpm matching given requirements
+#
+find_rpm() {
+ local dir="$1"
+ local match_type="$2"
+ local match="$3"
+
+ pushd "$dir" > /dev/null || \
+ fatal 1 "Unable to chdir to directory \"$dir\" in find_rpm()"
+
+ local file
+ for file in $(ls *.rpm); do
+ if [ ! -f "$file" ]; then
+ continue
+ fi
+ case "$match_type" in
+ provides)
+ # match is any valid ERE (i.e. given to egrep) match
+ if rpm -q --provides -p "$file" | egrep -q "$match"; then
+ echo "$file"
+ popd >/dev/null
+ return 0
+ fi
+ ;;
+ *)
+ popd >/dev/null
+ fatal 1 "Unknown match type \"$match_type\" given to find_rpm()"
+ ;;
+ esac
+ done
+
+ popd >/dev/null
+ return 1
+}
+
build_kernel_with_srpm() {
# need to generate the patch for this target
# get an md5sum of the kernel patch + config for reuse check
# XXX really, there needs to be a signature and a CONFIG_FILE per arch
# in BUILD_ARCHS
- local REUSE_SIGNATURE=$(cat $CONFIG_FILE $TARGET_FILE $FULL_PATCH | md5sum | cut -d" " -f1)
+ local REUSE_SIGNATURE=$({ echo $BUILD_GEN; cat $CONFIG_FILE $TARGET_FILE $FULL_PATCH; } | md5sum | cut -d" " -f1)
# see if we can link to the reuse pool
# XXX - hrm. i'm not convinced this doesn't belong in the reuse "library"
# the extra version string to use for the kernel (which might be a reused
# kernel, remember)
local kernel_extra_version=""
- if $REUSERPM && reuse kernel "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
- "$REUSE_SIGNATURE"; then
- # figure out the EXTRA_VERSION of the kernel we are re-using
- kernel_extra_version=$(ls $TOPDIR/RPMS/$TARGET_ARCH/kernel-lustre-*${lnxmaj}${EXTRA_VERSION_DELIMITER}${PRISTINE_EXTRA_VERSION}.*.$TARGET_ARCH.rpm)
- kernel_extra_version=${kernel_extra_version##*kernel-lustre-*${lnxmaj}${EXTRA_VERSION_DELIMITER}}
- kernel_extra_version=${kernel_extra_version%%.$TARGET_ARCH.rpm}
- else
+ if $REUSERPM && ! reuse kernel "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
+ "$REUSE_SIGNATURE"; then
# nothing cached, build from scratch
if [ ! -r "$KERNELDIR/$KERNEL_SRPM" ]; then
- download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM"
+ download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM" >&2
fi
- rpm -ivh $KERNELDIR/$KERNEL_SRPM --define "_topdir $TOPDIR" >&2 || {
- # should we clean this up or leave it for analysis?
+ if ! rpm -ivh $KERNELDIR/$KERNEL_SRPM \
+ --define "_topdir $TOPDIR" >&2; then
+ # should we clean this up or leave it for analysis?
#rm -rf $RPMTOPDIR
fatal 1 "Error installing kernel SRPM."
- }
+ fi
# put the Lustre kernel patch into the RPM build tree
cp $FULL_PATCH $TOPDIR/SOURCES/linux-${lnxmaj}-lustre.patch
- prepare_and_build_srpm
+ prepare_and_build_srpm >&2
# store the resulting kernel RPM build tree for future use
if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
echo "unknown"
return 1
fi
- kernel_extra_version=$EXTRA_VERSION
fi # build reuse
+ # figure out the EXTRA_VERSION of the kernel we built or are re-using
+ local KERNEL_RPM
+ if ! KERNEL_RPM=$(find_rpm "$TOPDIR/RPMS/$TARGET_ARCH/" provides "^kernel ="); then
+ fatal 1 "Failed to find a kernel RPM in $TOPDIR/RPMS/$TARGET_ARCH/"
+ fi
+ kernel_extra_version=$(rpm -q --queryformat "%{RELEASE}" -p $TOPDIR/RPMS/$TARGET_ARCH/$KERNEL_RPM)
+
# should now have the following RPMs
# $TOPDIR/RPMS/$arch/kernel-lustre-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
# $TOPDIR/RPMS/$arch/kernel-lustre-devel-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
if ! kernel_extra_version=$(build_kernel_with_srpm); then
fatal 1 "Failed to build the kernel from it's SRPM"
fi
-#local kernel_extra_version="60-0.33_lustre.1.8.0.50.20090311172757"
for arch in $BUILD_ARCHS; do
- local kernel_devel_rpm="$TOPDIR/RPMS/$arch/$(devel_kernel_name true)-$lnxmaj$EXTRA_VERSION_DELIMITER$kernel_extra_version.$arch.rpm"
+ local kernel_devel_rpm
+ if ! kernel_devel_rpm=$(find_rpm "$TOPDIR/RPMS/$arch/" provides "^$(devel_kernel_name $KERNEL_LUSTRE_NAMING) ="); then
+ fatal 1 "Failed to find a kernel development RPM in $TOPDIR/RPMS/$arch/"
+ fi
# install the -devel RPM in preparation for the lustre build
- if ! lnxrel="$kernel_extra_version" unpack_linux_rpm \
- $kernel_devel_rpm $EXTRA_VERSION_DELIMITER; then
- fatal 1 "Could not find the Linux tree in $kernel_devel_rpm"
+ # note that the EXTRA_VERSION_DELIMITER is *NOT* used in the
+ # version of the directory name under /usr/src
+ if ! lnxrel="$kernel_extra_version" unpack_linux_devel_rpm \
+ "$TOPDIR/RPMS/$arch/$kernel_devel_rpm" "-"; then
+ fatal 1 "Could not find the Linux tree in $TOPDIR/RPMS/$arch/$kernel_devel_rpm"
fi
-
- # XXX - superhack of all superhacks! kernel-lustre-devel doesn't
- # have have sources in it, so we need to pull them out of
- # the SRPM
- # yeah. blech.
- cp BUILD/kernel-lustre-${lnxmaj}/linux-${lnxmaj}.$arch/fs/ext3/*.[ch] \
- $TOPDIR/reused/usr/src/kernels/${lnxmaj}${EXTRA_VERSION_DELIMITER}${kernel_extra_version}-${arch}/fs/ext3
done
else
# need to find and unpack the vendor's own kernel-devel for patchless
if ! kernelrpm=$(find_linux_rpm "-$DEVEL_KERNEL_TYPE" ${EXTRA_VERSION_DELIMITER:-"-"}); then
fatal 1 "Could not find the kernel-$DEVEL_KERNEL_TYPE RPM in ${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
fi
- if ! lnxrel="$lnxrel" unpack_linux_rpm "$kernelrpm" \
- "${EXTRA_VERSION_DELIMITER:--}"; then
+ if ! lnxrel="$lnxrel" unpack_linux_devel_rpm "$kernelrpm" "-"; then
fatal 1 "Could not find the Linux tree in $kernelrpm"
fi
fi
# put the stuff we stashed away back
mv_back
fi
+
+ pushd "$TOPDIR" >/dev/null
+ rm -rf kernel-ib-devel
+ mkdir kernel-ib-devel
+ cd kernel-ib-devel
+ # the actual ofed RPMs don't have the -rc$n or -$date string appened that
+ # might be present on the file
+ local ofed_version=$(echo $OFED_VERSION |
+ sed -re 's/-(20[0-9]{6,6}-[0-9]{4,4}|rc[0-9]*)$//')
+ local rpm=$(ls $TOPDIR/RPMS/*/kernel-ib-devel-${ofed_version}-${LINUXRELEASE//-/_}.*.rpm)
+ rpm2cpio -itv < $rpm | cpio -id
+ CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/ofa_kernel ${CONFIGURE_FLAGS}"
+ popd >/dev/null
fi
# now build Lustre
fi
done
popd
+ else
+ return 1
fi
+
}
create_rpmbuild_dirs() {
- if [ ! -d RPMS ]; then
- mkdir -p RPMS
- for arch in $BUILD_ARCHS; do
- mkdir RPMS/$arch
- done
- fi
+ [ -d RPMS ] || mkdir RPMS
+ for arch in $BUILD_ARCHS; do
+ if [[ $arch = i?86 ]]; then
+ # some stupidity in the sles11 kernel spec requires an RPMS/i386
+ # even if the target arch is i686
+ [ -d RPMS/i386 ] || mkdir RPMS/i386
+ fi
+ [ -d RPMS/$arch ] || mkdir RPMS/$arch
+ done
[ -d BUILD ] || mkdir BUILD
[ -d SOURCES ] || mkdir SOURCES
[ -d SPECS ] || mkdir SPECS
if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
download_ofed
- unpack_ofed
+ unpack_ofed || fatal 1 "Error unpacking OFED tarball"
fi
# make sure the RPM build environment is set up
echo
echo "Environment:"
set
-) | tee >(mail -s "Untrapped error in lbuild on $MACHINENAME" brian@sun.com) >&2' ERR
+) | tee >(mail -s "Untrapped error at ${BASH_SOURCE[0]##*/}:${BASH_LINENO[0]} on $HOSTNAME" brian@sun.com) >&2' ERR
set -E
source ${0%/*}/lbuild-$DISTRO