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)
239 EXTRA_VERSION_save="$EXTRA_VERSION"
240 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches" ; do
241 TARGET_FILE="$patchesdir/targets/$TARGET.target"
242 [ -r "$TARGET_FILE" ] && break
244 [ -r "$TARGET_FILE" ] || \
245 fatal 1 "Target $TARGET was not found."
247 echo "Loading target config file $TARGET.target..."
251 [ "$KERNEL" ] || fatal 1 "Target $TARGET did not specify a kernel."
252 # [ "$SERIES" ] || fatal 1 "Target $TARGET did not specify a kernel patch series."
253 # [ "$CONFIG" ] || fatal 1 "Target $TARGET did not specify a kernel config."
254 [ "$VERSION" ] || fatal 1 "Target $TARGET did not specify a kernel version."
256 if [ "$KERNELDIR" ] ; then
257 KERNEL_FILE="$KERNELDIR/$KERNEL"
258 if [ ! -r "$KERNELDIR/$KERNEL" ] ; then
259 if (( $DOWNLOAD )) ; then
260 echo "Downloading http://ftp.lustre.org/kernels/$CANONICAL_TARGET/old/$KERNEL..."
261 if ! wget -nv "http://ftp.lustre.org/kernels/$CANONICAL_TARGET/old/$KERNEL" \
262 -O "$KERNELDIR/$KERNEL" ; then
263 fatal 1 "Could not download target $TARGET's kernel file $KERNEL from ftp.lustre.org."
266 fatal 1 "Target $TARGET's kernel file $KERNEL not found in kernel directory $KERNELDIR."
271 if [ "$SERIES" ] ; then
272 for series in $SERIES ; do
273 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches" ; do
274 [ -r "$patchesdir/series/$series" ] && continue 2
276 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."
280 CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/$CONFIG"
281 [ -r "$CONFIG_FILE" ] || \
282 fatal 1 "Target $TARGET's config file $CONFIG missing from $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/."
284 if [ "$EXTRA_VERSION_save" ] ; then
285 EXTRA_VERSION="$EXTRA_VERSION_save"
286 elif ! (( $RELEASE )) ; then
287 #remove the @VERSION@ (lustre version)
288 EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
289 EXTRA_VERSION="${EXTRA_VERSION}-${TAG}.${TIMESTAMP}"
291 # EXTRA_VERSION=${EXTRA_VERSION//-/_}
293 ALL_ARCHS="$BASE_ARCHS $BIGMEM_ARCHS $BOOT_ARCHS $JENSEN_ARCHS $SMP_ARCHS $BIGSMP_ARCHS $PSERIES64_ARCHS $UP_ARCHS"
296 for arch in $(uniqify "$ALL_ARCHS") ; do
297 if [ -z "$TARGET_ARCHS" ] || echo "$TARGET_ARCHS" | grep "$arch" >/dev/null 2>/dev/null ; then
298 BUILD_ARCHS="$BUILD_ARCHS $arch"
301 [ "$BUILD_ARCHS" ] || usage 1 "No available target archs to build."
302 echo "Building for: $BUILD_ARCHS"
309 fatal 1 "tarflags(): File name argument missing."
321 fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
328 echo "Untarring ${1##*/}..."
329 tar $(tarflags "$1") "$1"
334 DIRNAME="lustre-$TAG-$TIMESTAMP"
335 if [ "$LUSTRE" ] ; then
337 [ -d lustre ] || ln -sf lustre* lustre
339 if [ "$USE_DATESTAMP" ]; then
340 DATESTAMP="-D '$DATE'"
345 cvs -d "$CVSROOT" -qz3 co $DATESTAMP -d "$DIRNAME" lustre || \
346 fatal 1 "There was an error checking out toplevel Lustre from CVS."
347 pushd "$DIRNAME" > /dev/null
348 ./lustrecvs "$TAG" || \
349 fatal 1 "There was an error checking out Lustre/Portals/Build from CVS."
350 echo "Creating lustre tarball..."
351 sh autogen.sh || fatal 1 "There was an error running autogen.sh."
352 ./configure --disable-{modules,utils,liblustre,tests,doc} || \
353 fatal 1 "There was an error running ./configure to create makefiles."
354 make dist || fatal 1 "There was an error running 'make dist'."
356 fname=`basename $DIRNAME/lustre-*.tar.gz`
357 cp $DIRNAME/$fname . || fatal 1 "There was an error copying lustre tarball."
359 ln -sf "$DIRNAME" lustre
366 [ -d linux ] || ln -sf linux* linux
371 [ "$SERIES" ] || return 0
372 FULL_PATCH="$PWD/lustre-kernel-${TARGET}-${EXTRA_VERSION}.patch"
373 [ -f "$FULL_PATCH" ] && rm -f "$FULL_PATCH"
374 pushd linux >/dev/null
375 for series in $SERIES ; do
376 echo -n "Applying series $series:"
377 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches" ; do
378 [ -r "$patchesdir/series/$series" ] || continue
379 SERIES_FILE="$patchesdir/series/$series"
380 for patch in $(<"$SERIES_FILE") ; do
382 PATCH_FILE="$patchesdir/patches/$patch"
383 [ -r "$PATCH_FILE" ] || \
384 fatal 1 "Patch $patch does not exist in Lustre tree."
385 cat "$PATCH_FILE" >> "$FULL_PATCH" || \
386 fatal 1 "Error adding patch $patch to full patch."
387 patch -s -p1 < "$PATCH_FILE" || fatal 1 "Error applying patch $patch."
394 echo "Full patch has been saved in ${FULL_PATCH##*/}."
395 echo "Replacing .config files..."
396 [ -d linux/configs ] || mkdir linux/configs || \
397 fatal 1 "Error creating configs directory."
398 rm -f linux/configs/*
400 for patchesdir in "$EXTERNAL_PATCHES" "lustre/lustre/kernel_patches" ; do
401 [ "$patchesdir" ] && \
402 cp -v $patchesdir/kernel_configs/kernel-${VERSION}-${TARGET}*.config linux/configs/ >/dev/null && copysuccess=1
404 [ "$copysuccess" = "1" ] || \
405 fatal 1 "Error copying in kernel configs."
410 TARBALL="$(readlink linux)-$EXTRA_VERSION.tar.gz"
411 echo "Creating patched linux tarball $TARBALL..."
412 tar zcf "$TARBALL" "$(readlink linux)" \
413 --exclude "CVS" --exclude ".cvsignore" || \
414 --exclude "*.orig" --exclude "*~" --exclude "*.rej" || \
415 fatal 1 "Error creating patched Linux tarball."
420 [ -d linux ] || return 0
421 echo "Cleaning linux..."
422 [ -L linux ] && rm -rf $(readlink linux)
429 ENABLE_INIT_SCRIPTS=""
431 -e "s^@BASE_ARCHS@^$BASE_ARCHS^g" \
432 -e "s^@BIGMEM_ARCHS@^$BIGMEM_ARCHS^g" \
433 -e "s^@BIGSMP_ARCHS@^$BIGSMP_ARCHS^g" \
434 -e "s^@BOOT_ARCHS@^$BOOT_ARCHS^g" \
435 -e "s^@CONFIGURE_FLAGS@^$CONFIGURE_FLAGS^g" \
436 -e "s^@ENABLE_INIT_SCRIPTS@^$ENABLE_INIT_SCRIPTS^g" \
437 -e "s^@JENSEN_ARCHS@^$BOOT_ARCHS^g" \
438 -e "s^@KERNEL_EXTRA_VERSION@^$EXTRA_VERSION^g" \
439 -e "s^@KERNEL_RELEASE@^${EXTRA_VERSION//-/_}^g" \
440 -e "s^@KERNEL_SOURCE@^$KERNEL^g" \
441 -e "s^@KERNEL_VERSION@^$VERSION^g" \
442 -e "s^@LINUX26@^$LINUX26^g" \
443 -e "s^@LUSTRE_SOURCE@^${LUSTRE##*/}^g" \
444 -e "s^@LUSTRE_TARGET@^$TARGET^g" \
445 -e "s^@PSERIES64_ARCHS@^$PSERIES64_ARCHS^g" \
446 -e "s^@RHBUILD@^$RHBUILD^g" \
447 -e "s^@SMP_ARCHS@^$SMP_ARCHS^g" \
448 -e "s^@SUSEBUILD@^$SUSEBUILD^g" \
449 -e "s^@SUSEBUILD@^$SUSEBUILD^g" \
450 -e "s^@UP_ARCHS@^$UP_ARCHS^g" \
451 < $TOPDIR/lustre/build/lustre-kernel-2.4.spec.in \
452 > lustre-kernel-2.4.spec
453 [ -d SRPMS ] || mkdir SRPMS
454 [ -d RPMS ] || mkdir RPMS
455 [ -d BUILD ] || mkdir BUILD
456 [ -d SOURCES ] || mkdir SOURCES
457 for script in linux-{rhconfig.h,merge-config.awk,merge-modules.awk} \
458 suse-{functions.sh,post.sh,postun.sh,trigger-script.sh.in} \
459 sles8-{pre,post,postun,update_{INITRD_MODULES,rcfile_setting}}.sh ; do
460 cp $TOPDIR/lustre/build/$script SOURCES
462 cp "$LUSTRE" "$KERNEL_FILE" SOURCES
463 if [ "$EXTERNAL_PATCHES" -a -d "$EXTERNAL_PATCHES" ] ; then
464 tar zcf SOURCES/external-patches.tar.gz -C "$EXTERNAL_PATCHES" series targets patches kernel_configs
466 touch SOURCES/external-patches.tar.gz
472 [ -d lustre ] || return 0
473 echo "Cleaning Lustre..."
474 [ -L lustre ] && rm -rf $(readlink lustre)
480 echo "Building kernel + Lustre RPMs for: $BUILD_ARCHS..."
482 for arch in $BUILD_ARCHS ; do
483 targets="--target $arch $targets"
486 $RPMBUILD $targets -bb lustre-kernel-2.4.spec \
487 --define "_topdir $TOPDIR" || \
488 fatal 1 "Error building rpms for $BUILD_ARCHS."
490 if (( $DO_SRC )) ; then
491 $RPMBUILD -bs lustre-kernel-2.4.spec \
492 --define "_topdir $TOPDIR" || \
493 fatal 1 "Error building .src.rpm."
499 [ -d SRPMS ] || mkdir SRPMS
500 [ -d RPMS ] || mkdir RPMS
501 [ -d BUILD ] || mkdir BUILD
502 [ -d SOURCES ] || mkdir SOURCES
506 pushd lustre >/dev/null
508 echo "Building Lustre RPMs for: $BUILD_ARCHS..."
510 for arch in $BUILD_ARCHS ; do
511 targets="--target $arch $targets"
514 ./configure "--with-linux=${LINUX}" ${CONFIGURE_FLAGS}
516 $RPMBUILD $targets -bb build/lustre.spec \
517 --define "_topdir $TOPDIR" || \
518 fatal 1 "Error building rpms for $BUILD_ARCHS."
525 [ "$STAGEDIR" ] || return 0
527 for arch in $BUILD_ARCHS ; do
528 rpmdir="${STAGEDIR}/${CANONICAL_TARGET}-${arch}"
529 echo "${0##*/}: Copying RPMs into ${rpmdir}"
531 cp -v RPMS/${arch}/*.rpm "${rpmdir}"
532 if [ -d RPMS/noarch ] ; then
533 cp -v RPMS/noarch/*.rpm "${rpmdir}"
537 cp -v "$LUSTRE" "$STAGEDIR"
540 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
542 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: -- "$@")
544 if [ $? != 0 ] ; then
548 eval set -- "$options"
578 --linux | --with-linux)
631 usage 1 "Unrecognized option: $1"
640 # prep_build needs the .spec.in from the lustre source
641 if [ -z "$LINUX" ] ; then
644 if (( $DO_SRC )) ; then