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="hp-pnnl-2.4"
221 CANONICAL_TARGET="$TARGET"
225 TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M")
227 RPMBUILD=$(which rpmbuild 2>/dev/null | head -1)
228 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
229 RPMBUILD=$(which rpm 2>/dev/null | head -1)
230 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
231 usage 1 "Could not find binary for making rpms (tried rpmbuild and rpm)."
238 echo $(echo "$*" | xargs -n 1 | sort -u)
245 if [ "$TARGET" = "rhel-2.6" -o "$TARGET" = "rhel-2.4" ]; then
247 if [ "$TARGET" = "rhel-2.6" ]; then
249 OLDCONFIG=nonint_oldconfig
250 elif [ "$TARGET" = "rhel-2.4" ]; then
255 RPMTOPDIR=$(mktemp -d $KERNELDIR/rpm_XXXXXX)
256 mkdir $RPMTOPDIR/BUILD/
257 rpm -ivh $KERNELDIR/$SRPM --define "_topdir $RPMTOPDIR" || \
258 { rm -rf $RPMTOPDIR; fatal 1 "Error installing kernel SRPM."; }
259 $RPMBUILD -bp --nodeps --target i686 $RPMTOPDIR/SPECS/$SPEC --define "_topdir $RPMTOPDIR"
260 pushd $RPMTOPDIR/BUILD/kernel-${lnxmaj}/linux-${lnxmaj} && {
262 cp configs/kernel-${lnxmaj}-i686-smp.config .config
263 if ! make $OLDCONFIG > /dev/null; then
264 fatal 1 "error trying to make $OLDCONFIG while building a tarball from SRPM."
266 make include/linux/version.h
269 tar cjf $KERNEL_FILE linux-${lnxmaj}
276 download_and_build_tarball() {
280 local SRPM=kernel-${lnxmaj}-${lnxrel}.src.rpm
282 echo "Downloading http://ftp.lustre.org/kernels/$TARGET/old/$SRPM..."
283 if ! wget -nv "http://ftp.lustre.org/kernels/$TARGET/old/$SRPM" \
284 -O "$KERNELDIR/$SRPM" ; then
285 fatal 1 "Could not download target $TARGET's kernel SRPM $SRPM from ftp.lustre.org."
288 build_tarball $TARGET $SRPM
293 EXTRA_VERSION_save="$EXTRA_VERSION"
294 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches" ; do
295 TARGET_FILE="$patchesdir/targets/$TARGET.target"
296 [ -r "$TARGET_FILE" ] && break
298 [ -r "$TARGET_FILE" ] || \
299 fatal 1 "Target $TARGET was not found."
301 echo "Loading target config file $TARGET.target..."
305 [ "$KERNEL" ] || fatal 1 "Target $TARGET did not specify a kernel."
306 [ "$VERSION" ] || fatal 1 "Target $TARGET did not specify a kernel version."
308 if [ "$KERNELDIR" ] ; then
309 KERNEL_FILE="$KERNELDIR/$KERNEL"
310 if [ ! -r "$KERNELDIR/$KERNEL" ] ; then
311 # see if we have an SRPM we can build a tarball for
312 KERNEL_SRPM=kernel-${lnxmaj}-${lnxrel}.src.rpm
313 if [ -r "$KERNELDIR/$KERNEL_SRPM" ] ; then
314 build_tarball $CANONICAL_TARGET $KERNEL_SRPM
316 if (( $DOWNLOAD )) ; then
317 echo "Downloading http://ftp.lustre.org/kernels/$CANONICAL_TARGET/old/$KERNEL..."
318 if ! wget -nv "http://ftp.lustre.org/kernels/$CANONICAL_TARGET/old/$KERNEL" -O "$KERNELDIR/$KERNEL" ; then
319 # see if we can do it with an SRPM from the download site
320 download_and_build_tarball $CANONICAL_TARGET $KERNEL_FILE
323 fatal 1 "Target $TARGET's kernel file $KERNEL not found in kernel directory $KERNELDIR."
329 if [ "$SERIES" ] ; then
330 for series in $SERIES ; do
331 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches" ; do
332 [ -r "$patchesdir/series/$series" ] && continue 2
334 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."
338 CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/$CONFIG"
339 [ -r "$CONFIG_FILE" ] || \
340 fatal 1 "Target $TARGET's config file $CONFIG missing from $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/."
342 if [ "$EXTRA_VERSION_save" ] ; then
343 EXTRA_VERSION="$EXTRA_VERSION_save"
344 elif ! (( $RELEASE )) ; then
345 # if there is no patch series, then this is not a lustre specific
346 # kernel. don't make it look like one
347 if [ -n "$SERIES" ]; then
348 #remove the @VERSION@ (lustre version)
349 EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
350 EXTRA_VERSION="${EXTRA_VERSION}-${TAG}.${TIMESTAMP}"
353 # EXTRA_VERSION=${EXTRA_VERSION//-/_}
355 ALL_ARCHS="$BASE_ARCHS $BIGMEM_ARCHS $BOOT_ARCHS $JENSEN_ARCHS $SMP_ARCHS $BIGSMP_ARCHS $PSERIES64_ARCHS $UP_ARCHS"
358 for arch in $(uniqify "$ALL_ARCHS") ; do
359 if [ -z "$TARGET_ARCHS" ] || echo "$TARGET_ARCHS" | grep "$arch" >/dev/null 2>/dev/null ; then
360 BUILD_ARCHS="$BUILD_ARCHS $arch"
363 [ "$BUILD_ARCHS" ] || usage 1 "No available target archs to build."
364 echo "Building for: $BUILD_ARCHS"
371 fatal 1 "tarflags(): File name argument missing."
383 fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
390 echo "Untarring ${1##*/}..."
391 tar $(tarflags "$1") "$1"
396 DIRNAME="lustre-$TAG-$TIMESTAMP"
397 if [ "$LUSTRE" ] ; then
399 [ -d lustre ] || ln -sf lustre-[0-9].[0-9]* lustre
401 if [ "$USE_DATESTAMP" ]; then
402 DATESTAMP="-D '$DATE'"
407 cvs -d "$CVSROOT" -qz3 co $DATESTAMP -d "$DIRNAME" lustre || \
408 fatal 1 "There was an error checking out toplevel Lustre from CVS."
409 pushd "$DIRNAME" > /dev/null
410 ./lustrecvs "$TAG" || \
411 fatal 1 "There was an error checking out Lustre/Portals/Build from CVS."
412 echo "Creating lustre tarball..."
413 sh autogen.sh || fatal 1 "There was an error running autogen.sh."
414 ./configure --disable-{modules,utils,liblustre,tests,doc} || \
415 fatal 1 "There was an error running ./configure to create makefiles."
416 make dist || fatal 1 "There was an error running 'make dist'."
418 fname=`basename $DIRNAME/lustre-*.tar.gz`
419 cp $DIRNAME/$fname . || fatal 1 "There was an error copying lustre tarball."
421 ln -sf "$DIRNAME" lustre
428 [ -d linux ] || ln -sf linux* linux
433 [ "$SERIES" ] || return 0
434 FULL_PATCH="$PWD/lustre-kernel-${TARGET}-${EXTRA_VERSION}.patch"
435 [ -f "$FULL_PATCH" ] && rm -f "$FULL_PATCH"
436 pushd linux >/dev/null
437 for series in $SERIES ; do
438 echo -n "Applying series $series:"
439 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches" ; do
440 [ -r "$patchesdir/series/$series" ] || continue
441 SERIES_FILE="$patchesdir/series/$series"
442 for patch in $(<"$SERIES_FILE") ; do
444 PATCH_FILE="$patchesdir/patches/$patch"
445 [ -r "$PATCH_FILE" ] || \
446 fatal 1 "Patch $patch does not exist in Lustre tree."
447 cat "$PATCH_FILE" >> "$FULL_PATCH" || \
448 fatal 1 "Error adding patch $patch to full patch."
449 patch -s -p1 < "$PATCH_FILE" || fatal 1 "Error applying patch $patch."
456 echo "Full patch has been saved in ${FULL_PATCH##*/}."
457 echo "Replacing .config files..."
458 [ -d linux/configs ] || mkdir linux/configs || \
459 fatal 1 "Error creating configs directory."
460 rm -f linux/configs/*
462 for patchesdir in "$EXTERNAL_PATCHES" "lustre/lustre/kernel_patches" ; do
463 [ "$patchesdir" ] && \
464 cp -v $patchesdir/kernel_configs/kernel-${VERSION}-${TARGET}*.config linux/configs/ >/dev/null && copysuccess=1
466 [ "$copysuccess" = "1" ] || \
467 fatal 1 "Error copying in kernel configs."
472 TARBALL="$(readlink linux)-$EXTRA_VERSION.tar.gz"
473 echo "Creating patched linux tarball $TARBALL..."
474 tar zcf "$TARBALL" "$(readlink linux)" \
475 --exclude "CVS" --exclude ".cvsignore" || \
476 --exclude "*.orig" --exclude "*~" --exclude "*.rej" || \
477 fatal 1 "Error creating patched Linux tarball."
482 [ -d linux ] || return 0
483 echo "Cleaning linux..."
484 [ -L linux ] && rm -rf $(readlink linux)
491 ENABLE_INIT_SCRIPTS=""
493 -e "s^@BASE_ARCHS@^$BASE_ARCHS^g" \
494 -e "s^@BIGMEM_ARCHS@^$BIGMEM_ARCHS^g" \
495 -e "s^@BIGSMP_ARCHS@^$BIGSMP_ARCHS^g" \
496 -e "s^@BOOT_ARCHS@^$BOOT_ARCHS^g" \
497 -e "s^@CONFIGURE_FLAGS@^$CONFIGURE_FLAGS^g" \
498 -e "s^@ENABLE_INIT_SCRIPTS@^$ENABLE_INIT_SCRIPTS^g" \
499 -e "s^@JENSEN_ARCHS@^$BOOT_ARCHS^g" \
500 -e "s^@KERNEL_EXTRA_VERSION@^$EXTRA_VERSION^g" \
501 -e "s^@KERNEL_RELEASE@^${EXTRA_VERSION//-/_}^g" \
502 -e "s^@KERNEL_SOURCE@^$KERNEL^g" \
503 -e "s^@KERNEL_VERSION@^$VERSION^g" \
504 -e "s^@LINUX26@^$LINUX26^g" \
505 -e "s^@LUSTRE_SOURCE@^${LUSTRE##*/}^g" \
506 -e "s^@LUSTRE_TARGET@^$TARGET^g" \
507 -e "s^@PSERIES64_ARCHS@^$PSERIES64_ARCHS^g" \
508 -e "s^@RHBUILD@^$RHBUILD^g" \
509 -e "s^@SMP_ARCHS@^$SMP_ARCHS^g" \
510 -e "s^@SUSEBUILD@^$SUSEBUILD^g" \
511 -e "s^@SUSEBUILD@^$SUSEBUILD^g" \
512 -e "s^@UP_ARCHS@^$UP_ARCHS^g" \
513 < $TOPDIR/lustre/build/lustre-kernel-2.4.spec.in \
514 > lustre-kernel-2.4.spec
515 [ -d SRPMS ] || mkdir SRPMS
516 [ -d RPMS ] || mkdir RPMS
517 [ -d BUILD ] || mkdir BUILD
518 [ -d SOURCES ] || mkdir SOURCES
519 for script in linux-{rhconfig.h,merge-config.awk,merge-modules.awk} \
520 suse-{functions.sh,post.sh,postun.sh,trigger-script.sh.in} \
521 sles8-{pre,post,postun,update_{INITRD_MODULES,rcfile_setting}}.sh ; do
522 cp $TOPDIR/lustre/build/$script SOURCES
524 cp "$LUSTRE" "$KERNEL_FILE" SOURCES
525 if [ "$EXTERNAL_PATCHES" -a -d "$EXTERNAL_PATCHES" ] ; then
526 tar zcf SOURCES/external-patches.tar.gz -C "$EXTERNAL_PATCHES" series targets patches kernel_configs
528 touch SOURCES/external-patches.tar.gz
534 [ -d lustre ] || return 0
535 echo "Cleaning Lustre..."
536 [ -L lustre ] && rm -rf $(readlink lustre)
542 echo "Building kernel + Lustre RPMs for: $BUILD_ARCHS..."
544 for arch in $BUILD_ARCHS ; do
545 targets="--target $arch $targets"
548 $RPMBUILD $targets -bb lustre-kernel-2.4.spec \
549 --define "_tmppath $TMPDIR" \
550 --define "_topdir $TOPDIR" || \
551 fatal 1 "Error building rpms for $BUILD_ARCHS."
553 if (( $DO_SRC )) ; then
554 $RPMBUILD -bs lustre-kernel-2.4.spec \
555 --define "_tmppath $TMPDIR" \
556 --define "_topdir $TOPDIR" || \
557 fatal 1 "Error building .src.rpm."
563 [ -d SRPMS ] || mkdir SRPMS
564 [ -d RPMS ] || mkdir RPMS
565 [ -d BUILD ] || mkdir BUILD
566 [ -d SOURCES ] || mkdir SOURCES
570 pushd lustre >/dev/null
572 echo "Building Lustre RPMs for: $BUILD_ARCHS..."
574 for arch in $BUILD_ARCHS ; do
575 targets="--target $arch $targets"
578 ./configure "--with-linux=${LINUX}" ${CONFIGURE_FLAGS}
580 $RPMBUILD $targets -bb build/lustre.spec \
581 --define "_tmppath $TMPDIR" \
582 --define "_topdir $TOPDIR" || \
583 fatal 1 "Error building rpms for $BUILD_ARCHS."
590 [ "$STAGEDIR" ] || return 0
592 for arch in $BUILD_ARCHS ; do
593 rpmdir="${STAGEDIR}/${CANONICAL_TARGET}-${arch}"
594 echo "${0##*/}: Copying RPMs into ${rpmdir}"
596 cp -v RPMS/${arch}/*.rpm "${rpmdir}"
597 if [ -d RPMS/noarch ] ; then
598 cp -v RPMS/noarch/*.rpm "${rpmdir}"
602 cp -v "$LUSTRE" "$STAGEDIR"
605 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
607 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: -- "$@")
609 if [ $? != 0 ] ; then
613 eval set -- "$options"
643 --linux | --with-linux)
696 usage 1 "Unrecognized option: $1"
705 # prep_build needs the .spec.in from the lustre source
706 if [ -z "$LINUX" ] ; then
708 if (( $DO_SRC )) ; then