Whamcloud - gitweb
land v0.9.1 on HEAD, in preparation for a 1.0.x branch
[fs/lustre-release.git] / lustre / scripts / lmake
diff --git a/lustre/scripts/lmake b/lustre/scripts/lmake
new file mode 100755 (executable)
index 0000000..addbe4f
--- /dev/null
@@ -0,0 +1,542 @@
+#!/bin/sh
+
+# option variables
+DESTDIR=
+KERNELDIR=
+TARGET=
+# Not sure what to put here
+# TARGET_ARCH=$(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
+TARGET_ARCH="i386"
+TARGET_CONFIG=
+JOBS=1
+CONFIGURE_FLAGS=
+
+# commands to run
+BUILD_LUSTRE=0
+BUILD_KERNEL=0
+DEPEND_KERNEL=0
+INSTALL_LUSTRE=0
+INSTALL_KERNEL=0
+SAVE_HEADERS=0
+UNPACK_KERNEL=0
+
+# provided by target file
+KERNEL=
+SERIES=
+CONFIG=
+VERSION=
+EXTRA_VERSION=
+
+BASE_ARCH=
+BIGMEM_ARCHS=
+BOOT_ARCHS=
+JENSEN_ARCHS=
+SMP_ARCHS=
+UP_ARCHS=
+
+# flat-out globals
+TOPDIR=
+TARGET_FILE=
+KERNEL_FILE=
+SERIES_FILE=
+CONFIG_FILE=
+CC=${CC:-gcc}
+
+canon()
+{
+    pushd $1 >/dev/null
+    echo $PWD
+    popd >/dev/null
+}
+TOPDIR=$(canon "${0%%${0##*/}}/..")
+
+cleanup()
+{
+    true
+}
+
+fatal()
+{
+    cleanup
+    [ "$2" ] && echo
+    [ "$2" ] && echo "${0##*/}: $2"
+    exit $1
+}
+
+list_targets()
+{
+    echo -n "Available targets:"
+    for target in $TOPDIR/kernel_patches/targets/*.target ; do
+       target_file=${target##*/}
+       echo -n " ${target_file%%.target}"
+    done
+    echo
+}
+
+
+usage()
+{
+    cat <<EOF
+Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
+
+Options:
+
+  --build
+    same as --build-kernel --build-lustre --unpack-kernel
+
+  --build-lustre
+    configure and compile lustre.  Requires that --build-kernel was
+    already run.
+
+  --build-kernel
+    configure and compile a kernel.  Implies --depend-kernel.
+    Requires that --unpack-kernel was already run.
+
+  --depend-kernel)
+    Prepares a kernel tree for building (similar to make mrproper
+    oldconfig dep).  Requires that --unpack-kernel was already run.
+
+  --destdir=DESTDIR
+    Root directory to install into (like DESTDIR with auto*).
+
+  --extraversion=EXTRAVERSION
+    Overrides the target kernel\'s EXTRAVERSION text.
+
+  -h, --help
+    Display this message.
+
+  --install
+    same as --install-kernel --install-lustre
+
+  --install-lustre
+    run make install in the Lustre tree.
+
+  --install-kernel
+    install the kernel image and modules.
+
+  -j jobs
+    This works just like the -j option to make, and is passed to make
+    when building.
+
+  --kerneldir=KERNELDIR
+    Directory containing linux source tarballs.
+
+  --target=TARGET
+    Name of the configuration to use.  The available targets are
+    listed below.
+
+  --target-arch=ARCH
+    Specifies an architecture to use when choosing a kernel config
+    file.  Default is i386.
+
+  --target-config=CONFIG
+    Specifies a special option (such as smp, bigmem, or BOOT) to use
+    when choosing a kernel config file.  This also modifies the kernel
+    version and modules directory.
+
+  --unpack-kernel
+    Untars and patches the kernel source.
+
+  The order that commands (--build-lustre, --unpack-kernel) are
+  specified on the command line is ignored; ${0##*/} will always
+  execute them in the correct order (unpack, then build, then install
+  etc.).
+
+EOF
+    list_targets
+
+    fatal "$1" "$2"
+}
+
+check_options()
+{
+    (( $BUILD_LUSTRE || $BUILD_KERNEL || $DEPEND_KERNEL || \
+           $INSTALL_LUSTRE || $INSTALL_KERNEL || $SAVE_HEADERS || \
+           $UNPACK_KERNEL )) || \
+               fatal 1 "No commands specified."
+
+    if (( $UNPACK_KERNEL )) ; then
+       [ "$KERNELDIR" ] || \
+           fatal 1 "A kernel directory must be specified with --kerneldir."
+       [ -d "$KERNELDIR" ] || \
+           fatal 1 "$KERNELDIR is not a directory."
+    fi
+
+    if (( $INSTALL_LUSTRE || $INSTALL_KERNEL || $SAVE_HEADERS )) ; then
+       [ -z "$DESTDIR" -o -d "$DESTDIR" ] || \
+           fatal 1 "$DESTDIR is not a directory."
+    fi
+
+    [ "$TARGET" ] || usage 1 "A target must be specified with --target."
+    TARGET_FILE="$TOPDIR/kernel_patches/targets/$TARGET.target"
+    [ -r "$TARGET_FILE" ] || \
+       fatal 1 "Target '$TARGET' was not found.  Try --list-targets."
+
+    if [ -z "$JOBS" -o "$JOBS" -lt "1" ] ; then
+       JOBS=1
+    fi
+}
+
+get_lustre_version()
+{
+    lustre_patch=$(grep lustre_version "$SERIES_FILE" 2>/dev/null)
+    [ "$lustre_patch" ] || \
+       fatal 1 "Could not determine Lustre version from $SERIES series."
+
+    awk '/^\+#define LUSTRE_KERNEL_VERSION /{ print $3 }' \
+       "$TOPDIR/kernel_patches/patches/$lustre_patch" 2>/dev/null
+}
+
+load_target()
+{
+    EXTRA_VERSION_save="$EXTRA_VERSION"
+
+    . "$TARGET_FILE"
+
+    [ "$KERNEL" ] || fatal 1 "Target $TARGET did not specify a kernel."
+    [ "$SERIES" ] || fatal 1 "Target $TARGET did not specify a patch series."
+#    [ "$CONFIG" ] || fatal 1 "Target $TARGET did not specify a kernel config."
+    [ "$VERSION" ] || fatal 1 "Target $TARGET did not specify the kernel version."
+    
+    if [ "$KERNELDIR" ] ; then
+       KERNEL_FILE="$KERNELDIR/$KERNEL"
+       [ -r "$KERNELDIR/$KERNEL" ] || \
+           fatal 1 "Target $TARGET's kernel file $KERNEL not found in kernel directory $KERNELDIR."
+    fi
+
+    SERIES_FILE="$TOPDIR/kernel_patches/series/$SERIES"
+    [ -r "$SERIES_FILE" ] || \
+       fatal 1 "Target $TARGET's series $SERIES missing from $TOPDIR/kernel_patches/series."
+
+    CONFIG_TARGET="$TARGET${TARGET_ARCH:+-$TARGET_ARCH}${TARGET_CONFIG:+-$TARGET_CONFIG}"
+    CONFIG_FILE="$TOPDIR/kernel_patches/kernel_configs/kernel-$VERSION-$CONFIG_TARGET.config"
+    [ -r "$CONFIG_FILE" ] || \
+       fatal 1 "Target $TARGET's config file $CONFIG missing from $TOPDIR/kernel_patches/configs."
+
+    if [ "$EXTRA_VERSION_save" ] ; then
+       EXTRA_VERSION="$EXTRA_VERSION_save"
+    else
+       EXTRA_VERSION="${EXTRA_VERSION}_lustre.$(get_lustre_version)"
+    fi
+    EXTRA_VERSION=${EXTRA_VERSION//-/_}
+}
+
+tarflags()
+{
+    case "$1" in
+       '')
+           fatal 1 "tarflags(): File name argument missing."
+           ;;
+       *.tar.gz)
+           echo 'zxf'
+           ;;
+       *.tar.bz2)
+           echo 'jxf'
+           ;;
+       *)
+           fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
+           ;;
+    esac
+}
+
+untar()
+{
+    echo "Untarring ${1##*/}..."
+    tar $(tarflags $1) $1
+}
+
+
+extract_kernel()
+{
+    (( $UNPACK_KERNEL )) || return 0
+    pushd "$TOPDIR" >/dev/null
+    if [ -d linux ] ; then
+       [ -L linux ] && rm -rf $(readlink linux)
+       rm -rf linux
+    fi
+    untar "$KERNEL_FILE"
+    [ -d linux ] || ln -sf linux* linux
+    popd >/dev/null
+}
+
+patch_kernel()
+{
+    (( $UNPACK_KERNEL )) || return 0
+    pushd "$TOPDIR/linux" >/dev/null
+    echo -n "Applying patch"
+    for patch in $(<"$SERIES_FILE") ; do
+       PATCH_FILE="$TOPDIR/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
+    popd >/dev/null
+}
+
+depend_kernel()
+{
+    (( $DEPEND_KERNEL )) || return 0
+    # we need to override $CC at make time, since there is no
+    # configure
+    MAKE="make -s CC=$CC"
+    pushd "$TOPDIR/linux" >/dev/null
+    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"
+    cp "$CONFIG_FILE" .config
+    $MAKE oldconfig_nonint || fatal 1 "Error running make oldconfig"
+    $MAKE -j $JOBS dep || fatal 1 "Error running make dep"
+    $MAKE include/linux/version.h || fatal 1 "Error making include/linux/version.h"
+}
+
+build_kernel()
+{
+    (( $BUILD_KERNEL )) || return 0
+    # we need to override $CC at make time, since there is no
+    # configure
+    MAKE="make -s CC=$CC"
+    echo "Building kernel in $PWD..."
+    case "$TARGET_ARCH" in
+       i386 | i586 | i686 | athlon | x86_64)
+           $MAKE -j $JOBS -s bzImage || fatal 1 "Error making bzImage."
+           ;;
+       *)
+           $MAKE -j $JOBS -s boot || fatal 1 "Error making boot."
+           ;;
+    esac
+    $MAKE -j $JOBS -s modules || fatal 1 "Error building modules."
+
+    popd >/dev/null
+}
+
+configure_lustre()
+{
+    (( $BUILD_LUSTRE )) || return 0
+    pushd "$TOPDIR" >/dev/null
+    [ -f Makefile ] && make -s clean
+    [ -f configure ] || sh ./autogen.sh
+    ./configure --with-linux=$PWD/linux $CONFIGURE_FLAGS || \
+       fatal 1 "Error configuring Lustre."
+    popd >/dev/null
+}
+
+build_lustre()
+{
+    (( $BUILD_LUSTRE )) || return 0
+    pushd "$TOPDIR" >/dev/null
+    make -j $JOBS -s
+    popd >/dev/null
+}
+
+install_kernel()
+{
+    (( $INSTALL_KERNEL )) || return 0
+    FULL_VERSION="${VERSION}-${EXTRA_VERSION}${TARGET_CONFIG}"
+    pushd "$TOPDIR/linux" >/dev/null
+    mkdir -p "$DESTDIR/boot"
+
+    install -m 644 System.map "$DESTDIR/boot/System.map-${FULL_VERSION}"
+    # install -m 644 module-info ...
+    install -m 644 "$CONFIG_FILE" "$DESTDIR/boot/config-${FULL_VERSION}"
+
+    mkdir -p "$DESTDIR/dev/shm"
+
+    case "$TARGET_ARCH" in
+       i386 | i586 | i686 | athlon)
+           cp arch/i386/boot/bzImage "$DESTDIR/boot/vmlinuz-${FULL_VERSION}"
+           cp vmlinux "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
+           ;;
+       x86_64)
+           cp arch/x86_64/boot/bzImage "$DESTDIR/boot/vmlinuz-${FULL_VERSION}"
+           cp vmlinux "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
+           ;;
+       ia64)
+           gzip -cfv vmlinux > vmlinuz
+           mkdir -p "$DESTDIR/boot/efi/redhat"
+           install -m 755 vmlinux "$DESTDIR/boot/efi/redhat/vmlinux-${FULL_VERSION}"
+           install -m 755 vmlinuz "$DESTDIR/boot/efi/redhat/vmlinuz-${FULL_VERSION}"
+           ln -sf "efi/vmlinux-${FULL_VERSION}" "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
+           ln -sf "efi/vmlinuz-${FULL_VERSION}" "$DESTDIR/boot/vmlinuz-${FULL_VERSION}"
+           ;;
+       *)
+           cp vmlinuz "$DESTDIR/boot/vmlinuz-${FULL_VERSION}"
+           cp vmlinux "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
+           ;;
+    esac
+
+    mkdir -p "$DESTDIR/lib/modules/${FULL_VERSION}"
+    make CC="$CC" INSTALL_MOD_PATH="$DESTDIR" KERNELRELEASE="$FULL_VERSION" \
+       -s modules_install || \
+       fatal 1 "Error installing modules."
+
+    popd >/dev/null
+}
+
+install_lustre()
+{
+    (( $INSTALL_LUSTRE )) || return 0
+    FULL_VERSION="${VERSION}-${EXTRA_VERSION}${TARGET_CONFIG}"
+    pushd "$TOPDIR" >/dev/null
+    make -s install "DESTDIR=$DESTDIR" KERNELRELEASE="$FULL_VERSION" || fatal 1 "Error installing Lustre."
+    popd >/dev/null
+}
+
+save_headers()
+{
+    echo "Saving headers for $1 $2..."
+    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"
+    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
+    popd >/dev/null
+}
+
+save_all_headers()
+{
+    (( $SAVE_HEADERS )) || return 0
+
+    for arch in $BIGMEM_ARCHS ; do
+       save_headers bigmem $arch
+    done
+
+    for arch in $BOOT_ARCHS ; do
+       save_headers BOOT $arch
+    done
+
+    for arch in $JENSEN_ARCHS ; do
+       save_headers jensen $arch
+    done
+
+    for arch in $SMP_ARCHS ; do
+       save_headers smp $arch
+    done
+
+    for arch in $UP_ARCHS ; do
+       save_headers up $arch
+    done
+}
+
+longopts="build,build-lustre,build-kernel,depend-kernel,destdir:,extraversion:"
+longopts="$longopts,help,install,install-lustre,install-kernel,kerneldir:"
+longopts="$longopts,save-headers,target:,target-arch:,target-config:,unpack-kernel"
+
+options=$(getopt -o hj: -l "$longopts" -- "$@")
+
+eval set -- "$options"
+    
+while [ "$1" ] ; do
+    case "$1" in
+       '')
+           usage 1
+           ;;
+       --build)
+           BUILD_LUSTRE=1
+           BUILD_KERNEL=1
+           DEPEND_KERNEL=1
+           UNPACK_KERNEL=1
+           shift
+           ;;
+       --build-lustre)
+           BUILD_LUSTRE=1
+           shift
+           ;;
+       --build-kernel)
+           BUILD_KERNEL=1
+           DEPEND_KERNEL=1
+           shift
+           ;;
+       --depend-kernel)
+           DEPEND_KERNEL=1
+           shift
+           ;;
+       --destdir)
+           DESTDIR=$2
+           shift 2
+           ;;
+       --extraversion)
+           EXTRA_VERSION=$2
+           shift 2
+           ;;
+       --help | -h)
+           usage 0
+           ;;
+       --install)
+           INSTALL_LUSTRE=1
+           INSTALL_KERNEL=1
+           shift
+           ;;
+       --install-lustre)
+           INSTALL_LUSTRE=1
+           shift
+           ;;
+       --install-kernel)
+           INSTALL_KERNEL=1
+           shift
+           ;;
+       -j)
+           JOBS=$2
+           shift 2
+           ;;
+       --kerneldir)
+           KERNELDIR=$2
+           shift 2
+           ;;
+       --save-headers)
+           SAVE_HEADERS=1
+           shift
+           ;;
+       --target)
+           TARGET=$2
+           shift 2
+           ;;
+       --target-arch)
+           TARGET_ARCH=$2
+           shift 2
+           ;;
+       --target-config)
+           TARGET_CONFIG=$2
+           shift 2
+           ;;
+       --unpack-kernel)
+           UNPACK_KERNEL=1
+           shift
+           ;;
+       --)
+           shift
+           CONFIGURE_FLAGS=$@
+           break
+           ;; 
+       *)
+           usage 1 "Unrecognized option: $1"
+           ;;
+    esac
+done
+
+check_options
+load_target
+
+extract_kernel
+patch_kernel
+
+depend_kernel
+build_kernel
+
+configure_lustre
+build_lustre
+
+install_kernel
+install_lustre
+
+save_all_headers
+
+exit 0