X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=build%2Flbuild;h=20697bfc0128a14b8899913726328efaff2df90a;hp=01e122672c6e1918a79979c6e2bb8a53b745bf47;hb=116e447c76389f6eefdb818a6be5fbe475bc8dd1;hpb=22bc8ab8bbe67223ed852f841c98b69591db0283 diff --git a/build/lbuild b/build/lbuild index 01e1226..20697bf 100755 --- a/build/lbuild +++ b/build/lbuild @@ -2,9 +2,25 @@ # 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 + xtrace="-x" +fi shopt -s extdebug +# include the exit_traps library +. ${0%/lbuild}/exit_traps.sh + +# our children should die when we do +push_exit_trap "kill -INT -$$ || true" kill_children + TOPDIR=$PWD # CVSROOT is inherited from the environment @@ -67,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 @@ -96,7 +115,7 @@ cleanup() { error() { local msg="$1" - [ -n "$msg" ] && echo -e "\n${0##*/}: $msg" >&2 + [ -n "$msg" ] && echo -e "\n${0##*/}: $msg" >&3 } @@ -318,27 +337,37 @@ 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 + push_exit_trap '[ -n "$CCACHE" ] && ccache -s' "ccache_summary" + # should remove the ccache trap if lbuild is interrupted + trap 'echo "Received an INT TERM or HUP signal, terminating."; delete_exit_trap "ccache_summary"; exit 1' INT TERM HUP fi fi [ -z "$DISTRO" ] && DISTRO=$(autodetect_distro) + + return 0 + } # autodetect used Distro @@ -357,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} @@ -382,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." @@ -395,6 +422,85 @@ download_srpm() { } +download_file() { + local from="$1" + local to="$2" + local force="$3" + + local file=${from##*/} + + if [ -d $to ]; then + to="$to/$file" + fi + + local semaphore="$to-downloading" + + is_downloading() { + if [ ! -f $semaphore ]; then + return 1 + fi + + # make sure the download has not been aborted + local now=$(date +%s) + local file_mtime=$(stat -c %Y "$to") + local staleness=$((now - file_mtime)) + # let's assume an active download will write at least once a minute + if [ $staleness -gt 60 ]; then + return 1 + fi + + return 0 + } + + is_downloaded() { + # if the semaphore file exists, the file is either still downloading + # or a download was aborted and we cannot trust the target file + if [ -f $semaphore ]; then + return 1 + fi + + if ! is_downloading && [ -r "$to" ] && [ -s "$to" ]; then + return 0 + fi + + return 1 + } + + if $force || ! is_downloaded; then + if is_downloading; then + echo "Somebody else is downloading $from..." + while is_downloading; do + echo "Waiting for $to to finish downloading" + sleep 60 + done + if is_downloaded; then + return 0 + else + echo "The download we were waiting for seems to have been aborted" + fi + + fi + + if $DOWNLOAD; then + echo "Downloading $from..." + # flag others so they don't try to download also + push_exit_trap "rm -f $to $semaphore" "download" + touch $semaphore + if ! wget -nv "$from" -O "$to" || [ ! -s "$to" ]; then + # the trap will remove the files via the fatal below + fatal 1 "Could not download ${to##*/} from ${from%%/*}/." + fi + rm -f $semaphore + delete_exit_trap "download" + else + fatal 1 "${to##*/} not found in directory ${to%/*}." + fi + fi + + return 0 + +} + download_ofed() { local force="${1:-false}" @@ -407,80 +513,47 @@ 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") + 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 fi - 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 - echo "Downloading $location/OFED-${OFED_VERSION}.tgz..." - if ! wget -nv "$location/OFED-${OFED_VERSION}.tgz" \ - -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 - else - fatal 1 "OFED-${OFED_VERSION}.tgz not found in kernel" \ - "directory $KERNELTREE." - fi + if [ -z "$OFED_VERSION" -o "$OFED_VERSION" = "inkernel" ]; then + return 0 fi + local file="OFED-${OFED_VERSION}.tgz" + download_file "$location/$file" "$KERNELTREE" "$force" + } download_rdac() { local force="${1:-false}" - if [ -n "$RDAC_VERSION" -a "$RDAC_VERSION" != "inkernel" ] && - ( $force || [ ! -r "$KERNELTREE/rdac-LINUX-${RDAC_VERSION}-source.tar.gz" ] || - [ ! -s "$KERNELTREE/rdac-LINUX-${RDAC_VERSION}-source.tar.gz" ] ); then - if $DOWNLOAD; then - local location="http://downloads.lustre.org/public/RDAC/" - echo "Downloading $location/rdac-LINUX-${RDAC_VERSION}-source.tar.gz..." - if ! wget -nv "$location/rdac-LINUX-${RDAC_VERSION}-source.tar.gz" \ - -O "$KERNELTREE/rdac-LINUX-${RDAC_VERSION}-source.tar.gz" || - [ ! -s "$KERNELTREE/rdac-LINUX-${RDAC_VERSION}-source.tar.gz" ]; then - rm -f $KERNELTREE/rdac-LINUX-${RDAC_VERSION}-source.tar.gz - fatal 1 "Could not download rdac-LINUX-${RDAC_VERSION}-source.tar.gz" \ - "from downloads.lustre.org." - fi - else - fatal 1 "rdac-LINUX-${RDAC_VERSION}-source.tar.gz not found in kernel" \ - "directory $KERNELTREE." - fi + local location="http://downloads.lustre.org/public/RDAC/" + + if [ -z "$RDAC_VERSION" -o "$RDAC_VERSION" = "inkernel" ]; then + return 0 fi - return 0 + local file="rdac-LINUX-${RDAC_VERSION}-source.tar.gz" + download_file "$location/$file" "$KERNELTREE" "$force" + } download_mptlinux() { local force="${1:-false}" - if [ -n "$MPTLINUX_VERSION" -a "$MPTLINUX_VERSION" != "inkernel" ] && - ( $force || [ ! -r "$KERNELTREE/MPTLINUX_RHEL5_SLES10_PH15-${MPTLINUX_VERSION}.zip" ] || - [ ! -s "$KERNELTREE/MPTLINUX_RHEL5_SLES10_PH15-${MPTLINUX_VERSION}.zip" ] ); then - if $DOWNLOAD; then - local location="http://downloads.lustre.org/public/MPTLINUX/" - echo "Downloading $location/MPTLINUX_RHEL5_SLES10_PH15-${MPTLINUX_VERSION}.zip..." - if ! wget -nv "$location/MPTLINUX_RHEL5_SLES10_PH15-${MPTLINUX_VERSION}.zip" \ - -O "$KERNELTREE/MPTLINUX_RHEL5_SLES10_PH15-${MPTLINUX_VERSION}.zip" || - [ ! -s "$KERNELTREE/MPTLINUX_RHEL5_SLES10_PH15-${MPTLINUX_VERSION}.zip" ]; then - rm -f $KERNELTREE/MPTLINUX_RHEL5_SLES10_PH15-${MPTLINUX_VERSION}.zip - fatal 1 "Could not download MPTLINUX_RHEL5_SLES10_PH15-${MPTLINUX_VERSION}.zip" \ - "from downloads.lustre.org." - fi - else - fatal 1 "MPTLINUX_RHEL5_SLES10_PH15-${MPTLINUX_VERSION}.zip not found in kernel" \ - "directory $KERNELTREE." - fi + local location="http://downloads.lustre.org/public/MPTLINUX/" + + if [ -z "$MPTLINUX_VERSION" -o "$MPTLINUX_VERSION" = "inkernel" ]; then + return 0 fi - return 0 + file="MPTLINUX_RHEL5_SLES10_PH15-${MPTLINUX_VERSION}.zip" + download_file "$location/$file" "$KERNELTREE" "$force" + } load_target() { @@ -515,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 @@ -530,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 @@ -555,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 @@ -696,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." } @@ -733,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 @@ -766,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 + # 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 @@ -798,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 @@ -921,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 @@ -951,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 @@ -962,7 +1040,7 @@ unpack_linux_devel_rpm() { unpack_linux_devel_rpm-$DISTRO "$kernelrpm" fi - popd + popd &>/dev/null find_linux_devel_paths $TOPDIR/reused @@ -1036,7 +1114,7 @@ build_kernel_ib() { case "$TARGET_ARCH" in ppc64) OFED_HARDWARE="$OFED_HARDWARE --with-ehca-mod" - ;; + ;; esac # we're no longer shipping the OFED iSCSI #OFED_ISCSI="--with-srp-mod --with-srp-target-mod" @@ -1046,17 +1124,45 @@ build_kernel_ib() { # OFED_ISCSI="$OFED_ISCSI --with-iser-mod" #fi + # assume we are just rebuilding the SRPM + local BUILD_TYPE=${BUILD_TYPE:-"--rebuild"} + local SOURCE="${TOPDIR}/OFED/SRPMS/ofa_kernel-*.src.rpm" + + # but switch to building from the SPEC if we need to apply patches + if ls ${TOPDIR}/lustre/build/patches/ofed/* >/dev/null; then + BUILD_TYPE="-bb" + rpm --define "_topdir ${TOPDIR}" -ivh $SOURCE + SOURCE="${TOPDIR}/SPECS/ofa_kernel.spec" + local file ed_fragment1 ed_fragment2 n=1 + for file in ${TOPDIR}/lustre/build/patches/ofed/*; do + ed_fragment1="$ed_fragment1 +Patch$n: ${file%%*/}" + ed_fragment2="$ed_fragment2 +%patch$n -p0" + cp $file ${TOPDIR}/SOURCES + let n=$n+1 + done + + ed $SOURCE <&1; then fatal 1 "Error building kernel-ib" fi @@ -1089,7 +1195,7 @@ store_for_reuse() { 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)} || + mv "$location"{,-bad-$(date +%s)} || error "failed to clean up a failed cache attempt" \ "in \"$location\" -- manual cleanup will be" \ "necessary" @@ -1115,11 +1221,9 @@ reuse() { if [ ! -f "$REUSEBUILD/$signature/$module/.lastused" ]; then # the .lastused flag is populated at the end of the caching to # 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" + # 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 @@ -1156,7 +1260,7 @@ reuse() { find $dir -type f | xargs ln -t $dest/RPMS/${dir##*/} -s done - + fi return 0 else @@ -1194,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 @@ -1212,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 @@ -1229,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/$$ @@ -1241,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." @@ -1253,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 @@ -1301,7 +1413,7 @@ build_mptlinux() { if $NORPM; then rpmbuildopt='-bc' echo NORPM mode. Only compiling. - fi + fi # if only we could just rebuild the src.rpm. but the included spec # is a real pig's breakfast. just check out the patch we need to @@ -1333,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 @@ -1341,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 @@ -1389,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 @@ -1397,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 @@ -1437,43 +1549,43 @@ build_ofed() { cat "${linux}/include/linux/autoconf.h"; } | md5sum | cut -d" " -f1) if ! $REUSERPM || ! reuse ofed "$TOPDIR" "$CAN_LINK_FOR_REUSE" \ - "$REUSE_SIGNATURE"; then - # stash away the existing built articles for a moment - mkdir bak - mv {BUILD,{S,}RPMS,S{OURCE,PEC}S} bak - function mv_back { - pushd bak - find . | cpio -pudlm .. - popd - rm -rf bak - } - create_rpmbuild_dirs - # build it + "$REUSE_SIGNATURE"; then + # stash away the existing built articles for a moment + mkdir bak + mv {BUILD,{S,}RPMS,S{OURCE,PEC}S} bak + function mv_back { + pushd bak + find . | cpio -pudlm .. + popd + rm -rf bak + } + create_rpmbuild_dirs + # build it build_kernel_ib "${linux}" - if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \ - "ofed" "$REUSEBUILD" "$REUSE_SIGNATURE" \ - "$CAN_LINK_FOR_REUSE"; then - error "Failed to store OFED RPMS for reuse" - mv_back - return 1 - fi - # put the stuff we stashed away back + if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \ + "ofed" "$REUSEBUILD" "$REUSE_SIGNATURE" \ + "$CAN_LINK_FOR_REUSE"; then + error "Failed to store OFED RPMS for reuse" mv_back + return 1 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 linuxrelease=$(find_linux_release "$linux") - 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 + 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 linuxrelease=$(find_linux_release "$linux") + 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 } @@ -1481,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 @@ -1514,8 +1626,11 @@ build_with_srpm() { build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" || fatal 1 "error building OFED" - build_rdac "${LINUXOBJ:-$LINUX}" "$RDAC_VERSION" || - fatal 1 "error building RDAC" + if ! $PATCHLESS; then + # only need RDAC for the server + build_rdac "${LINUXOBJ:-$LINUX}" "$RDAC_VERSION" || + fatal 1 "error building RDAC" + fi build_mptlinux "${LINUXOBJ:-$LINUX}" "$MPTLINUX_VERSION" || fatal 1 "error building mptlinux" @@ -1601,6 +1716,9 @@ backtrace() { funcname=${FUNCNAME[$n - 1]} sourcefile=$(basename ${BASH_SOURCE[$n]}) lineno=${BASH_LINENO[$n - 1]} + if [ $n = 1 ]; then + let lineno-=11 + fi # Display function arguments if [[ ! -z "${BASH_ARGV[@]}" ]]; then local args newarg j p=0 @@ -1621,7 +1739,11 @@ backtrace() { #echo ${FUNCNAME[*]} local i=$((${#FUNCNAME[@]} - 1)) while [ $i -ge 0 ]; do - local SOURCELINE="${BASH_SOURCE[$i + 1]}:${BASH_LINENO[$i]}" + local lineno=${BASH_LINENO[$i]} + if [ $i = 0 ]; then + let lineno-=11 + fi + local SOURCELINE="${BASH_SOURCE[$i + 1]}:${lineno}" # Can't figure out how to get function args from other frames... local FUNCTION="${FUNCNAME[$i]}()" echo "$SOURCELINE:$FUNCTION" @@ -1634,9 +1756,30 @@ 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 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 +echo "checking seen list for ${BASH_SOURCE[0]}:${BASH_LINENO[0]}" + +if is_list_member "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}"; then + echo "seen this one already" +else + seen_list=$(add_list "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}") +fi +backtrace +echo +echo "Environment:" +set +) | mail -s "Untrapped error at ${BASH_SOURCE[0]##*/}:$((LINENO-15)) on $HOSTNAME" brian@sun.com >&2; set $xtrace' ERR +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 @@ -1775,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 @@ -1815,8 +1967,6 @@ if [ -n "$RDAC_VERSION" -a "$RDAC_VERSION" != "inkernel" ]; then fatal 1 "Error copying RDAC source tarball to RPM SOURCES dir" fi -trap '[ -n "$CCACHE" ] && ccache -s' EXIT - # if an unpacked kernel source tree was given on the command line # just build lustre with it (nothing distro kernel specific here) if [ -n "$LINUX" ]; then @@ -1824,29 +1974,13 @@ if [ -n "$LINUX" ]; then fatal 1 "error building mptlinux" build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" || fatal 1 "error building OFED" - build_rdac "${LINUXOBJ:-$LINUX}" "$RDAC_VERSION" || - fatal 1 "error building RDAC" + if ! $PATCHLESS; then + build_rdac "${LINUXOBJ:-$LINUX}" "$RDAC_VERSION" || + fatal 1 "error building RDAC" + fi build_lustre "$LINUX" "$LINUXOBJ" else if [ -f "${0%/*}/lbuild-$DISTRO" ]; then - seen_list=$(new_list) - trap '(echo "Untrapped error" -echo -# have we seen this one -echo "checking seen list for ${BASH_SOURCE[0]}:${BASH_LINENO[0]}" - -if is_list_member "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}"; then - echo "seen this one already" -else - seen_list=$(add_list "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}") -fi -backtrace -echo -echo "Environment:" -set -) | 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 build_with_srpm || fatal 1 "Failed to build_with_srpm"