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