Whamcloud - gitweb
LU-717 ldiskfs: MRP-222 Replace sysname with nodename in MMP
[fs/lustre-release.git] / build / lbuild
index fd97a12..3abf846 100755 (executable)
@@ -17,6 +17,7 @@ shopt -s extdebug
 
 # include the exit_traps library
 . ${0%/lbuild}/exit_traps.sh
+. ${0%/lbuild}/funcs.sh
 
 # our children should die when we do
 push_exit_trap "kill -INT -$$ || true" kill_children
@@ -26,7 +27,8 @@ push_exit_trap "kill -INT -$$ || true" kill_children
 #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
+#BUILD_GEN=4   # bz22281: use the git hash in the kernel extra version
+BUILD_GEN=5    # TT-107: don't cache the BUILD dir
 
 TOPDIR=$PWD
 
@@ -44,9 +46,10 @@ DOWNLOAD=true
 TAG=
 CANONICAL_TARGET=
 TARGET=
-TARGET_ARCH=$(uname -m)
-TARGET_ARCHS=
-TARGET_ARCHS_ALL=$TARGET_ARCH
+TARGET_ARCH="$(uname -m)"
+# change default behavior to only build for the current arch
+TARGET_ARCHS="$TARGET_ARCH"
+TARGET_ARCHS_ALL="$TARGET_ARCH"
 [ "$TARGET_ARCH" = "i686" ] && TARGET_ARCHS_ALL="i686 i586 i386"
 CONFIGURE_FLAGS=
 EXTERNAL_PATCHES=
@@ -73,6 +76,8 @@ DISTRO=
 KERNELTREE=
 # default to not adding -lustre- into the kernel RPM package names
 KERNEL_LUSTRE_NAMING=false
+# default not use kabi check.
+USE_KABI=false
 
 # patchless build
 KERNELRPMSBASE=
@@ -116,26 +121,6 @@ readlink() {
     fi
 }
 
-cleanup() {
-
-    true
-}
-
-error() {
-    local msg="$1"
-
-    [ -n "$msg" ] && echo -e "\n${0##*/}: $msg" >&3
-
-}
-
-fatal() {
-
-    cleanup
-    error "$2"
-    exit $1
-
-}
-
 usage() {
     cat <<EOF
 Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
@@ -296,6 +281,8 @@ check_options() {
             usage 1 "A branch/tag name must be specified with --tag when not building from a tarball."
     fi
 
+    [ -z "$DISTRO" ] && DISTRO=$(autodetect_distro)
+
     if [ -z "$LINUX" ]; then
         [ "$KERNELDIR" -o "$KERNELTREE" ] || \
             usage 1 "A kernel directory must be specified with --kerneldir or --kerneltree."
@@ -308,13 +295,16 @@ check_options() {
                 usage 1 "When building a snapshot, a tag name must be used."
         fi
 
-        [ "$TARGET" ] || usage 1 "A target must be specified with --target."
+        [ "$TARGET" ] || TARGET=$(autodetect_target "$DISTRO")
 #       TARGET_FILE="$TOPDIR/lustre/kernel_patches/targets/$TARGET.target"
 #       [ -r "$TARGET_FILE" ] || \
 #               usage 1 "Target '$TARGET' was not found."
     fi
 
     case $TARGET in
+        2.6-rhel6)
+            CANONICAL_TARGET="rhel6"
+            ;;
         2.6-rhel5)
             CANONICAL_TARGET="rhel5"
             ;;
@@ -391,39 +381,34 @@ check_options() {
         fi
     fi
 
-    [ -z "$DISTRO" ] && DISTRO=$(autodetect_distro)
-
     return 0
 
 }
 
-# autodetect used Distro
-autodetect_distro() {
-
-    local name
-    local version
-
-    if [ -f /etc/SuSE-release ]; then
-        name=sles
-        version=$(grep ^VERSION /etc/SuSE-release)
-        version=${version#*= }
-    elif [ -f /etc/redhat-release ]; then
-        name=$(head -1 /etc/redhat-release)
-        version=$(echo "$distroname" |
-                  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.\nEither update autodetect_distro() or use the --distro argument"
-    fi
+uniqify() {
 
-    echo ${name}${version}
-    return 0
+    echo $(echo "$*" | xargs -n 1 | sort -u)
 
 }
 
-uniqify() {
+fetch_url() {
+    local url="$1"
+    local target="$2"
 
-    echo $(echo "$*" | xargs -n 1 | sort -u)
+    local rc=0
+    if which wget >/dev/null 2>&1; then
+        if ! wget -nv "$url" -O "$target"; then
+            rc=${PIPESTATUS[0]}
+        fi
+    elif which curl >/dev/null 2>&1; then
+        if ! curl -L -s -o "$target" "$url"; then
+            rc=${PIPESTATUS[0]}
+        fi
+    else
+        fatal 1 "Could not find either wget or curl to fetch URLs."
+    fi
+
+    return $rc
 
 }
 
@@ -436,11 +421,22 @@ download_srpm() {
        [ ! -s "$KERNELDIR/$srpm" ]; then
         if $DOWNLOAD; then
             local location="http://downloads.lustre.org/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 ! wget -nv "$location/$srpm" -O "$KERNELDIR/$srpm" 2>&1 ||
+            if ! fetch_url "$location/$srpm" "$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."
+                # punt to a distro specific method if it exists
+                if ! type -p download_srpm-$DISTRO; then
+                    fatal 1 "Could not download target $target's kernel SRPM $srpm from $location."
+                else
+                    if ! download_srpm-$DISTRO "$target" "$srpm" "$force"; then
+                        fatal 1 "Could not download target $target's kernel SRPM $srpm using download_srpm-$DISTRO."
+                    fi
+                fi
             fi
         else
             fatal 1 "$srpm not found in directory $KERNELDIR."
@@ -513,7 +509,7 @@ download_file() {
             # 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
+            if ! fetch_url "$from" "$to" || [ ! -s "$to" ]; then
                 # the trap will remove the files via the fatal below
                 fatal 1 "Could not download ${to##*/} from ${from%/*}/."
             fi
@@ -535,7 +531,12 @@ download_ofed() {
         return 0
     fi
 
-    local location="http://www.openfabrics.org/downloads/OFED/ofed-${OFED_VERSION}/"
+    local OFED_BASE_VERSION=$OFED_VERSION
+    if [[ $OFED_VERSION = *.*.*.* ]]; then
+        OFED_BASE_VERSION=${OFED_VERSION%.*}
+    fi
+
+    local location="http://www.openfabrics.org/downloads/OFED/ofed-${OFED_BASE_VERSION}/"
 
     if [[ $OFED_VERSION = daily-* ]]; then
         local Mmv daily
@@ -869,6 +870,20 @@ build_lustre() {
         --define "_topdir $TOPDIR" 2>&1 || \
         fatal 1 "Error building rpms for $BUILD_ARCHS."
 
+    if $DO_SRC; then
+        if ! $RPMBUILD -ts "$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; then
+            popd
+            return 255
+        fi
+    fi
     popd >/dev/null
 
 }
@@ -951,36 +966,6 @@ find_linux_release() {
 
 }
 
-# XXX this needs to be re-written as a wrapper around find_rpm
-#     or just gotten rid of.  :-)
-find_linux_rpm() {
-    local prefix="$1"
-
-    local pathtorpms="${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
-    [ -d $pathtorpms ] || return 255
-
-    local kernelbinaryrpm rpmfile
-    local wanted_kernel="${lnxmaj}${lnxmin}-${lnxrel}"
-
-    local arch ret=1
-    for arch in $TARGET_ARCHS_ALL; do
-        local found_rpm="" rpm
-        for rpm in ${pathtorpms}/${arch}/*.rpm; do
-            if rpm -q --provides -p "$rpm" 2>&3 | grep -q "kernel${prefix} = $wanted_kernel" 2>&3; then
-
-                found_rpm="$rpm"
-                ret=0
-                break
-            fi
-        done
-        [ -f "$found_rpm" ] && break
-    done
-
-    echo "$found_rpm"
-    return $ret
-
-}
-
 # unpack kernel(/source/devel) RPM
 #
 # This function and it's setting of $LINUX and $LINUXOBJ is a total hack that
@@ -1051,7 +1036,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 $(ls ${TOPDIR}/lustre/build/patches/ofed/*); do
+        for file in $(ls ${TOPDIR}/lustre/build/patches/ofed/*.patch); do
             ed_fragment1="$ed_fragment1
 Patch$n: ${file%%*/}"
             ed_fragment2="$ed_fragment2
@@ -1059,6 +1044,11 @@ Patch$n: ${file%%*/}"
             cp $file ${TOPDIR}/SOURCES
             let n=$n+1
         done
+        for file in $(ls ${TOPDIR}/lustre/build/patches/ofed/*.ed); do
+            ed_fragment3="$ed_fragment3
+$(cat $file)"
+            let n=$n+1
+        done
 
         if [ $n -gt 1 ]; then
             ed $SOURCE <<EOF
@@ -1068,6 +1058,7 @@ $ed_fragment1
 /^%setup /a
 $ed_fragment2
 .
+$ed_fragment3
 wq
 EOF
         fi
@@ -1089,45 +1080,60 @@ EOF
 }
 
 store_for_reuse() {
-        local articles="$1"
-        local module="$2"
-        local location="$3"
-        local signature="$4"
-        local use_links="$5"
+    local articles="$1"
+    local module="$2"
+    local location="$3"
+    local signature="$4"
+    local use_links="$5"
 
-        local linkflag=""
-        if $use_links; then
-            linkflag="l"
-        fi
+    local linkflag=""
+    if $use_links; then
+        linkflag="l"
+    fi
 
-        location="$location"/"$signature"/"$module"
-        mkdir -p "$location"
-        # the cleanup script removes any directory that doesn't have a
-        # .lastused, so let's try to prevent that as soon as we can
-        # this solution still slightly racy with the cleanup script
-        # but the race is a lot tighter now
-        touch -t 197001010000 "$location/.lastused"
-        ## use eval/echo here to make sure shell expansions are performed
-        #if ! cp -a${linkflag} $(eval echo $articles) "$location"; then
-        local article
-        for article in $(eval echo $articles); do
-            if ! cp -a${linkflag} "$article" "$location"; then
-                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)} ||
-                    error "failed to clean up a failed cache attempt" \
-                          "in \"$location\" -- manual cleanup will be" \
-                          "necessary"
-                return 1
-            fi
-        done
+    local default_iface=$(/sbin/ip route get 192.1.1.1 | sed -ne 's/.* dev \(.*\)  * src .*/\1/p')
+    if [ -z "$default_iface" ]; then
+        fatal 1 "Failed to determine the default route interface"
+    fi
+    local unique_id=$(/sbin/ip addr show dev $default_iface | sed -ne '/ inet /s/ *inet \(.*\)\/.*/\1/p' | head -1)
+    if [ -z "$unique_id" ]; then
+        fatal 1 "Failed to determine a unique id from interface $default_interface"
+    fi
 
-        # flag the cache as complete (i.e. in case lbuild was previously
-        # interrupted while caching)
-        touch "$location/.lastused"
+    local finallocation="$location"/"$signature"/"$module"
+    location="$location"/"$signature-${unique_id}"/"$module"
+    mkdir -p "$location"
+    # the cleanup script removes any directory that doesn't have a
+    # .lastused, so let's try to prevent that as soon as we can
+    # this solution still slightly racy with the cleanup script
+    # but the race is a lot tighter now
+    touch -t 197001010000 "$location/.lastused"
+    ## use eval/echo here to make sure shell expansions are performed
+    #if ! cp -a${linkflag} $(eval echo $articles) "$location"; then
+    local article
+    for article in $(eval echo $articles); do
+        if ! cp -a${linkflag} "$article" "$location"; then
+            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)} ||
+                error "failed to clean up a failed cache attempt" \
+                      "in \"$location\" -- manual cleanup will be" \
+                      "necessary"
+            return 1
+        fi
+    done
 
-        return 0
+    # flag the cache as complete (i.e. in case lbuild was previously
+    # interrupted while caching)
+    touch "$location/.lastused"
+
+    # put the temporary location into the final location
+    # (last one wins)
+    mkdir -p "${finallocation%/*}"
+    mv "$location" "$finallocation"
+    rmdir "${location%/*}"
+    return 0
 
 }
 
@@ -1198,42 +1204,6 @@ basearch() {
 
 }
 
-#
-# in a given directory, find the first rpm matching given requirements
-#
-find_rpm() {
-    local dir="$1"
-    local match_type="$2"
-    local match="$3"
-
-    pushd "$dir" > /dev/null || \
-        fatal 1 "Unable to chdir to directory \"$dir\" in find_rpm()"
-
-    local file
-    for file in $(ls *.rpm); do
-        if [ ! -f "$file" ]; then
-            continue
-        fi
-        case "$match_type" in
-            provides)
-                # match is any valid ERE (i.e. given to egrep) match
-                if rpm -q --provides -p "$file" 2>&3 | egrep -q "$match"; then
-                    echo "$file"
-                    popd >/dev/null
-                    return 0
-                fi
-                ;;
-            *)
-                popd >/dev/null
-                fatal 1 "Unknown match type \"$match_type\" given to find_rpm()"
-                ;;
-        esac
-    done
-
-    popd >/dev/null
-    return 1
-}
-
 build_kernel_with_srpm() {
     local outfd=$1
 
@@ -1275,7 +1245,7 @@ build_kernel_with_srpm() {
                                    "$REUSE_SIGNATURE"; then
         # nothing cached, build from scratch
         if [ ! -r "$KERNELDIR/$KERNEL_SRPM" ]; then
-            echo "Downloading kernel SRPM"
+            echo "Downloading kernel SRPM" >&${outfd}
             download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM" >&${outfd}
         fi
 
@@ -1296,11 +1266,11 @@ build_kernel_with_srpm() {
         else
             # store the resulting kernel RPM build tree for future use
             echo "Storing the built kernel for future reuse" >&${outfd}
-            if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
+            if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,SRPMS,RPMS}" \
                                  "kernel" "$REUSEBUILD" "$REUSE_SIGNATURE" \
                                  "$CAN_LINK_FOR_REUSE"; then
                 error "Failed to store kernel RPMS for reuse"
-                echo "unknown"
+                echo "unknown" >&${outfd}
                 return 1
             fi
         fi