Whamcloud - gitweb
b=17258 fix error with make rpms after configure --disable-tests
[fs/lustre-release.git] / build / lbuild
index e3380ba..20697bf 100755 (executable)
@@ -2,6 +2,12 @@
 
 # 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
@@ -77,6 +83,9 @@ UP_ARCHS=
 # not in the target file any more
 CONFIG=
 
+# build the lustre-tests rpm?
+LUSTRE_TESTS=true
+
 DATE=$(date)
 
 USE_DATESTAMP=1
@@ -106,7 +115,7 @@ cleanup() {
 error() {
     local msg="$1"
 
-    [ -n "$msg" ] && echo -e "\n${0##*/}: $msg" >&2
+    [ -n "$msg" ] && echo -e "\n${0##*/}: $msg" >&3
 
 }
 
@@ -328,22 +337,24 @@ check_options() {
     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
@@ -375,8 +386,7 @@ autodetect_distro() {
                   sed -e 's/^[^0-9.]*//g' | sed -e 's/[ \.].*//')
     fi
     if [ -z "$name" -o -z "$version" ]; then
-        fatal 1 "I don't know how to determine distro type/version.\n" \
-                "Either update autodetect_distro() or use the --distro argument"
+        fatal 1 "I don't know how to determine distro type/version.\nEither update autodetect_distro() or use the --distro argument"
     fi
 
     echo ${name}${version}
@@ -400,11 +410,10 @@ download_srpm() {
         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" \
-                        "$srpm from $location."
+                fatal 1 "Could not download target $target's kernel SRPM $srpm from $location."
             fi
         else
             fatal 1 "$srpm not found in directory $KERNELDIR."
@@ -504,7 +513,7 @@ download_ofed() {
         daily=${OFED_VERSION##$Mmv-}
         location="http://www.openfabrics.org/downloads/OFED/ofed-${Mmv}-daily/"
         # find the filename for the version for the date specified
-        OFED_VERSION=$(curl -s "$location" | sed -nre "/${daily}-/s/.*href=\"OFED-([0-9]+\.[0-9]+-${daily}-[0-9]{4,4}).tgz.*$/\1/p" | tail -1)
+        OFED_VERSION=$(curl -s "$location" | sed -nre "/${daily}-/s/.*href=\"OFED-(${Mmv//./\\.}-${daily}-[0-9]{4,4}).tgz.*$/\1/p" | tail -1)
         if [ -z "$OFED_VERSION" ]; then
             fatal 1 "Could not determine the filename of the OFED snapshot for ${daily}"
         fi
@@ -579,7 +588,7 @@ load_target() {
     [ -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
 
@@ -594,9 +603,7 @@ load_target() {
             for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches"; do
                 [ -r "$patchesdir/series/$series" ] && continue 2
             done
-            fatal 1 "Target $TARGET's series $SERIES could not be" \
-                    "found.\nSearched:\n\t$EXTERNAL_PATCHES/series\n" \
-                    "\t$TOPDIR/lustre/lustre/kernel_patches/series."
+            fatal 1 "Target $TARGET's series $SERIES could not be found.\nSearched:\n\t$EXTERNAL_PATCHES/series\n\t$TOPDIR/lustre/lustre/kernel_patches/series."
         done
     fi
 
@@ -619,8 +626,7 @@ load_target() {
     PRISTINE_EXTRA_VERSION=$EXTRA_VERSION
 
     if ! $PATCHLESS && [ ! -f "$CONFIG_FILE" ]; then
-        fatal 1 "Config file for target $TARGET missing from" \
-                "$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/."
+        fatal 1 "Config file for target $TARGET missing from $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/."
     fi
 
     if [ "$EXTRA_VERSION_save" ]; then
@@ -760,7 +766,7 @@ do_patch_linux() {
                     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."
                     }
@@ -797,7 +803,7 @@ build_lustre() {
         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
@@ -830,24 +836,33 @@ build_lustre() {
         echo NORPM mode. Only compiling.
     fi
 
-    # convert the $PATCHLESS boolean to an empty/no-empty boolean
+    # convert the $PATCHLESS boolean to an empty/not-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
+
+    # ditto for the lustre-tests boolean
+    local lustre_tests=""
+    if ! $LUSTRE_TESTS; then
+        lustre_tests="no"
+    fi
+
     $RPMBUILD $targets $rpmbuildopt ../lustre.spec \
         ${is_patchless:+--define "lustre_name lustre-client"} \
+        ${lustre_tests:+--define "build_lustre_tests 0"} \
+        --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
         --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
@@ -862,19 +877,17 @@ build_lustre() {
     < $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
@@ -985,7 +998,8 @@ find_linux_rpm() {
     for arch in $TARGET_ARCHS_ALL; do
         local found_rpm="" rpm
         for rpm in ${pathtorpms}/${arch}/*.rpm; do
-            if rpm -q --provides -p "$rpm" | grep -q "kernel${prefix} = $wanted_kernel"; then
+            if rpm -q --provides -p "$rpm" 2>&3 | grep -q "kernel${prefix} = $wanted_kernel" 2>&3; then
+
                 found_rpm="$rpm"
                 ret=0
                 break
@@ -1015,7 +1029,7 @@ unpack_linux_devel_rpm() {
     [ -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
@@ -1026,7 +1040,7 @@ unpack_linux_devel_rpm() {
         unpack_linux_devel_rpm-$DISTRO "$kernelrpm"
     fi
 
-    popd
+    popd &>/dev/null
 
     find_linux_devel_paths $TOPDIR/reused
 
@@ -1141,16 +1155,14 @@ EOF
     fi
 
     local linuxrelease=$(find_linux_release "$linux")
-    $RPMBUILD $BUILD_TYPE --define 'build_kernel_ib 1' --define 'build_kernel_ib_devel 1' \
-              --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
-              --define "KVERSION ${linuxrelease}" \
-              --define "$K_SRC ${linux}" \
-              --define "LIB_MOD_DIR /lib/modules/${linuxrelease}/updates" \
-              ${OFA_KERNEL_RELEASE:+--define "_release $OFA_KERNEL_RELEASE"} \
-              --define "configure_options --without-quilt $OFED_CORE $OFED_HARDWARE $OFED_ISCSI" \
-              ${SOURCE}
-
-    if [ ${PIPESTATUS[0]} != 0 ]; then
+    if ! $RPMBUILD $BUILD_TYPE --define 'build_kernel_ib 1' --define 'build_kernel_ib_devel 1' \
+                  --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
+                  --define "KVERSION ${linuxrelease}" \
+                  --define "$K_SRC ${linux}" \
+                  --define "LIB_MOD_DIR /lib/modules/${linuxrelease}/updates" \
+                  ${OFA_KERNEL_RELEASE:+--define "_release $OFA_KERNEL_RELEASE"} \
+                  --define "configure_options --without-quilt $OFED_CORE $OFED_HARDWARE $OFED_ISCSI" \
+                  ${SOURCE} 2>&1; then
         fatal 1 "Error building kernel-ib"
     fi
 
@@ -1211,9 +1223,7 @@ reuse() {
             # signal that the caching was completed.  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"
+                fatal 1 "failed to clean up a bad cache in location $REUSEBUILD/$signature/$module\" -- manual cleanup will be necessary"
             return 1
         fi
 
@@ -1288,7 +1298,7 @@ find_rpm() {
         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
+                if rpm -q --provides -p "$file" 2>&3 | egrep -q "$match"; then
                     echo "$file"
                     popd >/dev/null
                     return 0
@@ -1306,9 +1316,14 @@ find_rpm() {
 }
 
 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
@@ -1323,7 +1338,7 @@ build_kernel_with_srpm() {
     # 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/$$
@@ -1335,11 +1350,12 @@ build_kernel_with_srpm() {
                                    "$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."
@@ -1347,9 +1363,11 @@ build_kernel_with_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
@@ -1427,7 +1445,7 @@ build_mptlinux() {
                   --define "_tmppath /var/tmp" \
                   --define "_topdir ${TOPDIR}" \
                   --define "kernel_obj $linux" \
-                  ${TOPDIR}/SPECS/mptlinux.spec; then
+                  ${TOPDIR}/SPECS/mptlinux.spec 2>&1; then
         return 1
     fi
     if $DO_SRC; then
@@ -1435,7 +1453,7 @@ build_mptlinux() {
                       --define "_tmppath /var/tmp" \
                       --define "_topdir ${TOPDIR}" \
                       --define "kernel_obj $linux" \
-                      ${TOPDIR}/SPECS/mptlinux.spec; then
+                      ${TOPDIR}/SPECS/mptlinux.spec 2>&1; then
             return 1
         fi
     fi
@@ -1483,7 +1501,7 @@ build_rdac() {
                   --define "_tmppath /var/tmp" \
                   --define "_topdir ${TOPDIR}" \
                   --define "kernel_obj $linux" \
-                  ${TOPDIR}/SPECS/rdac.spec; then
+                  ${TOPDIR}/SPECS/rdac.spec 2>&1; then
         return 1
     fi
     if $DO_SRC; then
@@ -1491,7 +1509,7 @@ build_rdac() {
                       --define "_tmppath /var/tmp" \
                       --define "_topdir ${TOPDIR}" \
                       --define "kernel_obj $linux" \
-                      ${TOPDIR}/SPECS/rdac.spec; then
+                      ${TOPDIR}/SPECS/rdac.spec 2>&1; then
             return 1
         fi
     fi
@@ -1575,7 +1593,7 @@ build_with_srpm() {
 
     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
 
@@ -1741,7 +1759,7 @@ backtrace() {
 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
@@ -1761,7 +1779,7 @@ set -E
 
 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
 
-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,ofed-version:,publish,release,src,stage:,tag:,target:,target-archs:,with-linux:,xen -- "$@")
+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,ofed-version:,publish,release,set-value:,src,stage:,tag:,target:,target-archs:,with-linux:,xen -- "$@")
 
 if [ $? != 0 ]; then
     usage 1
@@ -1900,8 +1918,17 @@ while [ "$1" ]; do
             XEN=true
             shift
             ;;
+        --set-value)
+            eval $2
+            shift 2
+            ;;
         --)
             shift
+            # there are actually some lustre configure flags that we need to
+            # handle ourselves (but we still give them to configure)
+            if [[ \ $@\  == *\ --disable-tests\ * ]]; then
+                LUSTRE_TESTS=false
+            fi
             CONFIGURE_FLAGS=$@
             CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-liblustre --enable-liblustre-tests"
             break