lmake

来自「lustre 1.6.5 source code」· 代码 · 共 886 行 · 第 1/2 页

TXT
886
字号
#!/bin/sh# option variablesDESTDIR=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=TARGET_CONFIG=JOBS=1CONFIGURE_FLAGS=TMPDIR=${TMPDIR:-"/var/tmp"}# commands to runBUILD_LUSTRE=0BUILD_KERNEL=0DEPEND_KERNEL=0INSTALL_LUSTRE=0INSTALL_KERNEL=0SAVE_HEADERS=0UNPACK_KERNEL=0# provided by target fileKERNEL=SERIES=CONFIG=VERSION=EXTRA_VERSION=BASE_ARCHS=BIGMEM_ARCHS=BOOT_ARCHS=JENSEN_ARCHS=SMP_ARCHS=BIGSMP_ARCHS=PSERIES64_ARCHS=UP_ARCHS=RHBUILD=0SUSEBUILD=0# flat-out globalsTOPDIR=TARGET_FILE=KERNEL_FILE=SERIES_FILE=CONFIG_FILE=RPMBUILD=canon(){    pushd $1 >/dev/null    echo $PWD    popd >/dev/null}TOPDIR="${0%%${0##*/}}"if [ "${TOPDIR}" ] ; then    TOPDIR=$(canon "${TOPDIR}/..")else    TOPDIR=$(canon "..")filbuild_topdir(){    retdir=$TOPDIR    while [ ! -d $retdir/BUILD ] ; do	retdir=$(canon "$retdir/..")	if [ "$retdir" = "/" ] ; then	    break;	fi    done    echo "$retdir"}cleanup(){    true}fatal(){    cleanup    [ "$2" ] && echo    [ "$2" ] && echo "${0##*/}: $2"    exit $1}list_targets(){    echo -n "Available targets:"    for target in $TOPDIR/lustre/kernel_patches/targets/*.target ; do	target_file=${target##*/}	echo -n " ${target_file%%.target}"    done    echo}usage(){    cat <<EOFUsage: ${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, bigsmp, 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/lustre/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    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(){    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."    awk '/^\+#define LUSTRE_KERNEL_VERSION /{ print $3 }' \	"$TOPDIR/lustre/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."# Suse 2.6 has our patches in already#    [ "$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    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}    CONFIG_TARGET="$TARGET-${TARGET_ARCH}${TARGET_CONFIG:+-$TARGET_CONFIG}"    CONFIG_FILE="$TOPDIR/lustre/kernel_patches/kernel_configs/kernel-$VERSION-$CONFIG_TARGET.config"    [ -r "$CONFIG_FILE" ] ||	fatal 1 "Target $TARGET's config file $CONFIG_FILE missing from $TOPDIR/lustre/kernel_patches/configs."    if [ "$EXTRA_VERSION_save" ] ; then	EXTRA_VERSION="$EXTRA_VERSION_save"    else	EXTRA_VERSION="${EXTRA_VERSION}_lustre.$(get_lustre_version)"    fi}# do these after load_target(), which maybe export CCsetup_ccache_distcc(){    # distcc can't handle ".incbin"    if [ "$TARGET" == "2.6-suse" -o "$TARGET" == "2.6-rhel4" ]; then        if [ "$TARGET_ARCH" == "x86_64" ]; then            unset DISTCC        fi    fi        CC=${CC:-gcc}    if [ "$CCACHE" ]; then        CC="$CCACHE $CC"        [ "$DISTCC" ] && export CCACHE_PREFIX="$DISTCC"    else        [ "$DISTCC" ] && CC="$DISTCC $CC"    fi}tarflags(){    case "$1" in	'')	    fatal 1 "tarflags(): File name argument missing."	    ;;	*.tar.gz | *.tgz)	    echo 'zxf'	    ;;	*.tar.bz2)	    echo 'jxf'	    ;;	*.tar)	    echo 'xf'	    ;;	*)	    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    [ "$SERIES" ] || return 0    pushd "$TOPDIR/linux" >/dev/null    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    popd >/dev/null}set_make(){    MAKE="make -s"    if [ "$CC" ] ; then	MAKE_CC="CC=$CC"    fi    if [ "$ARCH" ] ; then	MAKE_ARCH="$MAKE ARCH=$ARCH"    else	case $TARGET_ARCH in	    i?86)                ;;            *)	        MAKE_ARCH="$MAKE ARCH=$TARGET_ARCH"		;;        esac    fi    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    # we need to override $CC at make time, since there is no    # configure    set_make    pushd "$TOPDIR/linux" >/dev/null    echo "Overriding EXTRAVERSION in kernel..."    local extra_version="${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}"    if [ -n "${TARGET_CONFIG}" ]; then	extra_version="${extra_version}${TARGET_DELIMITER}${TARGET_CONFIG}"    fi    perl -p -i -e "s/^EXTRAVERSION.*/EXTRAVERSION = ${extra_version}/" Makefile    echo "Making depend in $PWD..."    $MAKE "$MAKE_CC" mrproper || fatal 1 "Error running make mrproper"    rm -f rpm-release    # remove localversion-* files to avoid kernel release string     # srewing up by the top-level Makefile    rm -f localversion-*    cp "$CONFIG_FILE" .config    local UPDATE_OLDCONFIG=    for oc in oldconfig_nonint silentoldconfig oldconfig ; do                           if grep -q "$oc" Makefile ; then                                                    timed_run 300 $MAKE "$MAKE_CC" $oc || UPDATE_OLDCONFIG=1            break        fi    done    if [ "$UPDATE_OLDCONFIG" ] ; then        # 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]}        #$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    fi    rm -f $logfile    # now notify if resulting .config is different than $CONFIG_FILE    local tmpfile=$(mktemp /tmp/XXXXXX)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?