Whamcloud - gitweb
fix copy/paste error
[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
49 canon()
50 {
51     pushd $1 >/dev/null
52     echo $PWD
53     popd >/dev/null
54 }
55 TOPDIR=$(canon "${0%%${0##*/}}/..")
56
57 cleanup()
58 {
59     true
60 }
61
62 fatal()
63 {
64     cleanup
65     [ "$2" ] && echo
66     [ "$2" ] && echo "${0##*/}: $2"
67     exit $1
68 }
69
70 list_targets()
71 {
72     echo -n "Available targets:"
73     for target in $TOPDIR/lustre/kernel_patches/targets/*.target ; do
74         target_file=${target##*/}
75         echo -n " ${target_file%%.target}"
76     done
77     echo
78 }
79
80
81 usage()
82 {
83     cat <<EOF
84 Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
85
86 Options:
87
88   --build
89     same as --build-kernel --build-lustre --unpack-kernel
90
91   --build-lustre
92     configure and compile lustre.  Requires that --build-kernel was
93     already run.
94
95   --build-kernel
96     configure and compile a kernel.  Implies --depend-kernel.
97     Requires that --unpack-kernel was already run.
98
99   --depend-kernel)
100     Prepares a kernel tree for building (similar to make mrproper
101     oldconfig dep).  Requires that --unpack-kernel was already run.
102
103   --destdir=DESTDIR
104     Root directory to install into (like DESTDIR with auto*).
105
106   --extraversion=EXTRAVERSION
107     Overrides the target kernel\'s EXTRAVERSION text.
108
109   -h, --help
110     Display this message.
111
112   --install
113     same as --install-kernel --install-lustre
114
115   --install-lustre
116     run make install in the Lustre tree.
117
118   --install-kernel
119     install the kernel image and modules.
120
121   -j jobs
122     This works just like the -j option to make, and is passed to make
123     when building.
124
125   --kerneldir=KERNELDIR
126     Directory containing linux source tarballs.
127
128   --target=TARGET
129     Name of the configuration to use.  The available targets are
130     listed below.
131
132   --target-arch=ARCH
133     Specifies an architecture to use when choosing a kernel config
134     file.  Default is i386.
135
136   --target-config=CONFIG
137     Specifies a special option (such as smp, bigsmp, bigmem, or BOOT)
138     to use when choosing a kernel config file.  This also modifies the
139     kernel version and modules directory.
140
141   --unpack-kernel
142     Untars and patches the kernel source.
143
144   The order that commands (--build-lustre, --unpack-kernel) are
145   specified on the command line is ignored; ${0##*/} will always
146   execute them in the correct order (unpack, then build, then install
147   etc.).
148
149 EOF
150     list_targets
151
152     fatal "$1" "$2"
153 }
154
155 check_options()
156 {
157     (( $BUILD_LUSTRE || $BUILD_KERNEL || $DEPEND_KERNEL || \
158             $INSTALL_LUSTRE || $INSTALL_KERNEL || $SAVE_HEADERS || \
159             $UNPACK_KERNEL )) || \
160                 fatal 1 "No commands specified."
161
162     if (( $UNPACK_KERNEL )) ; then
163         [ "$KERNELDIR" ] || \
164             fatal 1 "A kernel directory must be specified with --kerneldir."
165         [ -d "$KERNELDIR" ] || \
166             fatal 1 "$KERNELDIR is not a directory."
167     fi
168
169     if (( $INSTALL_LUSTRE || $INSTALL_KERNEL || $SAVE_HEADERS )) ; then
170         [ -z "$DESTDIR" -o -d "$DESTDIR" ] || \
171             fatal 1 "$DESTDIR is not a directory."
172     fi
173
174     [ "$TARGET" ] || usage 1 "A target must be specified with --target."
175     TARGET_FILE="$TOPDIR/lustre/kernel_patches/targets/$TARGET.target"
176     [ -r "$TARGET_FILE" ] || \
177         fatal 1 "Target '$TARGET' was not found.  Try --list-targets."
178
179     if [ -z "$JOBS" -o "$JOBS" -lt "1" ] ; then
180         JOBS=1
181     fi
182 }
183
184 get_lustre_version()
185 {
186     for series in $SERIES ; do
187         SERIES_FILE="$TOPDIR/lustre/kernel_patches/series/$series"
188         lustre_patch=$(grep lustre_version "$SERIES_FILE" 2>/dev/null)
189         [ "$lustre_patch" ] && break
190     done
191     [ "$lustre_patch" ] || \
192         fatal 1 "Could not determine Lustre version from $SERIES series."
193
194     awk '/^\+#define LUSTRE_KERNEL_VERSION /{ print $3 }' \
195         "$TOPDIR/lustre/kernel_patches/patches/$lustre_patch" 2>/dev/null
196 }
197
198 load_target()
199 {
200     EXTRA_VERSION_save="$EXTRA_VERSION"
201
202     . "$TARGET_FILE"
203
204     [ "$KERNEL" ] || fatal 1 "Target $TARGET did not specify a kernel."
205 # Suse 2.6 has our patches in already
206 #    [ "$SERIES" ] || fatal 1 "Target $TARGET did not specify a patch series."
207 #    [ "$CONFIG" ] || fatal 1 "Target $TARGET did not specify a kernel config."
208     [ "$VERSION" ] || fatal 1 "Target $TARGET did not specify the kernel version."
209     
210     if [ "$KERNELDIR" ] ; then
211         KERNEL_FILE="$KERNELDIR/$KERNEL"
212         [ -r "$KERNELDIR/$KERNEL" ] || \
213             fatal 1 "Target $TARGET's kernel file $KERNEL not found in kernel directory $KERNELDIR."
214     fi
215
216     if [ "$SERIES" ] ; then
217         for series in $SERIES ; do
218             SERIES_FILE="$TOPDIR/lustre/kernel_patches/series/$series"
219             [ -r "$SERIES_FILE" ] || \
220                 fatal 1 "Target $TARGET's series $SERIES missing from $TOPDIR/lustre/kernel_patches/series."
221         done
222     fi
223
224     TARGET_ARCH=${TARGET_ARCH:-$BASE_ARCHS}
225     CONFIG_TARGET="$TARGET-${TARGET_ARCH}${TARGET_CONFIG:+-$TARGET_CONFIG}"
226     CONFIG_FILE="$TOPDIR/lustre/kernel_patches/kernel_configs/kernel-$VERSION-$CONFIG_TARGET.config"
227     [ -r "$CONFIG_FILE" ] ||
228         fatal 1 "Target $TARGET's config file $CONFIG_FILE missing from $TOPDIR/lustre/kernel_patches/configs."
229
230     if [ "$EXTRA_VERSION_save" ] ; then
231         EXTRA_VERSION="$EXTRA_VERSION_save"
232     else
233         EXTRA_VERSION="${EXTRA_VERSION}_lustre.$(get_lustre_version)"
234     fi
235 }
236
237 tarflags()
238 {
239     case "$1" in
240         '')
241             fatal 1 "tarflags(): File name argument missing."
242             ;;
243         *.tar.gz)
244             echo 'zxf'
245             ;;
246         *.tar.bz2)
247             echo 'jxf'
248             ;;
249         *)
250             fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
251             ;;
252     esac
253 }
254
255 untar()
256 {
257     echo "Untarring ${1##*/}..."
258     tar $(tarflags $1) $1
259 }
260
261
262 extract_kernel()
263 {
264     (( $UNPACK_KERNEL )) || return 0
265     pushd "$TOPDIR" >/dev/null
266     if [ -d linux ] ; then
267         [ -L linux ] && rm -rf $(readlink linux)
268         rm -rf linux
269     fi
270     untar "$KERNEL_FILE"
271     [ -d linux ] || ln -sf linux* linux
272     popd >/dev/null
273 }
274
275 patch_kernel()
276 {
277     (( $UNPACK_KERNEL )) || return 0
278     [ "$SERIES" ] || return 0
279     pushd "$TOPDIR/linux" >/dev/null
280     for series in $SERIES ; do
281         echo -n "Applying series $series:"
282         SERIES_FILE="$TOPDIR/lustre/kernel_patches/series/$series"
283         for patch in $(<"$SERIES_FILE") ; do
284             PATCH_FILE="$TOPDIR/lustre/kernel_patches/patches/$patch"
285             [ -r "$PATCH_FILE" ] || \
286                 fatal 1 "Patch file not found: $patch"
287             echo -n " $patch"
288             patch -s -p1 < "$PATCH_FILE" || fatal 1 "Error applying patch $patch."
289         done
290         echo
291     done
292     popd >/dev/null
293 }
294
295 set_make()
296 {
297     MAKE="make -s"
298     if [ "$CC" ] ; then
299         MAKE_CC="CC=$CC"
300     fi
301     if [ "$ARCH" ] ; then
302         MAKE_ARCH="$MAKE ARCH=$ARCH"
303     else
304         case $TARGET_ARCH in
305             i?86)
306                 ;;
307             *)
308                 MAKE_ARCH="$MAKE ARCH=$TARGET_ARCH"
309                 ;;
310         esac
311     fi
312     MAKE_J="$MAKE -j $JOBS"
313 }
314
315 depend_kernel()
316 {
317     (( $DEPEND_KERNEL )) || return 0
318     # we need to override $CC at make time, since there is no
319     # configure
320     set_make
321     pushd "$TOPDIR/linux" >/dev/null
322     echo "Overriding EXTRAVERSION in kernel..."
323     perl -p -i -e "s/^EXTRAVERSION.*/EXTRAVERSION = -${EXTRA_VERSION}${TARGET_CONFIG}/" Makefile
324     echo "Making depend in $PWD..."
325     $MAKE "$MAKE_CC" mrproper || fatal 1 "Error running make mrproper"
326     cp "$CONFIG_FILE" .config
327     for oc in oldconfig_nonint silentoldconfig oldconfig ; do
328         if grep -q "$oc" Makefile ; then
329             $MAKE "$MAKE_CC" $oc || fatal 1 "Error running make oldconfig"
330             break
331         fi
332     done
333     case "$VERSION" in
334         2.6*)
335             $MAKE "$MAKE_CC" include/asm
336             ;;
337         2.4*)
338             $MAKE "$MAKE_CC" symlinks
339             $MAKE "$MAKE_CC" dep || fatal 1 "Error running make dep"
340             ;;
341     esac
342     $MAKE "$MAKE_CC" include/linux/version.h || fatal 1 "Error making include/linux/version.h"
343 }
344
345 build_kernel()
346 {
347     (( $BUILD_KERNEL )) || return 0
348     set_make
349     echo "Building kernel in $PWD..."
350     case "$TARGET_ARCH" in
351         i386 | i586 | i686 | athlon | x86_64)
352             $MAKE_J "$MAKE_CC" bzImage || fatal 1 "Error making bzImage."
353             ;;
354         ppc | ppc64)
355             $MAKE_J "$MAKE_CC" vmlinux || fatal 1 "Error making vmlinux."
356             ;;
357         *)
358             $MAKE_J "$MAKE_CC" boot || fatal 1 "Error making boot."
359             ;;
360     esac
361     $MAKE_J "$MAKE_CC" modules || fatal 1 "Error building modules."
362
363     popd >/dev/null
364 }
365
366 configure_lustre()
367 {
368     (( $BUILD_LUSTRE )) || return 0
369     pushd "$TOPDIR" >/dev/null
370     [ -f Makefile ] && make -s clean
371     [ -f configure ] || sh ./autogen.sh
372     ./configure --with-linux=$PWD/linux $CONFIGURE_FLAGS || \
373         fatal 1 "Error configuring Lustre."
374     popd >/dev/null
375 }
376
377 build_lustre()
378 {
379     (( $BUILD_LUSTRE )) || return 0
380     set_make
381     pushd "$TOPDIR" >/dev/null
382     $MAKE_J "$MAKE_CC" || fatal 1 "Error building Lustre."
383     popd >/dev/null
384 }
385
386 install_kernel()
387 {
388     (( $INSTALL_KERNEL )) || return 0
389     set_make
390     FULL_VERSION="${VERSION}-${EXTRA_VERSION}${TARGET_CONFIG}"
391     pushd "$TOPDIR/linux" >/dev/null
392     mkdir -p "$DESTDIR/boot"
393
394     install -m 644 System.map "$DESTDIR/boot/System.map-${FULL_VERSION}"
395     # install -m 644 module-info ...
396     install -m 644 "$CONFIG_FILE" "$DESTDIR/boot/config-${FULL_VERSION}"
397
398     mkdir -p "$DESTDIR/dev/shm"
399     mkdir -p "$DESTDIR/lib/modules/${FULL_VERSION}"
400
401     $MAKE "$MAKE_CC" INSTALL_MOD_PATH="$DESTDIR" KERNELRELEASE="$FULL_VERSION" \
402         -s modules_install || \
403         fatal 1 "Error installing modules."
404
405     case "$TARGET_ARCH" in
406         i386 | i586 | i686 | athlon)
407             cp arch/i386/boot/bzImage "$DESTDIR/boot/vmlinuz-${FULL_VERSION}"
408             cp vmlinux "$DESTDIR/lib/modules/${FULL_VERSION}/"
409             ln -sf "../lib/modules/${FULL_VERSION}/vmlinux" "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
410             ;;
411         x86_64)
412             cp arch/x86_64/boot/bzImage "$DESTDIR/boot/vmlinuz-${FULL_VERSION}"
413             cp vmlinux "$DESTDIR/lib/modules/${FULL_VERSION}/"
414             ln -sf "../lib/modules/${FULL_VERSION}/vmlinux" "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
415             ;;
416         ppc | ppc64)
417             cp vmlinux "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
418             ln -sf "$DESTDIR/boot/vmlinux-${FULL_VERSION}" "../lib/modules/${FULL_VERSION}/vmlinux" 
419             ;;
420         ia64)
421             gzip -cfv vmlinux > vmlinuz
422             mkdir -p "$DESTDIR/boot/efi/redhat"
423             install -m 755 vmlinux "$DESTDIR/lib/modules/${FULL_VERSION}/"
424             install -m 755 vmlinuz "$DESTDIR/boot/efi/redhat/vmlinuz-${FULL_VERSION}"
425             ln -sf "../../../lib/modules/${FULL_VERSION}/vmlinux" "$DESTDIR/boot/efi/redhat/vmlinux-${FULL_VERSION}"
426             ln -sf "efi/redhat/vmlinux-${FULL_VERSION}" "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
427             ln -sf "efi/redhat/vmlinuz-${FULL_VERSION}" "$DESTDIR/boot/vmlinuz-${FULL_VERSION}"
428             ;;
429         *)
430             cp vmlinuz "$DESTDIR/boot/vmlinuz-${FULL_VERSION}"
431             cp vmlinux "$DESTDIR/lib/modules/${FULL_VERSION}/vmlinux-${FULL_VERSION}"
432             ln -sf "../lib/modules/${FULL_VERSION}/vmlinux-${FULL_VERSION}" "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
433
434             ;;
435     esac
436     if [ -e init/kerntypes.o ] ; then
437         cp init/kerntypes.o "$DESTDIR/boot/Kerntypes-${FULL_VERSION}"
438     fi
439
440     popd >/dev/null
441 }
442
443 install_lustre()
444 {
445     (( $INSTALL_LUSTRE )) || return 0
446     set_make
447     FULL_VERSION="${VERSION}-${EXTRA_VERSION}${TARGET_CONFIG}"
448     pushd "$TOPDIR" >/dev/null
449     $MAKE "$MAKE_CC" -s install "DESTDIR=$DESTDIR" KERNELRELEASE="$FULL_VERSION" || fatal 1 "Error installing Lustre."
450     popd >/dev/null
451 }
452
453 build_kms()
454 {
455     (( $BUILD_KERNEL )) || return 0
456     (( $SUSEBUILD )) || return 0
457     set_make
458     FULL_VERSION="${VERSION}-${EXTRA_VERSION}${TARGET_CONFIG}"
459     mkdir -p "${TOPDIR}/modules-${FULL_VERSION}"
460     for dir in /usr/src/kernel-modules/* ; do
461         # we are replacing lustre-lite, so don't include it
462         if [ ${dir##*/} != "lustre-lite" -a -e $dir/Makefile ]; then
463             build_dir="${TOPDIR}/modules-${FULL_VERSION}/${dir##*/}"
464             cp -a $dir $build_dir
465             # these modules are terrible, and don't all build
466             $MAKE_J "$MAKE_CC" -C $build_dir modules KERNEL_SOURCE="${TOPDIR}/linux"
467         fi
468     done
469 }
470
471 symver()
472 {
473     local file=$1 name=${1%.ko}
474     nm $file \
475     | sed -ne 's,^0*\([0-9a-f]\{8\}\) A __crc_\(.*\),0x\1\t\2\t'"$name"',p'
476 }
477
478 install_kms()
479 {
480     (( $INSTALL_KERNEL )) || return 0
481     (( $SUSEBUILD )) || return 0
482     set_make
483     FULL_VERSION="${VERSION}-${EXTRA_VERSION}${TARGET_CONFIG}"
484     for build_dir in "${TOPDIR}/modules-${FULL_VERSION}/*" ; do
485         [ -d $build_dir ] || continue
486         # these modules are terrible, and don't all build
487         $MAKE "$MAKE_CC" -C $build_dir KERNEL_SOURCE="${TOPDIR}/linux" INSTALL_MOD_PATH="$DESTDIR" 
488     done
489     (   symver vmlinux
490         moddir="${DESTDIR}/lib/modules/${FULL_VERSION}"
491         cd $moddir/kernel
492         for module in $(find * -name '*.ko'); do
493             symver $module
494         done
495         cd $moddir
496         for module in $(find * -path 'kernel/*' -prune -o \
497                            -name '*.ko' -print); do
498             symver $module
499         done
500     ) | sort -u -k2 \
501         | gzip -c9 > "${DESTDIR}/boot/symvers-${VERSION}-${EXTRA_VERSION}-${TARGET_ARCH}${TARGET_CONFIG}.gz"
502 }
503
504 save_headers()
505 {
506     (( $SAVE_HEADERS )) || return 0
507
508     echo "Saving headers for ${TARGET_CONFIG:-up} ${TARGET_ARCH}..."
509     pushd linux >/dev/null
510
511     KVERREL="${VERSION}-${EXTRA_VERSION}"
512     # deal with the kernel headers that are version specific
513     
514     saveddir="$RPM_BUILD_ROOT/usr/src/linux-${KVERREL}/savedheaders/${TARGET_ARCH}/${TARGET_CONFIG:-up}"
515     mkdir -p "$saveddir"
516     install -m 644 include/linux/autoconf.h "$saveddir/autoconf.h"
517     install -m 644 include/linux/version.h  "$saveddir/version.h"
518     mv include/linux/modules "$saveddir/"
519     echo ${TARGET_ARCH} ${TARGET_CONFIG} ../../savedheaders/${TARGET_ARCH}/${TARGET_CONFIG:-up}/ \
520         >>  "$RPM_BUILD_ROOT/usr/src/linux-${KVERREL}/savedheaders/list"
521     popd >/dev/null
522 }
523
524 save_all_headers()
525 {
526     (( $SAVE_HEADERS )) || return 0
527
528     for arch in $BIGMEM_ARCHS ; do
529         save_headers bigmem $arch
530     done
531
532     for arch in $BOOT_ARCHS ; do
533         save_headers BOOT $arch
534     done
535
536     for arch in $JENSEN_ARCHS ; do
537         save_headers jensen $arch
538     done
539
540     for arch in $SMP_ARCHS ; do
541         save_headers smp $arch
542     done
543
544     for arch in $BIGSMP_ARCHS ; do
545         save_headers bigsmp $arch
546     done
547     for arch in $PSERIES64_ARCHS ; do
548         save_headers pseries64 $arch
549     done
550     for arch in $UP_ARCHS ; do
551         save_headers up $arch
552     done
553 }
554
555 longopts="build,build-lustre,build-kernel,depend-kernel,destdir:,extraversion:"
556 longopts="$longopts,help,install,install-lustre,install-kernel,kerneldir:"
557 longopts="$longopts,save-headers,target:,target-arch:,target-config:,unpack-kernel"
558
559 options=$(getopt -o hj: -l "$longopts" -- "$@")
560
561 eval set -- "$options"
562     
563 while [ "$1" ] ; do
564     case "$1" in
565         '')
566             usage 1
567             ;;
568         --build)
569             BUILD_LUSTRE=1
570             BUILD_KERNEL=1
571             DEPEND_KERNEL=1
572             UNPACK_KERNEL=1
573             shift
574             ;;
575         --build-lustre)
576             BUILD_LUSTRE=1
577             shift
578             ;;
579         --build-kernel)
580             BUILD_KERNEL=1
581             DEPEND_KERNEL=1
582             shift
583             ;;
584         --depend-kernel)
585             DEPEND_KERNEL=1
586             shift
587             ;;
588         --destdir)
589             DESTDIR=$2
590             shift 2
591             ;;
592         --extraversion)
593             EXTRA_VERSION=$2
594             shift 2
595             ;;
596         --help | -h)
597             usage 0
598             ;;
599         --install)
600             INSTALL_LUSTRE=1
601             INSTALL_KERNEL=1
602             shift
603             ;;
604         --install-lustre)
605             INSTALL_LUSTRE=1
606             shift
607             ;;
608         --install-kernel)
609             INSTALL_KERNEL=1
610             shift
611             ;;
612         -j)
613             JOBS=$2
614             shift 2
615             ;;
616         --kerneldir)
617             KERNELDIR=$2
618             shift 2
619             ;;
620         --save-headers)
621             SAVE_HEADERS=1
622             shift
623             ;;
624         --target)
625             TARGET=$2
626             shift 2
627             ;;
628         --target-arch)
629             TARGET_ARCH=$2
630             shift 2
631             ;;
632         --target-config)
633             TARGET_CONFIG=$2
634             shift 2
635             ;;
636         --unpack-kernel)
637             UNPACK_KERNEL=1
638             shift
639             ;;
640         --)
641             shift
642             CONFIGURE_FLAGS=$@
643             break
644             ;; 
645         *)
646             usage 1 "Unrecognized option: $1"
647             ;;
648     esac
649 done
650
651 check_options
652 load_target
653
654 extract_kernel
655 patch_kernel
656
657 depend_kernel
658 build_kernel
659
660 configure_lustre
661 build_lustre
662
663 build_kms
664
665 install_kernel
666 install_lustre
667
668 install_kms
669
670 save_headers
671
672 exit 0