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 for target in $TOPDIR/lustre/kernel_patches/targets/*.target.in ; do
87 echo -n "$(basename $target .target.in) "
94 Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
97 Specifies the CVS Root to use when pulling files from CVS. The
98 environment variable \$CVSROOT is used if this option is not
101 --external-patches=EXTERNAL_PATCHES
102 Directory similar to lustre/lustre/kernel_patches/ that lbuild should
103 look for seres and config files in before looking in the lustre
106 --extraversion=EXTRAVERSION
107 Text to use for the rpm release and kernel extraversion.
109 --kerneldir=KERNELDIR
110 Directory containing Linux source tarballs referenced by target
114 Directory of Linux kernel sources. When this option is used, only
115 Lustre modules and userspace are built.
118 Path to an existing lustre source tarball to use instead of
122 Do not try to download a kernel from ftp.lustre.org
125 Do not build a .src.rpm, a full kernel patch, or a patched kernel
132 Specifies that the files generated do not include timestamps, and
133 that this is an official release.
136 Build a .src.rpm, a full kernel patch, and a patched kernel tarball.
139 Directory used to stage packages for release. RPMs will be placed
140 more or less in DIR/<target>-<arch>, and the tarball will be
144 A CVS branch/tag name to build from when pulling from CVS.
147 The name of the target to build.
148 One of: $(list_targets)
150 --target-archs=TARGET_ARCHS
151 A (space delimited) list of architectures to build. By default,
152 all of the archs supported by the TARGET will be built, in
153 addition to a .src.rpm. This option can limit those, for machines
154 that can only build certain archs or if you only want a certain
155 arch built (for testing, or a one-off kernel).
157 Also note that by using a non-"base" arch (eg, i386) only kernels
158 will be built - there will be no lustre-lite-utils package.
161 Prevents the datestamp flag (-D) from being passed to cvs for
162 checkouts. This is a workaround for a problem encountered when
163 using lbuild with tinderbox.
172 if [ "$LUSTRE" ] ; then
173 [ -r "$LUSTRE" ] || \
174 usage 1 "Could not find Lustre source tarball '$LUSTRE'."
177 usage 1 "Either specify a CVS Root with -d, or a Lustre source tarball with --lustre."
179 usage 1 "A branch/tag name must be specified with --tag when not building from a tarball."
182 if [ -z "$LINUX" ] ; then
183 [ "$KERNELDIR" ] || \
184 usage 1 "A kernel directory must be specified with --kerneldir."
186 [ -d "$KERNELDIR" ] || \
187 usage 1 "$KERNELDIR is not a directory."
189 if ! (( $RELEASE )) ; then
191 usage 1 "When building a snapshot, a tag name must be used."
194 [ "$TARGET" ] || usage 1 "A target must be specified with --target."
195 # TARGET_FILE="$TOPDIR/lustre/kernel_patches/targets/$TARGET.target"
196 # [ -r "$TARGET_FILE" ] || \
197 # usage 1 "Target '$TARGET' was not found."
202 CANONICAL_TARGET="rhel-2.6"
205 CANONICAL_TARGET="sles-2.6"
208 CANONICAL_TARGET="sles10-2.6"
211 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 [ "$VERSION" ] || fatal 1 "Target $TARGET did not specify a kernel version."
306 if [ "$KERNELDIR" ] ; then
307 KERNEL_FILE="$KERNELDIR/$KERNEL"
308 if [ ! -r "$KERNELDIR/$KERNEL" ] ; then
309 # see if we have an SRPM we can build a tarball for
310 KERNEL_SRPM=kernel-${lnxmaj}-${lnxrel}.src.rpm
311 if [ -r "$KERNELDIR/$KERNEL_SRPM" ] ; then
312 build_tarball $CANONICAL_TARGET $KERNEL_SRPM
314 if (( $DOWNLOAD )) ; then
315 echo "Downloading http://ftp.lustre.org/kernels/$CANONICAL_TARGET/old/$KERNEL..."
316 if ! wget -nv "http://ftp.lustre.org/kernels/$CANONICAL_TARGET/old/$KERNEL" -O "$KERNELDIR/$KERNEL" ; then
317 # see if we can do it with an SRPM from the download site
318 download_and_build_tarball $CANONICAL_TARGET $KERNEL_FILE
321 fatal 1 "Target $TARGET's kernel file $KERNEL not found in kernel directory $KERNELDIR."
327 if [ "$SERIES" ] ; then
328 for series in $SERIES ; do
329 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches" ; do
330 [ -r "$patchesdir/series/$series" ] && continue 2
332 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."
336 CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/$CONFIG"
337 [ -r "$CONFIG_FILE" ] || \
338 fatal 1 "Target $TARGET's config file $CONFIG missing from $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/."
340 if [ "$EXTRA_VERSION_save" ] ; then
341 EXTRA_VERSION="$EXTRA_VERSION_save"
342 elif ! (( $RELEASE )) ; then
343 # if there is no patch series, then this is not a lustre specific
344 # kernel. don't make it look like one
345 if [ -n "$SERIES" ]; then
346 #remove the @VERSION@ (lustre version)
347 EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
348 EXTRA_VERSION="${EXTRA_VERSION}-${TAG}.${TIMESTAMP}"
351 # EXTRA_VERSION=${EXTRA_VERSION//-/_}
353 ALL_ARCHS="$BASE_ARCHS $BIGMEM_ARCHS $BOOT_ARCHS $JENSEN_ARCHS $SMP_ARCHS $BIGSMP_ARCHS $PSERIES64_ARCHS $UP_ARCHS"
356 for arch in $(uniqify "$ALL_ARCHS") ; do
357 if [ -z "$TARGET_ARCHS" ] || echo "$TARGET_ARCHS" | grep "$arch" >/dev/null 2>/dev/null ; then
358 BUILD_ARCHS="$BUILD_ARCHS $arch"
361 [ "$BUILD_ARCHS" ] || usage 1 "No available target archs to build."
362 echo "Building for: $BUILD_ARCHS"
369 fatal 1 "tarflags(): File name argument missing."
381 fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
388 echo "Untarring ${1##*/}..."
389 tar $(tarflags "$1") "$1"
394 DIRNAME="lustre-$TAG-$TIMESTAMP"
395 if [ "$LUSTRE" ] ; then
397 [ -d lustre ] || ln -sf lustre-[0-9].[0-9]* lustre
399 if [ "$USE_DATESTAMP" ]; then
400 DATESTAMP="-D '$DATE'"
405 cvs -d "$CVSROOT" -qz3 co $DATESTAMP -d "$DIRNAME" lustre || \
406 fatal 1 "There was an error checking out toplevel Lustre from CVS."
407 pushd "$DIRNAME" > /dev/null
408 ./lustrecvs "$TAG" || \
409 fatal 1 "There was an error checking out Lustre/Portals/Build from CVS."
410 echo "Creating lustre tarball..."
411 sh autogen.sh || fatal 1 "There was an error running autogen.sh."
412 ./configure --disable-{modules,utils,liblustre,tests,doc} || \
413 fatal 1 "There was an error running ./configure to create makefiles."
414 make dist || fatal 1 "There was an error running 'make dist'."
416 fname=`basename $DIRNAME/lustre-*.tar.gz`
417 cp $DIRNAME/$fname . || fatal 1 "There was an error copying lustre tarball."
419 ln -sf "$DIRNAME" lustre
426 [ -d linux ] || ln -sf linux* linux
431 [ "$SERIES" ] || return 0
432 FULL_PATCH="$PWD/lustre-kernel-${TARGET}-${EXTRA_VERSION}.patch"
433 [ -f "$FULL_PATCH" ] && rm -f "$FULL_PATCH"
434 pushd linux >/dev/null
435 for series in $SERIES ; do
436 echo -n "Applying series $series:"
437 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches" ; do
438 [ -r "$patchesdir/series/$series" ] || continue
439 SERIES_FILE="$patchesdir/series/$series"
440 for patch in $(<"$SERIES_FILE") ; do
442 PATCH_FILE="$patchesdir/patches/$patch"
443 [ -r "$PATCH_FILE" ] || \
444 fatal 1 "Patch $patch does not exist in Lustre tree."
445 cat "$PATCH_FILE" >> "$FULL_PATCH" || \
446 fatal 1 "Error adding patch $patch to full patch."
447 patch -s -p1 < "$PATCH_FILE" || fatal 1 "Error applying patch $patch."
454 echo "Full patch has been saved in ${FULL_PATCH##*/}."
455 echo "Replacing .config files..."
456 [ -d linux/configs ] || mkdir linux/configs || \
457 fatal 1 "Error creating configs directory."
458 rm -f linux/configs/*
460 for patchesdir in "$EXTERNAL_PATCHES" "lustre/lustre/kernel_patches" ; do
461 [ "$patchesdir" ] && \
462 cp -v $patchesdir/kernel_configs/kernel-${VERSION}-${TARGET}*.config linux/configs/ >/dev/null && copysuccess=1
464 [ "$copysuccess" = "1" ] || \
465 fatal 1 "Error copying in kernel configs."
470 TARBALL="$(readlink linux)-$EXTRA_VERSION.tar.gz"
471 echo "Creating patched linux tarball $TARBALL..."
472 tar zcf "$TARBALL" "$(readlink linux)" \
473 --exclude "CVS" --exclude ".cvsignore" || \
474 --exclude "*.orig" --exclude "*~" --exclude "*.rej" || \
475 fatal 1 "Error creating patched Linux tarball."
480 [ -d linux ] || return 0
481 echo "Cleaning linux..."
482 [ -L linux ] && rm -rf $(readlink linux)
489 ENABLE_INIT_SCRIPTS=""
491 -e "s^@BASE_ARCHS@^$BASE_ARCHS^g" \
492 -e "s^@BIGMEM_ARCHS@^$BIGMEM_ARCHS^g" \
493 -e "s^@BIGSMP_ARCHS@^$BIGSMP_ARCHS^g" \
494 -e "s^@BOOT_ARCHS@^$BOOT_ARCHS^g" \
495 -e "s^@CONFIGURE_FLAGS@^$CONFIGURE_FLAGS^g" \
496 -e "s^@ENABLE_INIT_SCRIPTS@^$ENABLE_INIT_SCRIPTS^g" \
497 -e "s^@JENSEN_ARCHS@^$BOOT_ARCHS^g" \
498 -e "s^@KERNEL_EXTRA_VERSION@^$EXTRA_VERSION^g" \
499 -e "s^@KERNEL_RELEASE@^${EXTRA_VERSION//-/_}^g" \
500 -e "s^@KERNEL_SOURCE@^$KERNEL^g" \
501 -e "s^@KERNEL_VERSION@^$VERSION^g" \
502 -e "s^@LINUX26@^$LINUX26^g" \
503 -e "s^@LUSTRE_SOURCE@^${LUSTRE##*/}^g" \
504 -e "s^@LUSTRE_TARGET@^$TARGET^g" \
505 -e "s^@PSERIES64_ARCHS@^$PSERIES64_ARCHS^g" \
506 -e "s^@RHBUILD@^$RHBUILD^g" \
507 -e "s^@SMP_ARCHS@^$SMP_ARCHS^g" \
508 -e "s^@SUSEBUILD@^$SUSEBUILD^g" \
509 -e "s^@SUSEBUILD@^$SUSEBUILD^g" \
510 -e "s^@UP_ARCHS@^$UP_ARCHS^g" \
511 < $TOPDIR/lustre/build/lustre-kernel-2.4.spec.in \
512 > lustre-kernel-2.4.spec
513 [ -d SRPMS ] || mkdir SRPMS
514 [ -d RPMS ] || mkdir RPMS
515 [ -d BUILD ] || mkdir BUILD
516 [ -d SOURCES ] || mkdir SOURCES
517 for script in linux-{rhconfig.h,merge-config.awk,merge-modules.awk} \
518 suse-{functions.sh,post.sh,postun.sh,trigger-script.sh.in} \
519 sles8-{pre,post,postun,update_{INITRD_MODULES,rcfile_setting}}.sh ; do
520 cp $TOPDIR/lustre/build/$script SOURCES
522 cp "$LUSTRE" "$KERNEL_FILE" SOURCES
523 if [ "$EXTERNAL_PATCHES" -a -d "$EXTERNAL_PATCHES" ] ; then
524 tar zcf SOURCES/external-patches.tar.gz -C "$EXTERNAL_PATCHES" series targets patches kernel_configs
526 touch SOURCES/external-patches.tar.gz
532 [ -d lustre ] || return 0
533 echo "Cleaning Lustre..."
534 [ -L lustre ] && rm -rf $(readlink lustre)
540 echo "Building kernel + Lustre RPMs for: $BUILD_ARCHS..."
542 for arch in $BUILD_ARCHS ; do
543 targets="--target $arch $targets"
546 $RPMBUILD $targets -bb lustre-kernel-2.4.spec \
547 --define "_tmppath $TMPDIR" \
548 --define "_topdir $TOPDIR" || \
549 fatal 1 "Error building rpms for $BUILD_ARCHS."
551 if (( $DO_SRC )) ; then
552 $RPMBUILD -bs lustre-kernel-2.4.spec \
553 --define "_tmppath $TMPDIR" \
554 --define "_topdir $TOPDIR" || \
555 fatal 1 "Error building .src.rpm."
561 [ -d SRPMS ] || mkdir SRPMS
562 [ -d RPMS ] || mkdir RPMS
563 [ -d BUILD ] || mkdir BUILD
564 [ -d SOURCES ] || mkdir SOURCES
568 pushd lustre >/dev/null
570 echo "Building Lustre RPMs for: $BUILD_ARCHS..."
572 for arch in $BUILD_ARCHS ; do
573 targets="--target $arch $targets"
576 ./configure "--with-linux=${LINUX}" ${CONFIGURE_FLAGS}
578 $RPMBUILD $targets -bb lustre.spec \
579 --define "_tmppath $TMPDIR" \
580 --define "_topdir $TOPDIR" || \
581 fatal 1 "Error building rpms for $BUILD_ARCHS."
588 [ "$STAGEDIR" ] || return 0
590 for arch in $BUILD_ARCHS ; do
591 rpmdir="${STAGEDIR}/${CANONICAL_TARGET}-${arch}"
592 echo "${0##*/}: Copying RPMs into ${rpmdir}"
594 cp -v RPMS/${arch}/*.rpm "${rpmdir}"
595 if [ -d RPMS/noarch ] ; then
596 cp -v RPMS/noarch/*.rpm "${rpmdir}"
600 cp -v "$LUSTRE" "$STAGEDIR"
603 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
605 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: -- "$@")
607 if [ $? != 0 ] ; then
611 eval set -- "$options"
641 --linux | --with-linux)
694 usage 1 "Unrecognized option: $1"
703 # prep_build needs the .spec.in from the lustre source
704 if [ -z "$LINUX" ] ; then
706 if (( $DO_SRC )) ; then