3 # vim:expandtab:shiftwidth=4:softtabstop=4:tabstop=4:
7 # CVSROOT is inherited from the environment
49 # Readlink is not present on some older distributions: emulate it.
53 if [ -L "$path" ]; then
54 ll="$(LC_ALL=C ls -l "$path" 2> /dev/null)" &&
68 [ "$1" ] && echo -e "\n${0##*/}: $1"
80 (( $RELEASE )) || return 0
85 echo -n "Available targets:"
86 for target in $TOPDIR/lustre/lustre/kernel_patches/targets/*.target ; do
87 target_file=${target##*/}
88 echo -n " ${target_file%%.target}"
96 Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
99 Specifies the CVS Root to use when pulling files from CVS. The
100 environment variable \$CVSROOT is used if this option is not
103 --external-patches=EXTERNAL_PATCHES
104 Directory similar to lustre/lustre/kernel_patches/ that lbuild should
105 look for seres and config files in before looking in the lustre
108 --extraversion=EXTRAVERSION
109 Text to use for the rpm release and kernel extraversion.
111 --kerneldir=KERNELDIR
112 Directory containing Linux source tarballs referenced by target
116 Directory of Linux kernel sources. When this option is used, only
117 Lustre modules and userspace are built.
120 Path to an existing lustre source tarball to use instead of
124 Do not try to download a kernel from ftp.lustre.org
127 Do not build a .src.rpm, a full kernel patch, or a patched kernel
134 Specifies that the files generated do not include timestamps, and
135 that this is an official release.
138 Build a .src.rpm, a full kernel patch, and a patched kernel tarball.
141 Directory used to stage packages for release. RPMs will be placed
142 more or less in DIR/<target>-<arch>, and the tarball will be
146 A CVS branch/tag name to build from when pulling from CVS.
149 The name of the target to build. The available targets are listed
152 --target-archs=TARGET_ARCHS
153 A (space delimited) list of architectures to build. By default,
154 all of the archs supported by the TARGET will be built, in
155 addition to a .src.rpm. This option can limit those, for machines
156 that can only build certain archs or if you only want a certain
157 arch built (for testing, or a one-off kernel).
159 Also note that by using a non-"base" arch (eg, i386) only kernels
160 will be built - there will be no lustre-lite-utils package.
163 Prevents the datestamp flag (-D) from being passed to cvs for
164 checkouts. This is a workaround for a problem encountered when
165 using lbuild with tinderbox.
176 if [ "$LUSTRE" ] ; then
177 [ -r "$LUSTRE" ] || \
178 usage 1 "Could not find Lustre source tarball '$LUSTRE'."
181 usage 1 "Either specify a CVS Root with -d, or a Lustre source tarball with --lustre."
183 usage 1 "A branch/tag name must be specified with --tag when not building from a tarball."
186 if [ -z "$LINUX" ] ; then
187 [ "$KERNELDIR" ] || \
188 usage 1 "A kernel directory must be specified with --kerneldir."
190 [ -d "$KERNELDIR" ] || \
191 usage 1 "$KERNELDIR is not a directory."
193 if ! (( $RELEASE )) ; then
195 usage 1 "When building a snapshot, a tag name must be used."
198 [ "$TARGET" ] || usage 1 "A target must be specified with --target."
199 # TARGET_FILE="$TOPDIR/lustre/kernel_patches/targets/$TARGET.target"
200 # [ -r "$TARGET_FILE" ] || \
201 # usage 1 "Target '$TARGET' was not found."
206 CANONICAL_TARGET="rhel-2.6"
209 CANONICAL_TARGET="sles-2.6"
212 CANONICAL_TARGET="hp-pnnl-2.4"
219 CANONICAL_TARGET="$TARGET"
223 TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M")
225 RPMBUILD=$(which rpmbuild 2>/dev/null | head -1)
226 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
227 RPMBUILD=$(which rpm 2>/dev/null | head -1)
228 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
229 usage 1 "Could not find binary for making rpms (tried rpmbuild and rpm)."
236 echo $(echo "$*" | xargs -n 1 | sort -u)
243 if [ "$TARGET" = "rhel-2.6" -o "$TARGET" = "rhel-2.4" ]; then
245 if [ "$TARGET" = "rhel-2.6" ]; then
247 OLDCONFIG=nonint_oldconfig
248 elif [ "$TARGET" = "rhel-2.4" ]; then
253 RPMTOPDIR=$(mktemp -d $KERNELDIR/rpm_XXXXXX)
254 mkdir $RPMTOPDIR/BUILD/
255 rpm -ivh $KERNELDIR/$SRPM --define "_topdir $RPMTOPDIR" || \
256 { rm -rf $RPMTOPDIR; fatal 1 "Error installing kernel SRPM."; }
257 $RPMBUILD -bp --nodeps --target i686 $RPMTOPDIR/SPECS/$SPEC --define "_topdir $RPMTOPDIR"
258 pushd $RPMTOPDIR/BUILD/kernel-${lnxmaj}/linux-${lnxmaj} && {
260 cp configs/kernel-${lnxmaj}-i686-smp.config .config
261 if ! make $OLDCONFIG > /dev/null; then
262 fatal 1 "error trying to make $OLDCONFIG while building a tarball from SRPM."
264 make include/linux/version.h
267 tar cjf $KERNEL_FILE linux-${lnxmaj}
274 download_and_build_tarball() {
278 local SRPM=kernel-${lnxmaj}-${lnxrel}.src.rpm
280 echo "Downloading http://ftp.lustre.org/kernels/$TARGET/old/$SRPM..."
281 if ! wget -nv "http://ftp.lustre.org/kernels/$TARGET/old/$SRPM" \
282 -O "$KERNELDIR/$SRPM" ; then
283 fatal 1 "Could not download target $TARGET's kernel SRPM $SRPM from ftp.lustre.org."
286 build_tarball $TARGET $SRPM
291 EXTRA_VERSION_save="$EXTRA_VERSION"
292 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches" ; do
293 TARGET_FILE="$patchesdir/targets/$TARGET.target"
294 [ -r "$TARGET_FILE" ] && break
296 [ -r "$TARGET_FILE" ] || \
297 fatal 1 "Target $TARGET was not found."
299 echo "Loading target config file $TARGET.target..."
303 [ "$KERNEL" ] || fatal 1 "Target $TARGET did not specify a kernel."
304 # [ "$SERIES" ] || fatal 1 "Target $TARGET did not specify a kernel patch series."
305 # [ "$CONFIG" ] || fatal 1 "Target $TARGET did not specify a kernel config."
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 #remove the @VERSION@ (lustre version)
346 EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
347 EXTRA_VERSION="${EXTRA_VERSION}-${TAG}.${TIMESTAMP}"
349 # EXTRA_VERSION=${EXTRA_VERSION//-/_}
351 ALL_ARCHS="$BASE_ARCHS $BIGMEM_ARCHS $BOOT_ARCHS $JENSEN_ARCHS $SMP_ARCHS $BIGSMP_ARCHS $PSERIES64_ARCHS $UP_ARCHS"
354 for arch in $(uniqify "$ALL_ARCHS") ; do
355 if [ -z "$TARGET_ARCHS" ] || echo "$TARGET_ARCHS" | grep "$arch" >/dev/null 2>/dev/null ; then
356 BUILD_ARCHS="$BUILD_ARCHS $arch"
359 [ "$BUILD_ARCHS" ] || usage 1 "No available target archs to build."
360 echo "Building for: $BUILD_ARCHS"
367 fatal 1 "tarflags(): File name argument missing."
379 fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
386 echo "Untarring ${1##*/}..."
387 tar $(tarflags "$1") "$1"
392 DIRNAME="lustre-$TAG-$TIMESTAMP"
393 if [ "$LUSTRE" ] ; then
395 [ -d lustre ] || ln -sf lustre* lustre
397 if [ "$USE_DATESTAMP" ]; then
398 DATESTAMP="-D '$DATE'"
403 cvs -d "$CVSROOT" -qz3 co $DATESTAMP -d "$DIRNAME" lustre || \
404 fatal 1 "There was an error checking out toplevel Lustre from CVS."
405 pushd "$DIRNAME" > /dev/null
406 ./lustrecvs "$TAG" || \
407 fatal 1 "There was an error checking out Lustre/Portals/Build from CVS."
408 echo "Creating lustre tarball..."
409 sh autogen.sh || fatal 1 "There was an error running autogen.sh."
410 ./configure --disable-{modules,utils,liblustre,tests,doc} || \
411 fatal 1 "There was an error running ./configure to create makefiles."
412 make dist || fatal 1 "There was an error running 'make dist'."
414 fname=`basename $DIRNAME/lustre-*.tar.gz`
415 cp $DIRNAME/$fname . || fatal 1 "There was an error copying lustre tarball."
417 ln -sf "$DIRNAME" lustre
424 [ -d linux ] || ln -sf linux* linux
429 [ "$SERIES" ] || return 0
430 FULL_PATCH="$PWD/lustre-kernel-${TARGET}-${EXTRA_VERSION}.patch"
431 [ -f "$FULL_PATCH" ] && rm -f "$FULL_PATCH"
432 pushd linux >/dev/null
433 for series in $SERIES ; do
434 echo -n "Applying series $series:"
435 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches" ; do
436 [ -r "$patchesdir/series/$series" ] || continue
437 SERIES_FILE="$patchesdir/series/$series"
438 for patch in $(<"$SERIES_FILE") ; do
440 PATCH_FILE="$patchesdir/patches/$patch"
441 [ -r "$PATCH_FILE" ] || \
442 fatal 1 "Patch $patch does not exist in Lustre tree."
443 cat "$PATCH_FILE" >> "$FULL_PATCH" || \
444 fatal 1 "Error adding patch $patch to full patch."
445 patch -s -p1 < "$PATCH_FILE" || fatal 1 "Error applying patch $patch."
452 echo "Full patch has been saved in ${FULL_PATCH##*/}."
453 echo "Replacing .config files..."
454 [ -d linux/configs ] || mkdir linux/configs || \
455 fatal 1 "Error creating configs directory."
456 rm -f linux/configs/*
458 for patchesdir in "$EXTERNAL_PATCHES" "lustre/lustre/kernel_patches" ; do
459 [ "$patchesdir" ] && \
460 cp -v $patchesdir/kernel_configs/kernel-${VERSION}-${TARGET}*.config linux/configs/ >/dev/null && copysuccess=1
462 [ "$copysuccess" = "1" ] || \
463 fatal 1 "Error copying in kernel configs."
468 TARBALL="$(readlink linux)-$EXTRA_VERSION.tar.gz"
469 echo "Creating patched linux tarball $TARBALL..."
470 tar zcf "$TARBALL" "$(readlink linux)" \
471 --exclude "CVS" --exclude ".cvsignore" || \
472 --exclude "*.orig" --exclude "*~" --exclude "*.rej" || \
473 fatal 1 "Error creating patched Linux tarball."
478 [ -d linux ] || return 0
479 echo "Cleaning linux..."
480 [ -L linux ] && rm -rf $(readlink linux)
487 ENABLE_INIT_SCRIPTS=""
489 -e "s^@BASE_ARCHS@^$BASE_ARCHS^g" \
490 -e "s^@BIGMEM_ARCHS@^$BIGMEM_ARCHS^g" \
491 -e "s^@BIGSMP_ARCHS@^$BIGSMP_ARCHS^g" \
492 -e "s^@BOOT_ARCHS@^$BOOT_ARCHS^g" \
493 -e "s^@CONFIGURE_FLAGS@^$CONFIGURE_FLAGS^g" \
494 -e "s^@ENABLE_INIT_SCRIPTS@^$ENABLE_INIT_SCRIPTS^g" \
495 -e "s^@JENSEN_ARCHS@^$BOOT_ARCHS^g" \
496 -e "s^@KERNEL_EXTRA_VERSION@^$EXTRA_VERSION^g" \
497 -e "s^@KERNEL_RELEASE@^${EXTRA_VERSION//-/_}^g" \
498 -e "s^@KERNEL_SOURCE@^$KERNEL^g" \
499 -e "s^@KERNEL_VERSION@^$VERSION^g" \
500 -e "s^@LINUX26@^$LINUX26^g" \
501 -e "s^@LUSTRE_SOURCE@^${LUSTRE##*/}^g" \
502 -e "s^@LUSTRE_TARGET@^$TARGET^g" \
503 -e "s^@PSERIES64_ARCHS@^$PSERIES64_ARCHS^g" \
504 -e "s^@RHBUILD@^$RHBUILD^g" \
505 -e "s^@SMP_ARCHS@^$SMP_ARCHS^g" \
506 -e "s^@SUSEBUILD@^$SUSEBUILD^g" \
507 -e "s^@SUSEBUILD@^$SUSEBUILD^g" \
508 -e "s^@UP_ARCHS@^$UP_ARCHS^g" \
509 < $TOPDIR/lustre/build/lustre-kernel-2.4.spec.in \
510 > lustre-kernel-2.4.spec
511 [ -d SRPMS ] || mkdir SRPMS
512 [ -d RPMS ] || mkdir RPMS
513 [ -d BUILD ] || mkdir BUILD
514 [ -d SOURCES ] || mkdir SOURCES
515 for script in linux-{rhconfig.h,merge-config.awk,merge-modules.awk} \
516 suse-{functions.sh,post.sh,postun.sh,trigger-script.sh.in} \
517 sles8-{pre,post,postun,update_{INITRD_MODULES,rcfile_setting}}.sh ; do
518 cp $TOPDIR/lustre/build/$script SOURCES
520 cp "$LUSTRE" "$KERNEL_FILE" SOURCES
521 if [ "$EXTERNAL_PATCHES" -a -d "$EXTERNAL_PATCHES" ] ; then
522 tar zcf SOURCES/external-patches.tar.gz -C "$EXTERNAL_PATCHES" series targets patches kernel_configs
524 touch SOURCES/external-patches.tar.gz
530 [ -d lustre ] || return 0
531 echo "Cleaning Lustre..."
532 [ -L lustre ] && rm -rf $(readlink lustre)
538 echo "Building kernel + Lustre RPMs for: $BUILD_ARCHS..."
540 for arch in $BUILD_ARCHS ; do
541 targets="--target $arch $targets"
544 $RPMBUILD $targets -bb lustre-kernel-2.4.spec \
545 --define "_topdir $TOPDIR" || \
546 fatal 1 "Error building rpms for $BUILD_ARCHS."
548 if (( $DO_SRC )) ; then
549 $RPMBUILD -bs lustre-kernel-2.4.spec \
550 --define "_topdir $TOPDIR" || \
551 fatal 1 "Error building .src.rpm."
557 [ -d SRPMS ] || mkdir SRPMS
558 [ -d RPMS ] || mkdir RPMS
559 [ -d BUILD ] || mkdir BUILD
560 [ -d SOURCES ] || mkdir SOURCES
564 pushd lustre >/dev/null
566 echo "Building Lustre RPMs for: $BUILD_ARCHS..."
568 for arch in $BUILD_ARCHS ; do
569 targets="--target $arch $targets"
572 ./configure "--with-linux=${LINUX}" ${CONFIGURE_FLAGS}
574 $RPMBUILD $targets -bb build/lustre.spec \
575 --define "_topdir $TOPDIR" || \
576 fatal 1 "Error building rpms for $BUILD_ARCHS."
583 [ "$STAGEDIR" ] || return 0
585 for arch in $BUILD_ARCHS ; do
586 rpmdir="${STAGEDIR}/${CANONICAL_TARGET}-${arch}"
587 echo "${0##*/}: Copying RPMs into ${rpmdir}"
589 cp -v RPMS/${arch}/*.rpm "${rpmdir}"
590 if [ -d RPMS/noarch ] ; then
591 cp -v RPMS/noarch/*.rpm "${rpmdir}"
595 cp -v "$LUSTRE" "$STAGEDIR"
598 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
600 options=$(getopt -o d:D:h -l disable-datestamp,external-patches:,extraversion:,kerneldir:,linux:,lustre:,nodownload,nosrc,publish,release,stage:,tag:,target:,target-archs:,with-linux: -- "$@")
602 if [ $? != 0 ] ; then
606 eval set -- "$options"
636 --linux | --with-linux)
689 usage 1 "Unrecognized option: $1"
698 # prep_build needs the .spec.in from the lustre source
699 if [ -z "$LINUX" ] ; then
702 if (( $DO_SRC )) ; then