5 # CVSROOT is inherited from the environment
47 # Readlink is not present on some older distributions: emulate it.
51 if [ -L "$path" ]; then
52 ll="$(LC_ALL=C ls -l "$path" 2> /dev/null)" &&
66 [ "$1" ] && echo -e "\n${0##*/}: $1"
78 (( $RELEASE )) || return 0
83 echo -n "Available targets:"
84 for target in $TOPDIR/lustre/lustre/kernel_patches/targets/*.target ; do
85 target_file=${target##*/}
86 echo -n " ${target_file%%.target}"
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. The available targets are listed
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.
174 if [ "$LUSTRE" ] ; then
175 [ -r "$LUSTRE" ] || \
176 usage 1 "Could not find Lustre source tarball '$LUSTRE'."
179 usage 1 "Either specify a CVS Root with -d, or a Lustre source tarball with --lustre."
181 usage 1 "A branch/tag name must be specified with --tag when not building from a tarball."
184 if [ -z "$LINUX" ] ; then
185 [ "$KERNELDIR" ] || \
186 usage 1 "A kernel directory must be specified with --kerneldir."
188 [ -d "$KERNELDIR" ] || \
189 usage 1 "$KERNELDIR is not a directory."
191 if ! (( $RELEASE )) ; then
193 usage 1 "When building a snapshot, a tag name must be used."
196 [ "$TARGET" ] || usage 1 "A target must be specified with --target."
197 # TARGET_FILE="$TOPDIR/lustre/kernel_patches/targets/$TARGET.target"
198 # [ -r "$TARGET_FILE" ] || \
199 # usage 1 "Target '$TARGET' was not found."
204 CANONICAL_TARGET="rhel-2.6"
207 CANONICAL_TARGET="sles-2.6"
210 CANONICAL_TARGET="hp-pnnl-2.4"
217 CANONICAL_TARGET="$TARGET"
221 TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M")
223 RPMBUILD=$(which rpmbuild 2>/dev/null | head -1)
224 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
225 RPMBUILD=$(which rpm 2>/dev/null | head -1)
226 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
227 usage 1 "Could not find binary for making rpms (tried rpmbuild and rpm)."
234 echo $(echo "$*" | xargs -n 1 | sort -u)
237 download_and_build_tarball() {
241 local SRPM=kernel-${lnxmaj}-${lnxrel}.src.rpm
243 echo "Downloading http://ftp.lustre.org/kernels/$TARGET/old/$SRPM..."
244 if ! wget -nv "http://ftp.lustre.org/kernels/$TARGET/old/$SRPM" \
245 -O "$KERNELDIR/$SRPM" ; then
246 fatal 1 "Could not download target $TARGET's kernel SRPM $SRPM from ftp.lustre.org."
249 if [ "$TARGET" = "rhel-2.6" ]; then
250 RPMTOPDIR=$(mktemp -d $KERNELDIR/rpm_XXXXXX)
251 mkdir $RPMTOPDIR/BUILD/
252 rpm -ivh $KERNELDIR/$SRPM --define "_topdir $RPMTOPDIR" || \
253 { rm -rf $RPMTOPDIR; fatal 1 "Error installing kernel SRPM."; }
254 $RPMBUILD -bp --nodeps --target i686 $RPMTOPDIR/SPECS/kernel-2.6.spec --define "_topdir $RPMTOPDIR"
255 pushd $RPMTOPDIR/BUILD/kernel-${lnxmaj}/linux-${lnxmaj} && {
257 cp configs/kernel-${lnxmaj}-i686-smp.config .config
258 make nonint_oldconfig > /dev/null
259 make include/linux/version.h
262 tar cjf $KERNEL_FILE linux-${lnxmaj}
271 EXTRA_VERSION_save="$EXTRA_VERSION"
272 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches" ; do
273 TARGET_FILE="$patchesdir/targets/$TARGET.target"
274 [ -r "$TARGET_FILE" ] && break
276 [ -r "$TARGET_FILE" ] || \
277 fatal 1 "Target $TARGET was not found."
279 echo "Loading target config file $TARGET.target..."
283 [ "$KERNEL" ] || fatal 1 "Target $TARGET did not specify a kernel."
284 # [ "$SERIES" ] || fatal 1 "Target $TARGET did not specify a kernel patch series."
285 # [ "$CONFIG" ] || fatal 1 "Target $TARGET did not specify a kernel config."
286 [ "$VERSION" ] || fatal 1 "Target $TARGET did not specify a kernel version."
288 if [ "$KERNELDIR" ] ; then
289 KERNEL_FILE="$KERNELDIR/$KERNEL"
290 if [ ! -r "$KERNELDIR/$KERNEL" ] ; then
291 if (( $DOWNLOAD )) ; then
292 echo "Downloading http://ftp.lustre.org/kernels/$CANONICAL_TARGET/old/$KERNEL..."
293 if ! wget -nv "http://ftp.lustre.org/kernels/$CANONICAL_TARGET/old/$KERNEL" -O "$KERNELDIR/$KERNEL" ; then
294 # see if we can do it with an SRPM from the download site
295 download_and_build_tarball $CANONICAL_TARGET $KERNEL_FILE
298 fatal 1 "Target $TARGET's kernel file $KERNEL not found in kernel directory $KERNELDIR."
303 if [ "$SERIES" ] ; then
304 for series in $SERIES ; do
305 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches" ; do
306 [ -r "$patchesdir/series/$series" ] && continue 2
308 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."
312 CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/$CONFIG"
313 [ -r "$CONFIG_FILE" ] || \
314 fatal 1 "Target $TARGET's config file $CONFIG missing from $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/."
316 if [ "$EXTRA_VERSION_save" ] ; then
317 EXTRA_VERSION="$EXTRA_VERSION_save"
318 elif ! (( $RELEASE )) ; then
319 #remove the @VERSION@ (lustre version)
320 EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
321 EXTRA_VERSION="${EXTRA_VERSION}-${TAG}.${TIMESTAMP}"
323 # EXTRA_VERSION=${EXTRA_VERSION//-/_}
325 ALL_ARCHS="$BASE_ARCHS $BIGMEM_ARCHS $BOOT_ARCHS $JENSEN_ARCHS $SMP_ARCHS $BIGSMP_ARCHS $PSERIES64_ARCHS $UP_ARCHS"
328 for arch in $(uniqify "$ALL_ARCHS") ; do
329 if [ -z "$TARGET_ARCHS" ] || echo "$TARGET_ARCHS" | grep "$arch" >/dev/null 2>/dev/null ; then
330 BUILD_ARCHS="$BUILD_ARCHS $arch"
333 [ "$BUILD_ARCHS" ] || usage 1 "No available target archs to build."
334 echo "Building for: $BUILD_ARCHS"
341 fatal 1 "tarflags(): File name argument missing."
353 fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
360 echo "Untarring ${1##*/}..."
361 tar $(tarflags "$1") "$1"
366 DIRNAME="lustre-$TAG-$TIMESTAMP"
367 if [ "$LUSTRE" ] ; then
369 [ -d lustre ] || ln -sf lustre* lustre
371 if [ "$USE_DATESTAMP" ]; then
372 DATESTAMP="-D '$DATE'"
377 cvs -d "$CVSROOT" -qz3 co $DATESTAMP -d "$DIRNAME" lustre || \
378 fatal 1 "There was an error checking out toplevel Lustre from CVS."
379 pushd "$DIRNAME" > /dev/null
380 ./lustrecvs "$TAG" || \
381 fatal 1 "There was an error checking out Lustre/Portals/Build from CVS."
382 echo "Creating lustre tarball..."
383 sh autogen.sh || fatal 1 "There was an error running autogen.sh."
384 ./configure --disable-{modules,utils,liblustre,tests,doc} || \
385 fatal 1 "There was an error running ./configure to create makefiles."
386 make dist || fatal 1 "There was an error running 'make dist'."
388 fname=`basename $DIRNAME/lustre-*.tar.gz`
389 cp $DIRNAME/$fname . || fatal 1 "There was an error copying lustre tarball."
391 ln -sf "$DIRNAME" lustre
398 [ -d linux ] || ln -sf linux* linux
403 [ "$SERIES" ] || return 0
404 FULL_PATCH="$PWD/lustre-kernel-${TARGET}-${EXTRA_VERSION}.patch"
405 [ -f "$FULL_PATCH" ] && rm -f "$FULL_PATCH"
406 pushd linux >/dev/null
407 for series in $SERIES ; do
408 echo -n "Applying series $series:"
409 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches" ; do
410 [ -r "$patchesdir/series/$series" ] || continue
411 SERIES_FILE="$patchesdir/series/$series"
412 for patch in $(<"$SERIES_FILE") ; do
414 PATCH_FILE="$patchesdir/patches/$patch"
415 [ -r "$PATCH_FILE" ] || \
416 fatal 1 "Patch $patch does not exist in Lustre tree."
417 cat "$PATCH_FILE" >> "$FULL_PATCH" || \
418 fatal 1 "Error adding patch $patch to full patch."
419 patch -s -p1 < "$PATCH_FILE" || fatal 1 "Error applying patch $patch."
426 echo "Full patch has been saved in ${FULL_PATCH##*/}."
427 echo "Replacing .config files..."
428 [ -d linux/configs ] || mkdir linux/configs || \
429 fatal 1 "Error creating configs directory."
430 rm -f linux/configs/*
432 for patchesdir in "$EXTERNAL_PATCHES" "lustre/lustre/kernel_patches" ; do
433 [ "$patchesdir" ] && \
434 cp -v $patchesdir/kernel_configs/kernel-${VERSION}-${TARGET}*.config linux/configs/ >/dev/null && copysuccess=1
436 [ "$copysuccess" = "1" ] || \
437 fatal 1 "Error copying in kernel configs."
442 TARBALL="$(readlink linux)-$EXTRA_VERSION.tar.gz"
443 echo "Creating patched linux tarball $TARBALL..."
444 tar zcf "$TARBALL" "$(readlink linux)" \
445 --exclude "CVS" --exclude ".cvsignore" || \
446 --exclude "*.orig" --exclude "*~" --exclude "*.rej" || \
447 fatal 1 "Error creating patched Linux tarball."
452 [ -d linux ] || return 0
453 echo "Cleaning linux..."
454 [ -L linux ] && rm -rf $(readlink linux)
461 ENABLE_INIT_SCRIPTS=""
463 -e "s^@BASE_ARCHS@^$BASE_ARCHS^g" \
464 -e "s^@BIGMEM_ARCHS@^$BIGMEM_ARCHS^g" \
465 -e "s^@BIGSMP_ARCHS@^$BIGSMP_ARCHS^g" \
466 -e "s^@BOOT_ARCHS@^$BOOT_ARCHS^g" \
467 -e "s^@CONFIGURE_FLAGS@^$CONFIGURE_FLAGS^g" \
468 -e "s^@ENABLE_INIT_SCRIPTS@^$ENABLE_INIT_SCRIPTS^g" \
469 -e "s^@JENSEN_ARCHS@^$BOOT_ARCHS^g" \
470 -e "s^@KERNEL_EXTRA_VERSION@^$EXTRA_VERSION^g" \
471 -e "s^@KERNEL_RELEASE@^${EXTRA_VERSION//-/_}^g" \
472 -e "s^@KERNEL_SOURCE@^$KERNEL^g" \
473 -e "s^@KERNEL_VERSION@^$VERSION^g" \
474 -e "s^@LINUX26@^$LINUX26^g" \
475 -e "s^@LUSTRE_SOURCE@^${LUSTRE##*/}^g" \
476 -e "s^@LUSTRE_TARGET@^$TARGET^g" \
477 -e "s^@PSERIES64_ARCHS@^$PSERIES64_ARCHS^g" \
478 -e "s^@RHBUILD@^$RHBUILD^g" \
479 -e "s^@SMP_ARCHS@^$SMP_ARCHS^g" \
480 -e "s^@SUSEBUILD@^$SUSEBUILD^g" \
481 -e "s^@SUSEBUILD@^$SUSEBUILD^g" \
482 -e "s^@UP_ARCHS@^$UP_ARCHS^g" \
483 < $TOPDIR/lustre/build/lustre-kernel-2.4.spec.in \
484 > lustre-kernel-2.4.spec
485 [ -d SRPMS ] || mkdir SRPMS
486 [ -d RPMS ] || mkdir RPMS
487 [ -d BUILD ] || mkdir BUILD
488 [ -d SOURCES ] || mkdir SOURCES
489 for script in linux-{rhconfig.h,merge-config.awk,merge-modules.awk} \
490 suse-{functions.sh,post.sh,postun.sh,trigger-script.sh.in} \
491 sles8-{pre,post,postun,update_{INITRD_MODULES,rcfile_setting}}.sh ; do
492 cp $TOPDIR/lustre/build/$script SOURCES
494 cp "$LUSTRE" "$KERNEL_FILE" SOURCES
495 if [ "$EXTERNAL_PATCHES" -a -d "$EXTERNAL_PATCHES" ] ; then
496 tar zcf SOURCES/external-patches.tar.gz -C "$EXTERNAL_PATCHES" series targets patches kernel_configs
498 touch SOURCES/external-patches.tar.gz
504 [ -d lustre ] || return 0
505 echo "Cleaning Lustre..."
506 [ -L lustre ] && rm -rf $(readlink lustre)
512 echo "Building kernel + Lustre RPMs for: $BUILD_ARCHS..."
514 for arch in $BUILD_ARCHS ; do
515 targets="--target $arch $targets"
518 $RPMBUILD $targets -bb lustre-kernel-2.4.spec \
519 --define "_topdir $TOPDIR" || \
520 fatal 1 "Error building rpms for $BUILD_ARCHS."
522 if (( $DO_SRC )) ; then
523 $RPMBUILD -bs lustre-kernel-2.4.spec \
524 --define "_topdir $TOPDIR" || \
525 fatal 1 "Error building .src.rpm."
531 [ -d SRPMS ] || mkdir SRPMS
532 [ -d RPMS ] || mkdir RPMS
533 [ -d BUILD ] || mkdir BUILD
534 [ -d SOURCES ] || mkdir SOURCES
538 pushd lustre >/dev/null
540 echo "Building Lustre RPMs for: $BUILD_ARCHS..."
542 for arch in $BUILD_ARCHS ; do
543 targets="--target $arch $targets"
546 ./configure "--with-linux=${LINUX}" ${CONFIGURE_FLAGS}
548 $RPMBUILD $targets -bb build/lustre.spec \
549 --define "_topdir $TOPDIR" || \
550 fatal 1 "Error building rpms for $BUILD_ARCHS."
557 [ "$STAGEDIR" ] || return 0
559 for arch in $BUILD_ARCHS ; do
560 rpmdir="${STAGEDIR}/${CANONICAL_TARGET}-${arch}"
561 echo "${0##*/}: Copying RPMs into ${rpmdir}"
563 cp -v RPMS/${arch}/*.rpm "${rpmdir}"
564 if [ -d RPMS/noarch ] ; then
565 cp -v RPMS/noarch/*.rpm "${rpmdir}"
569 cp -v "$LUSTRE" "$STAGEDIR"
572 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
574 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: -- "$@")
576 if [ $? != 0 ] ; then
580 eval set -- "$options"
610 --linux | --with-linux)
663 usage 1 "Unrecognized option: $1"
672 # prep_build needs the .spec.in from the lustre source
673 if [ -z "$LINUX" ] ; then
676 if (( $DO_SRC )) ; then