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"
220 CANONICAL_TARGET="$TARGET"
224 TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M")
226 RPMBUILD=$(which rpmbuild 2>/dev/null | head -1)
227 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
228 RPMBUILD=$(which rpm 2>/dev/null | head -1)
229 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
230 usage 1 "Could not find binary for making rpms (tried rpmbuild and rpm)."
237 echo $(echo "$*" | xargs -n 1 | sort -u)
244 if [ "$TARGET" = "rhel-2.6" -o "$TARGET" = "rhel-2.4" ]; then
246 if [ "$TARGET" = "rhel-2.6" ]; then
248 OLDCONFIG=nonint_oldconfig
249 elif [ "$TARGET" = "rhel-2.4" ]; then
254 RPMTOPDIR=$(mktemp -d $KERNELDIR/rpm_XXXXXX)
255 mkdir $RPMTOPDIR/BUILD/
256 rpm -ivh $KERNELDIR/$SRPM --define "_topdir $RPMTOPDIR" || \
257 { rm -rf $RPMTOPDIR; fatal 1 "Error installing kernel SRPM."; }
258 $RPMBUILD -bp --nodeps --target i686 $RPMTOPDIR/SPECS/$SPEC --define "_topdir $RPMTOPDIR"
259 pushd $RPMTOPDIR/BUILD/kernel-${lnxmaj}/linux-${lnxmaj} && {
261 cp configs/kernel-${lnxmaj}-i686-smp.config .config
262 if ! make $OLDCONFIG > /dev/null; then
263 fatal 1 "error trying to make $OLDCONFIG while building a tarball from SRPM."
265 make include/linux/version.h
268 tar cjf $KERNEL_FILE linux-${lnxmaj}
275 download_and_build_tarball() {
279 local SRPM=kernel-${lnxmaj}-${lnxrel}.src.rpm
281 echo "Downloading http://ftp.lustre.org/kernels/$TARGET/old/$SRPM..."
282 if ! wget -nv "http://ftp.lustre.org/kernels/$TARGET/old/$SRPM" \
283 -O "$KERNELDIR/$SRPM" ; then
284 fatal 1 "Could not download target $TARGET's kernel SRPM $SRPM from ftp.lustre.org."
287 build_tarball $TARGET $SRPM
292 EXTRA_VERSION_save="$EXTRA_VERSION"
293 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches" ; do
294 TARGET_FILE="$patchesdir/targets/$TARGET.target"
295 [ -r "$TARGET_FILE" ] && break
297 [ -r "$TARGET_FILE" ] || \
298 fatal 1 "Target $TARGET was not found."
300 echo "Loading target config file $TARGET.target..."
304 [ "$KERNEL" ] || fatal 1 "Target $TARGET did not specify a kernel."
305 [ "$VERSION" ] || fatal 1 "Target $TARGET did not specify a kernel version."
307 if [ "$KERNELDIR" ] ; then
308 KERNEL_FILE="$KERNELDIR/$KERNEL"
309 if [ ! -r "$KERNELDIR/$KERNEL" ] ; then
310 # see if we have an SRPM we can build a tarball for
311 KERNEL_SRPM=kernel-${lnxmaj}-${lnxrel}.src.rpm
312 if [ -r "$KERNELDIR/$KERNEL_SRPM" ] ; then
313 build_tarball $CANONICAL_TARGET $KERNEL_SRPM
315 if (( $DOWNLOAD )) ; then
316 echo "Downloading http://ftp.lustre.org/kernels/$CANONICAL_TARGET/old/$KERNEL..."
317 if ! wget -nv "http://ftp.lustre.org/kernels/$CANONICAL_TARGET/old/$KERNEL" -O "$KERNELDIR/$KERNEL" ; then
318 # see if we can do it with an SRPM from the download site
319 download_and_build_tarball $CANONICAL_TARGET $KERNEL_FILE
322 fatal 1 "Target $TARGET's kernel file $KERNEL not found in kernel directory $KERNELDIR."
328 if [ "$SERIES" ] ; then
329 for series in $SERIES ; do
330 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches" ; do
331 [ -r "$patchesdir/series/$series" ] && continue 2
333 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."
337 CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/$CONFIG"
338 [ -r "$CONFIG_FILE" ] || \
339 fatal 1 "Target $TARGET's config file $CONFIG missing from $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/."
341 if [ "$EXTRA_VERSION_save" ] ; then
342 EXTRA_VERSION="$EXTRA_VERSION_save"
343 elif ! (( $RELEASE )) ; then
344 # if there is no patch series, then this is not a lustre specific
345 # kernel. don't make it look like one
346 if [ -n "$SERIES" ]; then
347 #remove the @VERSION@ (lustre version)
348 EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
349 EXTRA_VERSION="${EXTRA_VERSION}-${TAG}.${TIMESTAMP}"
352 # EXTRA_VERSION=${EXTRA_VERSION//-/_}
354 ALL_ARCHS="$BASE_ARCHS $BIGMEM_ARCHS $BOOT_ARCHS $JENSEN_ARCHS $SMP_ARCHS $BIGSMP_ARCHS $PSERIES64_ARCHS $UP_ARCHS"
357 for arch in $(uniqify "$ALL_ARCHS") ; do
358 if [ -z "$TARGET_ARCHS" ] || echo "$TARGET_ARCHS" | grep "$arch" >/dev/null 2>/dev/null ; then
359 BUILD_ARCHS="$BUILD_ARCHS $arch"
362 [ "$BUILD_ARCHS" ] || usage 1 "No available target archs to build."
363 echo "Building for: $BUILD_ARCHS"
370 fatal 1 "tarflags(): File name argument missing."
382 fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
389 echo "Untarring ${1##*/}..."
390 tar $(tarflags "$1") "$1"
395 DIRNAME="lustre-$TAG-$TIMESTAMP"
396 if [ "$LUSTRE" ] ; then
398 [ -d lustre ] || ln -sf lustre-[0-9].[0-9]* lustre
400 if [ "$USE_DATESTAMP" ]; then
401 DATESTAMP="-D '$DATE'"
406 cvs -d "$CVSROOT" -qz3 co $DATESTAMP -d "$DIRNAME" lustre || \
407 fatal 1 "There was an error checking out toplevel Lustre from CVS."
408 pushd "$DIRNAME" > /dev/null
409 ./lustrecvs "$TAG" || \
410 fatal 1 "There was an error checking out Lustre/Portals/Build from CVS."
411 echo "Creating lustre tarball..."
412 sh autogen.sh || fatal 1 "There was an error running autogen.sh."
413 ./configure --disable-{modules,utils,liblustre,tests,doc} || \
414 fatal 1 "There was an error running ./configure to create makefiles."
415 make dist || fatal 1 "There was an error running 'make dist'."
417 fname=`basename $DIRNAME/lustre-*.tar.gz`
418 cp $DIRNAME/$fname . || fatal 1 "There was an error copying lustre tarball."
420 ln -sf "$DIRNAME" lustre
427 [ -d linux ] || ln -sf linux* linux
432 [ "$SERIES" ] || return 0
433 FULL_PATCH="$PWD/lustre-kernel-${TARGET}-${EXTRA_VERSION}.patch"
434 [ -f "$FULL_PATCH" ] && rm -f "$FULL_PATCH"
435 pushd linux >/dev/null
436 for series in $SERIES ; do
437 echo -n "Applying series $series:"
438 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches" ; do
439 [ -r "$patchesdir/series/$series" ] || continue
440 SERIES_FILE="$patchesdir/series/$series"
441 for patch in $(<"$SERIES_FILE") ; do
443 PATCH_FILE="$patchesdir/patches/$patch"
444 [ -r "$PATCH_FILE" ] || \
445 fatal 1 "Patch $patch does not exist in Lustre tree."
446 cat "$PATCH_FILE" >> "$FULL_PATCH" || \
447 fatal 1 "Error adding patch $patch to full patch."
448 patch -s -p1 < "$PATCH_FILE" || fatal 1 "Error applying patch $patch."
455 echo "Full patch has been saved in ${FULL_PATCH##*/}."
456 echo "Replacing .config files..."
457 [ -d linux/configs ] || mkdir linux/configs || \
458 fatal 1 "Error creating configs directory."
459 rm -f linux/configs/*
461 for patchesdir in "$EXTERNAL_PATCHES" "lustre/lustre/kernel_patches" ; do
462 [ "$patchesdir" ] && \
463 cp -v $patchesdir/kernel_configs/kernel-${VERSION}-${TARGET}*.config linux/configs/ >/dev/null && copysuccess=1
465 [ "$copysuccess" = "1" ] || \
466 fatal 1 "Error copying in kernel configs."
471 TARBALL="$(readlink linux)-$EXTRA_VERSION.tar.gz"
472 echo "Creating patched linux tarball $TARBALL..."
473 tar zcf "$TARBALL" "$(readlink linux)" \
474 --exclude "CVS" --exclude ".cvsignore" || \
475 --exclude "*.orig" --exclude "*~" --exclude "*.rej" || \
476 fatal 1 "Error creating patched Linux tarball."
481 [ -d linux ] || return 0
482 echo "Cleaning linux..."
483 [ -L linux ] && rm -rf $(readlink linux)
490 ENABLE_INIT_SCRIPTS=""
492 -e "s^@BASE_ARCHS@^$BASE_ARCHS^g" \
493 -e "s^@BIGMEM_ARCHS@^$BIGMEM_ARCHS^g" \
494 -e "s^@BIGSMP_ARCHS@^$BIGSMP_ARCHS^g" \
495 -e "s^@BOOT_ARCHS@^$BOOT_ARCHS^g" \
496 -e "s^@CONFIGURE_FLAGS@^$CONFIGURE_FLAGS^g" \
497 -e "s^@ENABLE_INIT_SCRIPTS@^$ENABLE_INIT_SCRIPTS^g" \
498 -e "s^@JENSEN_ARCHS@^$BOOT_ARCHS^g" \
499 -e "s^@KERNEL_EXTRA_VERSION@^$EXTRA_VERSION^g" \
500 -e "s^@KERNEL_RELEASE@^${EXTRA_VERSION//-/_}^g" \
501 -e "s^@KERNEL_SOURCE@^$KERNEL^g" \
502 -e "s^@KERNEL_VERSION@^$VERSION^g" \
503 -e "s^@LINUX26@^$LINUX26^g" \
504 -e "s^@LUSTRE_SOURCE@^${LUSTRE##*/}^g" \
505 -e "s^@LUSTRE_TARGET@^$TARGET^g" \
506 -e "s^@PSERIES64_ARCHS@^$PSERIES64_ARCHS^g" \
507 -e "s^@RHBUILD@^$RHBUILD^g" \
508 -e "s^@SMP_ARCHS@^$SMP_ARCHS^g" \
509 -e "s^@SUSEBUILD@^$SUSEBUILD^g" \
510 -e "s^@SUSEBUILD@^$SUSEBUILD^g" \
511 -e "s^@UP_ARCHS@^$UP_ARCHS^g" \
512 < $TOPDIR/lustre/build/lustre-kernel-2.4.spec.in \
513 > lustre-kernel-2.4.spec
514 [ -d SRPMS ] || mkdir SRPMS
515 [ -d RPMS ] || mkdir RPMS
516 [ -d BUILD ] || mkdir BUILD
517 [ -d SOURCES ] || mkdir SOURCES
518 for script in linux-{rhconfig.h,merge-config.awk,merge-modules.awk} \
519 suse-{functions.sh,post.sh,postun.sh,trigger-script.sh.in} \
520 sles8-{pre,post,postun,update_{INITRD_MODULES,rcfile_setting}}.sh ; do
521 cp $TOPDIR/lustre/build/$script SOURCES
523 cp "$LUSTRE" "$KERNEL_FILE" SOURCES
524 if [ "$EXTERNAL_PATCHES" -a -d "$EXTERNAL_PATCHES" ] ; then
525 tar zcf SOURCES/external-patches.tar.gz -C "$EXTERNAL_PATCHES" series targets patches kernel_configs
527 touch SOURCES/external-patches.tar.gz
533 [ -d lustre ] || return 0
534 echo "Cleaning Lustre..."
535 [ -L lustre ] && rm -rf $(readlink lustre)
541 echo "Building kernel + Lustre RPMs for: $BUILD_ARCHS..."
543 for arch in $BUILD_ARCHS ; do
544 targets="--target $arch $targets"
547 $RPMBUILD $targets -bb lustre-kernel-2.4.spec \
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 "_topdir $TOPDIR" || \
554 fatal 1 "Error building .src.rpm."
560 [ -d SRPMS ] || mkdir SRPMS
561 [ -d RPMS ] || mkdir RPMS
562 [ -d BUILD ] || mkdir BUILD
563 [ -d SOURCES ] || mkdir SOURCES
567 pushd lustre >/dev/null
569 echo "Building Lustre RPMs for: $BUILD_ARCHS..."
571 for arch in $BUILD_ARCHS ; do
572 targets="--target $arch $targets"
575 ./configure "--with-linux=${LINUX}" ${CONFIGURE_FLAGS}
577 $RPMBUILD $targets -bb build/lustre.spec \
578 --define "_topdir $TOPDIR" || \
579 fatal 1 "Error building rpms for $BUILD_ARCHS."
586 [ "$STAGEDIR" ] || return 0
588 for arch in $BUILD_ARCHS ; do
589 rpmdir="${STAGEDIR}/${CANONICAL_TARGET}-${arch}"
590 echo "${0##*/}: Copying RPMs into ${rpmdir}"
592 cp -v RPMS/${arch}/*.rpm "${rpmdir}"
593 if [ -d RPMS/noarch ] ; then
594 cp -v RPMS/noarch/*.rpm "${rpmdir}"
598 cp -v "$LUSTRE" "$STAGEDIR"
601 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
603 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: -- "$@")
605 if [ $? != 0 ] ; then
609 eval set -- "$options"
639 --linux | --with-linux)
692 usage 1 "Unrecognized option: $1"
701 # prep_build needs the .spec.in from the lustre source
702 if [ -z "$LINUX" ] ; then
704 if (( $DO_SRC )) ; then