3 # vim:expandtab:shiftwidth=4:softtabstop=4:tabstop=4:
7 # CVSROOT is inherited from the environment
21 TMPDIR=${TMPDIR:-"/var/tmp"}
50 # Readlink is not present on some older distributions: emulate it.
54 if [ -L "$path" ]; then
55 ll="$(LC_ALL=C ls -l "$path" 2> /dev/null)" &&
69 [ "$1" ] && echo -e "\n${0##*/}: $1"
81 (( $RELEASE )) || return 0
86 echo -n "Available targets:"
87 for target in $TOPDIR/lustre/lustre/kernel_patches/targets/*.target ; do
88 target_file=${target##*/}
89 echo -n " ${target_file%%.target}"
97 Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
100 Specifies the CVS Root to use when pulling files from CVS. The
101 environment variable \$CVSROOT is used if this option is not
104 --external-patches=EXTERNAL_PATCHES
105 Directory similar to lustre/lustre/kernel_patches/ that lbuild should
106 look for seres and config files in before looking in the lustre
109 --extraversion=EXTRAVERSION
110 Text to use for the rpm release and kernel extraversion.
112 --kerneldir=KERNELDIR
113 Directory containing Linux source tarballs referenced by target
117 Directory of Linux kernel sources. When this option is used, only
118 Lustre modules and userspace are built.
121 Path to an existing lustre source tarball to use instead of
125 Do not try to download a kernel from ftp.lustre.org
128 Do not build a .src.rpm, a full kernel patch, or a patched kernel
135 Specifies that the files generated do not include timestamps, and
136 that this is an official release.
139 Build a .src.rpm, a full kernel patch, and a patched kernel tarball.
142 Directory used to stage packages for release. RPMs will be placed
143 more or less in DIR/<target>-<arch>, and the tarball will be
147 A CVS branch/tag name to build from when pulling from CVS.
150 The name of the target to build. The available targets are listed
153 --target-archs=TARGET_ARCHS
154 A (space delimited) list of architectures to build. By default,
155 all of the archs supported by the TARGET will be built, in
156 addition to a .src.rpm. This option can limit those, for machines
157 that can only build certain archs or if you only want a certain
158 arch built (for testing, or a one-off kernel).
160 Also note that by using a non-"base" arch (eg, i386) only kernels
161 will be built - there will be no lustre-lite-utils package.
164 Prevents the datestamp flag (-D) from being passed to cvs for
165 checkouts. This is a workaround for a problem encountered when
166 using lbuild with tinderbox.
177 if [ "$LUSTRE" ] ; then
178 [ -r "$LUSTRE" ] || \
179 usage 1 "Could not find Lustre source tarball '$LUSTRE'."
182 usage 1 "Either specify a CVS Root with -d, or a Lustre source tarball with --lustre."
184 usage 1 "A branch/tag name must be specified with --tag when not building from a tarball."
187 if [ -z "$LINUX" ] ; then
188 [ "$KERNELDIR" ] || \
189 usage 1 "A kernel directory must be specified with --kerneldir."
191 [ -d "$KERNELDIR" ] || \
192 usage 1 "$KERNELDIR is not a directory."
194 if ! (( $RELEASE )) ; then
196 usage 1 "When building a snapshot, a tag name must be used."
199 [ "$TARGET" ] || usage 1 "A target must be specified with --target."
200 # TARGET_FILE="$TOPDIR/lustre/kernel_patches/targets/$TARGET.target"
201 # [ -r "$TARGET_FILE" ] || \
202 # usage 1 "Target '$TARGET' was not found."
207 CANONICAL_TARGET="rhel-2.6"
210 CANONICAL_TARGET="sles-2.6"
213 CANONICAL_TARGET="sles10-2.6"
216 CANONICAL_TARGET="hp-pnnl-2.4"
224 CANONICAL_TARGET="$TARGET"
228 TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M")
230 RPMBUILD=$(which rpmbuild 2>/dev/null | head -1)
231 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
232 RPMBUILD=$(which rpm 2>/dev/null | head -1)
233 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
234 usage 1 "Could not find binary for making rpms (tried rpmbuild and rpm)."
241 echo $(echo "$*" | xargs -n 1 | sort -u)
248 if [ "$TARGET" = "rhel-2.6" -o "$TARGET" = "rhel-2.4" ]; then
250 if [ "$TARGET" = "rhel-2.6" ]; then
252 OLDCONFIG=nonint_oldconfig
253 elif [ "$TARGET" = "rhel-2.4" ]; then
258 RPMTOPDIR=$(mktemp -d $KERNELDIR/rpm_XXXXXX)
259 mkdir $RPMTOPDIR/BUILD/
260 rpm -ivh $KERNELDIR/$SRPM --define "_topdir $RPMTOPDIR" || \
261 { rm -rf $RPMTOPDIR; fatal 1 "Error installing kernel SRPM."; }
262 $RPMBUILD -bp --nodeps --target i686 $RPMTOPDIR/SPECS/$SPEC --define "_topdir $RPMTOPDIR"
263 pushd $RPMTOPDIR/BUILD/kernel-${lnxmaj}/linux-${lnxmaj} && {
265 cp configs/kernel-${lnxmaj}-i686-smp.config .config
266 if ! make $OLDCONFIG > /dev/null; then
267 fatal 1 "error trying to make $OLDCONFIG while building a tarball from SRPM."
269 make include/linux/version.h
272 tar cjf $KERNEL_FILE linux-${lnxmaj}
279 download_and_build_tarball() {
283 local SRPM=kernel-${lnxmaj}-${lnxrel}.src.rpm
285 echo "Downloading http://ftp.lustre.org/kernels/$TARGET/old/$SRPM..."
286 if ! wget -nv "http://ftp.lustre.org/kernels/$TARGET/old/$SRPM" \
287 -O "$KERNELDIR/$SRPM" ; then
288 fatal 1 "Could not download target $TARGET's kernel SRPM $SRPM from ftp.lustre.org."
291 build_tarball $TARGET $SRPM
296 EXTRA_VERSION_save="$EXTRA_VERSION"
297 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches" ; do
298 TARGET_FILE="$patchesdir/targets/$TARGET.target"
299 [ -r "$TARGET_FILE" ] && break
301 [ -r "$TARGET_FILE" ] || \
302 fatal 1 "Target $TARGET was not found."
304 echo "Loading target config file $TARGET.target..."
308 [ "$KERNEL" ] || fatal 1 "Target $TARGET did not specify a kernel."
309 [ "$VERSION" ] || fatal 1 "Target $TARGET did not specify a kernel version."
311 if [ "$KERNELDIR" ] ; then
312 KERNEL_FILE="$KERNELDIR/$KERNEL"
313 if [ ! -r "$KERNELDIR/$KERNEL" ] ; then
314 # see if we have an SRPM we can build a tarball for
315 KERNEL_SRPM=kernel-${lnxmaj}-${lnxrel}.src.rpm
316 if [ -r "$KERNELDIR/$KERNEL_SRPM" ] ; then
317 build_tarball $CANONICAL_TARGET $KERNEL_SRPM
319 if (( $DOWNLOAD )) ; then
320 echo "Downloading http://ftp.lustre.org/kernels/$CANONICAL_TARGET/old/$KERNEL..."
321 if ! wget -nv "http://ftp.lustre.org/kernels/$CANONICAL_TARGET/old/$KERNEL" -O "$KERNELDIR/$KERNEL" ; then
322 # see if we can do it with an SRPM from the download site
323 download_and_build_tarball $CANONICAL_TARGET $KERNEL_FILE
326 fatal 1 "Target $TARGET's kernel file $KERNEL not found in kernel directory $KERNELDIR."
332 if [ "$SERIES" ] ; then
333 for series in $SERIES ; do
334 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches" ; do
335 [ -r "$patchesdir/series/$series" ] && continue 2
337 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."
341 CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/$CONFIG"
342 [ -r "$CONFIG_FILE" ] || \
343 fatal 1 "Target $TARGET's config file $CONFIG missing from $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/."
345 if [ "$EXTRA_VERSION_save" ] ; then
346 EXTRA_VERSION="$EXTRA_VERSION_save"
347 elif ! (( $RELEASE )) ; then
348 # if there is no patch series, then this is not a lustre specific
349 # kernel. don't make it look like one
350 if [ -n "$SERIES" ]; then
351 #remove the @VERSION@ (lustre version)
352 EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
353 EXTRA_VERSION="${EXTRA_VERSION}-${TAG}.${TIMESTAMP}"
356 # EXTRA_VERSION=${EXTRA_VERSION//-/_}
358 ALL_ARCHS="$BASE_ARCHS $BIGMEM_ARCHS $BOOT_ARCHS $JENSEN_ARCHS $SMP_ARCHS $BIGSMP_ARCHS $PSERIES64_ARCHS $UP_ARCHS"
361 for arch in $(uniqify "$ALL_ARCHS") ; do
362 if [ -z "$TARGET_ARCHS" ] || echo "$TARGET_ARCHS" | grep "$arch" >/dev/null 2>/dev/null ; then
363 BUILD_ARCHS="$BUILD_ARCHS $arch"
366 [ "$BUILD_ARCHS" ] || usage 1 "No available target archs to build."
367 echo "Building for: $BUILD_ARCHS"
374 fatal 1 "tarflags(): File name argument missing."
386 fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
393 echo "Untarring ${1##*/}..."
394 tar $(tarflags "$1") "$1"
399 DIRNAME="lustre-$TAG-$TIMESTAMP"
400 if [ "$LUSTRE" ] ; then
402 [ -d lustre ] || ln -sf lustre-[0-9].[0-9]* lustre
404 if [ "$USE_DATESTAMP" ]; then
405 DATESTAMP="-D '$DATE'"
410 cvs -d "$CVSROOT" -qz3 co $DATESTAMP -d "$DIRNAME" lustre || \
411 fatal 1 "There was an error checking out toplevel Lustre from CVS."
412 pushd "$DIRNAME" > /dev/null
413 ./lustrecvs "$TAG" || \
414 fatal 1 "There was an error checking out Lustre/Portals/Build from CVS."
415 echo "Creating lustre tarball..."
416 sh autogen.sh || fatal 1 "There was an error running autogen.sh."
417 ./configure --disable-{modules,utils,liblustre,tests,doc} || \
418 fatal 1 "There was an error running ./configure to create makefiles."
419 make dist || fatal 1 "There was an error running 'make dist'."
421 fname=`basename $DIRNAME/lustre-*.tar.gz`
422 cp $DIRNAME/$fname . || fatal 1 "There was an error copying lustre tarball."
424 ln -sf "$DIRNAME" lustre
431 [ -d linux ] || ln -sf linux* linux
436 [ "$SERIES" ] || return 0
437 FULL_PATCH="$PWD/lustre-kernel-${TARGET}-${EXTRA_VERSION}.patch"
438 [ -f "$FULL_PATCH" ] && rm -f "$FULL_PATCH"
439 pushd linux >/dev/null
440 for series in $SERIES ; do
441 echo -n "Applying series $series:"
442 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches" ; do
443 [ -r "$patchesdir/series/$series" ] || continue
444 SERIES_FILE="$patchesdir/series/$series"
445 for patch in $(<"$SERIES_FILE") ; do
447 PATCH_FILE="$patchesdir/patches/$patch"
448 [ -r "$PATCH_FILE" ] || \
449 fatal 1 "Patch $patch does not exist in Lustre tree."
450 cat "$PATCH_FILE" >> "$FULL_PATCH" || \
451 fatal 1 "Error adding patch $patch to full patch."
452 patch -s -p1 < "$PATCH_FILE" || fatal 1 "Error applying patch $patch."
459 echo "Full patch has been saved in ${FULL_PATCH##*/}."
460 echo "Replacing .config files..."
461 [ -d linux/configs ] || mkdir linux/configs || \
462 fatal 1 "Error creating configs directory."
463 rm -f linux/configs/*
465 for patchesdir in "$EXTERNAL_PATCHES" "lustre/lustre/kernel_patches" ; do
466 [ "$patchesdir" ] && \
467 cp -v $patchesdir/kernel_configs/kernel-${VERSION}-${TARGET}*.config linux/configs/ >/dev/null && copysuccess=1
469 [ "$copysuccess" = "1" ] || \
470 fatal 1 "Error copying in kernel configs."
475 TARBALL="$(readlink linux)-$EXTRA_VERSION.tar.gz"
476 echo "Creating patched linux tarball $TARBALL..."
477 tar zcf "$TARBALL" "$(readlink linux)" \
478 --exclude "CVS" --exclude ".cvsignore" || \
479 --exclude "*.orig" --exclude "*~" --exclude "*.rej" || \
480 fatal 1 "Error creating patched Linux tarball."
485 [ -d linux ] || return 0
486 echo "Cleaning linux..."
487 [ -L linux ] && rm -rf $(readlink linux)
494 ENABLE_INIT_SCRIPTS=""
496 -e "s^@BASE_ARCHS@^$BASE_ARCHS^g" \
497 -e "s^@BIGMEM_ARCHS@^$BIGMEM_ARCHS^g" \
498 -e "s^@BIGSMP_ARCHS@^$BIGSMP_ARCHS^g" \
499 -e "s^@BOOT_ARCHS@^$BOOT_ARCHS^g" \
500 -e "s^@CONFIGURE_FLAGS@^$CONFIGURE_FLAGS^g" \
501 -e "s^@ENABLE_INIT_SCRIPTS@^$ENABLE_INIT_SCRIPTS^g" \
502 -e "s^@JENSEN_ARCHS@^$BOOT_ARCHS^g" \
503 -e "s^@KERNEL_EXTRA_VERSION@^$EXTRA_VERSION^g" \
504 -e "s^@KERNEL_RELEASE@^${EXTRA_VERSION//-/_}^g" \
505 -e "s^@KERNEL_SOURCE@^$KERNEL^g" \
506 -e "s^@KERNEL_VERSION@^$VERSION^g" \
507 -e "s^@LINUX26@^$LINUX26^g" \
508 -e "s^@LUSTRE_SOURCE@^${LUSTRE##*/}^g" \
509 -e "s^@LUSTRE_TARGET@^$TARGET^g" \
510 -e "s^@PSERIES64_ARCHS@^$PSERIES64_ARCHS^g" \
511 -e "s^@RHBUILD@^$RHBUILD^g" \
512 -e "s^@SMP_ARCHS@^$SMP_ARCHS^g" \
513 -e "s^@SUSEBUILD@^$SUSEBUILD^g" \
514 -e "s^@SUSEBUILD@^$SUSEBUILD^g" \
515 -e "s^@UP_ARCHS@^$UP_ARCHS^g" \
516 < $TOPDIR/lustre/build/lustre-kernel-2.4.spec.in \
517 > lustre-kernel-2.4.spec
518 [ -d SRPMS ] || mkdir SRPMS
519 [ -d RPMS ] || mkdir RPMS
520 [ -d BUILD ] || mkdir BUILD
521 [ -d SOURCES ] || mkdir SOURCES
522 for script in linux-{rhconfig.h,merge-config.awk,merge-modules.awk} \
523 suse-{functions.sh,post.sh,postun.sh,trigger-script.sh.in} \
524 sles8-{pre,post,postun,update_{INITRD_MODULES,rcfile_setting}}.sh ; do
525 cp $TOPDIR/lustre/build/$script SOURCES
527 cp "$LUSTRE" "$KERNEL_FILE" SOURCES
528 if [ "$EXTERNAL_PATCHES" -a -d "$EXTERNAL_PATCHES" ] ; then
529 tar zcf SOURCES/external-patches.tar.gz -C "$EXTERNAL_PATCHES" series targets patches kernel_configs
531 touch SOURCES/external-patches.tar.gz
537 [ -d lustre ] || return 0
538 echo "Cleaning Lustre..."
539 [ -L lustre ] && rm -rf $(readlink lustre)
545 echo "Building kernel + Lustre RPMs for: $BUILD_ARCHS..."
547 for arch in $BUILD_ARCHS ; do
548 targets="--target $arch $targets"
551 $RPMBUILD $targets -bb lustre-kernel-2.4.spec \
552 --define "_tmppath $TMPDIR" \
553 --define "_topdir $TOPDIR" || \
554 fatal 1 "Error building rpms for $BUILD_ARCHS."
556 if (( $DO_SRC )) ; then
557 $RPMBUILD -bs lustre-kernel-2.4.spec \
558 --define "_tmppath $TMPDIR" \
559 --define "_topdir $TOPDIR" || \
560 fatal 1 "Error building .src.rpm."
566 [ -d SRPMS ] || mkdir SRPMS
567 [ -d RPMS ] || mkdir RPMS
568 [ -d BUILD ] || mkdir BUILD
569 [ -d SOURCES ] || mkdir SOURCES
573 pushd lustre >/dev/null
575 echo "Building Lustre RPMs for: $BUILD_ARCHS..."
577 for arch in $BUILD_ARCHS ; do
578 targets="--target $arch $targets"
581 ./configure "--with-linux=${LINUX}" ${CONFIGURE_FLAGS}
583 $RPMBUILD $targets -bb lustre.spec \
584 --define "_tmppath $TMPDIR" \
585 --define "_topdir $TOPDIR" || \
586 fatal 1 "Error building rpms for $BUILD_ARCHS."
593 [ "$STAGEDIR" ] || return 0
595 for arch in $BUILD_ARCHS ; do
596 rpmdir="${STAGEDIR}/${CANONICAL_TARGET}-${arch}"
597 echo "${0##*/}: Copying RPMs into ${rpmdir}"
599 cp -v RPMS/${arch}/*.rpm "${rpmdir}"
600 if [ -d RPMS/noarch ] ; then
601 cp -v RPMS/noarch/*.rpm "${rpmdir}"
605 cp -v "$LUSTRE" "$STAGEDIR"
608 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
610 options=$(getopt -o d:D:h -l disable-datestamp,external-patches:,extraversion:,kerneldir:,linux:,lustre:,nodownload,nosrc,publish,release,src,stage:,tag:,target:,target-archs:,with-linux: -- "$@")
612 if [ $? != 0 ] ; then
616 eval set -- "$options"
646 --linux | --with-linux)
699 usage 1 "Unrecognized option: $1"
708 # prep_build needs the .spec.in from the lustre source
709 if [ -z "$LINUX" ] ; then
711 if (( $DO_SRC )) ; then