3 # vim:expandtab:shiftwidth=4:softtabstop=4:tabstop=4:
9 # CVSROOT is inherited from the environment
19 TARGET_ARCH=$(uname -m)
21 TARGET_ARCHS_ALL=$TARGET_ARCH
22 [ "$TARGET_ARCH" = "i686" ] && TARGET_ARCHS_ALL="i686 i586 i386"
28 TMPDIR=${TMPDIR:-"/var/tmp"}
34 SKIPLDISKFSRPM="v1_4_* b1_4"
35 SMPTYPES="smp bigsmp default ''"
79 # Readlink is not present on some older distributions: emulate it.
83 if [ -L "$path" ]; then
84 ll="$(LC_ALL=C ls -l "$path" 2> /dev/null)" &&
98 [ "$1" ] && echo -e "\n${0##*/}: $1"
110 echo -n "Available targets:"
111 for target in $TOPDIR/lustre/lustre/kernel_patches/targets/*.target ; do
112 target_file=${target##*/}
113 echo -n " ${target_file%%.target}"
121 Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
124 Specifies the CVS Root to use when pulling files from CVS. The
125 environment variable \$CVSROOT is used if this option is not
128 --external-patches=EXTERNAL_PATCHES
129 Directory similar to lustre/lustre/kernel_patches/ that lbuild should
130 look for seres and config files in before looking in the lustre
133 --extraversion=EXTRAVERSION
134 Text to use for the rpm release and kernel extraversion.
136 --kerneldir=KERNELDIR
137 Directory containing Linux source tarballs referenced by target
140 --timestamp=TIMESTAMP
141 Date of building lustre in format YYYYMMDDhhmmss
144 Try to reuse old kernel RPMs from DIR
147 Try to reuse old kernel builds from DIR
150 Path to distro kernel RPM collection
156 Do not build RPMs (compile only mode)
159 Build lustre client only
162 Which distro using. Autodetect by default
164 --kerneltree=KERNELTREE
165 Directory containing dirs with Linux source tarballs referenced by target
166 files. Dir names in format kernel version ('2.6.9', etc.)
169 Directory of Linux kernel sources. When this option is used, only
170 Lustre modules and userspace are built.
173 Path to an existing lustre source tarball to use instead of
177 Do not try to download a kernel from downloads.lustre.org
180 Do not build a .src.rpm, a full kernel patch, or a patched kernel
184 Do ldiskfs RPM. Now true by default
190 Specifies that the files generated do not include timestamps, and
191 that this is an official release.
194 Build a .src.rpm, a full kernel patch, and a patched kernel tarball.
197 Directory used to stage packages for release. RPMs will be placed
198 more or less in DIR/<target>-<arch>, and the tarball will be
202 A CVS branch/tag name to build from when pulling from CVS.
205 The name of the target to build. The available targets are listed
208 --target-archs=TARGET_ARCHS
209 A (space delimited) list of architectures to build. By default,
210 all of the archs supported by the TARGET will be built, in
211 addition to a .src.rpm. This option can limit those, for machines
212 that can only build certain archs or if you only want a certain
213 arch built (for testing, or a one-off kernel).
215 Also note that by using a non-"base" arch (eg, i386) only kernels
216 will be built - there will be no lustre-lite-utils package.
219 Prevents the datestamp flag (-D) from being passed to cvs for
220 checkouts. This is a workaround for a problem encountered when
221 using lbuild with tinderbox.
232 if [ "$LUSTRE" ] ; then
233 [ -r "$LUSTRE" ] || \
234 usage 1 "Could not find Lustre source tarball '$LUSTRE'."
237 usage 1 "Either specify a CVS Root with -d, or a Lustre source tarball with --lustre."
239 usage 1 "A branch/tag name must be specified with --tag when not building from a tarball."
242 if [ -z "$LINUX" ] ; then
243 [ "$KERNELDIR" -o "$KERNELTREE" ] || \
244 usage 1 "A kernel directory must be specified with --kerneldir or --kerneltree."
246 [ -d "$KERNELDIR" -o -d "$KERNELTREE" ] || \
247 usage 1 "$KERNELDIR and $KERNELTREE are not a directory."
251 usage 1 "When building a snapshot, a tag name must be used."
254 [ "$TARGET" ] || usage 1 "A target must be specified with --target."
255 # TARGET_FILE="$TOPDIR/lustre/kernel_patches/targets/$TARGET.target"
256 # [ -r "$TARGET_FILE" ] || \
257 # usage 1 "Target '$TARGET' was not found."
262 CANONICAL_TARGET="rhel5"
265 CANONICAL_TARGET="rhel-2.6"
268 CANONICAL_TARGET="sles-2.6"
271 CANONICAL_TARGET="sles10-2.6"
274 CANONICAL_TARGET="hp-pnnl-2.4"
282 CANONICAL_TARGET="$TARGET"
286 local timestampnodig=$(echo $TIMESTAMP | sed -e s/[0-9]*//g)
287 [ "$timestampnodig" = "" ] || TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M%S")
288 local timestamplength="${#TIMESTAMP}"
289 if [ $timestamplength -eq 12 ]; then
290 TIMESTAMP="${TIMESTAMP}00"
291 elif [ $timestamplength -ne 14 ]; then
292 TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M%S")
295 RPMBUILD=$(which rpmbuild 2>/dev/null | head -1)
296 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
297 RPMBUILD=$(which rpm 2>/dev/null | head -1)
298 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
299 usage 1 "Could not find binary for making rpms (tried rpmbuild and rpm)."
303 if [ -n "$CCACHE" ]; then
304 which "$CCACHE" 2>/dev/null && export CCACHE && export CC="ccache gcc"
305 which "$DISTCC" 2>/dev/null && export DISTCC RPM_BUILD_NCPUS
306 local bindir="/cache/build/bin"
307 [ -d $bindir ] || mkdir -p $bindir
308 [ -d $bindir ] && rm ${bindir}/* > /dev/null 2>&1
309 which "$CCACHE" 2>/dev/null && [ -d $bindir ] && ln -s `which "$CCACHE"` ${bindir}/ccache
310 which "$CCACHE" 2>/dev/null && [ -d $bindir ] && ln -s `which "$CCACHE"` ${bindir}/cc
311 which "$CCACHE" 2>/dev/null && [ -d $bindir ] && ln -s `which "$CCACHE"` ${bindir}/gcc
312 [ -d $bindir ] && export PATH=$bindir:$PATH
315 [ -z "$DISTRO" ] && autodetect_distro
318 #autodetect used Distro
321 if [ -f /etc/SuSE-release ]; then
323 elif [ -f /etc/redhat-release ]; then
324 local distroname=$(head -1 /etc/redhat-release | grep -e "CentOS\|Red")
325 if [ ! "$distroname" = "" ]; then
326 local version=$(echo "$distroname" | sed -e s/[^0-9.]*//g | sed -e s/\\..*// )
328 [ "$version" = "" ] || DISTRO="${distroname}${version}"
331 [ "$DISTRO" = "" ] && DISTRO="sles9" #default distro
336 echo $(echo "$*" | xargs -n 1 | sort -u)
343 if [ "$TARGET" = "rhel-2.6" -o "$TARGET" = "rhel-2.4" ]; then
345 if [ "$TARGET" = "rhel-2.6" ]; then
347 OLDCONFIG=nonint_oldconfig
348 elif [ "$TARGET" = "rhel-2.4" ]; then
353 RPMTOPDIR=$(mktemp -d $KERNELDIR/rpm_XXXXXX)
354 mkdir $RPMTOPDIR/BUILD/
355 rpm -ivh $KERNELDIR/$SRPM --define "_topdir $RPMTOPDIR" || \
356 { rm -rf $RPMTOPDIR; fatal 1 "Error installing kernel SRPM."; }
357 $RPMBUILD -bp --nodeps --target i686 $RPMTOPDIR/SPECS/$SPEC --define "_topdir $RPMTOPDIR"
358 pushd $RPMTOPDIR/BUILD/kernel-${lnxmaj}/linux-${lnxmaj} && {
360 cp configs/kernel-${lnxmaj}-i686-smp.config .config
361 if ! make $OLDCONFIG > /dev/null; then
362 fatal 1 "error trying to make $OLDCONFIG while building a tarball from SRPM."
364 make include/linux/version.h
367 tar cjf $KERNEL_FILE linux-${lnxmaj}
374 download_and_build_tarball() {
378 local srpm=kernel-${lnxmaj}-${lnxrel}.src.rpm
380 echo "Downloading http://downloads.lustre.org/public/kernels/$target/old/$srpm..."
381 if ! wget -nv "http://downloads.lustre.org/public/kernels/$target/old/$srpm" \
382 -O "$KERNELDIR/$srpm" ; then
383 fatal 1 "Could not download target $kernel_file's kernel SRPM $srpm from downloads.lustre.org."
385 [ -s "$KERNELDIR/$srpm" ] || {
386 rm -rf $KERNELDIR/$srpm
387 fatal 1 "Could not download target $kernel_file's kernel SRPM $srpm from downloads.lustre.org."
390 build_tarball $target $srpm
395 EXTRA_VERSION_save="$EXTRA_VERSION"
396 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches" ; do
397 TARGET_FILE="$patchesdir/targets/$TARGET.target"
398 [ -r "$TARGET_FILE" ] && break
400 [ -r "$TARGET_FILE" ] || \
401 fatal 1 "Target $TARGET was not found."
403 echo "Loading target config file $TARGET.target..."
407 [ "$KERNEL" ] || fatal 1 "Target $TARGET did not specify a kernel."
408 [ "$VERSION" ] || fatal 1 "Target $TARGET did not specify a kernel version."
410 #CC was overwriten in TARGET_FILE
411 which "$CCACHE" 2>/dev/null && export CCACHE && export CC="ccache gcc"
413 if [ ! "$KERNELTREE" = "" ] && [ -d "$KERNELTREE" ]; then
414 KERNELDIR="$KERNELTREE/${lnxmaj}"
415 [ -d "$KERNELDIR" ] || mkdir "$KERNELDIR"
418 if [ "$KERNELDIR" ] ; then
419 KERNEL_FILE="$KERNELDIR/$KERNEL"
420 if [ ! -r "$KERNEL_FILE" ] ; then
421 # see if we have an SRPM we can build a tarball for
422 KERNEL_SRPM=kernel-${lnxmaj}-${lnxrel}.src.rpm
423 if [ -r "$KERNELDIR/$KERNEL_SRPM" ] ; then
424 build_tarball $CANONICAL_TARGET $KERNEL_SRPM
426 if (( $DOWNLOAD )) ; then
427 echo "Downloading http://downloads.lustre.org/public/kernels/$DISTRO/old/$KERNEL..."
428 if ! wget -nv "http://downloads.lustre.org/public/kernels/$DISTRO/old/$KERNEL" -O "$KERNELDIR/$KERNEL" ; then
429 # see if we can do it with an SRPM from the download site
430 download_and_build_tarball $CANONICAL_TARGET $KERNEL_FILE
432 [ -s "$KERNELDIR/$KERNEL" ] || {
433 rm -rf "$KERNELDIR/$KERNEL"
434 fatal 1 "Target $TARGET's kernel $KERNEL not found in directory $KERNELDIR."
438 fatal 1 "Target $TARGET's kernel file $KERNEL not found in kernel directory $KERNELDIR."
442 if [ -n "$OFED_VERSION" ] && \
443 [ ! -r "$KERNELTREE/../OFED-${OFED_VERSION}.tgz" ] ; then
444 if (( $DOWNLOAD )) ; then
445 local location="http://downloads.lustre.org/public/OFED/"
446 echo "Downloading $location/OFED-${OFED_VERSION}.tgz..."
447 if ! wget -nv "$location/OFED-${OFED_VERSION}.tgz" \
448 -O "$KERNELTREE/../OFED-${OFED_VERSION}.tgz" ; then
449 fatal 1 "Could not download OFED-${OFED_VERSION}.tgz from downloads.lustre.org."
452 fatal 1 "OFED-${OFED_VERSION}.tgz not found in kernel directory $KERNELDIR."
457 if [ "$SERIES" ] ; then
458 for series in $SERIES ; do
459 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches" ; do
460 [ -r "$patchesdir/series/$series" ] && continue 2
462 fatal 1 "Target $TARGET's series $SERIES could not be found.\nSearched:\n\t$EXTERNAL_PATCHES/series\n\t$TOPDIR/lustre/lustre/kernel_patches/series."
466 if [ -f $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET-$TARGET_ARCH.config ]; then
467 CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET-$TARGET_ARCH.config"
470 for smptype in $SMPTYPES; do
471 [ "$smptype" = "''" ] && smptype=
472 if [ -f $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET-$TARGET_ARCH-${smptype}.config ]; then
473 CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET-$TARGET_ARCH-${smptype}.config"
474 KERNCONFSMPTYPE=$smptype
478 local lnxrelnew=$( echo ${lnxrel} | sed s/-/_/g )
480 [ -f "$CONFIG_FILE" ] || \
481 fatal 1 "Config file for target $TARGET missing from $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/."
482 if [ "$EXTRA_VERSION_save" ] ; then
483 EXTRA_VERSION="$EXTRA_VERSION_save"
484 elif ! $RELEASE; then
485 # if there is no patch series, then this is not a lustre specific
486 # kernel. don't make it look like one
487 if [ -n "$SERIES" ]; then
488 #remove the @VERSION@ (lustre version)
489 # EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
490 # EXTRA_VERSION="${EXTRA_VERSION}-${TAG}.${TIMESTAMP}"
491 ! ( $PATCHLESS ) && EXTRA_VERSION="${EXTRA_VERSION}.${TIMESTAMP}"
494 # EXTRA_VERSION=${EXTRA_VERSION//-/_}
496 [ -z $REUSEDKERNELMASK ] && \
497 # create mask for kernel RPM/builddir which could be reused
499 REUSEDKERNELMASK=${KERNCONFSMPTYPE}-${lnxmaj}-${lnxrelnew}_lustre.${LUSTRE_VERSION}.*${TARGET_ARCH}
501 REUSEDKERNELMASK=${KERNCONFSMPTYPE}-${lnxmaj}-${lnxrelnew}_lustre.${LUSTRE_VERSION}.${TARGET_ARCH}
503 REUSEDKERNELMASK=${KERNCONFSMPTYPE}-${lnxmaj}-${lnxrelnew}_lustre.${LUSTRE_VERSION}.${TIMESTAMP}.${TARGET_ARCH}
505 # kernel-lustre-smp-2.6.9-55.0.2.EL_lustre.1.6.1.i686.rpm
507 ALL_ARCHS="$BASE_ARCHS $BIGMEM_ARCHS $BOOT_ARCHS $JENSEN_ARCHS $SMP_ARCHS $BIGSMP_ARCHS $PSERIES64_ARCHS $UP_ARCHS"
510 for arch in $(uniqify "$ALL_ARCHS") ; do
511 if [ -z "$TARGET_ARCHS" ] || echo "$TARGET_ARCHS" | grep "$arch" >/dev/null 2>/dev/null ; then
512 BUILD_ARCHS="$BUILD_ARCHS $arch"
515 [ "$BUILD_ARCHS" ] || usage 1 "No available target archs to build."
516 echo "Building for: $BUILD_ARCHS"
523 fatal 1 "tarflags(): File name argument missing."
535 fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
542 echo "Untarring ${1##*/}..."
543 tar $(tarflags "$1") "$1"
548 untar "$KERNELTREE/../OFED-${OFED_VERSION}.tgz"
549 [ -d OFED ] || ln -sf OFED-[0-9].[0-9]* OFED
551 ls -ld OFED OFED-[0-9].[0-9]*
552 ls -l OFED OFED-[0-9].[0-9]*
557 DIRNAME="lustre-$TAG-$TIMESTAMP"
558 if [ "$LUSTRE" ] ; then
560 [ -d lustre ] || ln -sf lustre-[0-9].[0-9]* lustre
562 if [ "$USE_DATESTAMP" ]; then
563 DATESTAMP="-D '$DATE'"
568 cvs -d "$CVSROOT" -qz3 co $DATESTAMP -d "$DIRNAME" lustre || \
569 fatal 1 "There was an error checking out toplevel Lustre from CVS."
570 pushd "$DIRNAME" > /dev/null
571 ./lustrecvs "$TAG" || \
572 fatal 1 "There was an error checking out Lustre/Portals/Build from CVS."
573 echo "Creating lustre tarball..."
574 sh autogen.sh || fatal 1 "There was an error running autogen.sh."
575 ./configure --disable-{modules,utils,liblustre,tests,doc} || \
576 fatal 1 "There was an error running ./configure to create makefiles."
577 make dist || fatal 1 "There was an error running 'make dist'."
579 fname=$(basename $DIRNAME/lustre-*.tar.gz)
580 cp $DIRNAME/$fname . || fatal 1 "There was an error copying lustre tarball."
582 ln -sf "$DIRNAME" lustre
589 [ -d linux ] || ln -sf linux* linux
594 [ "$SERIES" ] || return 0
595 FULL_PATCH="$PWD/lustre-kernel-${TARGET}${EXTRA_VERSION_DELIMITER}${EXTRA_VERSION}.patch"
596 [ -f "$FULL_PATCH" ] && rm -f "$FULL_PATCH"
597 pushd linux >/dev/null
598 for series in $SERIES ; do
599 echo -n "Applying series $series:"
600 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches" ; do
601 [ -r "$patchesdir/series/$series" ] || continue
602 SERIES_FILE="$patchesdir/series/$series"
603 for patch in $(<"$SERIES_FILE") ; do
605 PATCH_FILE="$patchesdir/patches/$patch"
606 [ -r "$PATCH_FILE" ] || \
607 fatal 1 "Patch $patch does not exist in Lustre tree."
608 cat "$PATCH_FILE" >> "$FULL_PATCH" || \
609 fatal 1 "Error adding patch $patch to full patch."
610 patch -s -p1 < "$PATCH_FILE" || fatal 1 "Error applying patch $patch."
617 echo "Full patch has been saved in ${FULL_PATCH##*/}."
618 echo "Replacing .config files..."
619 [ -d linux/configs ] || mkdir linux/configs || \
620 fatal 1 "Error creating configs directory."
621 rm -f linux/configs/*
623 for patchesdir in "$EXTERNAL_PATCHES" "lustre/lustre/kernel_patches" ; do
624 [ "$patchesdir" ] && \
625 cp -v $patchesdir/kernel_configs/kernel-${VERSION}-${TARGET}*.config linux/configs/ >/dev/null && copysuccess=1
627 [ "$copysuccess" = "1" ] || \
628 fatal 1 "Error copying in kernel configs."
633 TARBALL="$(readlink linux)-$EXTRA_VERSION.tar.gz"
634 echo "Creating patched linux tarball $TARBALL..."
635 tar zcf "$TARBALL" "$(readlink linux)" \
636 --exclude "CVS" --exclude ".cvsignore" || \
637 --exclude "*.orig" --exclude "*~" --exclude "*.rej" || \
638 fatal 1 "Error creating patched Linux tarball."
643 [ -d linux ] || return 0
644 echo "Cleaning linux..."
645 [ -L linux ] && rm -rf $(readlink linux)
652 ENABLE_INIT_SCRIPTS=""
654 -e "s^@BASE_ARCHS@^$BASE_ARCHS^g" \
655 -e "s^@BIGMEM_ARCHS@^$BIGMEM_ARCHS^g" \
656 -e "s^@BIGSMP_ARCHS@^$BIGSMP_ARCHS^g" \
657 -e "s^@BOOT_ARCHS@^$BOOT_ARCHS^g" \
658 -e "s^@CONFIGURE_FLAGS@^$CONFIGURE_FLAGS^g" \
659 -e "s^@ENABLE_INIT_SCRIPTS@^$ENABLE_INIT_SCRIPTS^g" \
660 -e "s^@JENSEN_ARCHS@^$BOOT_ARCHS^g" \
661 -e "s^@KERNEL_EXTRA_VERSION@^$EXTRA_VERSION^g" \
662 -e "s^@KERNEL_EXTRA_VERSION_DELIMITER@^$EXTRA_VERSION_DELIMITER^g" \
663 -e "s^@KERNEL_TARGET_DELIMITER@^$TARGET_DELIMITER^g" \
664 -e "s^@KERNEL_RELEASE@^${EXTRA_VERSION//-/_}^g" \
665 -e "s^@KERNEL_SOURCE@^$KERNEL^g" \
666 -e "s^@KERNEL_VERSION@^$VERSION^g" \
667 -e "s^@LINUX26@^$LINUX26^g" \
668 -e "s^@LUSTRE_SOURCE@^${LUSTRE##*/}^g" \
669 -e "s^@LUSTRE_TARGET@^$TARGET^g" \
670 -e "s^@PSERIES64_ARCHS@^$PSERIES64_ARCHS^g" \
671 -e "s^@RHBUILD@^$RHBUILD^g" \
672 -e "s^@SMP_ARCHS@^$SMP_ARCHS^g" \
673 -e "s^@SUSEBUILD@^$SUSEBUILD^g" \
674 -e "s^@UP_ARCHS@^$UP_ARCHS^g" \
675 < $TOPDIR/lustre/build/lustre-kernel-2.4.spec.in \
676 > lustre-kernel-2.4.spec
677 [ -d SRPMS ] || mkdir SRPMS
678 [ -d RPMS ] || mkdir RPMS
679 [ -d BUILD ] || mkdir BUILD
680 [ -d SOURCES ] || mkdir SOURCES
681 for script in linux-{rhconfig.h,merge-config.awk,merge-modules.awk} \
682 suse-{functions.sh,post.sh,postun.sh,trigger-script.sh.in} \
683 sles8-{pre,post,postun,update_{INITRD_MODULES,rcfile_setting}}.sh ; do
684 cp $TOPDIR/lustre/build/$script SOURCES
686 cp "$LUSTRE" "$KERNEL_FILE" SOURCES
687 if [ "$EXTERNAL_PATCHES" -a -d "$EXTERNAL_PATCHES" ] ; then
688 tar zcf SOURCES/external-patches.tar.gz -C "$EXTERNAL_PATCHES" series targets patches kernel_configs
690 touch SOURCES/external-patches.tar.gz
696 [ -d lustre ] || return 0
697 echo "Cleaning Lustre..."
698 [ -L lustre ] && rm -rf $(readlink lustre)
704 echo "Building kernel + Lustre RPMs for: $BUILD_ARCHS..."
706 for arch in $BUILD_ARCHS ; do
707 targets="--target $arch $targets"
710 local rpmbuildopt='-bb'
713 # echo NORPM mode. Only compiling.
714 # echo "XXX: need to fix lmake - add options to do rpmbuild -bc instead of -bb"
717 $RPMBUILD $targets $rpmbuildopt lustre-kernel-2.4.spec \
718 --define "_tmppath $TMPDIR" \
719 --define "_topdir $TOPDIR" || \
720 fatal 1 "Error building rpms for $BUILD_ARCHS."
722 if (( $DO_SRC )) ; then
723 $RPMBUILD -bs lustre-kernel-2.4.spec \
724 --define "_tmppath $TMPDIR" \
725 --define "_topdir $TOPDIR" || \
726 fatal 1 "Error building .src.rpm."
729 ( $(skeep_ldiskfs_rpm $TAG) ) && return
731 pushd $TOPDIR/BUILD/lustre*/ldiskfs || return 255
733 if [ "$?" != "0" ] ; then
737 cp lustre-ldiskfs*.tar.gz $TOPDIR/SOURCES
741 local ldiskfs_spec=lustre-ldiskfs.spec
742 [ -f "$ldiskfs_spec" ] && sed \
743 -e "s^Release: .*$^Release: $LUSTRE_EXTRA_VERSION^" \
745 > ../lustre-ldiskfs.spec
747 $RPMBUILD $targets $rpmbuildopt ../lustre-ldiskfs.spec \
748 --define "_tmppath /var/tmp" \
749 --define "_topdir $TOPDIR"
750 if [ "$?" != "0" ] ; then
755 if (( $DO_SRC )) ; then
756 $RPMBUILD -bs ../lustre-ldiskfs.spec \
757 --define "_tmppath /var/tmp" \
758 --define "_topdir $TOPDIR"
759 if [ "$?" != "0" ] ; then
769 [ -d SRPMS ] || mkdir SRPMS
770 [ -d RPMS ] || mkdir RPMS
771 [ -d BUILD ] || mkdir BUILD
772 [ -d SOURCES ] || mkdir SOURCES
776 pushd lustre >/dev/null
778 echo "Building Lustre RPMs for: $BUILD_ARCHS..."
780 for arch in $BUILD_ARCHS ; do
781 targets="--target $arch $targets"
784 local confoptions="--with-linux=${LINUX}"
786 confoptions="--with-linux=${LINUX} --disable-server"
788 if [ ! "$LINUXOBJ" = "" ]; then
789 confoptions="$confoptions --with-linux-obj=${LINUXOBJ}"
792 ./configure $confoptions ${CONFIGURE_FLAGS}
793 if [ "$?" != "0" ] ; then
794 local saved_config="../config.log.$(date +%s)"
795 cp config.log $saved_config
796 chmod a+r $saved_config
797 echo "Saved config.log is at $saved_config"
804 # hack. Somebody move build/lustre.spec to lustre.spec for b1_6
806 [ -f lustre.spec ] && lustre_spec=lustre.spec
807 [ -f build/lustre.spec ] && lustre_spec=build/lustre.spec
809 [ -f "$lustre_spec" ] && sed \
810 -e "s^Release: .*$^Release: $LUSTRE_EXTRA_VERSION^" \
814 local rpmbuildopt='-bb'
817 echo NORPM mode. Only compiling.
820 $RPMBUILD $targets $rpmbuildopt ../lustre.spec \
821 --define "_tmppath $TMPDIR" \
822 --define "_topdir $TOPDIR" || \
823 fatal 1 "Error building rpms for $BUILD_ARCHS."
826 ( $(skeep_ldiskfs_rpm $TAG) ) && return
828 pushd lustre/ldiskfs || return 255
830 if [ "$?" != "0" ] ; then
834 cp lustre-ldiskfs*.tar.gz $TOPDIR/SOURCES
838 local ldiskfs_spec=lustre-ldiskfs.spec
839 [ -f "$ldiskfs_spec" ] && sed \
840 -e "s^Release: .*$^Release: $LUSTRE_EXTRA_VERSION^" \
842 > ../lustre-ldiskfs.spec
844 $RPMBUILD $targets $rpmbuildopt ../lustre-ldiskfs.spec \
845 --define "_tmppath /var/tmp" \
846 --define "_topdir $TOPDIR"
847 if [ "$?" != "0" ] ; then
852 if (( $DO_SRC )) ; then
853 $RPMBUILD -bs ../lustre-ldiskfs.spec \
854 --define "_tmppath /var/tmp" \
855 --define "_topdir $TOPDIR"
856 if [ "$?" != "0" ] ; then
866 [ "$STAGEDIR" ] || return 0
868 for arch in $BUILD_ARCHS ; do
869 rpmdir="${STAGEDIR}/${CANONICAL_TARGET}-${arch}"
870 echo "${0##*/}: Copying RPMs into ${rpmdir}"
872 cp -v RPMS/${arch}/*.rpm "${rpmdir}"
873 if [ -d RPMS/noarch ] ; then
874 cp -v RPMS/noarch/*.rpm "${rpmdir}"
878 cp -v "$LUSTRE" "$STAGEDIR"
881 #check if we need to build separate ldiskfs RPM
886 if ! $LDISKFSRPM; then
888 elif $PATCHLESS; then
891 for skiptag in $SKIPLDISKFSRPM; do
892 [[ $tag == $skiptag ]] && skip=true && break
898 #get date of last changed target/config/series/patches
899 get_last_source_date()
901 local filelist="${TOPDIR}/lustre/lustre/kernel_patches/series/${SERIES} \
903 local TOPDIRnew=$(echo ${TOPDIR} | sed -e s/\\//\\\\\\//g)
904 filelist="$filelist $( \
905 cat ${TOPDIR}/lustre/lustre/kernel_patches/series/${SERIES} | \
906 sed -e s/^/${TOPDIRnew}\\/lustre\\/lustre\\/kernel_patches\\/patches\\// 2>&1)"
907 local sourcelastdate=$( find ${filelist} -name CVS -prune -o \
908 -type f -printf "%T@\n" 2>&1 | sort | tail -1 )
909 is_integer $sourcelastdate && echo $sourcelastdate
912 #check if variable is integer
916 [ "$invariable" = "" ] && return 255
917 local invariableint=$( echo $invariable | sed -e s/[^0-9]//g )
918 [ "$invariable" = "$invariableint" ] || return 255
921 #generate LUSTRE_EXTRA_VERSION from EXTRA_VERSION
925 [ "$KERNCONFSMPTYPE" = "" ] || smptype=$KERNCONFSMPTYPE
926 [ "$RPMSMPTYPE" = "" ] || smptype=$RPMSMPTYPE
928 LUSTRE_EXTRA_VERSION="${lnxmaj}-${EXTRA_VERSION}"
929 if [ "$PATCHLESS" = "true" -a "$DISTRO" = "sles10" ]; then
930 LUSTRE_EXTRA_VERSION="${LUSTRE_EXTRA_VERSION}-${smptype}"
932 LUSTRE_EXTRA_VERSION="${LUSTRE_EXTRA_VERSION}${smptype}"
934 LUSTRE_EXTRA_VERSION=$( echo $LUSTRE_EXTRA_VERSION | sed -e "s^-^_^g" )
937 #store RPMs and/or BUILD dir for future reuse
941 if [ ! "$REUSEBUILD" = "" ] && [ -d "/$REUSEBUILD/" ] ; then
942 [ -d "${REUSEBUILD}/${TIMESTAMP}" ] || mkdir "${REUSEBUILD}/${TIMESTAMP}"
943 [ -d "${REUSEBUILD}/${TIMESTAMP}" ] || return 255
948 local lnxrelnew=$( echo ${lnxrel} | sed s/-/_/g )
949 local EXTRA_VERSIONnew=$( echo ${EXTRA_VERSION} | sed s/-/_/g )
950 local KERNELRPMnew=$(basename "$KERNELRPM")
951 if [ ! "$rpmonly" = "rpmonly" ]; then
953 if [ ! "$KERNELCOMPILEDIR" = "" ]; then
954 builddir="$KERNELCOMPILEDIR"
956 builddir="BUILD/lustre-kernel-${lnxmaj}/lustre/linux-${lnxmaj}"
957 [ "$KERNELCOMPILEDIR" = "" ] || builddir="$KERNELCOMPILEDIR"
958 [ -d "$builddir" ] || builddir="BUILD/lustre-kernel-${lnxmaj}/lustre/linux-${lnxmaj}.${lnxrel}"
959 [ -d "$builddir" ] || builddir="BUILD/lustre-kernel-${lnxmaj}/lustre/linux-${lnxmaj}-${lnxrel}"
960 if [ ! -d "$builddir" ]; then
961 pushd "BUILD/lustre-kernel-${lnxmaj}/lustre/" || return 255
962 local basebuilddir=$(ls -d linux-${lnxmaj}* | head -1)
963 [ "$basebuilddir" = "" ] || builddir="BUILD/lustre-kernel-${lnxmaj}/lustre/${basebuilddir}"
967 [ -d "$builddir" ] || return 255
968 local dstdir="${REUSEBUILD}/${TIMESTAMP}/linux-${KERNCONFSMPTYPE}-${lnxmaj}-${EXTRA_VERSIONnew}.${TARGET_ARCH}"
969 ( $PATCHLESS ) && dstdir="${REUSEBUILD}/${TIMESTAMP}/linux-$KERNELRPMnew" && \
970 dstdir="${dstdir%.rpm}"
971 [ -d "$dstdir" ] && rm -rf "$dstdir"
972 mv "${builddir}" "$dstdir" || return 255
975 local kernelrpmname="kernel-lustre-${KERNCONFSMPTYPE}-${lnxmaj}-${EXTRA_VERSIONnew}.${TARGET_ARCH}.rpm"
976 [ -f "RPMS/${TARGET_ARCH}/${kernelrpmname}" ] || kernelrpmname="kernel-${KERNCONFSMPTYPE}-${lnxmaj}-${EXTRA_VERSNnew}.${TARGET_ARCH}.rpm"
977 ( $PATCHLESS ) && [ -f "$KERNELRPM" ] && kernelrpmname="$KERNELRPMnew"
978 if [ "$rpmonly" = "rpmonly" ] && [ -f "${REUSEBUILD}/${TIMESTAMP}/${kernelrpmname}" ]; then
979 echo "RPM already exist in store directory tree"
981 [ -f "RPMS/${TARGET_ARCH}/${kernelrpmname}" ] && cp -f "RPMS/${TARGET_ARCH}/${kernelrpmname}" "${REUSEBUILD}/${TIMESTAMP}/"
983 #store kernel source rpm
984 kernelrpmname="kernel-lustre-source-${lnxmaj}-${EXTRA_VERSIONnew}.${TARGET_ARCH}.rpm"
985 [ -f "RPMS/${TARGET_ARCH}/${kernelrpmname}" ] || kernelrpmname="kernel-source-${lnxmaj}-${EXTRA_VERSIONnew}.${TARGET_ARCH}.rpm"
986 ( $PATCHLESS ) && [ -f "$KERNELSOURCERPM" ] && kernelrpmname=$(basename "$KERNELSOURCERPM")
987 if [ "$rpmonly" = "rpmonly" ] && [ -f "${REUSEBUILD}/${TIMESTAMP}/${kernelrpmname}" ]; then
988 echo "RPM already exist in store directory tree"
990 [ -f "RPMS/${TARGET_ARCH}/${kernelrpmname}" ] && cp -f "RPMS/${TARGET_ARCH}/${kernelrpmname}" "${REUSEBUILD}/${TIMESTAMP}/"
996 local infact_arch=${TARGET_ARCH}
998 [ "$infact_arch" == "i586" ] && infact_arch="i686"
999 for smp_type in $SMP_ARCHS; do
1000 [ $infact_arch == $smp_type ] && RPMSMPTYPE=smp && break
1002 for smp_type in $BIGSMP_ARCHS; do
1003 [ $infact_arch == $smp_type ] && RPMSMPTYPE=bigsmp && break
1007 #unpack kernel(/source/devel) RPM
1011 local delimiter=${2:-"-"}
1012 local pathtorpms="${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
1013 local kernelbinaryrpm=
1014 [ -d $pathtorpms ] || return 255
1016 local wanted_kernel="${lnxmaj}${delimiter}${lnxrel}"
1017 for arch in $TARGET_ARCHS_ALL; do
1018 for rpm in ${pathtorpms}/${arch}/*.rpm; do
1019 local provides=$(rpm -q --provides -p $rpm)
1020 if (echo $provides | grep -q "kernel${prefix} = $wanted_kernel"); then
1024 [ -f "$KERNELRPM" ] && TARGET_ARCH="$arch" && BUILD_ARCHS="$arch" && break
1030 [ -f "$KERNELRPM" ] || return 255
1031 [ -d $TOPDIR/reused ] || mkdir $TOPDIR/reused
1032 pushd $TOPDIR/reused || return 255
1034 rpm2cpio < "$KERNELRPM" | cpio -idc > /dev/null 2>&1
1035 if [ ${PIPESTATUS[0]} -eq 0 ]; then
1036 # RHEL-style and SLES-style rpms
1037 local paths="kernels/${lnxmaj}${delimiter}${lnxrel}-${TARGET_ARCH} linux-${lnxmaj}${delimiter}${lnxrel}"
1039 for path in $paths; do
1042 if [ -d "$src/$path/" ]; then
1043 LINUX="$(pwd)/$src/$path"
1045 # SLES has a separate -obj tree
1046 if [ -d "$src/${path}-obj" ]; then
1047 src="$src/${path}-obj"
1048 local objects="$TARGET_ARCH/$RPMSMPTYPE"
1050 # Novell, are you *TRYING* to make life hard for me?
1051 if [ -d "$src/powerpc" ]; then
1052 objects="powerpc/$TARGET_ARCH"
1053 elif [ $TARGET_ARCH == 'i686' ]; then
1054 objects="i386/$RPMSMPTYPE"
1057 LINUXOBJ="$(pwd)/$src/$objects"
1060 if [ -z "$LINUX" ]; then
1063 # dig out the release version
1064 local LINUXRELEASEHEADER=version.h
1065 if test -s ${LINUXOBJ:-$LINUX}/include/linux/utsrelease.h ; then
1066 LINUXRELEASEHEADER=utsrelease.h
1068 LINUXRELEASE=$(sed -ne 's/#define UTS_RELEASE "\(.*\)"$/\1/p' ${LINUXOBJ:-$LINUX}/include/linux/$LINUXRELEASEHEADER)
1069 if [ -z "$LINUXRELEASE" ]; then
1070 echo "Failed to find linux release in ${LINUXOBJ:-$LINUX}/include/linux/$LINUXRELEASEHEADER"
1081 #look for kernel source RPM
1082 find_linux_source_rpm()
1088 [ ! "$TARGET_ARCH" = "" ] && arch=$TARGET_ARCH && findarch=false
1090 if ! $findarch; then
1091 pathtorpms="${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}/${arch}"
1092 [ -d $pathtorpms ] || return 255
1095 rpmfile="kernel-${lnxmaj}-${lnxrel}.src.rpm"
1098 rpmfile="kernel-source-${lnxmaj}.${lnxrel}.${arch}.rpm"
1101 rpmfile="kernel-source-${lnxmaj}-${lnxrel}.${arch}.rpm"
1104 [ -f "${pathtorpms}/${rpmfile}" ] || return 255
1105 KERNELSOURCERPM="${pathtorpms}/${rpmfile}"
1107 for arch in $TARGET_ARCHS_ALL; do
1108 pathtorpms="${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}/${arch}"
1109 [ -d $pathtorpms ] || continue
1112 rpmfile="kernel-${lnxmaj}-${lnxrel}.src.rpm"
1115 rpmfile="kernel-source-${lnxmaj}.${lnxrel}.${arch}.rpm"
1118 rpmfile="kernel-source-${lnxmaj}-${lnxrel}.${arch}.rpm"
1121 [ -f "${pathtorpms}/${rpmfile}" ] || continue
1122 KERNELSOURCERPM="${pathtorpms}/${rpmfile}"
1127 [ -f "${KERNELSOURCERPM}" ] || return 255
1130 #unpack and make symlinks for reusing kernel RPM
1134 [ "$pathtorpm" = "" ] && return 255
1135 [ -f "$pathtorpm" ] || return 255
1136 [ -d $TOPDIR/reused ] || mkdir $TOPDIR/reused
1137 pushd $TOPDIR/reused || return 255
1139 rpm2cpio < $pathtorpm | cpio -idc
1140 [ ${PIPESTATUS[0]} -eq 0 ] || return 255
1143 if pushd usr/src/linux-*-obj/${TARGET_ARCH}; then
1144 local smptypes="$SMPTYPES"
1145 [ "$RPMSMPTYPE" = "" ] || smptypes=$RPMSMPTYPE
1146 ( ! $PATCHLESS ) && [ ! "$KERNCONFSMPTYPE" = "" ] && smptypes="$KERNCONFSMPTYPE"
1148 for cursmptype in $smptypes; do
1149 [ "$cursmptype" = "''" ] && continue
1150 [ -d $cursmptype ] && smptype=$cursmptype
1151 [ -d $smptype ] && break
1155 if [ "${smptype}" = "" ]; then
1157 return 255 # cannot detect smp type
1159 if pushd usr/src/linux-*-obj/${TARGET_ARCH}/$smptype/include2; then
1160 local base=$(readlink asm)
1161 if [ ! -d "/${base}/" ]; then
1163 base=$(basename "$base")
1164 if pushd ../../../../linux-*/include; then
1167 [ -d "$lsrc/${base}" ] && ln -s $lsrc/${base} asm
1171 read a b < <(echo $(pwd)/usr/src/linux-*)
1172 if [[ $a == $(pwd)/* && $b = $(pwd)/* ]]; then
1173 cp -f $a/include/linux/config.h $b/${TARGET_ARCH}/$smptype/include/linux/
1174 cp $b/${TARGET_ARCH}/$smptype/.config $a/
1175 [ -f "$b/${TARGET_ARCH}/$smptype/.config" ] && KERNELRPMCONFIG="$b/${TARGET_ARCH}/$smptype/.config"
1176 cp $b/${TARGET_ARCH}/$smptype/.kernelrelease $a/
1177 [ -f "$b/${TARGET_ARCH}/$smptype/.kernelrelease" ] && KERNELRPMRELEASE="$b/${TARGET_ARCH}/$smptype/.kernelrelease"
1179 LINUXOBJ=$b/${TARGET_ARCH}/$smptype
1180 # local fname=$(basename $kernel_rpm)
1181 # KERNELRPMSDIR=${kernel_rpm%$fname}
1185 [ "$LINUX" = "" ] && return 255
1186 [ -d "$LINUX" ] || return 255
1189 #build linux kernel rpm
1192 pushd $LINUX || return 255
1193 make binrpm-pkg || ( popd ; return 255 )
1195 [ -f ".version" ] && addlnxrel="-$(cat .version)"
1198 for arch in $TARGET_ARCHS_ALL; do
1199 [ -f "/usr/src/rpm/RPMS/$arch/kernel-$lnxmaj.${lnxrel}${addlnxrel}.$arch.rpm" ] && \
1200 KERNELRPM="/usr/src/rpm/RPMS/$arch/kernel-$lnxmaj.${lnxrel}${addlnxrel}.$arch.rpm" && \
1202 [ -f "/usr/src/packages/RPMS/$arch/kernel-$lnxmaj.${lnxrel}${addlnxrel}.$arch.rpm" ] && \
1203 KERNELRPM="/usr/src/packages/RPMS/$arch/kernel-$lnxmaj.${lnxrel}${addlnxrel}.$arch.rpm" && \
1206 [ "$KERNELRPM" = "" ] || return
1214 local nocopykernel=$2
1215 pushd $LINUX || fatal 1 "Kernel source not found"
1216 [ "$nofullmake" = "nofullmake" ] || make mrproper
1217 [ "$nofullmake" = "nofullmake" ] || rm -f rpm-release
1218 # [ "$nocopykernel" = "copyrpmkernel" ] || rm -f localversion-*
1219 [ "$nocopykernel" = "copykernel" ] && [ -f "$CONFIG_FILE" ] && cp $CONFIG_FILE .config
1220 if [ "$nocopykernel" = "copyrpmkernel" ]; then
1221 [ -f "$KERNELRPMCONFIG" ] && cp $KERNELRPMCONFIG .config
1222 if [ -f "$KERNELRPMRELEASE" ]; then
1223 cp $KERNELRPMRELEASE .
1225 sed -e "s/^EXTRAVERSION\s\+=\s\+.*$/EXTRAVERSION = -${lnxrel}/" < Makefile > Makefile.new
1226 [ -f "Makefile.new" ] && mv Makefile.new Makefile
1229 [ -f ".config" ] || ( popd ; echo "Cannot find .config file"; return 255 )
1230 make oldconfig || ( popd ; return 255 )
1231 make include/linux/version.h
1232 if [ ! "$nofullmake" = "nofullmake" ]; then
1233 make || ( popd ; return 255 )
1241 # build kernel-ib{,-devel}
1242 # some I/B drivers are architecture dependent and kernel-ib's configure
1243 # does not figure it out for us ~sigh~
1244 local configure_options=""
1245 case "$TARGET_ARCH" in
1247 configure_options="--with-ipath_inf-mod"
1250 configure_options="--with-ipath_inf-mod --with-ehca-mod"
1253 $RPMBUILD --rebuild --define 'build_kernel_ib 1' --define 'build_kernel_ib_devel 1' \
1254 --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
1255 --define "KVERSION ${LINUXRELEASE}" \
1256 --define "KSRC ${LINUXOBJ:-${LINUX}}" \
1257 --define "LIB_MOD_DIR /lib/modules/${LINUXRELEASE}/updates" \
1258 --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
1260 if [ ${PIPESTATUS[0]} != 0 ]; then
1261 fatal 1 "Error building kernel-ib"
1264 pushd "$TOPDIR" >/dev/null
1265 rm -rf kernel-ib-devel
1266 mkdir kernel-ib-devel
1268 local rpm=$(ls $TOPDIR/RPMS/*/kernel-ib-devel-${OFED_VERSION}-${LINUXRELEASE//-/_}.*.rpm)
1269 rpm2cpio -itv < $rpm | cpio -id
1270 CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/ofa_kernel ${CONFIGURE_FLAGS}"
1274 #build patchless lustre
1275 patchless_build_sequence()
1277 #try to build from kernel-devel RPM (RHEL)
1280 local rpmfound=false
1281 local buildsuccess=false
1282 local storeforreuse=false
1283 if [ "$KERNELRPMSBASE" = "" ] || [ ! -d "$KERNELRPMSBASE" ]; then
1286 [ -d $TOPDIR/reused ] && rm -rf $TOPDIR/reused
1288 local delimiter=${EXTRA_VERSION_DELIMITER:-"-"}
1289 # default to source type -source and special case below
1297 unpack_linux_rpm $type $delimiter && rpmfound=true
1299 [ -d SRPMS ] || mkdir SRPMS
1300 [ -d RPMS ] || mkdir RPMS
1301 [ -d BUILD ] || mkdir BUILD
1302 [ -d SOURCES ] || mkdir SOURCES
1304 # first build kernel-ib
1305 if [ -n "$OFED_VERSION" ]; then
1306 $rpmfound && build_kernel_ib
1308 ( $rpmfound ) && build_lustre && buildsuccess=true && find_linux_source_rpm
1310 if $buildsuccess; then
1311 [ -d "RPMS/${TARGET_ARCH}" ] && [ -f "$KERNELRPM" ] && \
1312 cp "$KERNELRPM" RPMS/${TARGET_ARCH}/
1313 [ -d "RPMS/${TARGET_ARCH}" ] && [ -f "$KERNELSOURCERPM" ] && \
1314 cp "$KERNELSOURCERPM" RPMS/${TARGET_ARCH}/
1315 KERNELCOMPILEDIR="$LINUX"
1316 if $storeforreuse; then
1317 store_for_reuse || echo "Cannot store for feature reuse"
1321 elif ! $rpmfound; then
1322 echo "COULD NOT FIND VENDOR -devel or -source RPM for $DISTRO/$TARGET_ARCH: $lnxmaj-$lnxrel in $KERNELRPMSBASE"
1325 echo "Patchless build failed."
1330 #check timestamp value. should bi 14-digits string
1334 local timestampnodig=$(echo $invalue | sed -e s/[0-9]*//g)
1335 [ "$timestampnodig" = "" ] || return 255
1336 local timestamplength="${#invalue}"
1337 [ $timestamplength -eq 14 ] || return 255
1340 # get list of suitable directories with potential reused staff
1341 get_reuse_dir_list()
1344 local reusedkernelmasknew=$2
1345 local buildtimestamp=
1347 local sourcelastdate=$(get_last_source_date)
1348 for buildtimestamp in $(ls "$REUSEBUILD/" 2>&1); do
1349 [ -d "$REUSEBUILD/$buildtimestamp" ] || continue
1350 check_timestamp "$buildtimestamp" || continue
1351 local buildtimestampstr=$(echo $buildtimestamp | \
1352 sed -e "s^\(....\)\(..\)\(..\)\(..\)\(..\)\(..\)^\1-\2-\3 \4:\5:\6 GMT^g")
1353 local buildtimestampepoch=$(date --date="$buildtimestampstr" +%s )
1354 #check for suitable date
1355 if ! $PATCHLESS; then
1356 [ $buildtimestampepoch -ge $sourcelastdate ] || continue
1358 #check for suitable version
1359 if [ "$rpmonly" = "rpmonly" ]; then
1360 local reusedkernelprefix="kernel-lustre-"
1361 ( $PATCHLESS ) && reusedkernelprefix=
1362 local rpmmask="${reusedkernelprefix}${REUSEDKERNELMASK}"
1363 [ "$reusedkernelmasknew" = "" ] || rpmmask="$reusedkernelmasknew"
1364 [ -f $REUSEBUILD/$buildtimestamp/${rpmmask}.rpm ] && \
1365 dirsforreuse="$dirsforreuse $REUSEBUILD/$buildtimestamp"
1367 local rpmmask="$REUSEDKERNELMASK"
1368 [ "$reusedkernelmasknew" = "" ] || rpmmask="$reusedkernelmasknew"
1369 pushd $REUSEBUILD/$buildtimestamp/linux-${rpmmask} > /dev/null 2>&1 || continue
1371 dirsforreuse="$dirsforreuse $curdir"
1375 echo "$dirsforreuse"
1378 #try to reuse old RPM
1379 build_sequence_rpm_reuse()
1382 [ "$REUSERPM" = "" ] && [ "$REUSEBUILD" = "" ] && return 255
1384 if ! [ "$REUSEBUILD" = "" ] && [ -d "$REUSEBUILD" ]; then #try to reuse RPM
1385 local REUSEDKERNELMASKnew=$(echo $REUSEDKERNELMASK | sed -e "s/^[^0-9]*//")
1386 REUSEDKERNELMASKnew="kernel-lustre-source-${REUSEDKERNELMASKnew}"
1387 local dirsforreuse="$(get_reuse_dir_list rpmonly $REUSEDKERNELMASKnew)"
1388 local buildsuccess=false
1390 for curdir in $(echo $dirsforreuse); do
1391 [ -d "$curdir" ] || continue
1392 local reusedkernelprefix="kernel-lustre-"
1393 local reusedkernelrpm=
1394 [ -f ${curdir}/${reusedkernelprefix}${REUSEDKERNELMASK}.rpm ] && \
1395 reusedkernelrpm=$(ls ${curdir}/${reusedkernelprefix}${REUSEDKERNELMASK}.rpm | head -1 )
1396 [ -f "$reusedkernelrpm" ] || continue
1398 local reusedkernelsourcerpm=
1399 [ -f ${curdir}/${REUSEDKERNELMASKnew}.rpm ] && \
1400 reusedkernelsourcerpm=$(ls ${curdir}/${REUSEDKERNELMASKnew}.rpm | head -1 )
1401 [ -f "$reusedkernelsourcerpm" ] || continue
1403 [ -d $TOPDIR/reused ] && rm -rf $TOPDIR/reused
1404 reuse_kernel_rpm "$reusedkernelsourcerpm" && build_linux nofullmake copyrpmkernel && build_lustre && buildsuccess=true
1405 ( $buildsuccess ) || continue
1406 if ( ! $NORPM ) && ( ! $PATCHLESS ) ; then
1407 [ -f "$reusedkernelrpm" ] && \
1408 cp -f "$reusedkernelrpm" RPMS/${TARGET_ARCH}/ > /dev/null 2>&1
1410 [ -f "$reusedkernelsourcerpm" ] && \
1411 cp -f "$reusedkernelsourcerpm" RPMS/${TARGET_ARCH}/ > /dev/null 2>&1 && \
1412 touch RPMS/${TARGET_ARCH}/kernel_was_reused
1420 #try to reuse old BUILD dir
1421 build_sequence_reuse()
1424 [ "$REUSERPM" = "" ] && [ "$REUSEBUILD" = "" ] && return 255
1426 if [ ! "$REUSEBUILD" = "" ] && [ -d "$REUSEBUILD" ]; then #try to reuse old kernel build directory
1427 local dirsforreuse="$(get_reuse_dir_list)"
1428 local buildsuccess=false
1430 local REUSEDKERNELMASKnew=$(echo $REUSEDKERNELMASK | sed -e "s/^[^0-9]*//")
1431 for curdir in $(echo $dirsforreuse); do
1432 local reusedkernelrpm=
1433 local reusedkernelsourcerpm=
1434 [ -d "$curdir" ] || continue
1435 local reusedkernelprefix="kernel-lustre-"
1436 ( $PATCHLESS ) && reusedkernelprefix=
1437 [ -f ${curdir}/../${reusedkernelprefix}${REUSEDKERNELMASK}.rpm ] && \
1438 reusedkernelrpm=$(ls ${curdir}/../${reusedkernelprefix}${REUSEDKERNELMASK}.rpm | head -1 )
1439 reusedkernelprefix="kernel-lustre-source-"
1440 [ -f ${curdir}/../${reusedkernelprefix}${REUSEDKERNELMASKnew}.rpm ] && \
1441 reusedkernelsourcerpm=$(ls ${curdir}/../${reusedkernelprefix}${REUSEDKERNELMASKnew}.rpm | head -1 )
1442 if ! ( $NORPM ) && ! [ -f "$reusedkernelrpm" ]; then #kernel rpm not found. Build all
1445 if ! ( $NORPM ) && ! [ -f "$reusedkernelsourcerpm" ]; then #kernel source rpm not found. Build all
1449 build_lustre || continue
1452 if ( ! $NORPM ) && ( ! $PATCHLESS ) ; then
1453 [ -f "$reusedkernelrpm" ] && \
1454 cp -f "$reusedkernelrpm" RPMS/${TARGET_ARCH}/ > /dev/null 2>&1 && \
1455 touch RPMS/${TARGET_ARCH}/kernel_was_reused
1456 [ -f "$reusedkernelsourcerpm" ] && \
1457 cp -f "$reusedkernelsourcerpm" RPMS/${TARGET_ARCH}/ > /dev/null 2>&1
1468 if (( $DO_SRC )) ; then
1474 prep_kernel_build || return 255
1475 clean_lustre || return 255
1477 build_kernel || return 255
1480 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
1482 options=$(getopt -o d:D:h -l kerneltree:,distro:,kernelrpm:,reusebuild:,patchless,ldiskfs,ccache,reuse:,norpm,disable-datestamp,external-patches:,timestamp:,extraversion:,kerneldir:,linux:,lustre:,nodownload,nosrc,publish,release,src,stage:,tag:,target:,target-archs:,with-linux: -- "$@")
1484 if [ $? != 0 ] ; then
1488 eval set -- "$options"
1526 --linux | --with-linux)
1601 --disable-datestamp)
1608 CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-liblustre --enable-liblustre-tests"
1612 usage 1 "Unrecognized option: $1"
1622 EXTRA_VERSION_DELIMITER=${EXTRA_VERSION_DELIMITER:-"-"}
1624 if [ -n "$OFED_VERSION" ]; then
1630 patchless_build_sequence && build_success=true
1631 elif [ -z "$LINUX" ] ; then
1632 [ "$DISTRO" = "sles9" ] && build_sequence_rpm_reuse && build_success=true
1633 if ! $build_success; then
1634 build_sequence_reuse && build_success=true
1635 if ! $build_success; then
1636 build_sequence && build_success=true
1637 if $build_success; then
1638 store_for_reuse || echo "Cannot store for feature reuse"
1645 ( $build_success ) || fatal 1 "Cannot build lustre"