X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=build%2Flbuild;h=3f4e5cdd6d85b1bcb31cbdba54fae7149b1068cd;hp=99513c5a08293bebe4a5d517ffa685078cb1b5aa;hb=534e706b61114bbb6a462c0b9c911d42a1498f23;hpb=4557e3e767c961e019070253317c1aeeec5e1803 diff --git a/build/lbuild b/build/lbuild index 99513c5..3f4e5cd 100755 --- a/build/lbuild +++ b/build/lbuild @@ -21,6 +21,13 @@ shopt -s extdebug # our children should die when we do push_exit_trap "kill -INT -$$ || true" kill_children +# increment this if you have made a change that should force a new kernel +# to build built +#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 + TOPDIR=$PWD # CVSROOT is inherited from the environment @@ -44,14 +51,16 @@ TARGET_ARCHS_ALL=$TARGET_ARCH CONFIGURE_FLAGS= EXTERNAL_PATCHES= EXTRA_VERSION= -LUSTRE_EXTRA_VERSION= STAGEDIR= TMPDIR=${TMPDIR:-"/var/tmp"} TIMESTAMP= -# XXX - i think these two parameters/arguments/variables need to be -# cleaned up and merged. they effectively do the same thing +# this is a dir to try reuse old kernel RPMs in (although, it seems to be +# unused in any real manner REUSERPM= +# this is the dir that should be used to store reuse products REUSEBUILD= +# should cached products be used or force rebuilding? +USE_BUILD_CACHE=true # what does this do exactly? does it imply no kernel build? NORPM=false LDISKFSRPM=true @@ -83,6 +92,9 @@ UP_ARCHS= # not in the target file any more CONFIG= +# build the lustre-tests rpm? +LUSTRE_TESTS=true + DATE=$(date) USE_DATESTAMP=1 @@ -231,6 +243,9 @@ Usage: ${0##*/} [OPTION]... [-- ] --xen Builds a Xen domX kernel. + --set-value + Set's a variable to a given value. + EOF # list_targets @@ -238,7 +253,22 @@ EOF fatal "$1" "$2" } -# canonicalize a relative path +# canonicalize a relative path to a file +canon_filepath() { + local PATH="$1" + + if [ ! -f "$PATH" ]; then + return 1 + fi + + local FILE=${PATH##*/} + local DIR=${PATH%/*} + + echo $(canon_path "$DIR")/$FILE + return 0 +} + +# canonicalize a relative path to a dir canon_path() { local PATH="$1" @@ -485,7 +515,7 @@ download_file() { touch $semaphore if ! wget -nv "$from" -O "$to" || [ ! -s "$to" ]; then # the trap will remove the files via the fatal below - fatal 1 "Could not download ${to##*/} from ${from%%/*}/." + fatal 1 "Could not download ${to##*/} from ${from%/*}/." fi rm -f $semaphore delete_exit_trap "download" @@ -501,58 +531,30 @@ download_file() { download_ofed() { local force="${1:-false}" - local location="http://downloads.lustre.org/public/OFED/" + if [ -z "$OFED_VERSION" -o "$OFED_VERSION" = "inkernel" ]; then + return 0 + fi + + local location="http://www.openfabrics.org/downloads/OFED/ofed-${OFED_VERSION}/" - local Mmv daily if [[ $OFED_VERSION = daily-* ]]; then + local Mmv daily OFED_VERSION=${OFED_VERSION/daily-/} Mmv=${OFED_VERSION%%-*} daily=${OFED_VERSION##$Mmv-} location="http://www.openfabrics.org/downloads/OFED/ofed-${Mmv}-daily/" # find the filename for the version for the date specified - OFED_VERSION=$(curl -s "$location" | sed -nre "/${daily}-/s/.*href=\"OFED-([0-9]+\.[0-9]+-${daily}-[0-9]{4,4}).tgz.*$/\1/p" | tail -1) + OFED_VERSION=$(curl -s "$location" | sed -nre "/${daily}-/s/.*href=\"OFED-(${Mmv//./\\.}-${daily}-[0-9]{4,4}).tgz.*$/\1/p" | tail -1) if [ -z "$OFED_VERSION" ]; then fatal 1 "Could not determine the filename of the OFED snapshot for ${daily}" fi fi - if [ -z "$OFED_VERSION" -o "$OFED_VERSION" = "inkernel" ]; then - return 0 - fi - local file="OFED-${OFED_VERSION}.tgz" download_file "$location/$file" "$KERNELTREE" "$force" } -download_rdac() { - local force="${1:-false}" - - local location="http://downloads.lustre.org/public/RDAC/" - - if [ -z "$RDAC_VERSION" -o "$RDAC_VERSION" = "inkernel" ]; then - return 0 - fi - - local file="rdac-LINUX-${RDAC_VERSION}-source.tar.gz" - download_file "$location/$file" "$KERNELTREE" "$force" - -} - -download_mptlinux() { - local force="${1:-false}" - - local location="http://downloads.lustre.org/public/MPTLINUX/" - - if [ -z "$MPTLINUX_VERSION" -o "$MPTLINUX_VERSION" = "inkernel" ]; then - return 0 - fi - - file="MPTLINUX_RHEL5_SLES10_PH15-${MPTLINUX_VERSION}.zip" - download_file "$location/$file" "$KERNELTREE" "$force" - -} - load_target() { EXTRA_VERSION_save="$EXTRA_VERSION" @@ -631,11 +633,12 @@ load_target() { elif ! $RELEASE; then # if there is no patch series, then this is not a lustre specific # kernel. don't make it look like one - if [ -n "$SERIES" ]; then - #remove the @VERSION@ (lustre version) -# EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/") + if $PATCHLESS || [ -n "$SERIES" ]; then + EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/") # EXTRA_VERSION="${EXTRA_VERSION}-${TAG}.${TIMESTAMP}" - ! ( $PATCHLESS ) && EXTRA_VERSION="${EXTRA_VERSION}.${TIMESTAMP}" + if ! $PATCHLESS && [ -n "$BUILDID" ]; then + EXTRA_VERSION="${EXTRA_VERSION}.${BUILDID}" + fi fi fi # EXTRA_VERSION=${EXTRA_VERSION//-/_} @@ -677,10 +680,12 @@ tarflags() { } untar() { - local file="$1" + local tarfile="$1" + shift + local extractfile="$@" - echo "Untarring ${file##*/}..." - tar $(tarflags "$file") "$file" + echo "Untarring ${tarfile##*/}..." + tar $(tarflags "$tarfile") "$tarfile" $extractfile } @@ -693,24 +698,6 @@ unpack_ofed() { } -unpack_rdac() { - - if ! untar "$KERNELTREE/rdac-LINUX-${RDAC_VERSION}-source.tar.gz"; then - return 1 - fi - [ -d rdac-LINUX ] || ln -sf rdac-LINUX-[0-9][0-9].* rdac-LINUX - -} - -unpack_mptlinux() { - - if ! unzip -p $KERNELTREE/MPTLINUX_RHEL5_SLES10_PH15-4.16.00.00-2.zip | tar xzvf - srpms-2/mptlinux-4.16.00.00-2.src.rpm; then - return 1 - fi - mv srpms-2/mptlinux-4.16.00.00-2.src.rpm . - -} - unpack_lustre() { if [ -z "$LUSTRE" ]; then @@ -729,7 +716,7 @@ unpack_lustre() { fatal 1 "There was an error checking out Lustre/Portals/Build from CVS." echo "Creating lustre tarball..." sh autogen.sh || fatal 1 "There was an error running autogen.sh." - ./configure --disable-{modules,utils,liblustre,tests,doc} || \ + ./configure --enable-dist || \ fatal 1 "There was an error running ./configure to create makefiles." make dist || fatal 1 "There was an error running 'make dist'." LUSTRE=$PWD/lustre-*.tar.gz @@ -745,7 +732,7 @@ do_patch_linux() { local do_patch=${1:-true} - FULL_PATCH="$PWD/lustre-kernel-${TARGET}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}.patch" + FULL_PATCH="$PWD/lustre-kernel-${TARGET}-${EXTRA_VERSION}.patch" [ -f "$FULL_PATCH" ] && rm -f "$FULL_PATCH" $do_patch && pushd linux >/dev/null for series in $SERIES; do @@ -792,95 +779,111 @@ build_lustre() { targets="--target $arch $targets" done - local confoptions="--with-linux=${linux}" + local confoptions="" + if $PATCHLESS; then - confoptions="--with-linux=${linux} --disable-server" - fi - if [ "$linuxobj" != "" ]; then - confoptions="$confoptions --with-linux-obj=${linuxobj}" + confoptions="$confoptions --disable-server" fi - ./configure $confoptions ${CONFIGURE_FLAGS} 2>&1 - if [ "$?" != "0" ]; then - local saved_config="../config.log.$(date +%s)" - 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 + local rpmbuildopt='-tb' + if $NORPM; then + rpmbuildopt='-tc' + echo NORPM mode. Only compiling. fi - gen_lustre_version + ( $(skeep_ldiskfs_rpm $TAG) ) || { - # hack. Somebody move build/lustre.spec to lustre.spec for b1_6 - local lustre_spec - [ -f lustre.spec ] && lustre_spec=lustre.spec - [ -f build/lustre.spec ] && lustre_spec=build/lustre.spec + pushd ldiskfs > /dev/null || return 255 - [ -f "$lustre_spec" ] && sed \ - -e "s^Release: .*$^Release: $LUSTRE_EXTRA_VERSION^" \ - < $lustre_spec \ - > ../lustre.spec + if ! ./configure --enable-dist; then + echo "failed to configure in ldiskfs" + popd >/dev/null # pushd ldiskfs + popd >/dev/null # pushd lustre + return 255 + fi - local rpmbuildopt='-bb' - if $NORPM; then - rpmbuildopt='-bc' - echo NORPM mode. Only compiling. - fi + if ! make dist 2>&1; then + popd >/dev/null # pushd ldiskfs + popd >/dev/null # pushd lustre + return 255 + fi + + #cp lustre-ldiskfs*.tar.gz $TOPDIR/SOURCES || \ + # fatal 1 "Could not copy lustre-ldiskfs*.tar.gz to $TOPDIR/SOURCES" + + if ! $RPMBUILD $targets $rpmbuildopt lustre-ldiskfs*.tar.gz \ + --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \ + --define "kdir $linux" \ + ${linuxobj:+--define "kobjdir $linuxobj"} \ + --define "_tmppath /var/tmp" \ + --define "_topdir $TOPDIR" 2>&1; then + popd >/dev/null # pushd ldiskfs + popd >/dev/null # pushd lustre + return 255 + fi - # convert the $PATCHLESS boolean to an empty/no-empty boolean + if $DO_SRC; then + if ! $RPMBUILD -ts lustre-ldiskfs*.tar.gz \ + --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \ + --define "kdir $linux" \ + ${linuxobj:+--define "kobjdir $linuxobj"} \ + --define "_tmppath /var/tmp" \ + --define "_topdir $TOPDIR" 2>&1; then + popd >/dev/null # pushd ldiskfs + popd >/dev/null # pushd lustre + return 255 + fi + fi + popd >/dev/null # pushd ldiskfs + + # tell lustre where ldiskfs is + # XXX - pointing to the RPM BUILD dir is a hack. we need to flesh + # out the ldiskfs RPM build so that it builds a + # lustre-ldiskfs-devel RPM and install that and point lustre + # to that instead + confoptions="$confoptions --with-ldiskfs=$(ls -d $TOPDIR/BUILD/lustre-ldiskfs-*)" + } + + # convert the $PATCHLESS boolean to an empty/not-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 is_patchless="yes" fi - $RPMBUILD $targets $rpmbuildopt ../lustre.spec \ + + # ditto for the lustre-tests boolean + local lustre_tests="" + if ! $LUSTRE_TESTS; then + lustre_tests="no" + fi + + $RPMBUILD $targets $rpmbuildopt "$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 || \ fatal 1 "Error building rpms for $BUILD_ARCHS." - popd >/dev/null - ( $(skeep_ldiskfs_rpm $TAG) ) && return - - pushd lustre/ldiskfs || return 255 - make dist 2>&1 - if [ "$?" != "0" ]; then - popd - return 255 - fi - cp lustre-ldiskfs*.tar.gz $TOPDIR/SOURCES - - gen_lustre_version - - local ldiskfs_spec=lustre-ldiskfs.spec - [ -f "$ldiskfs_spec" ] && sed \ - -e "s^Release: .*$^Release: $LUSTRE_EXTRA_VERSION^" \ - < $ldiskfs_spec \ - > ../lustre-ldiskfs.spec - - if ! $RPMBUILD $targets $rpmbuildopt ../lustre-ldiskfs.spec \ - --define "_tmppath /var/tmp" \ - --define "_topdir $TOPDIR" 2>&1; then - popd - return 255 - fi - if $DO_SRC; then - if ! $RPMBUILD -bs ../lustre-ldiskfs.spec \ - --define "_tmppath /var/tmp" \ - --define "_topdir $TOPDIR" 2>&1; 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 + popd >/dev/null } @@ -904,33 +907,21 @@ stage() { #check if we need to build separate ldiskfs RPM skeep_ldiskfs_rpm() { - local tag="$1" + local tag="$1" - local skip=false - - if ! $LDISKFSRPM; then - skip=true - elif $PATCHLESS; then - skip=true - else - for skiptag in $SKIPLDISKFSRPM; do - [[ $tag == $skiptag ]] && skip=true && break - done - fi + local skip=false - pushd $TOPDIR/BUILD/lustre-[1-9]* >/dev/null - grep -q '^SERVER_TRUE[ \t]=[ \t]#$' autoMakefile && skip=true - popd >/dev/null - - echo $skip - -} - -#generate LUSTRE_EXTRA_VERSION from EXTRA_VERSION -gen_lustre_version() { + if ! $LDISKFSRPM; then + skip=true + elif $PATCHLESS; then + skip=true + else + for skiptag in $SKIPLDISKFSRPM; do + [[ $tag == $skiptag ]] && skip=true && break + done + fi - LUSTRE_EXTRA_VERSION="${lnxmaj}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}${TARGET_DELIMITER}${RPMSMPTYPE}" - LUSTRE_EXTRA_VERSION=${LUSTRE_EXTRA_VERSION//-/_} + echo $skip } @@ -950,6 +941,10 @@ set_rpm_smp_type() { [ $infact_arch == $smp_type ] && RPMSMPTYPE=bigsmp && break done + for smp_type in $PPC64_ARCHS; do + [ $infact_arch == $smp_type ] && RPMSMPTYPE=ppc64 && break + done + for smp_type in $DEFAULT_ARCHS; do [ $infact_arch == $smp_type ] && RPMSMPTYPE=default && break done @@ -974,13 +969,12 @@ find_linux_release() { # or just gotten rid of. :-) find_linux_rpm() { local prefix="$1" - local delimiter=${2:-"-"} local pathtorpms="${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}" [ -d $pathtorpms ] || return 255 local kernelbinaryrpm rpmfile - local wanted_kernel="${lnxmaj}${delimiter}${lnxrel}" + local wanted_kernel="${lnxmaj}${lnxmin}-${lnxrel}" local arch ret=1 for arch in $TARGET_ARCHS_ALL; do @@ -1009,10 +1003,6 @@ find_linux_rpm() { # lustre itself) 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 || return 255 @@ -1025,7 +1015,9 @@ unpack_linux_devel_rpm() { # call a distro specific hook, if available if type -p unpack_linux_devel_rpm-$DISTRO; then - unpack_linux_devel_rpm-$DISTRO "$kernelrpm" + if ! unpack_linux_devel_rpm-$DISTRO "$kernelrpm"; then + return 255 + fi fi popd &>/dev/null @@ -1036,55 +1028,6 @@ unpack_linux_devel_rpm() { } -# 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 - - pushd $path - # RHEL-style and SLES-style rpms - # 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 - local src='usr/src' - - if [ -d "$src/$path/" ]; then - LINUX="$(pwd)/$src/$path" - fi - # SLES has a separate -obj tree - if [ -d "$src/${path}-obj" ]; then - local src="$src/${path}-obj" - local objects="$TARGET_ARCH/$RPMSMPTYPE" - - # Novell, are you *TRYING* to make life hard for me? - if [ -d "$src/powerpc" ]; then - objects="powerpc/$TARGET_ARCH" - elif [ $TARGET_ARCH == 'i686' ]; then - objects="i386/$RPMSMPTYPE" - fi - - LINUXOBJ="$(pwd)/$src/$objects" - fi - done - if [ -z "$LINUX" ]; then - RC=255 - else - # dig out the release version - LINUXRELEASE=$(find_linux_release ${LINUXOBJ:-$LINUX}) - if [ -z "$LINUXRELEASE" ]; then - echo "Failed to find linux release in ${LINUXOBJ:-$LINUX}" - RC=255 - fi - fi - popd - return $RC -} - build_kernel_ib() { local linux="$1" @@ -1122,7 +1065,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 ${TOPDIR}/lustre/build/patches/ofed/*; do + for file in $(ls ${TOPDIR}/lustre/build/patches/ofed/*); do ed_fragment1="$ed_fragment1 Patch$n: ${file%%*/}" ed_fragment2="$ed_fragment2 @@ -1131,7 +1074,8 @@ Patch$n: ${file%%*/}" let n=$n+1 done - ed $SOURCE </dev/null; then - CAN_LINK_FOR_REUSE=true + + if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then + local REUSE_SIGNATURE=$({ echo -en $release_str; + 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" + local CAN_LINK_FOR_REUSE=false + touch $REUSEBUILD/$$ + if cp -al $REUSEBUILD/$$ $TOPDIR/ 2>/dev/null; then + CAN_LINK_FOR_REUSE=true + fi + rm $REUSEBUILD/$$ fi - rm $REUSEBUILD/$$ # the extra version string to use for the kernel (which might be a reused # kernel, remember) local kernel_extra_version="" - if $REUSERPM && ! reuse kernel "$TOPDIR" "$CAN_LINK_FOR_REUSE" \ + if ! $USE_BUILD_CACHE || ! reuse kernel "$TOPDIR" "$CAN_LINK_FOR_REUSE" \ "$REUSE_SIGNATURE"; then # nothing cached, build from scratch if [ ! -r "$KERNELDIR/$KERNEL_SRPM" ]; then @@ -1354,14 +1320,18 @@ build_kernel_with_srpm() { prepare_and_build_srpm >&${outfd} || fatal 1 "failed to prepare_and_build_srpm" - # store the resulting kernel RPM build tree for future use - echo "caching the built kenel for future builds..." >&${outfd} - if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \ - "kernel" "$REUSEBUILD" "$REUSE_SIGNATURE" \ - "$CAN_LINK_FOR_REUSE"; then - error "Failed to store kernel RPMS for reuse" - echo "unknown" - return 1 + if [ -z "$REUSE_SIGNATURE" ]; then + echo "No reuse signature was caculated so not storing the built kernel" >&${outfd} + 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}" \ + "kernel" "$REUSEBUILD" "$REUSE_SIGNATURE" \ + "$CAN_LINK_FOR_REUSE"; then + error "Failed to store kernel RPMS for reuse" + echo "unknown" + return 1 + fi fi fi # build reuse @@ -1384,146 +1354,48 @@ build_kernel_with_srpm() { } -build_mptlinux() { - local linux="$1" - local version="$2" - - if [ -z "$version" -o "$version" = "inkernel" ]; then - return 0 - fi - - local targets arch - for arch in $BUILD_ARCHS; do - targets="--target $arch $targets" - done - - local rpmbuildopt='-bb' - if $NORPM; then - rpmbuildopt='-bc' - echo NORPM mode. Only compiling. - fi - - # if only we could just rebuild the src.rpm. but the included spec - # is a real pig's breakfast. just check out the patch we need to - # apply to it to make it useful. - #$RPMBUILD --rebuild \ - # --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \ - # ${TOPDIR}/mptlinux-*.src.rpm - rpm -ivh --define "_topdir ${TOPDIR}" ${TOPDIR}/mptlinux-*.src.rpm - - # now the big honkin' patch to the spec file - pushd ${TOPDIR}/SPECS - # to regen this patch use: - # !!cd ~/rpm/SPECS/ && diff -u mptlinux.spec{.dist,} - patch -p0 < ${TOPDIR}/lustre/build/mptlinux.spec.patch || fatal 1 "failed to patch mptlinux.spec" - popd - - local targets arch - for arch in $BUILD_ARCHS; do - targets="--target $arch $targets" - done - - local rpmbuildopt='-bb' - if $NORPM; then - rpmbuildopt='-bc' - echo NORPM mode. Only compiling. - fi - - if ! $RPMBUILD $targets $rpmbuildopt \ - --define "_tmppath /var/tmp" \ - --define "_topdir ${TOPDIR}" \ - --define "kernel_obj $linux" \ - ${TOPDIR}/SPECS/mptlinux.spec 2>&1; then - return 1 - fi - if $DO_SRC; then - if ! $RPMBUILD -bs \ - --define "_tmppath /var/tmp" \ - --define "_topdir ${TOPDIR}" \ - --define "kernel_obj $linux" \ - ${TOPDIR}/SPECS/mptlinux.spec 2>&1; then - return 1 - fi - fi - - return 0 - -} - -# build RDAC -build_rdac() { - local linux="$1" - local version="$2" - - if [ -z "$version" -o "$version" = "inkernel" ]; then - return 0 - fi - - # note that we use an _, not a . before the spec on purpose. we are not - # allowed to have more than one file with a .spec trailer in a tarball - # that is supposed to be usable with rpmbuild - cp lustre/build/rdac_spec ${TOPDIR}/SPECS/rdac.spec || fatal 1 "Could not find rdac.spec in lustre/build" - - local targets arch - for arch in $BUILD_ARCHS; do - targets="--target $arch $targets" - done - - local rpmbuildopt='-bb' - if $NORPM; then - rpmbuildopt='-bc' - echo NORPM mode. Only compiling. - fi - - local distro - case $DISTRO in - rhel5) distro="REDHAT" - ;; - sles1*) distro="SUSE" - ;; - *) echo "$DISTRO not supported by RDAC, skipping" - return 0 - ;; - esac - if ! $RPMBUILD $targets $rpmbuildopt --define "dist $distro" \ - --define "_tmppath /var/tmp" \ - --define "_topdir ${TOPDIR}" \ - --define "kernel_obj $linux" \ - ${TOPDIR}/SPECS/rdac.spec 2>&1; then - return 1 - fi - if $DO_SRC; then - if ! $RPMBUILD -bs --define "dist $distro" \ - --define "_tmppath /var/tmp" \ - --define "_topdir ${TOPDIR}" \ - --define "kernel_obj $linux" \ - ${TOPDIR}/SPECS/rdac.spec 2>&1; then - return 1 - fi - fi - - return 0 -} - # build OFED # globals used: # TOPDIR -# REUSEBUILD, REUSERPM +# REUSEBUILD, USE_BUILD_CACHE # CONFIGURE_FLAGS build_ofed() { local linux="$1" local ofed_version="$2" - # before lustre, build kernel-ib - if [ -z "$ofed_version" -o "$ofed_version" = "inkernel" ]; then + # if an ofed version is given, then it means use OFED proper, + # not any vendor specific "inkernel" version + if [ -z "$ofed_version" ]; then return 0 fi - if [ -n "$REUSEBUILD" ]; then + if [ "$ofed_version" = "inkernel" ]; then + # see if there is a distro specific override for this and use + # that if it exists + # XXX we need to better integrate a distro specific override with + # the rest of this function so that all of the reuse cache + # stuff is leveraged given that 80% of this function is reuse + if type -p build_ofed-${DISTRO}; then + local ofed_location + ofed_location=$(build_ofed-${DISTRO} ${STDOUT}) + local rc=${PIPESTATUS[0]} + CONFIGURE_FLAGS="--with-o2ib=${ofed_location} ${CONFIGURE_FLAGS}" + return $rc + else + return 0 + fi + fi + + # build kernel-ib + if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then + local REUSE_SIGNATURE=$({ echo "$ofed_version"; + echo "$(find_linux_release ${linux})"; + cat "${linux}/include/linux/autoconf.h"; } | + 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" + # XXX - hrm. i'm not convinced this doesn't belong in the reuse + # "library" local CAN_LINK_FOR_REUSE=false touch $REUSEBUILD/$$ if cp -al $REUSEBUILD/$$ $TOPDIR/; then @@ -1532,33 +1404,38 @@ build_ofed() { rm $REUSEBUILD/$$ fi - local REUSE_SIGNATURE=$({ echo "$ofed_version"; - echo "$(find_linux_release ${linux})"; - cat "${linux}/include/linux/autoconf.h"; } | - md5sum | cut -d" " -f1) - if ! $REUSERPM || ! reuse ofed "$TOPDIR" "$CAN_LINK_FOR_REUSE" \ + if ! $USE_BUILD_CACHE || ! reuse ofed "$TOPDIR" "$CAN_LINK_FOR_REUSE" \ "$REUSE_SIGNATURE"; then - # stash away the existing built articles for a moment - mkdir bak - mv {BUILD,{S,}RPMS,S{OURCE,PEC}S} bak - function mv_back { - pushd bak - find . | cpio -pudlm .. - popd - rm -rf bak - } - create_rpmbuild_dirs + if [ -n "$REUSE_SIGNATURE" ]; then + # stash away the existing built articles for a moment + mkdir bak + mv {BUILD,{S,}RPMS,S{OURCE,PEC}S} bak + function mv_back { + pushd bak + find . | cpio -pudlm .. + popd + rm -rf bak + } + create_rpmbuild_dirs + fi # build it build_kernel_ib "${linux}" - if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \ - "ofed" "$REUSEBUILD" "$REUSE_SIGNATURE" \ - "$CAN_LINK_FOR_REUSE"; then - error "Failed to store OFED RPMS for reuse" + + if [ -z "$REUSE_SIGNATURE" ]; then + echo "No reuse signature was caculated so not storing the built ofed" + else + # store the resulting RPM build tree for future use + echo "Storing the built ofed for future reuse" + if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \ + "ofed" "$REUSEBUILD" "$REUSE_SIGNATURE" \ + "$CAN_LINK_FOR_REUSE"; then + error "Failed to store OFED RPMS for reuse" + mv_back + return 1 + fi + # put the stuff we stashed away back mv_back - return 1 fi - # put the stuff we stashed away back - mv_back fi pushd "$TOPDIR" >/dev/null @@ -1571,7 +1448,9 @@ build_ofed() { 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 + if ! rpm2cpio < $rpm | cpio -id; then + fatal 1 "could not unpack the kernel-ib-devel rpm." + fi CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/ofa_kernel ${CONFIGURE_FLAGS}" popd >/dev/null @@ -1591,11 +1470,9 @@ build_with_srpm() { fatal 1 "Failed to find a kernel development RPM in $TOPDIR/RPMS/$arch/" fi - # install the -devel RPM in preparation for the lustre build - # note that the EXTRA_VERSION_DELIMITER is *NOT* used in the - # version of the directory name under /usr/src + # install the -devel RPM in preparation for modules builds if ! lnxrel="$kernel_extra_version" unpack_linux_devel_rpm \ - "$TOPDIR/RPMS/$arch/$kernel_devel_rpm" "-"; then + "$TOPDIR/RPMS/$arch/$kernel_devel_rpm"; then fatal 1 "Could not find the Linux tree in $TOPDIR/RPMS/$arch/$kernel_devel_rpm" fi done @@ -1603,7 +1480,7 @@ build_with_srpm() { # need to find and unpack the vendor's own kernel-devel for patchless # client build local kernelrpm - if ! kernelrpm=$(find_linux_rpm "-$DEVEL_KERNEL_TYPE" ${EXTRA_VERSION_DELIMITER:-"-"}); then + if ! kernelrpm=$(find_linux_rpm "-$DEVEL_KERNEL_TYPE"); then fatal 1 "Could not find the kernel-$DEVEL_KERNEL_TYPE RPM in ${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}" fi if ! lnxrel="$lnxrel" unpack_linux_devel_rpm "$kernelrpm" "-"; then @@ -1611,37 +1488,76 @@ build_with_srpm() { fi fi + # ~sigh~ have to make copies of and modify some of the rpm + # infrastructure files so that find-requires can find our unpacked + # kernel-devel artifacts + cp $RPM_HELPERS_DIR/{symset-table,find-requires{,.ksyms}} . + FIND_REQUIRES="$(pwd)/find-requires" + chmod 755 {symset-table,find-requires{,.ksyms}} + local tmp="$(pwd)" + tmp="${tmp//\//\\/}" + ed find-requires <