# vim:expandtab:shiftwidth=4:softtabstop=4:tabstop=4:
+# this is an alternative FD for stdout, to be used especially when we are
+# taking stdout from a function as it's return value. i.e. foo=$(bar)
+# this is a workaround until a version of bash where we can put xtrace
+# on a specific FD
+exec 3>&1; STDOUT=3
+
#set -x
xtrace="+x"
if [[ $SHELLOPTS = *xtrace* ]]; then
error() {
local msg="$1"
- [ -n "$msg" ] && echo -e "\n${0##*/}: $msg" >&2
+ [ -n "$msg" ] && echo -e "\n${0##*/}: $msg" >&3
}
fi
if [ -n "$CCACHE" ]; then
- which "$DISTCC" 2>/dev/null && export DISTCC RPM_BUILD_NCPUS
+ which "$DISTCC" &>/dev/null && export DISTCC RPM_BUILD_NCPUS
- if which "$CCACHE" 2>/dev/null; then
+ if which "$CCACHE" &>/dev/null; then
local ccache=$(which "$CCACHE")
local bindir="$TOPDIR/bin"
- [ -d $bindir ] || mkdir -p $bindir
- if [ -d $bindir ]; then
- rm ${bindir}/* > /dev/null 2>&1
- ln -s "$ccache" ${bindir}/ccache
- ln -s "$ccache" ${bindir}/cc
- ln -s "$ccache" ${bindir}/$CC
- export PATH=$bindir:$PATH
+ if [ ! -d $bindir ]; then
+ mkdir -p $bindir || fatal 1 "error trying to create $bindir"
+ else
+ rm ${bindir}/* > /dev/null 2>&1 || true
fi
+ ln -s "$ccache" ${bindir}/ccache
+ ln -s "$ccache" ${bindir}/cc
+ ln -s "$ccache" ${bindir}/$CC
+ export PATH=$bindir:$PATH
export CCACHE && export CC="ccache $CC"
# zero the cache so we can see how effective we are being with it
+ echo -n "ccache "
ccache -z
# get some ccache stats when we are done
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" ||
+ if ! wget -nv "$location/$srpm" -O "$KERNELDIR/$srpm" 2>&1 ||
[ ! -s "$KERNELDIR/$srpm" ]; then
rm -f $KERNELDIR/$srpm
fatal 1 "Could not download target $target's kernel SRPM" \
[ -z "$RPMSMPTYPE" ] && set_rpm_smp_type
# CC might have been overwriten in TARGET_FILE
- if [[ $CC != ccache\ * ]] && which "$CCACHE" 2>/dev/null; then
+ if [[ $CC != ccache\ * ]] && which "$CCACHE" &>/dev/null; then
export CCACHE && export CC="ccache $CC"
fi
fatal 1 "Error adding patch $patch to full patch."
}
if $do_patch; then
- patch -s -p1 < "$PATCH_FILE" || {
+ patch -s -p1 < "$PATCH_FILE" 2>&1 || {
rm -f $FULL_PATCH
fatal 1 "Error applying patch $patch."
}
confoptions="$confoptions --with-linux-obj=${linuxobj}"
fi
- ./configure $confoptions ${CONFIGURE_FLAGS}
+ ./configure $confoptions ${CONFIGURE_FLAGS} 2>&1
if [ "$?" != "0" ]; then
local saved_config="../config.log.$(date +%s)"
cp config.log $saved_config
$RPMBUILD $targets $rpmbuildopt ../lustre.spec \
${is_patchless:+--define "lustre_name lustre-client"} \
--define "_tmppath $TMPDIR" \
- --define "_topdir $TOPDIR" || \
+ --define "_topdir $TOPDIR" 2>&1 || \
fatal 1 "Error building rpms for $BUILD_ARCHS."
popd >/dev/null
( $(skeep_ldiskfs_rpm $TAG) ) && return
pushd lustre/ldiskfs || return 255
- make dist
+ make dist 2>&1
if [ "$?" != "0" ]; then
popd
return 255
< $ldiskfs_spec \
> ../lustre-ldiskfs.spec
- $RPMBUILD $targets $rpmbuildopt ../lustre-ldiskfs.spec \
+ if ! $RPMBUILD $targets $rpmbuildopt ../lustre-ldiskfs.spec \
--define "_tmppath /var/tmp" \
- --define "_topdir $TOPDIR"
- if [ "$?" != "0" ]; then
+ --define "_topdir $TOPDIR" 2>&1; then
popd
return 255
fi
if $DO_SRC; then
- $RPMBUILD -bs ../lustre-ldiskfs.spec \
+ if ! $RPMBUILD -bs ../lustre-ldiskfs.spec \
--define "_tmppath /var/tmp" \
- --define "_topdir $TOPDIR"
- if [ "$?" != "0" ]; then
+ --define "_topdir $TOPDIR" 2>&1; then
popd
return 255
fi
[ -f "$kernelrpm" ] || return 255
[ -d $TOPDIR/reused ] || mkdir $TOPDIR/reused || return 255
- pushd $TOPDIR/reused || return 255
+ pushd $TOPDIR/reused &>/dev/null || return 255
if ! rpm2cpio < "$kernelrpm" | cpio -id > /dev/null 2>&1; then
return 255
unpack_linux_devel_rpm-$DISTRO "$kernelrpm"
fi
- popd
+ popd &>/dev/null
find_linux_devel_paths $TOPDIR/reused
}
build_kernel_with_srpm() {
+ local outfd=$1
+
+ if [ -z "$outfd" ] || [ $outfd = 1 ]; then
+ fatal 1 "You must supply a file descriptor to ${FUNCNAME[0]} and it cannot be 1"
+ fi
# need to generate the patch for this target
- do_patch_linux false >&2 # sets global $FULL_PATCH (yeah, yuck)
+ do_patch_linux false >&${outfd} # sets global $FULL_PATCH (yeah, yuck)
# 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
# XXX - hrm. i'm not convinced this doesn't belong in the reuse "library"
local CAN_LINK_FOR_REUSE=false
touch $REUSEBUILD/$$
- if cp -al $REUSEBUILD/$$ $TOPDIR/; then
+ if cp -al $REUSEBUILD/$$ $TOPDIR/ 2>/dev/null; then
CAN_LINK_FOR_REUSE=true
fi
rm $REUSEBUILD/$$
"$REUSE_SIGNATURE"; then
# nothing cached, build from scratch
if [ ! -r "$KERNELDIR/$KERNEL_SRPM" ]; then
- download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM" >&2
+ echo "Downloading kernel SRPM"
+ download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM" >&${outfd}
fi
if ! rpm -ivh $KERNELDIR/$KERNEL_SRPM \
- --define "_topdir $TOPDIR" >&2; then
+ --define "_topdir $TOPDIR" >&${outfd} 2>&1; then
# should we clean this up or leave it for analysis?
#rm -rf $RPMTOPDIR
fatal 1 "Error installing kernel SRPM."
# put the Lustre kernel patch into the RPM build tree
cp $FULL_PATCH $TOPDIR/SOURCES/linux-${lnxmaj}-lustre.patch
- prepare_and_build_srpm >&2
+ prepare_and_build_srpm >&${outfd} ||
+ fatal 1 "failed to prepare_and_build_srpm"
# store the resulting kernel RPM build tree for future use
+ echo "caching the built kenel for future builds..." >&${outfd}
if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
"kernel" "$REUSEBUILD" "$REUSE_SIGNATURE" \
"$CAN_LINK_FOR_REUSE"; then
if ! $PATCHLESS; then
local kernel_extra_version
- if ! kernel_extra_version=$(build_kernel_with_srpm); then
+ if ! kernel_extra_version=$(build_kernel_with_srpm ${STDOUT}); then
fatal 1 "Failed to build the kernel from it's SRPM"
fi
seen_list=$(new_list)
trap 'set +x;
echo "An unexpected error has occurred at ${BASH_SOURCE[0]##*/}:$((LINENO-1)).
-Unfortunately the above line number in the fail may or may not be correct,
+Unfortunately the above line number in the message may or may not be correct,
but details have been send to the lbuild maintainer. Attempting to continue."; (echo "Untrapped error"
echo
# have we seen this one
-e '/find $RPM_BUILD_ROOT\/lib\/modules\/$KernelVer/a\
cp -a fs/ext3/* $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/fs/ext3 \
cp -a fs/ext4/* $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/fs/ext4' \
- SPECS/kernel-2.6.spec
+ SPECS/kernel-2.6.spec 2>&1 || \
+ fatal 1 "Error while editing SPECS/kernel-2.6.spec"
if $KERNEL_LUSTRE_NAMING; then
# these are all of the changes needed because we change the package names
Provides: kernel-debuginfo = %{KVERREL}
Obsoletes: kernel-debuginfo
' \
- SPECS/kernel-2.6.spec
+ SPECS/kernel-2.6.sp 2>&1 || \
+ fatal 1 "Error while editing SPECS/kernel-2.6.spec"ec
fi
# XXX - a building-on-Ubuntu hack
if grep -q "Ubuntu" /etc/issue; then
sed -i -e 's/^\(BuildPreReq: .*\)$/#NOU \1/g' \
-e 's/^\(BuildRequires: .*\)$/#NOU \1/g' \
- SPECS/kernel-2.6.spec
+ -e 's/sha512hmac/md5sum/g' \
+ SPECS/kernel-2.6.spec 2>&1 || \
+ fatal 1 "Error while editing SPECS/kernel-2.6.spec"
fi
# finally, work around RH bug 491775, if needed
# XXX - i wonder if we will need to do this ad-hoc patching enough to
# formalize a patching system. let's assume not for the time
# being.
- patch -s -p0 <<"EOF" || fatal 1 "Error while patching SPECS/kernel-2.6.spec"
+ patch -s -p0 <<"EOF" 2>&1 || \
+ fatal 1 "Error while patching SPECS/kernel-2.6.spec"
--- SPECS/kernel-2.6.spec.dist 2009-03-23 20:30:55.000000000 -0400
+++ SPECS/kernel-2.6.spec 2009-03-23 20:37:03.000000000 -0400
@@ -6961,6 +6961,10 @@
# now build it
if ! $RPMBUILD $rpmbuildopt $targets --with baseonly \
--define "_topdir $TOPDIR" \
- $TOPDIR/SPECS/kernel-2.6.spec >&2; then
- fatal 1 "Failed to build kernel RPM"
+ $TOPDIR/SPECS/kernel-2.6.spec 2>&1; then
+ return 1
fi
+ return 0
+
}
devel_kernel_name() {
fi
echo kernel${lustre}${lnxmaj}${lnxmin}/linux-${lnxmaj}.$arch
}
+
+find_linux_devel_paths() {
+ local path="$1"
+
+ LINUX=$path/usr/src/kernels/${lnxmaj}${lnxmin}-${lnxrel}-${TARGET_ARCH}
+ # RHEL doesn't have the -obj tree
+ LINUXOBJ=""
+ # XXX - i don't think we need this any more
+ #LINUXRELEASE=$(find_linux_release "$LINUX")
+ #if [ -z "$LINUXRELEASE" ]; then
+ # echo "Failed to find linux release in $LINUX"
+ # return 255
+ #fi
+
+ return 0
+}
-e "/flavor=\${config/a\
[ \"\$flavor\" == \"$RPMSMPTYPE\" ] || continue" \
-e "s/^\(BuildRequires: kernel-dummy\)/# \1/" \
- SOURCES/kernel-${spec}.spec
+ SOURCES/kernel-${spec}.spec || \
+ fatal 1 "Error while editing SOURCES/kernel-${spec}.spec"
if $KERNEL_LUSTRE_NAMING; then
# these are all of the changes needed because we change the package names
-e "s/^\(Provides:.*kernel-\)\(.*\)/\1lustre-\2/" \
-e "s/^\(Requires:.*kernel-\)\(.*\)/\1lustre-\2/" \
-e "s/^\(Supplements:.*kernel-\)\(.*\)/\1lustre-\2/" \
- SOURCES/kernel-${spec}.spec
+ SOURCES/kernel-${spec}.spec || \
+ fatal 1 "Error while editing SOURCES/kernel-${spec}.spec"
fi
# XXX - a building-on-Ubuntu hack
-e 's/^\(BuildRequires: .*\)$/#NOU \1/g' \
-e 's/%(\(chmod .*\))$/%(bash -c "\1")/' \
-e 's/ -a 109//' \
- SOURCES/kernel-${spec}.spec
- fi
+ SOURCES/kernel-${spec}.spec || \
+ fatal 1 "Error while editing SOURCES/kernel-${spec}.spec"
+ fi
done
}
fi
}
-
-# this is actually valid for sles10 and sles11 but let's test it on sles11 only, first
-find_linux_devel_paths() {
- local path="$1"
-
- LINUX=$path/usr/src/linux-${lnxmaj}${lnxmin}${delimiter}${lnxrel##${lnxmin#.}-}
-
- local objects=$TARGET_ARCH/$RPMSMPTYPE
- if [ -d $path/usr/src/linux-${lnxmaj}${lnxmin}${delimiter}${lnxrel##${lnxmin#.}-}-obj/powerpc ]; then
- objects="powerpc/$TARGET_ARCH"
- elif [ $TARGET_ARCH == 'i686' ]; then
- objects="i386/$RPMSMPTYPE"
- fi
-
- LINUXOBJ=$path/usr/src/linux-${lnxmaj}${lnxmin}${delimiter}${lnxrel##${lnxmin#.}-}-obj/$objects
-
- LINUXRELEASE=$(find_linux_release ${LINUXOBJ:-$LINUX})
- if [ -z "$LINUXRELEASE" ]; then
- echo "Failed to find linux release in ${LINUXOBJ:-$LINUX}"
- RC=255
- fi
-}