Whamcloud - gitweb
UTS_RELEASE moves from include/linux/version.h to utsrelease.h since v2.6.18.
[fs/lustre-release.git] / build / lmake
1 #!/bin/sh
2
3 # option variables
4 DESTDIR=
5 KERNELDIR=
6 TARGET=
7 # Not sure what to put here
8 # TARGET_ARCH=$(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
9 TARGET_ARCH=
10 TARGET_CONFIG=
11 JOBS=1
12 CONFIGURE_FLAGS=
13
14 # commands to run
15 BUILD_LUSTRE=0
16 BUILD_KERNEL=0
17 DEPEND_KERNEL=0
18 INSTALL_LUSTRE=0
19 INSTALL_KERNEL=0
20 SAVE_HEADERS=0
21 UNPACK_KERNEL=0
22
23 # provided by target file
24 KERNEL=
25 SERIES=
26 CONFIG=
27 VERSION=
28 EXTRA_VERSION=
29
30 BASE_ARCHS=
31 BIGMEM_ARCHS=
32 BOOT_ARCHS=
33 JENSEN_ARCHS=
34 SMP_ARCHS=
35 BIGSMP_ARCHS=
36 PSERIES64_ARCHS=
37 UP_ARCHS=
38
39 RHBUILD=0
40 SUSEBUILD=0
41
42 # flat-out globals
43 TOPDIR=
44 TARGET_FILE=
45 KERNEL_FILE=
46 SERIES_FILE=
47 CONFIG_FILE=
48 RPMBUILD=
49
50 canon()
51 {
52     pushd $1 >/dev/null
53     echo $PWD
54     popd >/dev/null
55 }
56 TOPDIR="${0%%${0##*/}}"
57 if [ "${TOPDIR}" ] ; then
58     TOPDIR=$(canon "${TOPDIR}/..")
59 else
60     TOPDIR=$(canon "..")
61 fi
62
63 lbuild_topdir()
64 {
65     retdir=$TOPDIR
66     while [ ! -d $retdir/BUILD ] ; do
67         retdir=$(canon "$retdir/..")
68         if [ "$retdir" = "/" ] ; then
69             break;
70         fi
71     done
72     echo "$retdir"
73 }
74
75 cleanup()
76 {
77     true
78 }
79
80 fatal()
81 {
82     cleanup
83     [ "$2" ] && echo
84     [ "$2" ] && echo "${0##*/}: $2"
85     exit $1
86 }
87
88 list_targets()
89 {
90     echo -n "Available targets:"
91     for target in $TOPDIR/lustre/kernel_patches/targets/*.target ; do
92         target_file=${target##*/}
93         echo -n " ${target_file%%.target}"
94     done
95     echo
96 }
97
98
99 usage()
100 {
101     cat <<EOF
102 Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
103
104 Options:
105
106   --build
107     same as --build-kernel --build-lustre --unpack-kernel
108
109   --build-lustre
110     configure and compile lustre.  Requires that --build-kernel was
111     already run.
112
113   --build-kernel
114     configure and compile a kernel.  Implies --depend-kernel.
115     Requires that --unpack-kernel was already run.
116
117   --depend-kernel)
118     Prepares a kernel tree for building (similar to make mrproper
119     oldconfig dep).  Requires that --unpack-kernel was already run.
120
121   --destdir=DESTDIR
122     Root directory to install into (like DESTDIR with auto*).
123
124   --extraversion=EXTRAVERSION
125     Overrides the target kernel\'s EXTRAVERSION text.
126
127   -h, --help
128     Display this message.
129
130   --install
131     same as --install-kernel --install-lustre
132
133   --install-lustre
134     run make install in the Lustre tree.
135
136   --install-kernel
137     install the kernel image and modules.
138
139   -j jobs
140     This works just like the -j option to make, and is passed to make
141     when building.
142
143   --kerneldir=KERNELDIR
144     Directory containing linux source tarballs.
145
146   --target=TARGET
147     Name of the configuration to use.  The available targets are
148     listed below.
149
150   --target-arch=ARCH
151     Specifies an architecture to use when choosing a kernel config
152     file.  Default is i386.
153
154   --target-config=CONFIG
155     Specifies a special option (such as smp, bigsmp, bigmem, or BOOT)
156     to use when choosing a kernel config file.  This also modifies the
157     kernel version and modules directory.
158
159   --unpack-kernel
160     Untars and patches the kernel source.
161
162   The order that commands (--build-lustre, --unpack-kernel) are
163   specified on the command line is ignored; ${0##*/} will always
164   execute them in the correct order (unpack, then build, then install
165   etc.).
166
167 EOF
168     list_targets
169
170     fatal "$1" "$2"
171 }
172
173 check_options()
174 {
175     (( $BUILD_LUSTRE || $BUILD_KERNEL || $DEPEND_KERNEL || \
176             $INSTALL_LUSTRE || $INSTALL_KERNEL || $SAVE_HEADERS || \
177             $UNPACK_KERNEL )) || \
178                 fatal 1 "No commands specified."
179
180     if (( $UNPACK_KERNEL )) ; then
181         [ "$KERNELDIR" ] || \
182             fatal 1 "A kernel directory must be specified with --kerneldir."
183         [ -d "$KERNELDIR" ] || \
184             fatal 1 "$KERNELDIR is not a directory."
185     fi
186
187     if (( $INSTALL_LUSTRE || $INSTALL_KERNEL || $SAVE_HEADERS )) ; then
188         [ -z "$DESTDIR" -o -d "$DESTDIR" ] || \
189             fatal 1 "$DESTDIR is not a directory."
190     fi
191
192     [ "$TARGET" ] || usage 1 "A target must be specified with --target."
193     TARGET_FILE="$TOPDIR/lustre/kernel_patches/targets/$TARGET.target"
194     [ -r "$TARGET_FILE" ] || \
195         fatal 1 "Target '$TARGET' was not found.  Try --list-targets."
196
197     if [ -z "$JOBS" -o "$JOBS" -lt "1" ] ; then
198         JOBS=1
199     fi
200
201     RPMBUILD=$(which rpmbuild 2>/dev/null | head -1)
202     if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
203         RPMBUILD=$(which rpm 2>/dev/null | head -1)
204         if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
205             usage 1 "Could not find binary for making rpms (tried rpmbuild and rpm)."
206         fi
207     fi
208 }
209
210 get_lustre_version()
211 {
212     for series in $SERIES ; do
213         SERIES_FILE="$TOPDIR/lustre/kernel_patches/series/$series"
214         lustre_patch=$(grep lustre_version "$SERIES_FILE" 2>/dev/null)
215         [ "$lustre_patch" ] && break
216     done
217     [ "$lustre_patch" ] || \
218         fatal 1 "Could not determine Lustre version from $SERIES series."
219
220     awk '/^\+#define LUSTRE_KERNEL_VERSION /{ print $3 }' \
221         "$TOPDIR/lustre/kernel_patches/patches/$lustre_patch" 2>/dev/null
222 }
223
224 load_target()
225 {
226     EXTRA_VERSION_save="$EXTRA_VERSION"
227
228     . "$TARGET_FILE"
229
230     [ "$KERNEL" ] || fatal 1 "Target $TARGET did not specify a kernel."
231 # Suse 2.6 has our patches in already
232 #    [ "$SERIES" ] || fatal 1 "Target $TARGET did not specify a patch series."
233 #    [ "$CONFIG" ] || fatal 1 "Target $TARGET did not specify a kernel config."
234     [ "$VERSION" ] || fatal 1 "Target $TARGET did not specify the kernel version."
235     
236     if [ "$KERNELDIR" ] ; then
237         KERNEL_FILE="$KERNELDIR/$KERNEL"
238         [ -r "$KERNELDIR/$KERNEL" ] || \
239             fatal 1 "Target $TARGET's kernel file $KERNEL not found in kernel directory $KERNELDIR."
240     fi
241
242     if [ "$SERIES" ] ; then
243         for series in $SERIES ; do
244             SERIES_FILE="$TOPDIR/lustre/kernel_patches/series/$series"
245             [ -r "$SERIES_FILE" ] || \
246                 fatal 1 "Target $TARGET's series $SERIES missing from $TOPDIR/lustre/kernel_patches/series."
247         done
248     fi
249
250     TARGET_ARCH=${TARGET_ARCH:-$BASE_ARCHS}
251     CONFIG_TARGET="$TARGET-${TARGET_ARCH}${TARGET_CONFIG:+-$TARGET_CONFIG}"
252     CONFIG_FILE="$TOPDIR/lustre/kernel_patches/kernel_configs/kernel-$VERSION-$CONFIG_TARGET.config"
253     [ -r "$CONFIG_FILE" ] ||
254         fatal 1 "Target $TARGET's config file $CONFIG_FILE missing from $TOPDIR/lustre/kernel_patches/configs."
255
256     if [ "$EXTRA_VERSION_save" ] ; then
257         EXTRA_VERSION="$EXTRA_VERSION_save"
258     else
259         EXTRA_VERSION="${EXTRA_VERSION}_lustre.$(get_lustre_version)"
260     fi
261 }
262
263 tarflags()
264 {
265     case "$1" in
266         '')
267             fatal 1 "tarflags(): File name argument missing."
268             ;;
269         *.tar.gz | *.tgz)
270             echo 'zxf'
271             ;;
272         *.tar.bz2)
273             echo 'jxf'
274             ;;
275         *.tar)
276             echo 'xf'
277             ;;
278         *)
279             fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
280             ;;
281     esac
282 }
283
284 untar()
285 {
286     echo "Untarring ${1##*/}..."
287     tar $(tarflags $1) $1
288 }
289
290
291 extract_kernel()
292 {
293     (( $UNPACK_KERNEL )) || return 0
294     pushd "$TOPDIR" >/dev/null
295     if [ -d linux ] ; then
296         [ -L linux ] && rm -rf $(readlink linux)
297         rm -rf linux
298     fi
299     untar "$KERNEL_FILE"
300     [ -d linux ] || ln -sf linux* linux
301     popd >/dev/null
302 }
303
304 patch_kernel()
305 {
306     (( $UNPACK_KERNEL )) || return 0
307     [ "$SERIES" ] || return 0
308     pushd "$TOPDIR/linux" >/dev/null
309     for series in $SERIES ; do
310         echo -n "Applying series $series:"
311         SERIES_FILE="$TOPDIR/lustre/kernel_patches/series/$series"
312         for patch in $(<"$SERIES_FILE") ; do
313             PATCH_FILE="$TOPDIR/lustre/kernel_patches/patches/$patch"
314             [ -r "$PATCH_FILE" ] || \
315                 fatal 1 "Patch file not found: $patch"
316             echo -n " $patch"
317             patch -s -p1 < "$PATCH_FILE" || fatal 1 "Error applying patch $patch."
318         done
319         echo
320     done
321     popd >/dev/null
322 }
323
324 set_make()
325 {
326     MAKE="make -s"
327     if [ "$CC" ] ; then
328         MAKE_CC="CC=$CC"
329     fi
330     if [ "$ARCH" ] ; then
331         MAKE_ARCH="$MAKE ARCH=$ARCH"
332     else
333         case $TARGET_ARCH in
334             i?86)
335                 ;;
336             *)
337                 MAKE_ARCH="$MAKE ARCH=$TARGET_ARCH"
338                 ;;
339         esac
340     fi
341     MAKE_J="$MAKE -j $JOBS"
342 }
343
344 timed_run() {
345     SLEEP_TIME=$1
346     shift
347
348     set -o monitor
349
350     #bash -c "$@" &
351     ("$@") &
352     child_pid=$!
353     
354     (sleep $SLEEP_TIME
355     kill -TERM -$child_pid 2>/dev/null
356     sleep 5
357     kill -KILL -$child_pid 2>/dev/null
358     echo "$1 was killed due to timeout") &
359     dog_pid=$!
360
361     wait $child_pid
362     # status will be set to 143 if the process had to be killed due to timeout
363     status=${PIPESTATUS[0]}
364     kill -KILL -$dog_pid
365     return $status
366 }
367
368 depend_kernel()
369 {
370     (( $DEPEND_KERNEL )) || return 0
371     # we need to override $CC at make time, since there is no
372     # configure
373     set_make
374     pushd "$TOPDIR/linux" >/dev/null
375     echo "Overriding EXTRAVERSION in kernel..."
376     perl -p -i -e "s/^EXTRAVERSION.*/EXTRAVERSION = -${EXTRA_VERSION}${TARGET_CONFIG}/" Makefile
377     echo "Making depend in $PWD..."
378     $MAKE "$MAKE_CC" mrproper || fatal 1 "Error running make mrproper"
379     rm -f rpm-release
380     cp "$CONFIG_FILE" .config
381     local UPDATE_OLDCONFIG=
382     for oc in oldconfig_nonint silentoldconfig oldconfig ; do                   
383         if grep -q "$oc" Makefile ; then                                        
384             timed_run 300 $MAKE "$MAKE_CC" $oc || UPDATE_OLDCONFIG=1
385             break
386         fi
387     done
388
389     if [ "$UPDATE_OLDCONFIG" ] ; then
390         # use the expect script to "make oldconfig" and answer the questions for
391         # new items conservatively.  QA will get notified on anything newly added
392         # for them to review and adjust accordingly.
393         local logfile=$(mktemp /tmp/XXXXXX)
394         #timed_run 300 $TOPDIR/build/update_oldconfig $logfile
395         #local RC=${PIPESTATUS[0]}
396         #local RC=$(strace -f -o update_oldconfig.strace bash -c "$TOPDIR/build/update_oldconfig $logfile; echo \$?")
397         local RC=$($TOPDIR/build/update_oldconfig $logfile; echo \$?)
398         #$TOPDIR/build/update_oldconfig $logfile
399         #local RC=${PIPESTATUS[0]}
400         if [ $RC -eq 143 ]; then
401             fatal 1 "update_oldconfig timed out"
402         elif [ $RC -ne 0 ]; then
403             # dump the log
404             cat $logfile
405             rm -f $logfile
406             if [ -f update_oldconfig.strace ]; then
407                 cat update_oldconfig.strace
408                 rm -f update_oldconfig.strace
409             fi
410             fatal 1 "update_oldconfig failed: $RC. See log above."
411         fi
412         rm -f $logfile
413         # now notify if resulting .config is different than $CONFIG_FILE
414         local tmpfile=$(mktemp /tmp/XXXXXX)
415         diff -I '^#.*' -u "$CONFIG_FILE" .config >$tmpfile
416         if [ -s $tmpfile ]; then
417             { cat <<EOF
418 To: qa@lists.clusterfs.com
419 Subject: kernel_config change 
420
421 The result of a make oldconfig on file $CONFIG_FILE resulted in a
422 difference when compared to .config in the following way:
423
424 EOF
425             cat $tmpfile
426             echo -e "\n\nPlease consider updating $CONFIG_FILE."
427             # not sure these are entirely useful.  the above and "patch" are good
428             #echo -e "\nThe entire new .config file:\n"
429             #cat .config
430             } | sendmail -fqa@clusterfs.com -t
431         fi
432         rm -f $tmpfile
433     fi
434
435     case "$VERSION" in
436         2.6*)
437             $MAKE "$MAKE_CC" include/asm
438             ;;
439         2.4*)
440             $MAKE "$MAKE_CC" symlinks
441             $MAKE "$MAKE_CC" dep || fatal 1 "Error running make dep"
442             ;;
443     esac
444     $MAKE "$MAKE_CC" include/linux/version.h || fatal 1 "Error making include/linux/version.h"
445 }
446
447 build_kernel()
448 {
449     (( $BUILD_KERNEL )) || return 0
450     set_make
451     echo "Building kernel in $PWD..."
452     case "$TARGET_ARCH" in
453         i386 | i586 | i686 | athlon | x86_64)
454             $MAKE_J "$MAKE_CC" bzImage || fatal 1 "Error making bzImage."
455             ;;
456     ia64 | ppc | ppc64)
457             $MAKE_J "$MAKE_CC" vmlinux || fatal 1 "Error making vmlinux."
458             ;;
459         *)
460             $MAKE_J "$MAKE_CC" boot || fatal 1 "Error making boot."
461             ;;
462     esac
463     $MAKE_J "$MAKE_CC" modules || fatal 1 "Error building modules."
464
465     popd >/dev/null
466 }
467
468 configure_lustre()
469 {
470     return 0
471     (( $BUILD_LUSTRE )) || return 0
472     pushd "$TOPDIR" >/dev/null
473     [ -f Makefile ] && make -s clean
474     [ -f configure ] || sh ./autogen.sh
475     ./configure --with-linux=$PWD/linux $CONFIGURE_FLAGS || \
476         fatal 1 "Error configuring Lustre."
477     popd >/dev/null
478 }
479
480 build_lustre()
481 {
482     (( $BUILD_LUSTRE )) || return 0
483     set_make
484     FULL_VERSION="${VERSION}-${EXTRA_VERSION}${TARGET_CONFIG}"
485     pushd "$TOPDIR" >/dev/null
486     sed \
487         -e s^@VERSION@^${LUSTRE_VERSION}^g \
488         -e s^@LINUXRELEASE@^${FULL_VERSION}^g \
489         -e s^@RELEASE@^${FULL_VERSION//-/_}^g \
490         -e s^@ac_configure_args@^"--with-linux=${PWD}/linux ${CONFIGURE_FLAGS}"^g \
491         < build/lustre.spec.in \
492         > build/lustre.spec
493     $RPMBUILD --target ${TARGET_ARCH} -bb build/lustre.spec \
494         --define "_topdir $(lbuild_topdir)" || \
495         fatal 1 "Error building Lustre rpms."
496     # $MAKE_J "$MAKE_CC" || fatal 1 "Error building Lustre."
497     popd >/dev/null
498 }
499
500 install_kernel()
501 {
502     (( $INSTALL_KERNEL )) || return 0
503     set_make
504     FULL_VERSION="${VERSION}-${EXTRA_VERSION}${TARGET_CONFIG}"
505     pushd "$TOPDIR/linux" >/dev/null
506     mkdir -p "$DESTDIR/boot"
507
508     install -m 644 System.map "$DESTDIR/boot/System.map-${FULL_VERSION}"
509     # install -m 644 module-info ...
510     install -m 644 "$CONFIG_FILE" "$DESTDIR/boot/config-${FULL_VERSION}"
511
512     mkdir -p "$DESTDIR/dev/shm"
513     mkdir -p "$DESTDIR/lib/modules/${FULL_VERSION}"
514
515     $MAKE "$MAKE_CC" INSTALL_MOD_PATH="$DESTDIR" KERNELRELEASE="$FULL_VERSION" \
516         -s modules_install || \
517         fatal 1 "Error installing modules."
518
519     case "$TARGET_ARCH" in
520         i386 | i586 | i686 | athlon)
521             cp arch/i386/boot/bzImage "$DESTDIR/boot/vmlinuz-${FULL_VERSION}"
522             cp vmlinux "$DESTDIR/lib/modules/${FULL_VERSION}/"
523             ln -sf "../lib/modules/${FULL_VERSION}/vmlinux" "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
524             ;;
525         x86_64)
526             cp arch/x86_64/boot/bzImage "$DESTDIR/boot/vmlinuz-${FULL_VERSION}"
527             cp vmlinux "$DESTDIR/lib/modules/${FULL_VERSION}/"
528             ln -sf "../lib/modules/${FULL_VERSION}/vmlinux" "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
529             ;;
530         ppc | ppc64)
531             cp vmlinux "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
532             ln -sf "$DESTDIR/boot/vmlinux-${FULL_VERSION}" "../lib/modules/${FULL_VERSION}/vmlinux" 
533             ;;
534         ia64)
535             gzip -cfv vmlinux > vmlinuz
536             mkdir -p "$DESTDIR/boot/efi/redhat"
537             install -m 755 vmlinux "$DESTDIR/lib/modules/${FULL_VERSION}/"
538             install -m 755 vmlinuz "$DESTDIR/boot/efi/redhat/vmlinuz-${FULL_VERSION}"
539             ln -sf "../../../lib/modules/${FULL_VERSION}/vmlinux" "$DESTDIR/boot/efi/redhat/vmlinux-${FULL_VERSION}"
540             ln -sf "efi/redhat/vmlinux-${FULL_VERSION}" "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
541             ln -sf "efi/redhat/vmlinuz-${FULL_VERSION}" "$DESTDIR/boot/vmlinuz-${FULL_VERSION}"
542             ;;
543         *)
544             cp vmlinuz "$DESTDIR/boot/vmlinuz-${FULL_VERSION}"
545             cp vmlinux "$DESTDIR/lib/modules/${FULL_VERSION}/vmlinux-${FULL_VERSION}"
546             ln -sf "../lib/modules/${FULL_VERSION}/vmlinux-${FULL_VERSION}" "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
547
548             ;;
549     esac
550     if [ -e init/kerntypes.o ] ; then
551         cp init/kerntypes.o "$DESTDIR/boot/Kerntypes-${FULL_VERSION}"
552     fi
553
554     popd >/dev/null
555 }
556
557 cleanup_libmodules()
558 {
559     (( $INSTALL_LUSTRE )) || return 0
560
561     FULL_VERSION="${VERSION}-${EXTRA_VERSION}${TARGET_CONFIG}"
562     KVERREL="${VERSION}-${EXTRA_VERSION}"
563     i="$DESTDIR/lib/modules/${FULL_VERSION}"
564
565     rm -f $i/build
566     rm -f $i/source
567
568     if (( $LINUX26 )) ; then
569         ln -sf ../../../usr/src/linux-${KVERREL}-obj/${TARGET_ARCH}/${TARGET_CONFIG} $i/build
570         ln -sf ../../../usr/src/linux-${KVERREL} $i/source
571     else
572         ln -sf ../../../usr/src/linux-${KVERREL} $i/build
573     fi
574 }
575
576 install_lustre()
577 {
578     (( $INSTALL_LUSTRE )) || return 0
579     return 0
580     set_make
581     FULL_VERSION="${VERSION}-${EXTRA_VERSION}${TARGET_CONFIG}"
582     pushd "$TOPDIR" >/dev/null
583     $MAKE "$MAKE_CC" -s install "DESTDIR=$DESTDIR" KERNELRELEASE="$FULL_VERSION" || fatal 1 "Error installing Lustre."
584     popd >/dev/null
585 }
586
587 build_kms()
588 {
589     (( $BUILD_KERNEL )) || return 0
590     (( $SUSEBUILD )) || return 0
591     set_make
592     FULL_VERSION="${VERSION}-${EXTRA_VERSION}${TARGET_CONFIG}"
593     mkdir -p "${TOPDIR}/modules-${FULL_VERSION}"
594     for dir in /usr/src/kernel-modules/* ; do
595         # we are replacing lustre-lite, so don't include it
596         if [ "${dir##*/}" != "lustre-lite" -a -e $dir/Makefile ]; then
597             build_dir="${TOPDIR}/modules-${FULL_VERSION}/${dir##*/}"
598             cp -a $dir $build_dir
599             # these modules are terrible, and don't all build
600             $MAKE_J "$MAKE_CC" -C $build_dir modules KERNEL_SOURCE="${TOPDIR}/linux"
601         fi
602     done
603 }
604
605 symver()
606 {
607     local file=$1 name=${1%.ko}
608     nm $file \
609     | sed -ne 's,^0*\([0-9a-f]\{8\}\) A __crc_\(.*\),0x\1\t\2\t'"$name"',p'
610 }
611
612 install_kms()
613 {
614     (( $INSTALL_KERNEL )) || return 0
615     (( $LINUX26 )) || return 0
616     set_make
617     FULL_VERSION="${VERSION}-${EXTRA_VERSION}${TARGET_CONFIG}"
618     for build_dir in "${TOPDIR}/modules-${FULL_VERSION}/*" ; do
619         [ -d $build_dir ] || continue
620         # these modules are terrible, and don't all build
621         $MAKE "$MAKE_CC" -C $build_dir KERNEL_SOURCE="${TOPDIR}/linux" INSTALL_MOD_PATH="$DESTDIR" 
622     done
623     (   symver vmlinux
624         moddir="${DESTDIR}/lib/modules/${FULL_VERSION}"
625         cd $moddir/kernel
626         for module in $(find * -name '*.ko'); do
627             symver $module
628         done
629         cd $moddir
630         for module in $(find * -path 'kernel/*' -prune -o \
631                            -name '*.ko' -print); do
632             symver $module
633         done
634     ) | sort -u -k2 \
635         | gzip -c9 > "${DESTDIR}/boot/symvers-${VERSION}-${EXTRA_VERSION}-${TARGET_ARCH}${TARGET_CONFIG}.gz"
636 }
637
638 save_headers()
639 {
640     (( $SAVE_HEADERS )) || return 0
641
642     echo "Saving headers for ${TARGET_CONFIG:-up} ${TARGET_ARCH}..."
643     pushd linux >/dev/null
644
645     KVERREL="${VERSION}-${EXTRA_VERSION}"
646     # deal with the kernel headers that are version specific
647     
648     saveddir="$RPM_BUILD_ROOT/usr/src/linux-${KVERREL}/savedheaders/${TARGET_ARCH}/${TARGET_CONFIG:-up}"
649     mkdir -p "$saveddir"
650     install -m 644 include/linux/autoconf.h "$saveddir/autoconf.h"
651     install -m 644 include/linux/version.h  "$saveddir/version.h"
652     mv include/linux/modules "$saveddir/"
653     echo ${TARGET_ARCH} ${TARGET_CONFIG} ../../savedheaders/${TARGET_ARCH}/${TARGET_CONFIG:-up}/ \
654         >>  "$RPM_BUILD_ROOT/usr/src/linux-${KVERREL}/savedheaders/list"
655     popd >/dev/null
656 }
657
658 save_all_headers()
659 {
660     (( $SAVE_HEADERS )) || return 0
661
662     for arch in $BIGMEM_ARCHS ; do
663         save_headers bigmem $arch
664     done
665
666     for arch in $BOOT_ARCHS ; do
667         save_headers BOOT $arch
668     done
669
670     for arch in $JENSEN_ARCHS ; do
671         save_headers jensen $arch
672     done
673
674     for arch in $SMP_ARCHS ; do
675         save_headers smp $arch
676     done
677
678     for arch in $BIGSMP_ARCHS ; do
679         save_headers bigsmp $arch
680     done
681     for arch in $PSERIES64_ARCHS ; do
682         save_headers pseries64 $arch
683     done
684     for arch in $UP_ARCHS ; do
685         save_headers up $arch
686     done
687 }
688
689 longopts="build,build-lustre,build-kernel,depend-kernel,destdir:,extraversion:"
690 longopts="$longopts,help,install,install-lustre,install-kernel,kerneldir:"
691 longopts="$longopts,save-headers,target:,target-arch:,target-config:,unpack-kernel"
692
693 options=$(getopt -o hj: -l "$longopts" -- "$@")
694
695 eval set -- "$options"
696     
697 while [ "$1" ] ; do
698     case "$1" in
699         '')
700             usage 1
701             ;;
702         --build)
703             BUILD_LUSTRE=1
704             BUILD_KERNEL=1
705             DEPEND_KERNEL=1
706             UNPACK_KERNEL=1
707             shift
708             ;;
709         --build-lustre)
710             BUILD_LUSTRE=1
711             shift
712             ;;
713         --build-kernel)
714             BUILD_KERNEL=1
715             DEPEND_KERNEL=1
716             shift
717             ;;
718         --depend-kernel)
719             DEPEND_KERNEL=1
720             shift
721             ;;
722         --destdir)
723             DESTDIR=$2
724             shift 2
725             ;;
726         --extraversion)
727             EXTRA_VERSION=$2
728             shift 2
729             ;;
730         --help | -h)
731             usage 0
732             ;;
733         --install)
734             INSTALL_LUSTRE=1
735             INSTALL_KERNEL=1
736             shift
737             ;;
738         --install-lustre)
739             INSTALL_LUSTRE=1
740             shift
741             ;;
742         --install-kernel)
743             INSTALL_KERNEL=1
744             shift
745             ;;
746         -j)
747             JOBS=$2
748             shift 2
749             ;;
750         --kerneldir)
751             KERNELDIR=$2
752             shift 2
753             ;;
754         --save-headers)
755             SAVE_HEADERS=1
756             shift
757             ;;
758         --target)
759             TARGET=$2
760             shift 2
761             ;;
762         --target-arch)
763             TARGET_ARCH=$2
764             shift 2
765             ;;
766         --target-config)
767             TARGET_CONFIG=$2
768             shift 2
769             ;;
770         --unpack-kernel)
771             UNPACK_KERNEL=1
772             shift
773             ;;
774         --)
775             shift
776             CONFIGURE_FLAGS=$@
777             break
778             ;; 
779         *)
780             usage 1 "Unrecognized option: $1"
781             ;;
782     esac
783 done
784
785 check_options
786 load_target
787
788 extract_kernel
789 patch_kernel
790
791 depend_kernel
792 build_kernel
793
794 configure_lustre
795 build_lustre
796
797 build_kms
798
799 install_kernel
800 install_lustre
801
802 install_kms
803
804 cleanup_libmodules
805
806 save_headers
807
808 exit 0