Whamcloud - gitweb
The variable, not the literal. Thanks mjmac.
[fs/lustre-release.git] / build / lbuild
1 #!/bin/sh
2
3 # vim:expandtab:shiftwidth=4:softtabstop=4:tabstop=4:
4
5 TOPDIR=$PWD
6
7 # CVSROOT is inherited from the environment
8 KERNELDIR=
9 LINUX=
10 LUSTRE=
11 RELEASE=0
12 DO_SRC=0
13 DOWNLOAD=1
14 TAG=
15 TARGET=
16 TARGET_ARCHS=
17 CONFIGURE_FLAGS=
18 EXTERNAL_PATCHES=
19 EXTRA_VERSION=
20 STAGEDIR=
21
22 # from target file
23 KERNEL=
24 SERIES=
25 CONFIG=
26 VERSION=
27
28 RHBUILD=0
29 SUSEBUILD=0
30 LINUX26=0
31 SUSEBUILD=0
32
33 BASE_ARCHS=
34 BIGMEM_ARCHS=
35 BOOT_ARCHS=
36 JENSEN_ARCHS=
37 SMP_ARCHS=
38 BIGSMP_ARCHS=
39 PSERIES64_ARCHS=
40 UP_ARCHS=
41
42 DATE=$(date)
43
44 USE_DATESTAMP=1
45 RPMBUILD=
46
47 export CC=${CC:-gcc}
48
49 # Readlink is not present on some older distributions: emulate it.
50 readlink() {
51     local path=$1 ll
52
53     if [ -L "$path" ]; then
54         ll="$(LC_ALL=C ls -l "$path" 2> /dev/null)" &&
55         echo "${ll/* -> }"
56     else
57         return 1
58     fi
59 }
60
61 cleanup()
62 {
63     true
64 }
65
66 error()
67 {
68     [ "$1" ] && echo -e "\n${0##*/}: $1"
69 }
70
71 fatal()
72 {
73     cleanup
74     error "$2"
75     exit $1
76 }
77
78 is_release()
79 {
80     (( $RELEASE )) || return 0
81 }
82
83 list_targets()
84 {
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}"
89     done
90     echo
91 }
92
93 usage()
94 {
95     cat <<EOF
96 Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
97
98   -d CVSROOT
99     Specifies the CVS Root to use when pulling files from CVS.  The
100     environment variable \$CVSROOT is used if this option is not
101     present.
102
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
106     tree.
107
108   --extraversion=EXTRAVERSION
109     Text to use for the rpm release and kernel extraversion.
110
111   --kerneldir=KERNELDIR
112     Directory containing Linux source tarballs referenced by target
113     files.
114
115   --linux=LINUX
116     Directory of Linux kernel sources.  When this option is used, only
117     Lustre modules and userspace are built.
118
119   --lustre=LUSTRE
120     Path to an existing lustre source tarball to use instead of
121     pulling from CVS.
122
123   --nodownload
124     Do not try to download a kernel from ftp.lustre.org
125
126   --nosrc
127     Do not build a .src.rpm, a full kernel patch, or a patched kernel
128     tarball.
129
130   --publish
131     Unused.
132
133   --release
134     Specifies that the files generated do not include timestamps, and
135     that this is an official release.
136
137   --src
138     Build a .src.rpm, a full kernel patch, and a patched kernel tarball.
139
140   --stage=DIR
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
143     placed in DIR.
144
145   --tag=TAG
146     A CVS branch/tag name to build from when pulling from CVS.
147
148   --target=TARGET
149     The name of the target to build.  The available targets are listed
150     below.
151
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).
158
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.
161
162   --disable-datestamp
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.
166
167 EOF
168
169 #   list_targets
170
171     fatal "$1" "$2"
172 }
173
174 check_options()
175 {
176     if [ "$LUSTRE" ] ; then
177         [ -r "$LUSTRE" ] || \
178             usage 1 "Could not find Lustre source tarball '$LUSTRE'."
179     else
180         [ "$CVSROOT" ] || \
181             usage 1 "Either specify a CVS Root with -d, or a Lustre source tarball with --lustre."
182         [ "$TAG" ] || \
183             usage 1 "A branch/tag name must be specified with --tag when not building from a tarball."
184     fi
185
186     if [ -z "$LINUX" ] ; then
187         [ "$KERNELDIR" ] || \
188             usage 1 "A kernel directory must be specified with --kerneldir."
189
190         [ -d "$KERNELDIR" ] || \
191             usage 1 "$KERNELDIR is not a directory."
192
193         if ! (( $RELEASE )) ; then
194             [ "$TAG" ] || \
195                 usage 1 "When building a snapshot, a tag name must be used."
196         fi
197
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."
202     fi
203
204     case $TARGET in
205         2.6-rhel4)
206             CANONICAL_TARGET="rhel-2.6"
207             ;;
208         2.6-suse)
209             CANONICAL_TARGET="sles-2.6"
210             ;;
211         hp_pnnl-2.4)
212             CANONICAL_TARGET="hp-pnnl-2.4"
213             ;;
214         2.6-vanilla \
215             | suse-2.4.21-2 \
216             | rh-2.4 \
217             | rhel-2.4 \
218             | sles-2.4)
219                 CANONICAL_TARGET="$TARGET"
220                 ;;
221     esac
222
223     TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M")
224
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)."
230         fi
231     fi
232 }
233
234 uniqify()
235 {
236     echo $(echo "$*" | xargs -n 1 | sort -u)
237 }
238
239 build_tarball() {
240     local TARGET=$1
241     local SRPM=$2
242
243     if [ "$TARGET" = "rhel-2.6" -o "$TARGET" = "rhel-2.4" ]; then
244         local SPEC=""
245         if [ "$TARGET" = "rhel-2.6" ]; then
246             SPEC=kernel-2.6.spec
247             OLDCONFIG=nonint_oldconfig
248         elif [ "$TARGET" = "rhel-2.4" ]; then
249             SPEC=kernel-2.4.spec
250             OLDCONFIG=oldconfig
251         fi
252
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} && {
259             make mrproper
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."
263             fi
264             make include/linux/version.h 
265             rm -f .config
266             cd ..
267             tar cjf $KERNEL_FILE linux-${lnxmaj}
268         }
269         popd
270         rm -rf $RPMTOPDIR
271     fi
272 }
273
274 download_and_build_tarball() {
275     local TARGET=$1
276     local KERNEL_FILE=$2
277
278     local SRPM=kernel-${lnxmaj}-${lnxrel}.src.rpm
279
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."
284     fi
285
286     build_tarball $TARGET $SRPM
287 }
288
289 load_target()
290 {
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
295     done
296     [ -r "$TARGET_FILE" ] || \
297         fatal 1 "Target $TARGET was not found."
298
299     echo "Loading target config file $TARGET.target..."        
300
301     . "$TARGET_FILE"
302
303     [ "$KERNEL"  ] || fatal 1 "Target $TARGET did not specify a kernel."
304     [ "$VERSION" ] || fatal 1 "Target $TARGET did not specify a kernel version."
305
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
313             else
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
319                     fi
320                 else
321                     fatal 1 "Target $TARGET's kernel file $KERNEL not found in kernel directory $KERNELDIR."
322                 fi
323             fi
324         fi
325     fi
326
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
331             done
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."
333         done
334     fi
335
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/."
339
340     if [ "$EXTRA_VERSION_save" ] ; then
341         EXTRA_VERSION="$EXTRA_VERSION_save"
342     elif ! (( $RELEASE )) ; then
343         #remove the @VERSION@ (lustre version)
344         EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
345         EXTRA_VERSION="${EXTRA_VERSION}-${TAG}.${TIMESTAMP}"
346     fi
347     # EXTRA_VERSION=${EXTRA_VERSION//-/_}
348
349     ALL_ARCHS="$BASE_ARCHS $BIGMEM_ARCHS $BOOT_ARCHS $JENSEN_ARCHS $SMP_ARCHS $BIGSMP_ARCHS $PSERIES64_ARCHS $UP_ARCHS"
350
351     BUILD_ARCHS=
352     for arch in $(uniqify "$ALL_ARCHS") ; do
353         if [ -z "$TARGET_ARCHS" ] || echo "$TARGET_ARCHS" | grep "$arch" >/dev/null 2>/dev/null ; then
354             BUILD_ARCHS="$BUILD_ARCHS $arch"
355         fi
356     done
357     [ "$BUILD_ARCHS" ] || usage 1 "No available target archs to build."
358     echo "Building for: $BUILD_ARCHS"
359 }
360
361 tarflags()
362 {
363     case "$1" in
364         '')
365             fatal 1 "tarflags(): File name argument missing."
366             ;;
367         *.tar.gz | *.tgz)
368             echo 'zxf'
369             ;;
370         *.tar.bz2)
371             echo 'jxf'
372             ;;
373         *.tar)
374             echo 'xf'
375             ;;
376         *)
377             fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
378             ;;
379     esac
380 }
381
382 untar()
383 {
384     echo "Untarring ${1##*/}..."
385     tar $(tarflags "$1") "$1"
386 }
387
388 unpack_lustre()
389 {
390     DIRNAME="lustre-$TAG-$TIMESTAMP"
391     if [ "$LUSTRE" ] ; then
392         untar "$LUSTRE"
393         [ -d lustre ] || ln -sf lustre* lustre
394     else
395         if [ "$USE_DATESTAMP" ]; then
396             DATESTAMP="-D '$DATE'"
397         else
398             DATESTAMP=""
399         fi            
400
401         cvs -d "$CVSROOT" -qz3 co $DATESTAMP -d "$DIRNAME" lustre || \
402             fatal 1 "There was an error checking out toplevel Lustre from CVS."
403         pushd "$DIRNAME" > /dev/null
404         ./lustrecvs "$TAG" || \
405             fatal 1 "There was an error checking out Lustre/Portals/Build from CVS."
406         echo "Creating lustre tarball..."
407         sh autogen.sh || fatal 1 "There was an error running autogen.sh."
408         ./configure --disable-{modules,utils,liblustre,tests,doc} || \
409             fatal 1 "There was an error running ./configure to create makefiles."
410         make dist || fatal 1 "There was an error running 'make dist'."
411         popd > /dev/null
412         fname=`basename $DIRNAME/lustre-*.tar.gz`
413         cp $DIRNAME/$fname . || fatal 1 "There was an error copying lustre tarball."
414         LUSTRE="$PWD/$fname"
415         ln -sf "$DIRNAME" lustre
416     fi
417 }
418
419 unpack_linux()
420 {
421     untar "$KERNEL_FILE"
422     [ -d linux ] || ln -sf linux* linux
423 }
424
425 patch_linux()
426 {
427     [ "$SERIES" ] || return 0
428     FULL_PATCH="$PWD/lustre-kernel-${TARGET}-${EXTRA_VERSION}.patch"
429     [ -f "$FULL_PATCH" ] && rm -f "$FULL_PATCH"
430     pushd linux >/dev/null
431     for series in $SERIES ; do
432         echo -n "Applying series $series:"
433         for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches" ; do
434             [ -r "$patchesdir/series/$series" ] || continue
435             SERIES_FILE="$patchesdir/series/$series"
436             for patch in $(<"$SERIES_FILE") ; do
437                 echo -n " $patch"
438                 PATCH_FILE="$patchesdir/patches/$patch"
439                 [ -r "$PATCH_FILE" ] || \
440                     fatal 1 "Patch $patch does not exist in Lustre tree."
441                 cat "$PATCH_FILE" >> "$FULL_PATCH" || \
442                     fatal 1 "Error adding patch $patch to full patch."
443                 patch -s -p1 < "$PATCH_FILE" || fatal 1 "Error applying patch $patch."
444             done
445             break
446         done
447         echo
448     done
449     popd >/dev/null
450     echo "Full patch has been saved in ${FULL_PATCH##*/}."
451     echo "Replacing .config files..."
452     [ -d linux/configs ] || mkdir linux/configs || \
453         fatal 1 "Error creating configs directory."
454     rm -f linux/configs/*
455     copysuccess=0
456     for patchesdir in "$EXTERNAL_PATCHES" "lustre/lustre/kernel_patches" ; do
457         [ "$patchesdir" ] && \
458             cp -v $patchesdir/kernel_configs/kernel-${VERSION}-${TARGET}*.config linux/configs/ >/dev/null && copysuccess=1
459     done
460     [ "$copysuccess" = "1" ] || \
461         fatal 1 "Error copying in kernel configs."
462 }
463
464 pack_linux()
465 {
466     TARBALL="$(readlink linux)-$EXTRA_VERSION.tar.gz"
467     echo "Creating patched linux tarball $TARBALL..."
468     tar zcf "$TARBALL" "$(readlink linux)" \
469         --exclude "CVS" --exclude ".cvsignore" || \
470         --exclude "*.orig" --exclude "*~" --exclude "*.rej" || \
471         fatal 1 "Error creating patched Linux tarball."
472 }
473
474 clean_linux()
475 {
476     [ -d linux ] || return 0
477     echo "Cleaning linux..."
478     [ -L linux ] && rm -rf $(readlink linux)
479     rm -rf linux
480 }
481
482 prep_kernel_build()
483 {
484     # make .spec file
485     ENABLE_INIT_SCRIPTS=""
486     sed \
487         -e "s^@BASE_ARCHS@^$BASE_ARCHS^g" \
488         -e "s^@BIGMEM_ARCHS@^$BIGMEM_ARCHS^g" \
489         -e "s^@BIGSMP_ARCHS@^$BIGSMP_ARCHS^g" \
490         -e "s^@BOOT_ARCHS@^$BOOT_ARCHS^g" \
491         -e "s^@CONFIGURE_FLAGS@^$CONFIGURE_FLAGS^g" \
492         -e "s^@ENABLE_INIT_SCRIPTS@^$ENABLE_INIT_SCRIPTS^g" \
493         -e "s^@JENSEN_ARCHS@^$BOOT_ARCHS^g" \
494         -e "s^@KERNEL_EXTRA_VERSION@^$EXTRA_VERSION^g" \
495         -e "s^@KERNEL_RELEASE@^${EXTRA_VERSION//-/_}^g" \
496         -e "s^@KERNEL_SOURCE@^$KERNEL^g" \
497         -e "s^@KERNEL_VERSION@^$VERSION^g" \
498         -e "s^@LINUX26@^$LINUX26^g" \
499         -e "s^@LUSTRE_SOURCE@^${LUSTRE##*/}^g" \
500         -e "s^@LUSTRE_TARGET@^$TARGET^g" \
501         -e "s^@PSERIES64_ARCHS@^$PSERIES64_ARCHS^g" \
502         -e "s^@RHBUILD@^$RHBUILD^g" \
503         -e "s^@SMP_ARCHS@^$SMP_ARCHS^g" \
504         -e "s^@SUSEBUILD@^$SUSEBUILD^g" \
505         -e "s^@SUSEBUILD@^$SUSEBUILD^g" \
506         -e "s^@UP_ARCHS@^$UP_ARCHS^g" \
507         < $TOPDIR/lustre/build/lustre-kernel-2.4.spec.in \
508         > lustre-kernel-2.4.spec
509     [ -d SRPMS ] || mkdir SRPMS
510     [ -d RPMS ] || mkdir RPMS
511     [ -d BUILD ] || mkdir BUILD
512     [ -d SOURCES ] || mkdir SOURCES
513     for script in linux-{rhconfig.h,merge-config.awk,merge-modules.awk} \
514         suse-{functions.sh,post.sh,postun.sh,trigger-script.sh.in} \
515         sles8-{pre,post,postun,update_{INITRD_MODULES,rcfile_setting}}.sh ; do
516         cp $TOPDIR/lustre/build/$script SOURCES
517     done
518     cp "$LUSTRE" "$KERNEL_FILE" SOURCES
519     if [ "$EXTERNAL_PATCHES" -a -d "$EXTERNAL_PATCHES" ] ; then
520         tar zcf SOURCES/external-patches.tar.gz -C "$EXTERNAL_PATCHES" series targets patches kernel_configs
521     else
522         touch SOURCES/external-patches.tar.gz
523     fi
524 }
525
526 clean_lustre()
527 {
528     [ -d lustre ] || return 0
529     echo "Cleaning Lustre..."
530     [ -L lustre ] && rm -rf $(readlink lustre)
531     rm -rf lustre
532 }
533
534 build_kernel()
535 {
536     echo "Building kernel + Lustre RPMs for: $BUILD_ARCHS..."
537     targets=
538     for arch in $BUILD_ARCHS ; do
539         targets="--target $arch $targets"
540     done
541
542     $RPMBUILD $targets -bb lustre-kernel-2.4.spec \
543         --define "_topdir $TOPDIR" || \
544         fatal 1 "Error building rpms for $BUILD_ARCHS."
545
546     if (( $DO_SRC )) ; then
547         $RPMBUILD -bs lustre-kernel-2.4.spec \
548             --define "_topdir $TOPDIR" || \
549             fatal 1 "Error building .src.rpm."
550     fi
551 }
552
553 build_lustre()
554 {
555     [ -d SRPMS ] || mkdir SRPMS
556     [ -d RPMS ] || mkdir RPMS
557     [ -d BUILD ] || mkdir BUILD
558     [ -d SOURCES ] || mkdir SOURCES
559
560     cp "$LUSTRE" SOURCES
561
562     pushd lustre >/dev/null
563
564     echo "Building Lustre RPMs for: $BUILD_ARCHS..."
565     targets=
566     for arch in $BUILD_ARCHS ; do
567         targets="--target $arch $targets"
568     done
569
570     ./configure "--with-linux=${LINUX}" ${CONFIGURE_FLAGS}
571
572     $RPMBUILD $targets -bb build/lustre.spec \
573         --define "_topdir $TOPDIR" || \
574         fatal 1 "Error building rpms for $BUILD_ARCHS."
575
576     popd >/dev/null
577 }
578
579 stage()
580 {
581     [ "$STAGEDIR" ] || return 0
582
583     for arch in $BUILD_ARCHS ; do
584         rpmdir="${STAGEDIR}/${CANONICAL_TARGET}-${arch}"
585         echo "${0##*/}: Copying RPMs into ${rpmdir}"
586         mkdir -p "${rpmdir}"
587         cp -v RPMS/${arch}/*.rpm "${rpmdir}"
588         if [ -d RPMS/noarch ] ; then
589             cp -v RPMS/noarch/*.rpm "${rpmdir}"
590         fi
591     done
592
593     cp -v "$LUSTRE" "$STAGEDIR"
594 }
595
596 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
597
598 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: -- "$@")
599
600 if [ $? != 0 ] ; then
601     usage 1
602 fi
603
604 eval set -- "$options"
605     
606 while [ "$1" ] ; do
607     case "$1" in
608         '')
609             usage 1
610             ;;
611         -d)
612             CVSROOT=$2
613             shift 2
614             ;;
615         -D)
616             DATE=$2
617             shift 2
618             ;;
619         --external-patches)
620             EXTERNAL_PATCHES=$2
621             shift 2
622             ;;
623         --extraversion)
624             EXTRA_VERSION=$2
625             shift 2
626             ;;
627         --help | -h)
628             usage 0
629             ;;
630         --kerneldir)
631             KERNELDIR=$2
632             shift 2
633             ;;
634         --linux | --with-linux)
635             LINUX=$2
636             shift 2
637             ;;
638         --lustre)
639             LUSTRE=$2
640             shift 2
641             ;;
642         --nodownload)
643             DOWNLOAD=0
644             shift 1
645             ;;
646         --nosrc)
647             DO_SRC=0
648             shift 1
649             ;;
650         --publish)
651             shift
652             ;;
653         --release)
654             RELEASE=1
655             shift
656             ;;
657         --src)
658             DO_SRC=1
659             shift 1
660             ;;
661         --stage)
662             STAGEDIR=$2
663             shift 2
664             ;;
665         --tag)
666             TAG=$2
667             shift 2
668             ;;
669         --target)
670             TARGET=$2
671             shift 2
672             ;;
673         --target-archs)
674             TARGET_ARCHS=$2
675             shift 2
676             ;;
677         --disable-datestamp)
678             USE_DATESTAMP=
679             shift
680             ;;
681         --)
682             shift
683             CONFIGURE_FLAGS=$@
684             break
685             ;; 
686         *)
687             usage 1 "Unrecognized option: $1"
688             ;;
689     esac
690 done
691
692 check_options
693
694 unpack_lustre
695
696 # prep_build needs the .spec.in from the lustre source
697 if [ -z "$LINUX" ] ; then
698     load_target
699
700     if [ "$SERIES" ] ; then
701         if (( $DO_SRC )) ; then
702             unpack_linux
703             patch_linux
704             pack_linux
705             clean_linux
706         fi
707
708         prep_kernel_build
709         clean_lustre
710
711         build_kernel
712     else
713         # can't build a kernel if we have no series for it (i.e. patchless)
714         # but we still need the headers
715         use_unpacked_source=false
716         if $use_unpacked_source; then
717             unpack_linux
718             LINUX=$(pwd)/linux
719             pushd $LINUX && {
720                 # need a .config -- like a user would do
721                 BOOTCONFIG="/boot/config-${lnxmaj}-${lnxrel}smp"
722                 if [ -f $BOOTCONFIG ]; then
723                     cp $BOOTCONFIG .config
724                 else
725                     fatal 1 "$BOOTCONFIG doesn't exist!  Help!"                
726                 fi
727                 # vendors like to taint the EXTRAVERSION in their kernel-source
728                 # to differentiate a user-built kernel from their own
729                 ed << EOF Makefile
730 /^EXTRAVERSION =/d
731 wq
732 EOF
733                 make oldconfig
734                 make include/asm
735                 make include/linux/version.h
736                 make SUBDIRS=scripts
737             }
738             popd
739         else
740             LINUX=/lib/modules/${lnxmaj}-${lnxrel}smp/build
741             if [ ! -e $LINUX ]; then
742                 fatal 1 "$LINUX does not exist!  Install a kernel-devel package!"
743             fi
744         fi
745         CONFIGURE_FLAGS="$CONFIGURE_FLAGS --disable-server"
746         build_lustre
747     fi
748 else
749     build_lustre
750 fi
751
752 stage