Whamcloud - gitweb
b=22281 refactor packaging and versioning
[fs/lustre-release.git] / build / lbuild
index cb4906a..fd97a12 100755 (executable)
@@ -21,6 +21,13 @@ shopt -s extdebug
 # our children should die when we do
 push_exit_trap "kill -INT -$$ || true" kill_children
 
+# increment this if you have made a change that should force a new kernel
+# to build built
+#BUILD_GEN=1
+#BUILD_GEN=2   # bz19952: remove -lustre tag from kernel RPM names
+#BUILD_GEN=3   # bz19975: enable the building of src.rpms by default
+BUILD_GEN=4    # bz22281: use the git hash in the kernel extra version
+
 TOPDIR=$PWD
 
 # CVSROOT is inherited from the environment
@@ -44,7 +51,6 @@ TARGET_ARCHS_ALL=$TARGET_ARCH
 CONFIGURE_FLAGS=
 EXTERNAL_PATCHES=
 EXTRA_VERSION=
-LUSTRE_EXTRA_VERSION=
 STAGEDIR=
 TMPDIR=${TMPDIR:-"/var/tmp"}
 TIMESTAMP=
@@ -237,6 +243,9 @@ Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
   --xen
     Builds a Xen domX kernel.
 
+  --set-value
+    Set's a variable to a given value.
+
 EOF
 
 #   list_targets
@@ -244,7 +253,22 @@ EOF
     fatal "$1" "$2"
 }
 
-# canonicalize a relative path
+# canonicalize a relative path to a file
+canon_filepath() {
+    local PATH="$1"
+
+    if [ ! -f "$PATH" ]; then
+        return 1
+    fi
+
+    local FILE=${PATH##*/}
+    local DIR=${PATH%/*}
+
+    echo $(canon_path "$DIR")/$FILE
+    return 0
+}
+
+# canonicalize a relative path to a dir
 canon_path() {
     local PATH="$1"
 
@@ -491,7 +515,7 @@ download_file() {
             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%%/*}/."
+                fatal 1 "Could not download ${to##*/} from ${from%/*}/."
             fi
             rm -f $semaphore
             delete_exit_trap "download"
@@ -507,10 +531,14 @@ download_file() {
 download_ofed() {
     local force="${1:-false}"
 
-    local location="http://downloads.lustre.org/public/OFED/"
+    if [ -z "$OFED_VERSION" -o "$OFED_VERSION" = "inkernel" ]; then
+        return 0
+    fi
+
+    local location="http://www.openfabrics.org/downloads/OFED/ofed-${OFED_VERSION}/"
 
-    local Mmv daily
     if [[ $OFED_VERSION = daily-* ]]; then
+        local Mmv daily
         OFED_VERSION=${OFED_VERSION/daily-/}
         Mmv=${OFED_VERSION%%-*}
         daily=${OFED_VERSION##$Mmv-}
@@ -522,43 +550,11 @@ download_ofed() {
         fi
     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}"
-
-    local location="http://downloads.lustre.org/public/RDAC/"
-
-    if [ -z "$RDAC_VERSION" -o "$RDAC_VERSION" = "inkernel" ]; then
-        return 0
-    fi
-
-    local file="rdac-LINUX-${RDAC_VERSION}-source.tar.gz"
-    download_file "$location/$file" "$KERNELTREE" "$force"
-
-}
-
-download_mptlinux() {
-    local force="${1:-false}"
-
-    local location="http://downloads.lustre.org/public/MPTLINUX/"
-
-    if [ -z "$MPTLINUX_VERSION" -o "$MPTLINUX_VERSION" = "inkernel" ]; then
-        return 0
-    fi
-
-    file="MPTLINUX_RHEL5_SLES10_PH15-${MPTLINUX_VERSION}.zip"
-    download_file "$location/$file" "$KERNELTREE" "$force"
-
-}
-
 load_target() {
 
     EXTRA_VERSION_save="$EXTRA_VERSION"
@@ -637,11 +633,12 @@ load_target() {
     elif ! $RELEASE; then
         # if there is no patch series, then this is not a lustre specific
         # kernel.  don't make it look like one
-        if [ -n "$SERIES" ]; then
-            #remove the @VERSION@ (lustre version)
-#            EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
+        if $PATCHLESS || [ -n "$SERIES" ]; then
+            EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
 #            EXTRA_VERSION="${EXTRA_VERSION}-${TAG}.${TIMESTAMP}"
-            ! ( $PATCHLESS ) && EXTRA_VERSION="${EXTRA_VERSION}.${TIMESTAMP}"
+            if ! $PATCHLESS && [ -n "$BUILDID" ]; then
+                EXTRA_VERSION="${EXTRA_VERSION}.${BUILDID}"
+            fi
         fi
     fi
     # EXTRA_VERSION=${EXTRA_VERSION//-/_}
@@ -683,10 +680,12 @@ tarflags() {
 }
 
 untar() {
-    local file="$1"
+    local tarfile="$1"
+    shift
+    local extractfile="$@"
 
-    echo "Untarring ${file##*/}..."
-    tar $(tarflags "$file") "$file"
+    echo "Untarring ${tarfile##*/}..."
+    tar $(tarflags "$tarfile") "$tarfile" $extractfile
 
 }
 
@@ -699,24 +698,6 @@ unpack_ofed() {
 
 }
 
-unpack_rdac() {
-
-    if ! untar "$KERNELTREE/rdac-LINUX-${RDAC_VERSION}-source.tar.gz"; then
-        return 1
-    fi
-    [ -d rdac-LINUX ] || ln -sf rdac-LINUX-[0-9][0-9].* rdac-LINUX
-
-}
-
-unpack_mptlinux() {
-
-    if ! unzip -p $KERNELTREE/MPTLINUX_RHEL5_SLES10_PH15-4.16.00.00-2.zip | tar xzvf - srpms-2/mptlinux-4.16.00.00-2.src.rpm; then
-        return 1
-    fi
-    mv srpms-2/mptlinux-4.16.00.00-2.src.rpm .
-
-}
-
 unpack_lustre() {
 
     if [ -z "$LUSTRE" ]; then
@@ -735,7 +716,7 @@ unpack_lustre() {
             fatal 1 "There was an error checking out Lustre/Portals/Build from CVS."
         echo "Creating lustre tarball..."
         sh autogen.sh || fatal 1 "There was an error running autogen.sh."
-        ./configure --disable-{modules,utils,liblustre,tests,doc} || \
+        ./configure --enable-dist || \
             fatal 1 "There was an error running ./configure to create makefiles."
         make dist || fatal 1 "There was an error running 'make dist'."
         LUSTRE=$PWD/lustre-*.tar.gz
@@ -798,46 +779,70 @@ build_lustre() {
         targets="--target $arch $targets"
     done
 
-    local confoptions="--with-linux=${linux}"
+    local confoptions=""
+
     if $PATCHLESS; then
-        confoptions="--with-linux=${linux} --disable-server"
-    fi
-    if [ "$linuxobj" != "" ]; then
-        confoptions="$confoptions --with-linux-obj=${linuxobj}"
+        confoptions="$confoptions --disable-server"
     fi
 
-    ./configure $confoptions ${CONFIGURE_FLAGS} 2>&1
-    if [ "$?" != "0" ]; then
-        local saved_config="../config.log.$(date +%s)"
-        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
+    local rpmbuildopt='-tb'
+    if $NORPM; then
+        rpmbuildopt='-tc'
+        echo NORPM mode. Only compiling.
     fi
 
-    gen_lustre_version
+    ( $(skeep_ldiskfs_rpm $TAG) ) || {
 
-    # hack. Somebody move build/lustre.spec to lustre.spec for b1_6
-    local lustre_spec
-    [ -f lustre.spec ] && lustre_spec=lustre.spec
-    [ -f build/lustre.spec ] && lustre_spec=build/lustre.spec
+        pushd ldiskfs > /dev/null || return 255
 
-    [ -f "$lustre_spec" ] && sed \
-        -e "s^Release: .*$^Release: $LUSTRE_EXTRA_VERSION^" \
-        < $lustre_spec \
-        > ../lustre.spec
+        if !  ./configure --enable-dist; then
+            echo "failed to configure in ldiskfs"
+            popd >/dev/null # pushd ldiskfs
+            popd >/dev/null # pushd lustre
+            return 255
+        fi
 
-    local rpmbuildopt='-bb'
-    if $NORPM; then
-        rpmbuildopt='-bc'
-        echo NORPM mode. Only compiling.
-    fi
+        if ! make dist 2>&1; then
+            popd >/dev/null # pushd ldiskfs
+            popd >/dev/null # pushd lustre
+            return 255
+        fi
+
+        #cp lustre-ldiskfs*.tar.gz $TOPDIR/SOURCES || \
+        #    fatal 1 "Could not copy lustre-ldiskfs*.tar.gz to $TOPDIR/SOURCES"
+
+        if ! $RPMBUILD $targets $rpmbuildopt lustre-ldiskfs*.tar.gz \
+            --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
+            --define "kdir $linux" \
+            ${linuxobj:+--define "kobjdir $linuxobj"} \
+            --define "_tmppath /var/tmp" \
+            --define "_topdir $TOPDIR" 2>&1; then
+            popd >/dev/null # pushd ldiskfs
+            popd >/dev/null # pushd lustre
+            return 255
+        fi
+
+        if $DO_SRC; then
+            if ! $RPMBUILD -ts lustre-ldiskfs*.tar.gz \
+                --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
+                --define "kdir $linux" \
+                ${linuxobj:+--define "kobjdir $linuxobj"} \
+                --define "_tmppath /var/tmp" \
+                --define "_topdir $TOPDIR" 2>&1; then
+                popd >/dev/null # pushd ldiskfs
+                popd >/dev/null # pushd lustre
+                return 255
+            fi
+        fi
+        popd >/dev/null # pushd ldiskfs
+
+        # tell lustre where ldiskfs is
+        # XXX - pointing to the RPM BUILD dir is a hack.  we need to flesh
+        #       out the ldiskfs RPM build so that it builds a
+        #       lustre-ldiskfs-devel RPM and install that and point lustre
+        #       to that instead
+        confoptions="$confoptions --with-ldiskfs=$(ls -d $TOPDIR/BUILD/lustre-ldiskfs-*)"
+    }
 
     # convert the $PATCHLESS boolean to an empty/not-empty boolean
     # as silly as this seems, it makes the syntax of the rpmbuild command
@@ -853,49 +858,18 @@ build_lustre() {
         lustre_tests="no"
     fi
 
-    $RPMBUILD $targets $rpmbuildopt ../lustre.spec \
+    $RPMBUILD $targets $rpmbuildopt "$LUSTRE" \
         ${is_patchless:+--define "lustre_name lustre-client"} \
         ${lustre_tests:+--define "build_lustre_tests 0"} \
+        ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
         --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
+        --define "kdir $linux" \
+        ${linuxobj:+--define "kobjdir $linuxobj"} \
         --define "_tmppath $TMPDIR" \
         --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 2>&1
-    if [ "$?" != "0" ]; then
-        popd
-        return 255
-    fi
-    cp lustre-ldiskfs*.tar.gz $TOPDIR/SOURCES
-
-    gen_lustre_version
-
-    local ldiskfs_spec=lustre-ldiskfs.spec
-    [ -f "$ldiskfs_spec" ] && sed \
-    -e "s^Release: .*$^Release: $LUSTRE_EXTRA_VERSION^" \
-    < $ldiskfs_spec \
-    > ../lustre-ldiskfs.spec
-
-    if ! $RPMBUILD $targets $rpmbuildopt ../lustre-ldiskfs.spec \
-        --define "_tmppath /var/tmp" \
-        --define "_topdir $TOPDIR" 2>&1; then
-        popd
-        return 255
-    fi
-
-    if $DO_SRC; then
-        if ! $RPMBUILD -bs ../lustre-ldiskfs.spec \
-            --define "_tmppath /var/tmp" \
-            --define "_topdir $TOPDIR" 2>&1; then
-            popd
-            return 255
-        fi
-    fi
-    popd
 
 }
 
@@ -919,33 +893,21 @@ stage() {
 
 #check if we need to build separate ldiskfs RPM
 skeep_ldiskfs_rpm() {
-        local tag="$1"
+    local tag="$1"
 
-        local skip=false
+    local skip=false
 
-        if ! $LDISKFSRPM; then
-            skip=true
-        elif $PATCHLESS; then
-            skip=true
-        else
-            for skiptag in $SKIPLDISKFSRPM; do
-                [[ $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() {
+    if ! $LDISKFSRPM; then
+        skip=true
+    elif $PATCHLESS; then
+        skip=true
+    else
+        for skiptag in $SKIPLDISKFSRPM; do
+            [[ $tag == $skiptag ]] && skip=true && break
+        done
+    fi
 
-    LUSTRE_EXTRA_VERSION="${lnxmaj}-${EXTRA_VERSION}${FLAVOR_DELIMITER}${RPMSMPTYPE}"
-    LUSTRE_EXTRA_VERSION=${LUSTRE_EXTRA_VERSION//-/_}
+    echo $skip
 
 }
 
@@ -965,6 +927,10 @@ set_rpm_smp_type() {
         [ $infact_arch == $smp_type ] && RPMSMPTYPE=bigsmp && break
     done
 
+    for smp_type in $PPC64_ARCHS; do
+        [ $infact_arch == $smp_type ] && RPMSMPTYPE=ppc64 && break
+    done
+
     for smp_type in $DEFAULT_ARCHS; do
         [ $infact_arch == $smp_type ] && RPMSMPTYPE=default && break
     done
@@ -1035,7 +1001,9 @@ unpack_linux_devel_rpm() {
 
     # call a distro specific hook, if available
     if type -p unpack_linux_devel_rpm-$DISTRO; then
-        unpack_linux_devel_rpm-$DISTRO "$kernelrpm"
+        if ! unpack_linux_devel_rpm-$DISTRO "$kernelrpm"; then
+            return 255
+        fi
     fi
 
     popd &>/dev/null
@@ -1083,7 +1051,7 @@ build_kernel_ib() {
         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
+        for file in $(ls ${TOPDIR}/lustre/build/patches/ofed/*); do
             ed_fragment1="$ed_fragment1
 Patch$n: ${file%%*/}"
             ed_fragment2="$ed_fragment2
@@ -1092,7 +1060,8 @@ Patch$n: ${file%%*/}"
             let n=$n+1
         done
 
-        ed $SOURCE <<EOF
+        if [ $n -gt 1 ]; then
+            ed $SOURCE <<EOF
 /^Source: /a
 $ed_fragment1
 .
@@ -1101,10 +1070,12 @@ $ed_fragment2
 .
 wq
 EOF
+        fi
     fi
 
     local linuxrelease=$(find_linux_release "$linux")
     if ! $RPMBUILD $BUILD_TYPE --define 'build_kernel_ib 1' --define 'build_kernel_ib_devel 1' \
+                  ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
                   --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
                   --define "KVERSION ${linuxrelease}" \
                   --define "$K_SRC ${linux}" \
@@ -1209,7 +1180,6 @@ reuse() {
                 find $dir -type f |
                   xargs ln -t $dest/RPMS/${dir##*/} -s
             done
-
         fi
         return 0
     else
@@ -1355,127 +1325,6 @@ build_kernel_with_srpm() {
 
 }
 
-build_mptlinux() {
-    local linux="$1"
-    local version="$2"
-
-    if [ -z "$version" -o "$version" = "inkernel" ]; then
-        return 0
-    fi
-
-    local targets arch
-    for arch in $BUILD_ARCHS; do
-        targets="--target $arch $targets"
-    done
-
-    local rpmbuildopt='-bb'
-    if $NORPM; then
-        rpmbuildopt='-bc'
-        echo NORPM mode. Only compiling.
-    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
-    # apply to it to make it useful.
-    #$RPMBUILD --rebuild \
-    #          --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
-    #          ${TOPDIR}/mptlinux-*.src.rpm
-    rpm -ivh --define "_topdir ${TOPDIR}" ${TOPDIR}/mptlinux-*.src.rpm
-
-    # now the big honkin' patch to the spec file
-    pushd ${TOPDIR}/SPECS
-    # to regen this patch use:
-    # !!cd ~/rpm/SPECS/ && diff -u mptlinux.spec{.dist,}
-    patch -p0 < ${TOPDIR}/lustre/build/mptlinux.spec.patch || fatal 1 "failed to patch mptlinux.spec"
-    popd
-
-    local targets arch
-        for arch in $BUILD_ARCHS; do
-        targets="--target $arch $targets"
-    done
-
-    local rpmbuildopt='-bb'
-    if $NORPM; then
-        rpmbuildopt='-bc'
-        echo NORPM mode. Only compiling.
-    fi
-
-    if ! $RPMBUILD $targets $rpmbuildopt \
-                  --define "_tmppath /var/tmp" \
-                  --define "_topdir ${TOPDIR}" \
-                  --define "kernel_obj $linux" \
-                  ${TOPDIR}/SPECS/mptlinux.spec 2>&1; then
-        return 1
-    fi
-    if $DO_SRC; then
-        if ! $RPMBUILD -bs \
-                      --define "_tmppath /var/tmp" \
-                      --define "_topdir ${TOPDIR}" \
-                      --define "kernel_obj $linux" \
-                      ${TOPDIR}/SPECS/mptlinux.spec 2>&1; then
-            return 1
-        fi
-    fi
-
-    return 0
-
-}
-
-# build RDAC
-build_rdac() {
-    local linux="$1"
-    local version="$2"
-
-    if [ -z "$version" -o "$version" = "inkernel" ]; then
-        return 0
-    fi
-
-    # note that we use an _, not a . before the spec on purpose.  we are not
-    # allowed to have more than one file with a .spec trailer in a tarball
-    # that is supposed to be usable with rpmbuild
-    cp lustre/build/rdac_spec ${TOPDIR}/SPECS/rdac.spec || fatal 1 "Could not find rdac.spec in lustre/build" 
-
-    local targets arch
-    for arch in $BUILD_ARCHS; do
-        targets="--target $arch $targets"
-    done
-
-    local rpmbuildopt='-bb'
-    if $NORPM; then
-        rpmbuildopt='-bc'
-        echo NORPM mode. Only compiling.
-    fi
-
-    local distro
-    case $DISTRO in
-     rhel5)     distro="REDHAT"
-                ;;
-    sles1*)     distro="SUSE"
-                ;;
-         *)     echo "$DISTRO not supported by RDAC, skipping"
-                return 0
-                ;;
-    esac
-    if ! $RPMBUILD $targets $rpmbuildopt --define "dist $distro" \
-                  --define "_tmppath /var/tmp" \
-                  --define "_topdir ${TOPDIR}" \
-                  --define "kernel_obj $linux" \
-                  ${TOPDIR}/SPECS/rdac.spec 2>&1; then
-        return 1
-    fi
-    if $DO_SRC; then
-        if ! $RPMBUILD -bs --define "dist $distro" \
-                      --define "_tmppath /var/tmp" \
-                      --define "_topdir ${TOPDIR}" \
-                      --define "kernel_obj $linux" \
-                      ${TOPDIR}/SPECS/rdac.spec 2>&1; then
-            return 1
-        fi
-    fi
-
-    return 0
-}
-
 # build OFED
 # globals used:
 #    TOPDIR
@@ -1486,11 +1335,30 @@ build_ofed() {
     local linux="$1"
     local ofed_version="$2"
 
-    # before lustre, build kernel-ib
-    if [ -z "$ofed_version" -o "$ofed_version" = "inkernel" ]; then
+    # if an ofed version is given, then it means use OFED proper,
+    # not any vendor specific "inkernel" version
+    if [ -z "$ofed_version" ]; then
         return 0
     fi
 
+    if [ "$ofed_version" = "inkernel" ]; then
+        # see if there is a distro specific override for this and use
+        # that if it exists
+        # XXX we need to better integrate a distro specific override with
+        #     the rest of this function so that all of the reuse cache
+        #     stuff is leveraged given that 80% of this function is reuse
+        if type -p build_ofed-${DISTRO}; then
+            local ofed_location
+            ofed_location=$(build_ofed-${DISTRO} ${STDOUT})
+            local rc=${PIPESTATUS[0]}
+            CONFIGURE_FLAGS="--with-o2ib=${ofed_location} ${CONFIGURE_FLAGS}"
+            return $rc
+        else
+            return 0
+        fi
+    fi
+
+    # build kernel-ib
     if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
         local REUSE_SIGNATURE=$({ echo "$ofed_version";
                                   echo "$(find_linux_release ${linux})";
@@ -1551,7 +1419,9 @@ build_ofed() {
     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
+    if ! rpm2cpio < $rpm | cpio -id; then
+        fatal 1 "could not unpack the kernel-ib-devel rpm."
+    fi
     CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/ofa_kernel ${CONFIGURE_FLAGS}"
     popd >/dev/null
 
@@ -1571,7 +1441,7 @@ build_with_srpm() {
                 fatal 1 "Failed to find a kernel development RPM in $TOPDIR/RPMS/$arch/"
             fi
 
-            # install the -devel RPM in preparation for the lustre build
+            # install the -devel RPM in preparation for modules builds
             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"
@@ -1589,37 +1459,76 @@ build_with_srpm() {
         fi
     fi
 
+    # ~sigh~  have to make copies of and modify some of the rpm
+    # infrastructure files so that find-requires can find our unpacked
+    # kernel-devel artifacts
+    cp $RPM_HELPERS_DIR/{symset-table,find-requires{,.ksyms}} .
+    FIND_REQUIRES="$(pwd)/find-requires"
+    chmod 755 {symset-table,find-requires{,.ksyms}}
+    local tmp="$(pwd)"
+    tmp="${tmp//\//\\/}"
+    ed find-requires <<EOF
+1a
+set -x
+.
+/|.*find-requires.ksyms/s/|/| bash -x/
+g/ [^ ]*\/\(find-requires\.ksyms\)/s// $tmp\/\1/g
+wq
+EOF
+    ed find-requires.ksyms <<EOF
+1a
+set -x
+.
+g/\/.*\/\(symset-table\)/s//$tmp\/\1/g
+wq
+EOF
+    ed symset-table <<EOF
+1a
+set -x
+.
+g/\(\/boot\/\)/s//$tmp\/reused\1/g
+g/\(\/usr\/src\/kernels\/\)/s//$tmp\/reused\1/g
+wq
+EOF
+
     build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
         fatal 1 "error building OFED"
 
-    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"
-
     # now build Lustre
     if build_lustre "$LINUX" "$LINUXOBJ"; then
         # the build worked.  resolve any symlinked files (i.e. from reuse)
         # in RPMS/$arch to real files so that that that huge mess of
         # complication known as LTS can copy them yet somewhere else.
         # is it any wonder this whole process is so damn so?  anyone ever
-        # heard of hardlinks?  it this cool new thing that allows you save
+        # heard of hardlinks?  it's this cool new thing that allows you save
         # tons of time and space by creating... well you can go read about
         # them if you have not heard about them yet.
         # can i say how much the implemenation of all of this really impedes
         # RPM reuse?
-        pushd RPMS/$TARGET_ARCH
-            for file in *; do
+        local dir
+        for dir in RPMS/*; do
+            pushd $dir
+            for file in $(ls); do
                 if [ -h $file ]; then
                     cp $file foo
                     mv foo $file
                 fi
             done
-        popd
+            popd
+        done
+        # also, for i?86, make sure all of the RPMs are in RPMS/$TARGET_ARCH
+        # as that's where LTS expects to find them
+        for dir in RPMS/*; do
+            if [ $dir = RPMS/$TARGET_ARCH ]; then
+                continue
+            fi
+            pushd $dir
+            local files=$(ls)
+            if [ -n "$files" ]; then
+                cp -al $files ../$TARGET_ARCH
+            fi
+            popd
+        done
     else
         return 1
     fi
@@ -1834,7 +1743,9 @@ while [ "$1" ]; do
             shift 2
             ;;
         --lustre)
-            LUSTRE=$2
+            if ! LUSTRE=$(canon_filepath "$2"); then
+                fatal 1 "Could not determine the canonical location of $2"
+            fi
             shift 2
             ;;
         --nodownload)
@@ -1909,6 +1820,10 @@ check_options
 
 unpack_lustre
 
+# XXX - should we _always_ get the buildid from the META file?  what are the
+# other (i.e. non-lustre-tarball use cases of lbuild)?
+BUILDID=$(sed -ne '/^BUILDID =/s/.*= *//p' lustre/META)
+
 load_target
 
 if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
@@ -1916,33 +1831,14 @@ if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
     unpack_ofed || fatal 1 "Error unpacking OFED tarball"
 fi
 
-if [ -n "$MPTLINUX_VERSION" -a "$MPTLINUX_VERSION" != "inkernel" ]; then
-    download_mptlinux
-    unpack_mptlinux || fatal 1 "Error unpacking MPTLINUX distribution"
-fi
-
 # make sure the RPM build environment is set up
 create_rpmbuild_dirs
 
-if [ -n "$RDAC_VERSION" -a "$RDAC_VERSION" != "inkernel" ]; then
-    download_rdac
-    # we don't actually need to unpack this.  just put it in the SOURCES dir
-    #unpack_rdac || fatal 1 "Error unpacking RDAC tarball"
-    cp "$KERNELTREE/rdac-LINUX-${RDAC_VERSION}-source.tar.gz" ${TOPDIR}/SOURCES/ ||
-        fatal 1 "Error copying RDAC source tarball to RPM SOURCES dir"
-fi
-
 # 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
-    build_mptlinux "${LINUXOBJ:-$LINUX}" "$MPTLINUX_VERSION" ||
-        fatal 1 "error building mptlinux"
     build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
         fatal 1 "error building OFED"
-    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