Whamcloud - gitweb
LU-8642 build: suppport building various OFED
[fs/lustre-release.git] / contrib / lbuild / lbuild
index 37826fc..bc1d205 100755 (executable)
@@ -36,7 +36,7 @@ push_exit_trap "kill -INT -$$ || true" kill_children
 #BUILD_GEN=5   # TT-107: don't cache the BUILD dir
 BUILD_GEN=6    # TT-1092: don't cache the BUILD dir, to rebuild external OFED
 
-TOPDIR=$PWD
+TOPDIR="$PWD"
 
 KERNELDIR=
 LINUX=
@@ -60,12 +60,13 @@ EXTRA_VERSION=
 STAGEDIR=
 TMPDIR=${TMPDIR:-"/var/tmp"}
 TIMESTAMP=
+# default OFED
+OFED_TYPE="inkernel"
 # this is the dir that should be used to store reuse products
 REUSEBUILD=
 # should cached products be used or force rebuilding?
 USE_BUILD_CACHE=true
 # what does this do exactly?  does it imply no kernel build?
-NORPM=false
 IOKITRPM=true
 OSDLDISKFSRPM=true
 OSDZFSRPM=false
@@ -145,7 +146,7 @@ Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
     Use ccache
 
   --norpm
-    Do not build RPMs (compile only mode)
+    Unused.
 
   --patchless
     Build lustre client only
@@ -175,6 +176,24 @@ Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
     Do not build a .src.rpm, a full kernel patch, or a patched kernel
     tarball.
 
+  --ofed-type
+    Type of OFED to build with lustre: inkernel, ofa, mlnx, ifs
+    ofa: OpenFabrics Alliance
+    mlnx: Mellanox
+    ifs: Intel True Scale Fabric
+
+  --ofed-version
+    Version of external OFED to build with lustre
+
+  --mlnx-version
+    Version of external Mellanox OFED to build with lustre
+
+  --ofed-src
+    Tarball for either OFED. Tarball must follow below format
+    OFED-<ofed-version>.tgz regardless of vendors
+    It's likely that you need to reconstruct the directory name
+    It must be placed under KERNELTREE directory
+
   --ldiskfs
     Build with ldiskfs support. (Deprecated, always true)
 
@@ -263,6 +282,23 @@ check_options() {
         usage 1 "Could not find Lustre source tarball '$LUSTRE'."
     fi
 
+       if [ -n "${OFED_SRC}" ]; then
+               if [ -z "${OFED_VERSION}" ]; then
+                       usage 1 "Need to provide version for file ${OFED_SRC}."
+               fi
+               if [ "${OFED_TYPE}" = "inkernel" ]; then
+                       usage 1 "Need to provide ofed type for file ${OFED_SRC}."
+               fi
+       else
+               if [ "${OFED_TYPE}" != "inkernel" -a -z "${OFED_VERSION}" ]; then
+                       usage 1 "Need to provide version for $OFED_TYPE OFED"
+               fi
+
+               if [ "${OFED_TYPE}" = "inkernel" -a -n "${OFED_VERSION}" ]; then
+                       usage 1 "Can not specify version with inkernel OFED"
+               fi
+       fi
+
     if [ -z "$DISTRO" ] ; then
         DISTRO=$(autodetect_distro)
         # remove separator
@@ -285,7 +321,7 @@ check_options() {
     fi
 
     case $TARGET in
-        3.12-sles12)
+        3.12-sles12 | 4.4-sles12)
             CANONICAL_TARGET="sles12"
             ;;
         3.10-rhel7)
@@ -334,31 +370,47 @@ check_options() {
         TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M%S")
     fi
 
-    RPMBUILD=$(which rpmbuild 2>/dev/null | head -1)
-    if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
-        RPMBUILD=$(which rpm 2>/dev/null | head -1)
-        if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
-            usage 1 "Could not find binary for making rpms (tried rpmbuild and rpm)."
-        fi
+    RPMBUILD=$(which rpmbuild 2>/dev/null | head -n 1)
+    RPMBUILD=${RPMBUILD:-$(which rpm 2>/dev/null | head -n 1)}
+    if [ -z "$RPMBUILD" ]; then
+        usage 1 "Could not find binary for making rpms (tried rpmbuild and rpm)."
+    fi
+
+    local BINDIR="$TOPDIR/bin"
+    if [ -d $BINDIR ]; then
+        rm -rf $BINDIR >/dev/null 2>&1 || true
     fi
 
+    mkdir -p $BINDIR || fatal 1 "error trying to create $BINDIR"
+    export PATH=$BINDIR:$PATH
+
+    cat >${BINDIR}/rpmbuild <<EOF
+#!/bin/bash
+
+ARGS="\${FIND_REQUIRES:+--define \"__find_requires \$FIND_REQUIRES\"}"
+for arg; do
+    case \$arg in
+    *\'* ) ARGS="\$ARGS \"\$arg\"" ;;
+    * ) ARGS="\$ARGS '\$arg'" ;;
+    esac
+done
+
+eval $RPMBUILD \$ARGS
+EOF
+    chmod 755 ${BINDIR}/rpmbuild
+
     if [ -n "$CCACHE" ]; then
         which "$DISTCC" &>/dev/null && export DISTCC RPM_BUILD_NCPUS
 
         if which "$CCACHE" &>/dev/null; then
-            local ccache=$(which "$CCACHE")
-            local bindir="$TOPDIR/bin"
+            local ccache=$(which "$CCACHE" 2>/dev/null | head -n 1)
 
-            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"
+            ln -s "$ccache" ${BINDIR}/ccache
+            ln -s "$ccache" ${BINDIR}/cc
+            ln -s "$ccache" ${BINDIR}/$CC
+
+            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
@@ -371,7 +423,6 @@ check_options() {
     fi
 
     return 0
-
 }
 
 # compare two versions $1 and $2. if $1 < $2, return 0 otherwise return 1.
@@ -393,6 +444,7 @@ compare_version () {
             return 1
         fi
     done
+    return 1
 }
 
 uniqify() {
@@ -431,36 +483,27 @@ fetch_url() {
 }
 
 download_srpm() {
-    local target=$1
-    local srpm=$2
-    local force="${3:-false}"
-
-    if $force || [ ! -r "$KERNELDIR/$srpm" ] ||
-       [ ! -s "$KERNELDIR/$srpm" ]; then
-        if $DOWNLOAD; then
-            local location="https://downloads.hpdd.intel.com/public/kernels/$target/old"
-            # get the location from a distro specific method if it exists
-            if type -p kernel_srpm_location; then
-                location=$(kernel_srpm_location)
-            fi
-            echo "Downloading $location/$srpm..."
-            if ! fetch_url "$location/$srpm" "$KERNELDIR/$srpm" 2>&1 ||
-               [ ! -s "$KERNELDIR/$srpm" ]; then
-                rm -f $KERNELDIR/$srpm
-                # punt to a distro specific method if it exists
-                if ! type -p download_srpm-$DISTROMAJ; then
-                    fatal 1 "Could not download target $target's kernel SRPM $srpm from $location."
-                else
-                    if ! download_srpm-$DISTROMAJ "$target" "$srpm" "$force"; then
-                        fatal 1 "Could not download target $target's kernel SRPM $srpm using download_srpm-$DISTROMAJ."
-                    fi
-                fi
-            fi
-        else
-            fatal 1 "$srpm not found in directory $KERNELDIR."
-        fi
-    fi
-
+       local target=$1
+       local srpm=$2
+       local force="${3:-false}"
+
+       # let the download_file handle the concurrency
+       if $DOWNLOAD; then
+               local location= \
+               "https://downloads.hpdd.intel.com/public/kernels/$target/old"
+               # get the location from a distro specific method if it exists
+               if type -p kernel_srpm_location; then
+                       location=$(kernel_srpm_location)
+               fi
+               echo "Downloading $location/$srpm..."
+               if ! download_file \
+                       "$location/$srpm" "$KERNELDIR/$srpm" "$force" 2>&1 ||
+                       [ ! -s "$KERNELDIR/$srpm" ]; then
+                       rm -f $KERNELDIR/$srpm
+                       fatal 1 "Could not download target $target's kernel \
+SRPM $srpm from $location."
+               fi
+       fi
 }
 
 download_file() {
@@ -543,143 +586,60 @@ download_file() {
 }
 
 download_ofed() {
-    local force="${1:-false}"
-
-    if [ -z "$OFED_VERSION" -o "$OFED_VERSION" = "inkernel" ]; then
-        return 0
-    fi
-
-    local OFED_BASE_VERSION=$OFED_VERSION
-    if [[ $OFED_VERSION = *.*.*.* ]]; then
-        OFED_BASE_VERSION=${OFED_VERSION%.*}
-    fi
-
-    local location="https://www.openfabrics.org/downloads/OFED/ofed-${OFED_BASE_VERSION}/"
-
-    if [[ $OFED_VERSION = *-[rR][cC][0-9] ]]; then
-        local Mmv
-        Mmv=${OFED_VERSION%%-[rR][cC][0-9]}
-        location="https://www.openfabrics.org/downloads/OFED/ofed-${Mmv}/"
-    fi
-
-    if [[ $OFED_VERSION = daily-* ]]; then
-        local Mmv
-        Mmv=${OFED_VERSION/daily-/}
-        daily=${OFED_VERSION##$Mmv-}
-        location="https://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 "/${Mmv}-/s/.*href=\"OFED-(${Mmv}-[0-9]{8,8}-[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
-
-    local file="OFED-${OFED_VERSION}.tgz"
-    download_file "$location/$file" "$KERNELTREE" "$force"
-
-}
-
-parse_mpss_info() {
-    local file="$1"
-    local build="$2"
-    local distro="$3"
-
-    [ -r "$file" ] || fatal 1 "Could not find MPSS info file"
-
-    # convert to MPSS distro naming
-    distro=${distro/sles/suse}
-    distro_name=${distro%%-*}
-
-    # extract links from MPSS info file
-    local urls=$(cat "$file" | \
-        tr -d '\t\r\n' | sed -e 's?\(</[a-zA-Z]*>\)?\1\n?g' | \
-        grep '.intel.com/' | \
-        sed -e 's/^.*[hH][rR][eE][fF]="\([^>"]\+\)".*$/\1/g' | \
-        grep '.tar')
-    local res2=""
-    local res3=""
-    for url in $urls; do
-        local ver2=""
-        local ver3=""
-        # Try to match with MPSS 3.3 package
-        if [[ $url =~ mpss-[0-9].[0-9](.[0-9]*)?-linux.tar ]]; then
-            ver3=${url##*mpss-}
-            ver3=${ver3%%-linux.tar}
-        # Try to match with MPSS 3.x or 3.x.x distro package
-        elif [[ $url =~ mpss-[0-9].[0-9](.[0-9]*)?-$distro.tar ]]; then
-            ver3=${url##*mpss-}
-            ver3=${ver3%%-$distro.tar}
-        # Try to match with MPSS 3.x or 3.x.x source package
-        elif [[ $url =~ mpss-src-[0-9].[0-9](.[0-9]*)?.tar ]]; then
-            ver3=${url##*mpss-src-}
-            ver3=${ver3%%.tar}
-        # Try to match with MPSS 3.x or 3.x.x cross compiler package
-        elif [[ $url =~ mpss-[0-9].[0-9](.[0-9]*)?-k1om.tar ]]; then
-            ver3=${url##*mpss-}
-            ver3=${ver3%%-k1om.tar}
-        # Try to match with MPSS 2.1.x source package
-        elif [[ $url =~ _src-[0-9].[0-9].[0-9]*-[0-9]*_$distro_name.tar ]]; then
-            ver2=${url##*_src-}
-            ver2=${ver2%%_$distro_name.tar}
-        fi
-
-        if [ -n "$ver3" ]; then
-            ver3="${ver3}-0"
-            if [ -z "$build" ]; then
-                res3="$ver3"
-            elif [ "${build%%-*}" = "${ver3%%-*}" ]; then
-                res3="$res3 $url"
-            fi
-        elif [ -n "$ver2" ]; then
-            if [ -z "$build" ]; then
-                res2="$ver2"
-            elif [ "$build" = "$ver2" ]; then
-                res2="$res2 $url"
-            fi
-        fi
-
-    done
-
-    if [ -z "$build" ]; then
-        # return a last version of MPSS
-        if [ -n "$res3" ]; then
-            echo "$res3"
-        else
-            echo "$res2"
-        fi
-    elif [ "${build%%.*}" = "3" ]; then
-        # return URLs from MPSS info file
-        echo "$res3"
-    else
-        # return URLs from MPSS info file
-        echo "$res2"
-    fi
-}
+       local ofed_type="$1"
+       local ofed_version="$2"
+       local force="${3:-false}"
+       local distro_name="${DISTRO}"
+       local arch="${TARGET_ARCH}"
+       local location
+       local file
+
+       #if a src tarball has been given in the command line, we use it
+       #The format of the tarball must be OFED-${OFED_VERSION}.tgz
+       [ -n "${OFED_SRC}" ] && return 0
+
+       case $ofed_type in
+               ofa)
+                       location="https://www.openfabrics.org/downloads/OFED/ofed-${ofed_version}/"
+                       # version include RC
+                       if [[ $ofed_version = *-[rR][cC][0-9] ]]; then
+                               ofed_version_loc=${ofed_version%%-[rR][cC][0-9]}
+                               location="https://www.openfabrics.org/downloads/OFED/ofed-${ofed_version_loc}/"
+                       fi
+                       # daily build
+                       if [[ $ofed_version = *-daily ]]; then
+                               ofed_version=${ofed_version/-daily/}
+                               location="https://www.openfabrics.org/downloads/OFED/ofed-${ofed_version}-daily/"
+                               # find the filename for latest version
+                               ofed_version=$(curl -1 -s "$location" | sed -nre "s/.*href=\"OFED-(${ofed_version//./\\.}-[0-9]{8}-[0-9]{4}).tgz.*$/\1/p" | tail -1)
+                               if [ -z "$ofed_version" ]; then
+                                       fatal 1 "Could not determine the filename of the OFED snapshot from daily "
+                               fi
+                       fi
+
+                       file="OFED-${ofed_version}.tgz"
+                       download_file "$location/$file" "$KERNELTREE" "$force"
+                       ;;
+               mlnx)
+                       location="http://www.mellanox.com/downloads/ofed/MLNX_OFED-${ofed_version}"
+                       # this is a work around for suse distro (sles11.3). what we need is
+                       # sles11sp3. We really need to redesign how we use target and distro
+                       [[ $distro_name =~ sles ]] && distro_name=${DISTRO/./sp}
+                       file="MLNX_OFED_LINUX-${ofed_version}-${distro_name}-${arch}.tgz"
+                       download_file "$location/$file" "$KERNELTREE" "$force"
+                       ;;
+               ifs)
+                       location="http://downloadmirror.intel.com/24625/eng/"
+                       file="IntelIB-Basic.$(echo ${distro_name%%.*} | tr '[:lower:]' '[:upper:]')-${arch}.${ofed_version}.tgz"
+                       download_file "$location/$file" "$KERNELTREE" "$force"
+                       ;;
+               *)
+                       fatal 1 "Error: unknown OFED type: $ofed_type"
+
+       esac
+       # version might change due to detect daily version
+       OFED_VERSION=${ofed_version}
 
-# Get public information about last releases of
-# Intel Manycore Platform Software Stack (MPSS)
-download_mpss_info() {
-    local file="$1"
-    local force="${2:-true}"
-    local url=${MPSS_URL:-"http://software.intel.com/en-us/articles/intel-manycore-platform-software-stack-mpss"}
-
-    download_file "$url" "$file" "$force"
-}
-
-download_mpss() {
-    local file="$1"
-    local force="${2:-false}"
-    local urls=$(parse_mpss_info "$file" ${MPSS_VERSION} ${MPSS_DISTRO})
-
-    [ -z "$urls" ] && return 0
-
-    local url
-    local i=0
-    for url in $urls; do
-        file="$KERNELTREE/mpss_src-${MPSS_VER}-${MPSS_BLD}-${MPSS_DISTRO}-part$i.tar"
-        download_file "$url" "$file" "$force"
-        i=$((i+1))
-    done
 }
 
 load_target() {
@@ -762,9 +722,6 @@ load_target() {
         # kernel.  don't make it look like one
         if $PATCHLESS || [ -n "$SERIES" ]; then
             EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
-            if ! $PATCHLESS && [ -n "$BUILDID" ]; then
-                EXTRA_VERSION="${EXTRA_VERSION}.${BUILDID}"
-            fi
         fi
     fi
     # EXTRA_VERSION=${EXTRA_VERSION//-/_}
@@ -817,12 +774,63 @@ untar() {
 }
 
 unpack_ofed() {
-
-    if ! untar "$KERNELTREE/OFED-${OFED_VERSION}.tgz"; then
-        return 1
-    fi
-    [ -d OFED ] || ln -sf OFED-[0-9].[0-9]* OFED
-
+       local ofed_type="$1"
+       local ofed_version="$2"
+       local distro_name="${DISTRO}"
+       local arch="${TARGET_ARCH}"
+       local file
+
+       #if a src tarball has been given in the command line, we use it
+       #The format of the directory after untar MUST be in OFED-${version}
+       #even if it's from MLNX or IFS...or whatever
+       if [ -n "${OFED_SRC}" ]; then
+               if ! untar "$KERNELTREE/${OFED_SRC}"; then
+                       return 1
+               else
+                       [ -d OFED ] || ln -sf OFED-[0-9].[0-9]* OFED
+               fi
+       fi
+       case $ofed_type in
+               ofa)
+                       file="OFED-${ofed_version}"
+                       if ! untar "$KERNELTREE/${file}.tgz"; then
+                               return 1
+                       fi
+                       [ -d OFED ] || ln -sf OFED-[0-9].[0-9]* OFED
+                       ;;
+               mlnx)
+                       # this is a work around for suse distro (sles11.3). what we need is
+                       # sles11sp3. We really need to redesign how we use target and distro
+                       [[ $distro_name =~ sles ]] && distro_name=${DISTRO/./sp}
+                       file="MLNX_OFED_LINUX-${ofed_version}-${distro_name}-${arch}"
+
+                       # it's not important what distro we get the tarball since we only
+                       # interest in the src
+                       if ! untar "$KERNELTREE/${file}.tgz"; then
+                               return 1
+                       fi
+                       # we need to untar again to get the src since it's being
+                       # wrapped inside the tarball
+                       # There are cases where the source version is different
+                       # than the tarball.
+                       # (ie. MLNX_OFED_LINUX-2.3-1.0.1 but MLNX_OFED_SRC-2.3-1.0.0)
+                       local src=$(ls ${file}/src/MLNX_OFED_SRC-${ofed_version%.*}*.tgz)
+                       if ! untar "$src"; then
+                               return 1
+                       fi
+                       [ -d OFED ] || ln -sf MLNX_OFED_SRC-[0-9].[0-9]* OFED
+                       ;;
+               ifs)
+                       file="IntelIB-Basic.$(echo ${distro_name%%.*} | tr '[:lower:]' '[:upper:]')-${arch}.${ofed_version}"
+                       if ! untar "$KERNELTREE/${file}.tgz"; then
+                               return 1
+                       fi
+                       [ -d OFED ] || ln -sf $file/IntelIB-OFED.$(echo ${distro_name%%.*} | tr '[:lower:]' '[:upper:]')-${arch}.* OFED
+                       ofed_version="$(cat OFED/Version)"
+                       ;;
+       esac
+       # version might change due to detect daily version
+       OFED_VERSION=${ofed_version}
 }
 
 unpack_lustre() {
@@ -832,73 +840,6 @@ unpack_lustre() {
 
 }
 
-unpack_mpss() {
-
-    [ -d mpss ] && return 0
-
-    if [ "$MPSS_MAJ" = "3" ]; then
-        local file
-        local i
-        for i in $(seq 0 9); do
-            file="$KERNELTREE/mpss_src-${MPSS_VER}-${MPSS_BLD}-${MPSS_DISTRO}-part$i.tar"
-            if [ -r "$file" ]; then
-                untar "$file" \
-                    "mpss-$MPSS_VER/*/linux-*.tar.bz2" \
-                    "mpss-$MPSS_VER/*/kernel-dev-*.rpm" \
-                    "mpss-$MPSS_VER/*/ofed-driver-devel-*.rpm" \
-                    "mpss-$MPSS_VER/*/ofed-driver-*-devel-*.rpm"
-            fi
-        done
-        # Extract kernel configs
-        file=$(find mpss-$MPSS_VER -type f -path "*/kernel-dev-*.rpm" -print -quit)
-        if ! rpm2cpio "$file" | cpio -idm; then
-            echo "Error extracting MPSS kernel configs"
-            return 1
-        fi
-        # Unpack kernel sources
-        file=$(find mpss-$MPSS_VER -type f -path "*/linux-*.tar.bz2" -print -quit)
-        if ! untar "$file"; then
-            echo "Error unpacking MPSS kernel sources"
-            return 1
-        fi
-        # Extract OFED headers
-        file=$(find mpss-$MPSS_VER -type f -path "*/ofed-driver-*-devel-*.rpm" -print -quit)
-        if ! rpm2cpio "$file" | cpio -idm; then
-            # Name was changed in MPSS 3.3
-            file=$(find mpss-$MPSS_VER -type f -path "*/ofed-driver-devel-*.rpm" -print -quit)
-            if ! rpm2cpio "$file" | cpio -idm; then
-                echo "Error extracting MPSS OFED headers"
-                return 1
-            fi
-        fi
-        # Remove unpacked archives to save space
-        rm -rf mpss-$MPSS_VER
-        # Make link to MPSS kernel sources
-        ln -sf linux-* mpss
-    else
-        local dir="mpss-${MPSS_VER}-${MPSS_BLD}-${MPSS_DISTRO%%-*}"
-
-        mkdir $dir || return 255
-        pushd $dir >/dev/null || return 255
-        if ! untar "$KERNELTREE/mpss_src-${MPSS_VER}-${MPSS_BLD}-${MPSS_DISTRO}-part0.tar" "*/gpl/*full_src*"; then
-            popd >/dev/null
-            rm -rf $dir
-            echo "Error unpacking MPSS tarball 1"
-            return 1
-        fi
-        local file=$(find . -type f -path "*/gpl/*full_src*")
-        if ! untar "$file"; then
-            popd >/dev/null
-            rm -rf $dir
-            echo "Error unpacking MPSS tarball 2"
-            return 1
-        fi
-        popd >/dev/null
-        ln -sf $dir mpss
-    fi
-
-}
-
 do_patch_linux() {
 
     local do_patch=${1:-true}
@@ -939,6 +880,7 @@ do_patch_linux() {
 build_lustre() {
     local linux="$1"
     local linuxobj="$2"
+    local configure_args=""
 
     cp "$LUSTRE" SOURCES
 
@@ -950,16 +892,6 @@ build_lustre() {
     fi
 
     echo "Building Lustre RPMs for: $BUILD_ARCHS..."
-    local targets arch
-    for arch in $BUILD_ARCHS; do
-        targets="--target $arch $targets"
-    done
-
-    local rpmbuildopt='-tb'
-    if $NORPM; then
-        rpmbuildopt='-tc'
-        echo NORPM mode. Only compiling.
-    fi
 
     # If server we now build the spl and zfs modules against the lustre kernel.
     # These are required prior to the building of lustre server. Client does
@@ -973,60 +905,71 @@ build_lustre() {
     fi
 
     if $PATCHLESS; then
-        RPMBUILD_DEFS="$RPMBUILD_DEFS --without servers"
-        if [ -n "$CROSS_SUFFIX" ]; then
-            RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"lustre_name lustre-client$CROSS_SUFFIX\""
-        fi
+        configure_args="$configure_args --disable-server"
     fi
 
     # ditto for the lustre-tests boolean
     if ! $LUSTRE_TESTS; then
-        RPMBUILD_DEFS="$RPMBUILD_DEFS --without lustre_tests"
+        configure_args="$configure_args --disable-tests"
     fi
 
     if ! $IOKITRPM; then
-        RPMBUILD_DEFS="$RPMBUILD_DEFS --without lustre_iokit"
+        configure_args="$configure_args --disable-iokit"
     fi
 
-    local osd_zfs=""
-    if $OSDZFSRPM; then
-        osd_zfs="yes"
+    if ! $OSDZFSRPM; then
+        configure_args="$configure_args --without-zfs"
     fi
 
-    local osd_ldiskfs=""
-    if $OSDLDISKFSRPM; then
-        osd_ldiskfs="yes"
+    if ! $OSDLDISKFSRPM; then
+        configure_args="$configure_args --disable-ldiskfs"
     fi
 
-    RPMBUILD_DEFS="$RPMBUILD_DEFS ${FIND_REQUIRES:+--define \"__find_requires $FIND_REQUIRES\"}"
-    RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"configure_args ${CONFIGURE_FLAGS}\""
-    RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"kdir $linux\""
-    RPMBUILD_DEFS="$RPMBUILD_DEFS ${linuxobj:+--define \"kobjdir $linuxobj\"}"
-    RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"_tmppath $TMPDIR\""
-    RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"_topdir $TOPDIR\""
+    configure_args="$configure_args --with-linux=$linux"
+    configure_args="$configure_args ${linuxobj:+--with-linux-obj=$linuxobj}"
+
+    # allow environment setting to override ldiskfs series selection
+    [ -n "$LDISKFS_SERIES" ] && export LDISKFS_SERIES
 
-    eval $RPMBUILD $targets $rpmbuildopt "$LUSTRE" $RPMBUILD_DEFS \
-        ${osd_zfs:+--with zfs} \
-        ${osd_ldiskfs:+--with ldiskfs} 2>&1 || \
+    ./configure $configure_args $CONFIGURE_FLAGS 2>&1 ||
+        fatal 1 "Error in configure."
+    make rpms 2>&1 ||
         fatal 1 "Error building rpms for $BUILD_ARCHS."
 
-    if $DO_SRC; then
-        if ! eval $RPMBUILD -ts "$LUSTRE" $RPMBUILD_DEFS 2>&1; then
-            popd >/dev/null
-            return 255
-        fi
-    fi
+    # move RPMs into place where they are expected to be
+    for arch in $BUILD_ARCHS; do
+        mv -f *lustre*.${arch}.rpm $TOPDIR/RPMS/${arch}/
+    done
+    mv -f lustre-*.src.rpm $TOPDIR/SRPMS/
+
     popd >/dev/null
+       if type -p cleanup_rpmmacros; then
+               cleanup_rpmmacros
+       fi
 
+    return 0
 }
 
+# Only zfs Lustre DKMS Server is supported
 build_lustre_dkms() {
-    [ -n "$MPSS_VERSION" ] && return 0
-    local ver=$(eval echo  $(awk '/LUSTRE_VERSION_STRING/ {print $3}'  lustre/include/lustre_ver.h))
+    local build_args=""
+    local name_prefix="lustre"
+    local ver=$(sed -n -e 's/^LUSTRE_VERSION = //p' LUSTRE-VERSION-FILE)
+
     echo "Building Lustre DKMS RPMs for: $BUILD_ARCHS..."
-    ./configure --enable-dist || return 255
-    $RPMBUILD --define="_topdir $TOPDIR" -bs lustre-dkms.spec || return 255
-    $RPMBUILD --rebuild --define="_topdir $TOPDIR" $TOPDIR/SRPMS/lustre-dkms-$ver-*.src.rpm || return 255
+    ./configure --enable-dist || fatal 1 "Error in DKMS configure."
+
+    if $PATCHLESS; then
+        build_args="--without servers"
+        name_prefix="lustre-client"
+    fi
+
+    rpmbuild --define "_topdir $TOPDIR" $build_args -bs lustre-dkms.spec ||
+        fatal 1 "Error building DKMS .src.rpm for $BUILD_ARCHS."
+    rpmbuild --define "_topdir $TOPDIR" $build_args \
+             --rebuild $TOPDIR/SRPMS/$name_prefix-dkms-$ver-*.src.rpm ||
+        fatal 1 "Error building DKMS .rpm for $BUILD_ARCHS."
+
     return 0
 }
 
@@ -1050,7 +993,7 @@ build_spl_zfs() {
     # The spl/zfs spec files expect RPM_BUILD_ROOT to point to the root of the
     # destination for the rpms
     export RPM_BUILD_ROOT=$TOPDIR
-    SPLZFSVER=${SPLZFSVER:-0.6.4.2}
+    SPLZFSVER=${SPLZFSVER:-0.6.5.8}
     SPLZFSTAG=${SPLZFSTAG:-}
 
     # The files expect a kver to be set to the kernel version .
@@ -1062,7 +1005,7 @@ build_spl_zfs() {
 
         local rpmpkg
 
-        [ "$pkg" == "zfs" ] && spldir="$(ls -d $TOPDIR/usr/src/spl-*/|tail -1)"
+        [ "$pkg" == "zfs" ] && spldir="$(ls -d $TOPDIR/usr/src/spl-*|tail -1)"
 
         # need to fetch the repo in order to build it.
         # default to github but allow override
@@ -1115,8 +1058,9 @@ build_spl_zfs() {
         # Manually build rpms
         for spec in $speclist; do
             echo "Building RPMs from $pkg/$specdir/$spec"
-            if ! $RPMBUILD $rpmb $pkg/$specdir/$spec \
+            if ! rpmbuild $rpmb $pkg/$specdir/$spec \
                 --nodeps -v \
+                --define "_use_internal_dependency_generator 0" \
                 --define "require_kdir ${LINUX}" \
                 ${LINUXOBJ:+--define "require_kobj ${LINUXOBJ}"} \
                 ${spldir:+--define "require_spldir ${spldir}"} \
@@ -1157,7 +1101,7 @@ build_spl_zfs() {
         fi
         popd
 
-        CONFIGURE_FLAGS="--with-$pkg=$(ls -d $TOPDIR/usr/src/$pkg-*/|tail -1) ${CONFIGURE_FLAGS}"
+        CONFIGURE_FLAGS="--with-$pkg=$(ls -d $TOPDIR/usr/src/$pkg-*|tail -1) ${CONFIGURE_FLAGS}"
         CONFIGURE_FLAGS="--with-$pkg-obj=$(ls -d $TOPDIR/usr/src/$pkg-*/$kver*|tail -1) ${CONFIGURE_FLAGS}"
     done
 
@@ -1166,34 +1110,6 @@ build_spl_zfs() {
     return 0
 }
 
-prepare_mpss() {
-
-    pushd mpss >/dev/null || return 255
-    if [ "$MPSS_MAJ" = "3" ]; then
-        cp -f ../boot/config-* .config
-        if ! make ARCH=k1om silentoldconfig ; then
-            popd >/dev/null
-            return 1
-        fi
-        if ! make ARCH=k1om modules_prepare ; then
-            popd >/dev/null
-            return 1
-        fi
-        cp -f ../boot/Module.symvers-* Module.symvers
-    else
-        if ! make defconfig-miclinux; then
-            popd >/dev/null
-            return 1
-        fi
-        if ! make -C card/kernel ARCH=k1om modules_prepare ; then
-            popd >/dev/null
-            return 1
-        fi
-    fi
-    popd >/dev/null
-
-}
-
 stage() {
 
     [ "$STAGEDIR" ] || return 0
@@ -1202,10 +1118,9 @@ stage() {
         rpmdir="${STAGEDIR}/${CANONICAL_TARGET}-${arch}"
         echo "${0##*/}: Copying RPMs into ${rpmdir}"
         mkdir -p "${rpmdir}"
-        cp -v RPMS/${arch}/*.rpm "${rpmdir}"
-        if [ -d RPMS/noarch ]; then
-            cp -v RPMS/noarch/*.rpm "${rpmdir}"
-        fi
+        for rpm in $(ls RPMS/${arch}/*.rpm RPMS/noarch/*.rpm); do
+            cp -v $rpm "${rpmdir}"
+        done
     done
 
     cp -v "$LUSTRE" "$STAGEDIR"
@@ -1296,22 +1211,25 @@ build_kernel_ib() {
     local linux="$1"
     local kib_prefix="$2"
     local kib_rpm="$3"
+    local ofed_type="${4}"
+    local ofed_version="${5}"
 
     # build kernel-ib{,-devel}/compat-rdma{,-devel}
     local K_SRC="K_SRC"
-    # ofed 1.3 had a bug in the rpm spec
-    if [ "$OFED_VERSION" = "1.3" ]; then
-        K_SRC="KSRC"
-    fi
 
-    local OFED_CORE="--with-core-mod --with-ipoib-mod --with-user_mad-mod --with-user_access-mod --with-addr_trans-mod"
-    local OFED_HARDWARE="--with-mthca-mod --with-mlx4-mod --with-mlx4_en-mod --with-cxgb3-mod --with-nes-mod --with-qib-mod"
+       local OFED_CORE="--with-core-mod --with-ipoib-mod --with-user_mad-mod \
+       --with-user_access-mod --with-addr_trans-mod --with-madeye-mod"
+       local OFED_HARDWARE="--with-mthca-mod --with-mlx4-mod \
+       --with-mlx4_en-mod --with-cxgb3-mod --with-mlx4_en-mod \
+       --with-cxgb3-mod --with-nes-mod --with-mlx5-mod --with-cxgb4-mod \
+       --with-qib-mod"
 
-    if compare_version $OFED_VERSION 3.0; then
-       OFED_CORE="$OFED_CORE --with-madeye-mod --with-rds-mod"
-    else
-       OFED_HARDWARE="$OFED_HARDWARE --with-mlx5-mod --with-cxgb4-mod --with-ocrdma-mod --with-qib-mod"
-    fi
+       # Removing the check for older version support
+       #if compare_version $OFED_VERSION 3.0; then
+       #OFED_CORE="$OFED_CORE --with-madeye-mod --with-rds-mod"
+       #else
+       #OFED_HARDWARE="$OFED_HARDWARE --with-mlx5-mod --with-cxgb4-mod --with-ocrdma-mod --with-qib-mod"
+       #fi
 
     # some I/B drivers are architecture dependent and kernel-ib's configure
     # does not figure it out for us ~sigh~
@@ -1378,20 +1296,35 @@ EOF
     fi
 
     local linuxrelease=$(find_linux_release)
-    if compare_version $OFED_VERSION 3.0; then
-        local OFA_KERNEL_RELEASE=$(echo -n ${linuxrelease} | sed -e 's/-/_/g')
-    fi
-    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}" \
-                  --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 ${kib_rpm}"
-    fi
+       # a place to change/add any unique config
+       case $ofed_type in
+               ofa|ifs) local K_SRC_OBJ="K_SRC_OBJ"
+               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}" \
+                       ${K_SRC_OBJ:+--define "$K_SRC_OBJ ${linux}"} \
+                       ${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 ${kib_rpm}"
+               fi
+               ;;
+               mlnx)
+               if ! $RPMBUILD $BUILD_TYPE \
+                       ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
+                       --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
+                       --define "KVERSION ${linuxrelease}" \
+                       --define "$K_SRC ${linux}" \
+                       ${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 ${kib_rpm}"
+               fi
+               ;;
+       esac
 
 }
 
@@ -1542,7 +1475,8 @@ build_kernel_with_srpm() {
         local REUSE_SIGNATURE=$({ echo -en $release_str;
                                   echo $BUILD_GEN;
                                   cat "$CONFIG_FILE";
-                                  cat "$TARGET_FILE";
+                                  cat "$TARGET_FILE" |
+                                  sed -e '/_VERSION=/s/_[0-9]*_g.*$//g';
                                   cat "$FULL_PATCH";
                                   cat "$LBUILD_DIR/lbuild";
                                   cat "$LBUILD_DIR/lbuild-$DISTROMAJ"; } |
@@ -1564,10 +1498,8 @@ build_kernel_with_srpm() {
     if ! $USE_BUILD_CACHE || ! reuse kernel "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
                                    "$REUSE_SIGNATURE"; then
         # nothing cached, build from scratch
-        if [ ! -r "$KERNELDIR/$KERNEL_SRPM" ]; then
-            echo "Downloading kernel SRPM" >&${outfd}
-            download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM" >&${outfd}
-        fi
+       echo "Downloading kernel SRPM" >&${outfd}
+       download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM" >&${outfd}
 
         if ! rpm -ivh $KERNELDIR/$KERNEL_SRPM \
                   --define "_topdir $TOPDIR" >&${outfd} 2>&1; then
@@ -1622,16 +1554,14 @@ build_kernel_with_srpm() {
 #    CONFIGURE_FLAGS
 
 build_ofed() {
-    local linux="$1"
-    local ofed_version="$2"
-    local kib_prefix
-    local kib_rpm
-
-    # 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
+       local linux="$1"
+       local ofed_type="$2"
+       local ofed_version="$3"
+       local kib_prefix
+       local kib_rpm
+       local pre_prefix
+       local o2ib_location
+       local rpm
 
     if [ "$ofed_version" = "inkernel" ]; then
         # see if there is a distro specific override for this and use
@@ -1648,13 +1578,24 @@ build_ofed() {
         else
             return 0
         fi
-    elif compare_version $OFED_VERSION 3.0; then
-       kib_prefix="ofa_kernel"
-       kib_rpm="kernel-ib"
-    else
-       kib_prefix="compat-rdma"
-       kib_rpm="compat-rdma"
-    fi
+       else
+               case $ofed_type in
+                       mlnx) # no compat-rdma for mlnx as of 3.1
+                               kib_prefix="ofa_kernel"
+                               pre_prefix="mlnx-"
+                               kib_rpm="${pre_prefix}${kib_prefix}"
+                               ;;
+                       ofa|ifs)
+                               if compare_version $ofed_version 3.0; then
+                                       kib_prefix="ofa_kernel"
+                                       kib_rpm="${pre_prefix}${kib_prefix}"
+                               else
+                                       kib_prefix="compat-rdma"
+                                       kib_rpm="compat-rdma"
+                               fi
+                               ;;
+               esac
+       fi
 
     # build kernel-ib/compat-rdma
     if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
@@ -1691,7 +1632,7 @@ build_ofed() {
             create_rpmbuild_dirs
         fi
         # build it
-        build_kernel_ib "${linux}" "${kib_prefix}" "${kib_rpm}"
+       build_kernel_ib "${linux}" "${pre_prefix}${kib_prefix}" "${kib_rpm}" "${ofed_type}"
 
         if [ -z "$REUSE_SIGNATURE" ]; then
             echo "No reuse signature was caculated so not storing the built ofed"
@@ -1714,31 +1655,42 @@ build_ofed() {
     rm -rf ${kib_rpm}-devel
     mkdir ${kib_rpm}-devel
     cd ${kib_rpm}-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)
-    #ofed_version=$(echo $ofed_version |
-    #               sed -re 's/-(20[0-9]{6,6}-[0-9]{4,4}|rc[0-9]*)$//')
-    # FIXME
-    # OFED version will have 'hyphen' for minor release. (e.g. 3.5-1, instead
-    # of 3.5.1) compat-rdma and compat-rdma-devel could have same version
-    # number, but currectly not. Once OFED fix this in the future release, we
-    # can remove following filter.
-    #ofed_version=$(echo $ofed_version |
-    #               sed -re 's/-([0-9]*-[rR][cC][0-9]*)$//')
-    #local rpm=$(ls $TOPDIR/RPMS/*/${kib_rpm}-devel-${ofed_version}-${linuxrelease//-/_}.*.rpm)
-    # I dont' know why we have gone through the trouble to filter out the name
-    # of the rpm there should only be one ${kib_rpm}-devel built
-    local rpm=$(ls $TOPDIR/RPMS/*/${kib_rpm}-devel-*.rpm)
-    if ! rpm2cpio < $rpm | cpio -id; then
-        fatal 1 "could not unpack the ${kib_rpm}-devel rpm."
-    fi
-    CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/${kib_prefix} ${CONFIGURE_FLAGS}"
-    popd >/dev/null
+
+       o2ib_location="$(pwd)/usr/src/${kib_prefix}"
+       case $ofed_type in
+               mlnx) # Prior to MOFED 3.1, we had to use build_kernel_ib=1 to
+                     # build devel rpm. not so after 3.1
+                       if compare_version $ofed_version 3.0; then
+                               rpm=$(ls $TOPDIR/RPMS/*/kernel-ib-devel-${ofed_version%%-*}-*.rpm)
+                       else
+                               rpm=$(ls $TOPDIR/RPMS/*/${kib_rpm}-devel-${ofed_version%%-*}-*.rpm)
+                       fi
+                       o2ib_location="${o2ib_location}/default"
+                       ;;
+               ofa) # Prior to OFA 3.18, we had to use build_kernel_ib=1 during configure,
+                    # not so after 3.18
+                       if compare_version $ofed_version 3.18; then
+                               rpm=$(ls $TOPDIR/RPMS/*/kernel-ib-devel-${ofed_version%%-*}-*.rpm)
+                       else
+                               rpm=$(ls $TOPDIR/RPMS/*/${kib_rpm}-devel-${ofed_version%%-*}-*.rpm)
+                       fi
+                       ;;
+               ifs) # ifs doesn't follow any convention (if any)
+                       rpm=$(ls $TOPDIR/RPMS/*/${kib_rpm}-devel-*.rpm)
+                       ;;
+       esac
+
+       if ! rpm2cpio < $rpm | cpio -id; then
+               fatal 1 "could not unpack the $rpm."
+       fi
+       CONFIGURE_FLAGS="--with-o2ib=${o2ib_location} ${CONFIGURE_FLAGS}"
+       popd >/dev/null
 
 }
 
 build_with_srpm() {
+       local ofed_type="$1"
+       local ofed_version="$2"
 
     if ! $PATCHLESS; then
         local kernel_extra_version
@@ -1774,7 +1726,7 @@ build_with_srpm() {
     # 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"
+    export FIND_REQUIRES="$(pwd)/find-requires"
     chmod 755 {symset-table,find-requires{,.ksyms}}
     local tmp="$(pwd)"
     tmp="${tmp//\//\\/}"
@@ -1791,6 +1743,7 @@ EOF
 set -x
 .
 g/\/.*\/\(symset-table\)/s//$tmp\/\1/g
+g/\(\/usr\/src\/kernels\/\)/s//$tmp\/reused\1/g
 wq
 EOF
     ed symset-table <<EOF
@@ -1802,7 +1755,7 @@ g/\(\/usr\/src\/kernels\/\)/s//$tmp\/reused\1/g
 wq
 EOF
 
-    build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
+       build_ofed "${LINUXOBJ:-$LINUX}" "$ofed_type" "$ofed_version" ||
         fatal 1 "error building OFED"
 
     # now build Lustre
@@ -1963,7 +1916,7 @@ set -E
 
 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
 
-options=$(getopt -o D:h -l kerneltree:,distro:,kernelrpm:,reusebuild:,patchless,ccache,norpm,external-patches:,timestamp:,extraversion:,kerneldir:,linux:,lustre:,nodownload,nosrc,noiokit,ofed-version:,mpss-version:,publish,disable-zfs,release,set-value:,src,stage:,target:,target-archs:,with-linux:,xen -- "$@")
+options=$(getopt -o D:h -l kerneltree:,distro:,kernelrpm:,reusebuild:,patchless,ccache,norpm,external-patches:,timestamp:,extraversion:,kerneldir:,linux:,lustre:,nodownload,nosrc,noiokit,ofed-type:,ofed-version:,mlnx-version:,ofed-src:,publish,disable-zfs,release,set-value:,src,stage:,target:,target-archs:,with-linux:,xen -- "$@")
 
 if [ $? != 0 ]; then
     usage 1
@@ -2022,7 +1975,6 @@ while [ "$1" ]; do
             shift 2
             ;;
         --norpm)
-            NORPM=true
             shift
             ;;
         --noiokit)
@@ -2061,10 +2013,14 @@ while [ "$1" ]; do
             OFED_VERSION="$2"
             shift 2
             ;;
-        --mpss-version)
-            MPSS_VERSION="$2"
-            shift 2
-            ;;
+       --ofed-type)
+               OFED_TYPE="$2"
+               shift 2
+               ;;
+       --ofed-src)
+               OFED_SRC="$2"
+               shift 2
+               ;;
         --publish)
             shift
             ;;
@@ -2120,80 +2076,12 @@ 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 -n -e 's/^BUILDID = //p' lustre/META)
-
 load_target
 
-if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
-    download_ofed
-    unpack_ofed || fatal 1 "Error unpacking OFED tarball"
-fi
-
-if [ -n "$MPSS_VERSION" ]; then
-    [ -z "$MPSS_DISTRO" ] && MPSS_DISTRO=$(autodetect_distro)
-
-    MPSS_INFO=$(mktemp -u mpss-info-XXXXXXXXXX.html)
-    download_mpss_info "$MPSS_INFO"
-
-    if [ "$MPSS_VERSION" = "last" ]; then
-        MPSS_VERSION=$(parse_mpss_info "$MPSS_INFO" "" ${MPSS_DISTRO})
-        [ -z "$MPSS_VERSION" ] &&
-            fatal 1 "Could not determine the last MPSS version"
-    fi
-
-    MPSS_MAJ=${MPSS_VERSION%%.*}
-    MPSS_VER=${MPSS_VERSION%%-*}
-    MPSS_BLD=${MPSS_VERSION##*-}
-    [ "$MPSS_VER" = "$MPSS_BLD" ] && MPSS_BLD=0
-
-    download_mpss "$MPSS_INFO"
-    [ -r "$MPSS_INFO" ] && rm -f "$MPSS_INFO"
-    echo "Building with MPSS $MPSS_VER-$MPSS_BLD"
-    unpack_mpss  || fatal 1 "Error unpacking MPSS tarballs"
-    prepare_mpss || fatal 1 "Error preparing MPSS for kernel modules build"
-
-    if [ -z "$MPSS_OFED" ]; then
-        MPSS_OFED=$(find $PWD -type f -path "*/ofed-driver*/Module.symvers" -print -quit)
-        if [ -n "$MPSS_OFED" ]; then
-            MPSS_OFED="--with-o2ib=$(dirname $MPSS_OFED)"
-        else
-            MPSS_OFED="--without-o2ib"
-        fi
-    fi
-
-    # disable unsupported parts:
-    PATCHLESS=true
-    IOKITRPM=false
-    LDISKFSRPM=false
-    WITH_ZFS="no"
-
-    # define variables for cross compilation:
-    CROSS_SUFFIX="-mic"
-    if [ "$MPSS_MAJ" = "3" ]; then
-        CC_TARGET_ARCH=k1om-mpss-linux
-        LINUX="$TOPDIR/mpss"
-        RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"cross_requires /bin/sh\""
-    else
-        CC_TARGET_ARCH=x86_64-k1om-linux
-        LINUX="$TOPDIR/mpss/card/kernel"
-        RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"cross_requires intel-mic-gpl = $MPSS_VER\""
-    fi
-    LUSTRE_VERSION=$(sed -n -e 's/^VERSION = //p' lustre/META)
-    CONFIGURE_FLAGS="$CONFIGURE_FLAGS $MPSS_OFED --host=$CC_TARGET_ARCH --build=x86_64-pc-linux"
-    RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"post_script build/gen_filelist.sh\""
-    RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"make_args ARCH=k1om CROSS_COMPILE=${CC_TARGET_ARCH}-\""
-    RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"cross_path ${CROSS_PATH:=/opt/lustre/${LUSTRE_VERSION}/${CC_TARGET_ARCH}}\""
-    RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"rootdir %{cross_path}\""
-    RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"_prefix %{cross_path}/usr\""
-    RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"_mandir %{_prefix}/share/man\""
-    RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"_sysconfdir %{cross_path}/etc\""
-    RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"kmoddir extra\""
-
-    # redefine CC for proper ./configure during rpmbuild
-    export CC=${CC_TARGET_ARCH}-gcc
-fi
+       if [ -n "$OFED_TYPE" -a "$OFED_TYPE" != "inkernel" ]; then
+               download_ofed "$OFED_TYPE" "$OFED_VERSION"
+               unpack_ofed "$OFED_TYPE" "$OFED_VERSION" || fatal 1 "Error unpacking OFED tarball"
+       fi
 
 # make sure the RPM build environment is set up
 create_rpmbuild_dirs
@@ -2204,7 +2092,7 @@ if [ -n "$LINUX" ]; then
     find_linux_release() {
         _find_linux_release $LINUX
     }
-    build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
+       build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_TYPE" "$OFED_VERSION" ||
         fatal 1 "error building OFED"
     build_lustre "$LINUX" "$LINUXOBJ"
 else
@@ -2212,7 +2100,7 @@ else
         fatal 1 "${LBUILD_DIR}/lbuild-$DISTROMAJ not found"
     fi
     source ${LBUILD_DIR}/lbuild-$DISTROMAJ
-    build_with_srpm || fatal 1 "Failed to build_with_srpm"
+       build_with_srpm "$OFED_TYPE" "$OFED_VERSION" || fatal 1 "Failed to build_with_srpm"
 fi
 
 stage