Whamcloud - gitweb
Disable the stracing of update_oldconfig.
[fs/lustre-release.git] / build / lmake
index c110acf..cb177a2 100755 (executable)
@@ -33,6 +33,7 @@ BOOT_ARCHS=
 JENSEN_ARCHS=
 SMP_ARCHS=
 BIGSMP_ARCHS=
+PSERIES64_ARCHS=
 UP_ARCHS=
 
 RHBUILD=0
@@ -44,6 +45,7 @@ TARGET_FILE=
 KERNEL_FILE=
 SERIES_FILE=
 CONFIG_FILE=
+RPMBUILD=
 
 canon()
 {
@@ -51,7 +53,24 @@ canon()
     echo $PWD
     popd >/dev/null
 }
-TOPDIR=$(canon "${0%%${0##*/}}/..")
+TOPDIR="${0%%${0##*/}}"
+if [ "${TOPDIR}" ] ; then
+    TOPDIR=$(canon "${TOPDIR}/..")
+else
+    TOPDIR=$(canon "..")
+fi
+
+lbuild_topdir()
+{
+    retdir=$TOPDIR
+    while [ ! -d $retdir/BUILD ] ; do
+       retdir=$(canon "$retdir/..")
+       if [ "$retdir" = "/" ] ; then
+           break;
+       fi
+    done
+    echo "$retdir"
+}
 
 cleanup()
 {
@@ -178,11 +197,23 @@ check_options()
     if [ -z "$JOBS" -o "$JOBS" -lt "1" ] ; then
        JOBS=1
     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
+    fi
 }
 
 get_lustre_version()
 {
-    lustre_patch=$(grep lustre_version "$SERIES_FILE" 2>/dev/null)
+    for series in $SERIES ; do
+       SERIES_FILE="$TOPDIR/lustre/kernel_patches/series/$series"
+       lustre_patch=$(grep lustre_version "$SERIES_FILE" 2>/dev/null)
+       [ "$lustre_patch" ] && break
+    done
     [ "$lustre_patch" ] || \
        fatal 1 "Could not determine Lustre version from $SERIES series."
 
@@ -208,10 +239,12 @@ load_target()
            fatal 1 "Target $TARGET's kernel file $KERNEL not found in kernel directory $KERNELDIR."
     fi
 
-    if [ "$SERIES" ]; then
-        SERIES_FILE="$TOPDIR/lustre/kernel_patches/series/$SERIES"
-        [ -r "$SERIES_FILE" ] || \
-           fatal 1 "Target $TARGET's series $SERIES missing from $TOPDIR/lustre/kernel_patches/series."
+    if [ "$SERIES" ] ; then
+       for series in $SERIES ; do
+           SERIES_FILE="$TOPDIR/lustre/kernel_patches/series/$series"
+           [ -r "$SERIES_FILE" ] || \
+               fatal 1 "Target $TARGET's series $SERIES missing from $TOPDIR/lustre/kernel_patches/series."
+       done
     fi
 
     TARGET_ARCH=${TARGET_ARCH:-$BASE_ARCHS}
@@ -233,12 +266,15 @@ tarflags()
        '')
            fatal 1 "tarflags(): File name argument missing."
            ;;
-       *.tar.gz)
+       *.tar.gz | *.tgz)
            echo 'zxf'
            ;;
        *.tar.bz2)
            echo 'jxf'
            ;;
+       *.tar)
+           echo 'xf'
+           ;;
        *)
            fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
            ;;
@@ -270,15 +306,18 @@ patch_kernel()
     (( $UNPACK_KERNEL )) || return 0
     [ "$SERIES" ] || return 0
     pushd "$TOPDIR/linux" >/dev/null
-    echo -n "Applying patch"
-    for patch in $(<"$SERIES_FILE") ; do
-       PATCH_FILE="$TOPDIR/lustre/kernel_patches/patches/$patch"
-       [ -r "$PATCH_FILE" ] || \
-           fatal 1 "Patch file not found: $patch"
-       echo -n " $patch"
-       patch -s -p1 < "$PATCH_FILE" || fatal 1 "Error applying patch $patch."
+    for series in $SERIES ; do
+       echo -n "Applying series $series:"
+       SERIES_FILE="$TOPDIR/lustre/kernel_patches/series/$series"
+       for patch in $(<"$SERIES_FILE") ; do
+           PATCH_FILE="$TOPDIR/lustre/kernel_patches/patches/$patch"
+           [ -r "$PATCH_FILE" ] || \
+               fatal 1 "Patch file not found: $patch"
+           echo -n " $patch"
+           patch -s -p1 < "$PATCH_FILE" || fatal 1 "Error applying patch $patch."
+       done
+       echo
     done
-    echo
     popd >/dev/null
 }
 
@@ -286,7 +325,7 @@ set_make()
 {
     MAKE="make -s"
     if [ "$CC" ] ; then
-       MAKE="$MAKE CC=$CC"
+       MAKE_CC="CC=$CC"
     fi
     if [ "$ARCH" ] ; then
        MAKE_ARCH="$MAKE ARCH=$ARCH"
@@ -302,6 +341,30 @@ set_make()
     MAKE_J="$MAKE -j $JOBS"
 }
 
+timed_run() {
+    SLEEP_TIME=$1
+    shift
+
+    set -o monitor
+
+    #bash -c "$@" &
+    ("$@") &
+    child_pid=$!
+    
+    (sleep $SLEEP_TIME
+    kill -TERM -$child_pid 2>/dev/null
+    sleep 5
+    kill -KILL -$child_pid 2>/dev/null
+    echo "$1 was killed due to timeout") &
+    dog_pid=$!
+
+    wait $child_pid
+    # status will be set to 143 if the process had to be killed due to timeout
+    status=${PIPESTATUS[0]}
+    kill -KILL -$dog_pid
+    return $status
+}
+
 depend_kernel()
 {
     (( $DEPEND_KERNEL )) || return 0
@@ -312,26 +375,61 @@ depend_kernel()
     echo "Overriding EXTRAVERSION in kernel..."
     perl -p -i -e "s/^EXTRAVERSION.*/EXTRAVERSION = -${EXTRA_VERSION}${TARGET_CONFIG}/" Makefile
     echo "Making depend in $PWD..."
-    $MAKE mrproper || fatal 1 "Error running make mrproper"
+    $MAKE "$MAKE_CC" mrproper || fatal 1 "Error running make mrproper"
+    rm -f rpm-release
     cp "$CONFIG_FILE" .config
-    for oc in oldconfig_nonint silentoldconfig oldconfig ; do
-       if grep -q "$oc" Makefile ; then
-           OLDCONFIG="$oc"
-           break
-       fi
-    done
-    $MAKE $OLDCONFIG || fatal 1 "Error running make oldconfig"
+    # use the expect script to "make oldconfig" and answer the questions for
+    # new items conservatively.  QA will get notified on anything newly added
+    # for them to review and adjust accordingly.
+    local logfile=$(mktemp /tmp/XXXXXX)
+    #timed_run 300 $TOPDIR/build/update_oldconfig $logfile
+    #local RC=${PIPESTATUS[0]}
+    #local RC=$(strace -f -o update_oldconfig.strace bash -c "$TOPDIR/build/update_oldconfig $logfile; echo \$?")
+    $TOPDIR/build/update_oldconfig $logfile
+    local RC=${PIPESTATUS[0]}
+    if [ $RC -eq 143 ]; then
+        fatal 1 "update_oldconfig timed out"
+    elif [ $RC -ne 0 ]; then
+       # dump the log
+        cat $logfile
+        rm -f $logfile
+       if [ -f update_oldconfig.strace ]; then
+           cat update_oldconfig.strace
+           rm -f update_oldconfig.strace
+        fi
+        fatal 1 "update_oldconfig failed: $RC. See log above."
+    fi
+    rm -f $logfile
+    # now notify if resulting .config is different than $CONFIG_FILE
+    local tmpfile=$(mktemp /tmp/XXXXXX)
+    diff -I '^#.*' -u "$CONFIG_FILE" .config >$tmpfile
+    if [ -s $tmpfile ]; then
+        { cat <<EOF
+To: qa@lists.clusterfs.com
+Subject: kernel_config change 
+
+The result of a make oldconfig on file $CONFIG_FILE resulted in a
+difference when compared to .config in the following way:
+
+EOF
+        cat $tmpfile
+        echo -e "\n\nPlease consider updating $CONFIG_FILE."
+       # not sure these are entirely useful.  the above and "patch" are good
+       #echo -e "\nThe entire new .config file:\n"
+        #cat .config
+        } | sendmail -fqa@clusterfs.com -t
+    fi
+    rm -f $tmpfile
     case "$VERSION" in
        2.6*)
-            SYMLINKS="include/asm"
+            $MAKE "$MAKE_CC" include/asm
             ;;
         2.4*)
-           SYMLINKS="symlinks"
+           $MAKE "$MAKE_CC" symlinks
+           $MAKE "$MAKE_CC" dep || fatal 1 "Error running make dep"
            ;;
     esac
-    $MAKE $SYMLINKS
-    $MAKE_J dep || fatal 1 "Error running make dep"
-    $MAKE include/linux/version.h || fatal 1 "Error making include/linux/version.h"
+    $MAKE "$MAKE_CC" include/linux/version.h || fatal 1 "Error making include/linux/version.h"
 }
 
 build_kernel()
@@ -341,22 +439,23 @@ build_kernel()
     echo "Building kernel in $PWD..."
     case "$TARGET_ARCH" in
        i386 | i586 | i686 | athlon | x86_64)
-           $MAKE_J bzImage || fatal 1 "Error making bzImage."
+           $MAKE_J "$MAKE_CC" bzImage || fatal 1 "Error making bzImage."
            ;;
-        ppc | ppc64)
-           $MAKE_J vmlinux || fatal 1 "Error making vmlinux."
+    ia64 | ppc | ppc64)
+           $MAKE_J "$MAKE_CC" vmlinux || fatal 1 "Error making vmlinux."
            ;;
        *)
-           $MAKE_J boot || fatal 1 "Error making boot."
+           $MAKE_J "$MAKE_CC" boot || fatal 1 "Error making boot."
            ;;
     esac
-    $MAKE_J modules || fatal 1 "Error building modules."
+    $MAKE_J "$MAKE_CC" modules || fatal 1 "Error building modules."
 
     popd >/dev/null
 }
 
 configure_lustre()
 {
+    return 0
     (( $BUILD_LUSTRE )) || return 0
     pushd "$TOPDIR" >/dev/null
     [ -f Makefile ] && make -s clean
@@ -370,8 +469,19 @@ build_lustre()
 {
     (( $BUILD_LUSTRE )) || return 0
     set_make
+    FULL_VERSION="${VERSION}-${EXTRA_VERSION}${TARGET_CONFIG}"
     pushd "$TOPDIR" >/dev/null
-    $MAKE_J || fatal 1 "Error building Lustre."
+    sed \
+       -e s^@VERSION@^${LUSTRE_VERSION}^g \
+       -e s^@LINUXRELEASE@^${FULL_VERSION}^g \
+       -e s^@RELEASE@^${FULL_VERSION//-/_}^g \
+       -e s^@ac_configure_args@^"--with-linux=${PWD}/linux ${CONFIGURE_FLAGS}"^g \
+       < build/lustre.spec.in \
+       > build/lustre.spec
+    $RPMBUILD --target ${TARGET_ARCH} -bb build/lustre.spec \
+       --define "_topdir $(lbuild_topdir)" || \
+       fatal 1 "Error building Lustre rpms."
+    # $MAKE_J "$MAKE_CC" || fatal 1 "Error building Lustre."
     popd >/dev/null
 }
 
@@ -390,7 +500,7 @@ install_kernel()
     mkdir -p "$DESTDIR/dev/shm"
     mkdir -p "$DESTDIR/lib/modules/${FULL_VERSION}"
 
-    $MAKE INSTALL_MOD_PATH="$DESTDIR" KERNELRELEASE="$FULL_VERSION" \
+    $MAKE "$MAKE_CC" INSTALL_MOD_PATH="$DESTDIR" KERNELRELEASE="$FULL_VERSION" \
        -s modules_install || \
        fatal 1 "Error installing modules."
 
@@ -432,13 +542,33 @@ install_kernel()
     popd >/dev/null
 }
 
+cleanup_libmodules()
+{
+    (( $INSTALL_LUSTRE )) || return 0
+
+    FULL_VERSION="${VERSION}-${EXTRA_VERSION}${TARGET_CONFIG}"
+    KVERREL="${VERSION}-${EXTRA_VERSION}"
+    i="$DESTDIR/lib/modules/${FULL_VERSION}"
+
+    rm -f $i/build
+    rm -f $i/source
+
+    if (( $LINUX26 )) ; then
+       ln -sf ../../../usr/src/linux-${KVERREL}-obj/${TARGET_ARCH}/${TARGET_CONFIG} $i/build
+       ln -sf ../../../usr/src/linux-${KVERREL} $i/source
+    else
+       ln -sf ../../../usr/src/linux-${KVERREL} $i/build
+    fi
+}
+
 install_lustre()
 {
     (( $INSTALL_LUSTRE )) || return 0
+    return 0
     set_make
     FULL_VERSION="${VERSION}-${EXTRA_VERSION}${TARGET_CONFIG}"
     pushd "$TOPDIR" >/dev/null
-    $MAKE -s install "DESTDIR=$DESTDIR" KERNELRELEASE="$FULL_VERSION" || fatal 1 "Error installing Lustre."
+    $MAKE "$MAKE_CC" -s install "DESTDIR=$DESTDIR" KERNELRELEASE="$FULL_VERSION" || fatal 1 "Error installing Lustre."
     popd >/dev/null
 }
 
@@ -451,11 +581,11 @@ build_kms()
     mkdir -p "${TOPDIR}/modules-${FULL_VERSION}"
     for dir in /usr/src/kernel-modules/* ; do
        # we are replacing lustre-lite, so don't include it
-       if [ ${dir##*/} != "lustre-lite" -a -e $dir/Makefile ]; then
+       if [ "${dir##*/}" != "lustre-lite" -a -e $dir/Makefile ]; then
            build_dir="${TOPDIR}/modules-${FULL_VERSION}/${dir##*/}"
            cp -a $dir $build_dir
            # these modules are terrible, and don't all build
-           $MAKE_J -C $build_dir modules KERNEL_SOURCE="${TOPDIR}/linux"
+           $MAKE_J "$MAKE_CC" -C $build_dir modules KERNEL_SOURCE="${TOPDIR}/linux"
        fi
     done
 }
@@ -470,13 +600,13 @@ symver()
 install_kms()
 {
     (( $INSTALL_KERNEL )) || return 0
-    (( $SUSEBUILD )) || return 0
+    (( $LINUX26 )) || return 0
     set_make
     FULL_VERSION="${VERSION}-${EXTRA_VERSION}${TARGET_CONFIG}"
     for build_dir in "${TOPDIR}/modules-${FULL_VERSION}/*" ; do
        [ -d $build_dir ] || continue
         # these modules are terrible, and don't all build
-       $MAKE -C $build_dir KERNEL_SOURCE="${TOPDIR}/linux" INSTALL_MOD_PATH="$DESTDIR" 
+       $MAKE "$MAKE_CC" -C $build_dir KERNEL_SOURCE="${TOPDIR}/linux" INSTALL_MOD_PATH="$DESTDIR" 
     done
     (   symver vmlinux
        moddir="${DESTDIR}/lib/modules/${FULL_VERSION}"
@@ -495,18 +625,21 @@ install_kms()
 
 save_headers()
 {
-    echo "Saving headers for $1 $2..."
+    (( $SAVE_HEADERS )) || return 0
+
+    echo "Saving headers for ${TARGET_CONFIG:-up} ${TARGET_ARCH}..."
     pushd linux >/dev/null
 
     KVERREL="${VERSION}-${EXTRA_VERSION}"
     # deal with the kernel headers that are version specific
     
-    saveddir="$RPM_BUILD_ROOT/usr/src/linux-${KVERREL}/savedheaders/$2/$1"
+    saveddir="$RPM_BUILD_ROOT/usr/src/linux-${KVERREL}/savedheaders/${TARGET_ARCH}/${TARGET_CONFIG:-up}"
     mkdir -p "$saveddir"
     install -m 644 include/linux/autoconf.h "$saveddir/autoconf.h"
     install -m 644 include/linux/version.h  "$saveddir/version.h"
     mv include/linux/modules "$saveddir/"
-    echo $2 $1 ../../savedheaders/$2/$1/ >>  $RPM_BUILD_ROOT/usr/src/linux-${KVERREL}/savedheaders/list
+    echo ${TARGET_ARCH} ${TARGET_CONFIG} ../../savedheaders/${TARGET_ARCH}/${TARGET_CONFIG:-up}/ \
+       >>  "$RPM_BUILD_ROOT/usr/src/linux-${KVERREL}/savedheaders/list"
     popd >/dev/null
 }
 
@@ -533,6 +666,9 @@ save_all_headers()
     for arch in $BIGSMP_ARCHS ; do
        save_headers bigsmp $arch
     done
+    for arch in $PSERIES64_ARCHS ; do
+       save_headers pseries64 $arch
+    done
     for arch in $UP_ARCHS ; do
        save_headers up $arch
     done
@@ -653,6 +789,8 @@ install_lustre
 
 install_kms
 
-save_all_headers
+cleanup_libmodules
+
+save_headers
 
 exit 0