X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=build%2Flbuild;h=f285ea6e8c177a8242945220bf154690a6446fa9;hp=3e4e0cd056a415789c5f51a374ea251bb1001d83;hb=e5d626bc315e76e4f6d66d57cabfaeb948bce856;hpb=4198da9d8f2298742f22455d23799eec2dcb4fbb diff --git a/build/lbuild b/build/lbuild index 3e4e0cd..f285ea6 100755 --- a/build/lbuild +++ b/build/lbuild @@ -41,7 +41,6 @@ NORPM=false LDISKFSRPM=true SKIPLDISKFSRPM="v1_4_* b1_4" SMPTYPES="smp bigsmp default ''" -KERNCONFSMPTYPE= PATCHLESS=false XEN=false LINUXOBJ= @@ -280,6 +279,9 @@ check_options() { 2.6-sles10) CANONICAL_TARGET="sles10-2.6" ;; + 2.6-sles11) + CANONICAL_TARGET="sles11" + ;; hp_pnnl-2.4) CANONICAL_TARGET="hp-pnnl-2.4" ;; @@ -368,28 +370,39 @@ uniqify() { download_srpm() { local target=$1 local srpm=$2 + local force="${3:-false}" - echo "Downloading http://downloads.lustre.org/public/kernels/$target/old/$srpm..." - if ! wget -nv "http://downloads.lustre.org/public/kernels/$target/old/$srpm" \ - -O "$KERNELDIR/$srpm"; then - fatal 1 "Could not download target $target's kernel SRPM $srpm from downloads.lustre.org." + if $force || [ ! -r "$KERNELDIR/$srpm" ] || + [ ! -s "$KERNELDIR/$srpm" ]; then + if $DOWNLOAD; then + local location="http://downloads.lustre.org/public/kernels/$target/old" + echo "Downloading $location/$srpm..." + if ! wget -nv "$location/$srpm" -O "$KERNELDIR/$srpm" || + [ ! -s "$KERNELDIR/$srpm" ]; then + rm -f $KERNELDIR/$srpm + fatal 1 "Could not download target $target's kernel SRPM" \ + "$srpm from $location." + fi + else + fatal 1 "$srpm not found in directory $KERNELDIR." + fi fi - [ -s "$KERNELDIR/$srpm" ] || { - rm -rf $KERNELDIR/$srpm - fatal 1 "Could not download target $target's kernel SRPM $srpm from downloads.lustre.org." - } } download_ofed() { + local force="${1:-false}" - if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ] && \ - [ ! -r "$KERNELTREE/OFED-${OFED_VERSION}.tgz" ]; then + if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ] && + ( $force || [ ! -r "$KERNELTREE/OFED-${OFED_VERSION}.tgz" ] || + [ ! -s "$KERNELTREE/OFED-${OFED_VERSION}.tgz" ] ); then if $DOWNLOAD; then local location="http://downloads.lustre.org/public/OFED/" echo "Downloading $location/OFED-${OFED_VERSION}.tgz..." if ! wget -nv "$location/OFED-${OFED_VERSION}.tgz" \ - -O "$KERNELTREE/OFED-${OFED_VERSION}.tgz"; then + -O "$KERNELTREE/OFED-${OFED_VERSION}.tgz" || + [ ! -s "$KERNELTREE/OFED-${OFED_VERSION}.tgz" ]; then + rm -f $KERNELTREE/OFED-${OFED_VERSION}.tgz fatal 1 "Could not download OFED-${OFED_VERSION}.tgz" \ "from downloads.lustre.org." fi @@ -451,19 +464,10 @@ load_target() { if $XEN; then XENPOSTFIX="-xen" fi - if [ -f $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET-$TARGET_ARCH.config ]; then - CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET$XENPOSTFIX-$TARGET_ARCH.config" - fi - # figure out our smp kernel type and set the .config if we have one - local smptype - for smptype in $SMPTYPES; do - [ "$smptype" = "''" ] && smptype= - if [ -f $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET-$TARGET_ARCH-${smptype}.config ]; then - CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET$XENPOSTFIX-$TARGET_ARCH-${smptype}.config" - KERNCONFSMPTYPE=$smptype + if [ -f $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET-$TARGET_ARCH.config ]; then + CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET$XENPOSTFIX-$TARGET_ARCH${RPMSMPTYPE:+-}${RPMSMPTYPE}.config" fi - done local lnxrelnew=${lnxrel//-/_} @@ -538,7 +542,9 @@ untar() { unpack_ofed() { - untar "$KERNELTREE/OFED-${OFED_VERSION}.tgz" || fatal 1 "Error unpacking OFED tarball" + if ! untar "$KERNELTREE/OFED-${OFED_VERSION}.tgz"; then + return 1 + fi [ -d OFED ] || ln -sf OFED-[0-9].[0-9]* OFED } @@ -636,6 +642,11 @@ build_lustre() { cp config.log $saved_config chmod a+r $saved_config echo "Saved config.log is at $saved_config" + cat /proc/mounts + ls -l /proc/$$ + pwd + echo "config.log contents:" + cat config.log popd return 255 fi @@ -658,11 +669,15 @@ build_lustre() { echo NORPM mode. Only compiling. fi + # convert the $PATCHLESS boolean to an empty/no-empty boolean + # as silly as this seems, it makes the syntax of the rpmbuild command + # simpler and not need an eval to deal with the quotes in the quotes + local is_patchless="" if $PATCHLESS; then - rpmbuildopt="$rpmbuildopt --define \"lustre_name lustre-client\"" + is_patchless="yes" fi - $RPMBUILD $targets $rpmbuildopt ../lustre.spec \ + ${is_patchless:+--define "lustre_name lustre-client"} \ --define "_tmppath $TMPDIR" \ --define "_topdir $TOPDIR" || \ fatal 1 "Error building rpms for $BUILD_ARCHS." @@ -722,6 +737,7 @@ stage() { done cp -v "$LUSTRE" "$STAGEDIR" + } #check if we need to build separate ldiskfs RPM @@ -746,7 +762,7 @@ skeep_ldiskfs_rpm() { #generate LUSTRE_EXTRA_VERSION from EXTRA_VERSION gen_lustre_version() { - LUSTRE_EXTRA_VERSION="${lnxmaj}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}${TARGET_DELIMITER}${RPMSMPTYPE:-${KERNCONFSMPTYPE:-"smp"}}" + LUSTRE_EXTRA_VERSION="${lnxmaj}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}${TARGET_DELIMITER}${RPMSMPTYPE}" LUSTRE_EXTRA_VERSION=${LUSTRE_EXTRA_VERSION//-/_} } @@ -755,7 +771,7 @@ set_rpm_smp_type() { local infact_arch="${TARGET_ARCH}" - RPMSMPTYPE=default + RPMSMPTYPE="" [ "$infact_arch" == "i586" ] && infact_arch="i686" local smp_type @@ -767,6 +783,10 @@ set_rpm_smp_type() { [ $infact_arch == $smp_type ] && RPMSMPTYPE=bigsmp && break done + for smp_type in $DEFAULT_ARCHS; do + [ $infact_arch == $smp_type ] && RPMSMPTYPE=default && break + done + } # This function takes a linux source pool and digs out the linux release @@ -783,6 +803,8 @@ 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 delimiter=${2:-"-"} @@ -803,7 +825,7 @@ find_linux_rpm() { break fi done - [ -f "$found_rpm" ] && TARGET_ARCH="$arch" && BUILD_ARCHS="$arch" && break + [ -f "$found_rpm" ] && break done echo "$found_rpm" @@ -811,27 +833,53 @@ find_linux_rpm() { } -#unpack kernel(/source/devel) RPM +# unpack kernel(/source/devel) RPM # # This function and it's setting of $LINUX and $LINUXOBJ is a total hack that # needs to completely refactored. It completely ingores that $BUILD_ARCHS may # contain a list of arches for which rpmbuild commands (including the one for # lustre itself) -unpack_linux_rpm() { +unpack_linux_devel_rpm() { local kernelrpm="${1}" + # it's worth noting that neither sles10 nor rhel5 appear to use their + # extra_version delimiter for the dirname under /usr/src, so we could + # probably just get rid of this parameter local delimiter=${2:-"-"} [ -f "$kernelrpm" ] || return 255 - [ -d $TOPDIR/reused ] || mkdir $TOPDIR/reused + [ -d $TOPDIR/reused ] || mkdir $TOPDIR/reused || return 255 pushd $TOPDIR/reused || return 255 + if ! rpm2cpio < "$kernelrpm" | cpio -id > /dev/null 2>&1; then + return 255 + fi + + # call a distro specific hook, if available + if type -p unpack_linux_devel_rpm-$DISTRO; then + unpack_linux_devel_rpm-$DISTRO "$kernelrpm" + fi + + popd + + find_linux_devel_paths $TOPDIR/reused + + return 0 + +} + +# XXX - this rhel/sles goop needs abstracting out into the +# lbuild-{rhel5,sles10} method files +find_linux_devel_paths() { + local path="$1" + local RC=0 - rpm2cpio < "$kernelrpm" | cpio -id > /dev/null 2>&1 - if [ ${PIPESTATUS[0]} -eq 0 ]; then + pushd $path # RHEL-style and SLES-style rpms - local paths="kernels/${lnxmaj}${delimiter}${lnxrel}-${TARGET_ARCH} linux-${lnxmaj}${delimiter}${lnxrel}" + # XXX - until bug 19336 cleans this up, we need to extricate the + # ${lnxmin}- from the $lnxrel + local paths="kernels/${lnxmaj}${lnxmin}${delimiter}${lnxrel}-${TARGET_ARCH} linux-${lnxmaj}${lnxmin}${delimiter}${lnxrel##${lnxmin#.}-}" local path for path in $paths; do @@ -865,9 +913,6 @@ unpack_linux_rpm() { RC=255 fi fi - else - RC=255 - fi popd return $RC } @@ -895,20 +940,12 @@ build_kernel_ib() { --define "KVERSION ${LINUXRELEASE}" \ --define "$K_SRC ${LINUXOBJ:-${LINUX}}" \ --define "LIB_MOD_DIR /lib/modules/${LINUXRELEASE}/updates" \ - --define "configure_options --without-quilt --with-core-mod --with-user_mad-mod --with-user_access-mod --with-addr_trans-mod --with-srp-target-mod --with-core-mod --with-mthca-mod --with-mlx4-mod --with-cxgb3-mod --with-nes-mod --with-ipoib-mod --with-sdp-mod --with-srp-mod --without-srp-target-mod --with-rds-mod --with-iser-mod --with-qlgc_vnic-mod --with-madeye-mod $configure_options" ${TOPDIR}/OFED/SRPMS/ofa_kernel-${OFED_VERSION}-ofed${OFED_VERSION}.src.rpm + --define "configure_options --without-quilt --with-core-mod --with-user_mad-mod --with-user_access-mod --with-addr_trans-mod --with-srp-target-mod --with-core-mod --with-mthca-mod --with-mlx4-mod --with-mlx4_en-mod --with-cxgb3-mod --with-nes-mod --with-ipoib-mod --with-sdp-mod --with-srp-mod --without-srp-target-mod --with-rds-mod --with-iser-mod --with-qlgc_vnic-mod --with-madeye-mod $configure_options" ${TOPDIR}/OFED/SRPMS/ofa_kernel-*.src.rpm if [ ${PIPESTATUS[0]} != 0 ]; then fatal 1 "Error building kernel-ib" fi - pushd "$TOPDIR" >/dev/null - rm -rf kernel-ib-devel - mkdir kernel-ib-devel - cd kernel-ib-devel - local rpm=$(ls $TOPDIR/RPMS/*/kernel-ib-devel-${OFED_VERSION}-${LINUXRELEASE//-/_}.*.rpm) - rpm2cpio -itv < $rpm | cpio -id - CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/ofa_kernel ${CONFIGURE_FLAGS}" - popd >/dev/null } store_for_reuse() { @@ -925,16 +962,31 @@ store_for_reuse() { 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 + # flag the cache as complete (i.e. in case lbuild was previously + # interrupted while caching) + touch "$location/.lastused" + return 0 } @@ -945,9 +997,21 @@ reuse() { local use_links="${3:-false}" local signature="$4" - if [ -n "$REUSEBUILD" ] && [ -d $REUSEBUILD/$signature/$module ]; then + if [ -n "$REUSEBUILD" ] && [ -d "$REUSEBUILD/$signature/$module" ]; then + if [ ! -f "$REUSEBUILD/$signature/$module/.lastused" ]; then + # the .lastused flag is populated at the end of the caching to + # signal that the caching was completeld. if that flag is not + # there, then the cache is invalid (and should be removed in fact) + mv "$REUSEBUILD/$signature/$module"{,-bad-$(date +%s)} || + fatal 1 "failed to clean up a bad cache in location" \ + "\"$REUSEBUILD/$signature/$module\" -- manual cleanup" \ + "will be necessary" + return 1 + fi + # so that we know how stale this entry is touch $REUSEBUILD/$signature/$module/.lastused + if $use_links; then if ls $REUSEBUILD/$signature/$module/* >/dev/null 2>&1; then cp -al $REUSEBUILD/$signature/$module/* $dest/ @@ -997,6 +1061,42 @@ 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); 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" | 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() { # need to generate the patch for this target @@ -1005,7 +1105,7 @@ build_kernel_with_srpm() { # get an md5sum of the kernel patch + config for reuse check # XXX really, there needs to be a signature and a CONFIG_FILE per arch # in BUILD_ARCHS - local REUSE_SIGNATURE=$(cat $CONFIG_FILE $TARGET_FILE $FULL_PATCH | md5sum | cut -d" " -f1) + local REUSE_SIGNATURE=$({ echo $BUILD_GEN; cat $CONFIG_FILE $TARGET_FILE $FULL_PATCH; } | md5sum | cut -d" " -f1) # see if we can link to the reuse pool # XXX - hrm. i'm not convinced this doesn't belong in the reuse "library" @@ -1022,13 +1122,15 @@ build_kernel_with_srpm() { if $REUSERPM && reuse kernel "$TOPDIR" "$CAN_LINK_FOR_REUSE" \ "$REUSE_SIGNATURE"; then # figure out the EXTRA_VERSION of the kernel we are re-using - kernel_extra_version=$(ls $TOPDIR/RPMS/$TARGET_ARCH/kernel-lustre-*${lnxmaj}${EXTRA_VERSION_DELIMITER}${PRISTINE_EXTRA_VERSION}.*.$TARGET_ARCH.rpm) - kernel_extra_version=${kernel_extra_version##*kernel-lustre-*${lnxmaj}${EXTRA_VERSION_DELIMITER}} - kernel_extra_version=${kernel_extra_version%%.$TARGET_ARCH.rpm} + local KERNEL_RPM + if ! KERNEL_RPM=$(find_rpm "$TOPDIR/RPMS/$TARGET_ARCH/" provides "^kernel ="); then + fatal 1 "Failed to find a kernel RPM in $TOPDIR/RPMS/$TARGET_ARCH/" + fi + kernel_extra_version=$(rpm -q --queryformat "%{RELEASE}" -p $TOPDIR/RPMS/$TARGET_ARCH/$KERNEL_RPM) else # nothing cached, build from scratch if [ ! -r "$KERNELDIR/$KERNEL_SRPM" ]; then - download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM" + download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM" >&2 fi rpm -ivh $KERNELDIR/$KERNEL_SRPM --define "_topdir $TOPDIR" >&2 || { @@ -1039,7 +1141,7 @@ build_kernel_with_srpm() { # put the Lustre kernel patch into the RPM build tree cp $FULL_PATCH $TOPDIR/SOURCES/linux-${lnxmaj}-lustre.patch - prepare_and_build_srpm + prepare_and_build_srpm >&2 # store the resulting kernel RPM build tree for future use if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \ @@ -1071,24 +1173,21 @@ build_with_srpm() { if ! kernel_extra_version=$(build_kernel_with_srpm); then fatal 1 "Failed to build the kernel from it's SRPM" fi -#local kernel_extra_version="60-0.33_lustre.1.8.0.50.20090311172757" for arch in $BUILD_ARCHS; do - local kernel_devel_rpm="$TOPDIR/RPMS/$arch/$(devel_kernel_name true)-$lnxmaj$EXTRA_VERSION_DELIMITER$kernel_extra_version.$arch.rpm" + local kernel_devel_rpm + if ! kernel_devel_rpm=$(find_rpm "$TOPDIR/RPMS/$arch/" provides "^$(devel_kernel_name true) ="); then + fatal 1 "Failed to find a kernel development RPM in $TOPDIR/RPMS/$arch/" + fi # install the -devel RPM in preparation for the lustre build - if ! lnxrel="$kernel_extra_version" unpack_linux_rpm \ - $kernel_devel_rpm $EXTRA_VERSION_DELIMITER; then - fatal 1 "Could not find the Linux tree in $kernel_devel_rpm" + # note that the EXTRA_VERSION_DELIMITER is *NOT* used in the + # version of the directory name under /usr/src + if ! lnxrel="$kernel_extra_version" unpack_linux_devel_rpm \ + "$TOPDIR/RPMS/$arch/$kernel_devel_rpm" "-"; then + fatal 1 "Could not find the Linux tree in $TOPDIR/RPMS/$arch/$kernel_devel_rpm" fi - - # XXX - superhack of all superhacks! kernel-lustre-devel doesn't - # have have sources in it, so we need to pull them out of - # the SRPM - # yeah. blech. - cp BUILD/kernel-lustre-${lnxmaj}/linux-${lnxmaj}.$arch/fs/ext3/*.[ch] \ - $TOPDIR/reused/usr/src/kernels/${lnxmaj}${EXTRA_VERSION_DELIMITER}${kernel_extra_version}-${arch}/fs/ext3 done else # need to find and unpack the vendor's own kernel-devel for patchless @@ -1097,8 +1196,7 @@ build_with_srpm() { if ! kernelrpm=$(find_linux_rpm "-$DEVEL_KERNEL_TYPE" ${EXTRA_VERSION_DELIMITER:-"-"}); then fatal 1 "Could not find the kernel-$DEVEL_KERNEL_TYPE RPM in ${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}" fi - if ! lnxrel="$lnxrel" unpack_linux_rpm "$kernelrpm" \ - "${EXTRA_VERSION_DELIMITER:--}"; then + if ! lnxrel="$lnxrel" unpack_linux_devel_rpm "$kernelrpm" "-"; then fatal 1 "Could not find the Linux tree in $kernelrpm" fi fi @@ -1139,6 +1237,19 @@ build_with_srpm() { # put the stuff we stashed away back mv_back fi + + pushd "$TOPDIR" >/dev/null + rm -rf kernel-ib-devel + mkdir kernel-ib-devel + cd kernel-ib-devel + # the actual ofed RPMs don't have the -rc$n or -$date string appened that + # might be present on the file + local ofed_version=$(echo $OFED_VERSION | + sed -re 's/-(20[0-9]{6,6}-[0-9]{4,4}|rc[0-9]*)$//') + local rpm=$(ls $TOPDIR/RPMS/*/kernel-ib-devel-${ofed_version}-${LINUXRELEASE//-/_}.*.rpm) + rpm2cpio -itv < $rpm | cpio -id + CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/ofa_kernel ${CONFIGURE_FLAGS}" + popd >/dev/null fi # now build Lustre @@ -1160,7 +1271,10 @@ build_with_srpm() { fi done popd + else + return 1 fi + } create_rpmbuild_dirs() { @@ -1407,7 +1521,7 @@ EXTRA_VERSION_DELIMITER=${EXTRA_VERSION_DELIMITER:-"-"} if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then download_ofed - unpack_ofed + unpack_ofed || fatal 1 "Error unpacking OFED tarball" fi # make sure the RPM build environment is set up @@ -1436,7 +1550,7 @@ backtrace echo echo "Environment:" set -) | tee >(mail -s "Untrapped error in lbuild on $MACHINENAME" brian@sun.com) >&2' ERR +) | tee >(mail -s "Untrapped error at ${BASH_SOURCE[0]##*/}:${BASH_LINENO[0]} on $HOSTNAME" brian@sun.com) >&2' ERR set -E source ${0%/*}/lbuild-$DISTRO