Whamcloud - gitweb
fix lmake to link to correct ia64 kernels
[fs/lustre-release.git] / lustre / scripts / 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_ARCH=
31 BIGMEM_ARCHS=
32 BOOT_ARCHS=
33 JENSEN_ARCHS=
34 SMP_ARCHS=
35 UP_ARCHS=
36
37 # flat-out globals
38 TOPDIR=
39 TARGET_FILE=
40 KERNEL_FILE=
41 SERIES_FILE=
42 CONFIG_FILE=
43 CC=${CC:-gcc}
44
45 canon()
46 {
47     pushd $1 >/dev/null
48     echo $PWD
49     popd >/dev/null
50 }
51 TOPDIR=$(canon "${0%%${0##*/}}/..")
52
53 cleanup()
54 {
55     true
56 }
57
58 fatal()
59 {
60     cleanup
61     [ "$2" ] && echo
62     [ "$2" ] && echo "${0##*/}: $2"
63     exit $1
64 }
65
66 list_targets()
67 {
68     echo -n "Available targets:"
69     for target in $TOPDIR/kernel_patches/targets/*.target ; do
70         target_file=${target##*/}
71         echo -n " ${target_file%%.target}"
72     done
73     echo
74 }
75
76
77 usage()
78 {
79     cat <<EOF
80 Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
81
82 Options:
83
84   --build
85     same as --build-kernel --build-lustre --unpack-kernel
86
87   --build-lustre
88     configure and compile lustre.  Requires that --build-kernel was
89     already run.
90
91   --build-kernel
92     configure and compile a kernel.  Implies --depend-kernel.
93     Requires that --unpack-kernel was already run.
94
95   --depend-kernel)
96     Prepares a kernel tree for building (similar to make mrproper
97     oldconfig dep).  Requires that --unpack-kernel was already run.
98
99   --destdir=DESTDIR
100     Root directory to install into (like DESTDIR with auto*).
101
102   --extraversion=EXTRAVERSION
103     Overrides the target kernel\'s EXTRAVERSION text.
104
105   -h, --help
106     Display this message.
107
108   --install
109     same as --install-kernel --install-lustre
110
111   --install-lustre
112     run make install in the Lustre tree.
113
114   --install-kernel
115     install the kernel image and modules.
116
117   -j jobs
118     This works just like the -j option to make, and is passed to make
119     when building.
120
121   --kerneldir=KERNELDIR
122     Directory containing linux source tarballs.
123
124   --target=TARGET
125     Name of the configuration to use.  The available targets are
126     listed below.
127
128   --target-arch=ARCH
129     Specifies an architecture to use when choosing a kernel config
130     file.  Default is i386.
131
132   --target-config=CONFIG
133     Specifies a special option (such as smp, bigmem, or BOOT) to use
134     when choosing a kernel config file.  This also modifies the kernel
135     version and modules directory.
136
137   --unpack-kernel
138     Untars and patches the kernel source.
139
140   The order that commands (--build-lustre, --unpack-kernel) are
141   specified on the command line is ignored; ${0##*/} will always
142   execute them in the correct order (unpack, then build, then install
143   etc.).
144
145 EOF
146     list_targets
147
148     fatal "$1" "$2"
149 }
150
151 check_options()
152 {
153     (( $BUILD_LUSTRE || $BUILD_KERNEL || $DEPEND_KERNEL || \
154             $INSTALL_LUSTRE || $INSTALL_KERNEL || $SAVE_HEADERS || \
155             $UNPACK_KERNEL )) || \
156                 fatal 1 "No commands specified."
157
158     if (( $UNPACK_KERNEL )) ; then
159         [ "$KERNELDIR" ] || \
160             fatal 1 "A kernel directory must be specified with --kerneldir."
161         [ -d "$KERNELDIR" ] || \
162             fatal 1 "$KERNELDIR is not a directory."
163     fi
164
165     if (( $INSTALL_LUSTRE || $INSTALL_KERNEL || $SAVE_HEADERS )) ; then
166         [ -z "$DESTDIR" -o -d "$DESTDIR" ] || \
167             fatal 1 "$DESTDIR is not a directory."
168     fi
169
170     [ "$TARGET" ] || usage 1 "A target must be specified with --target."
171     TARGET_FILE="$TOPDIR/kernel_patches/targets/$TARGET.target"
172     [ -r "$TARGET_FILE" ] || \
173         fatal 1 "Target '$TARGET' was not found.  Try --list-targets."
174
175     if [ -z "$JOBS" -o "$JOBS" -lt "1" ] ; then
176         JOBS=1
177     fi
178 }
179
180 get_lustre_version()
181 {
182     lustre_patch=$(grep lustre_version "$SERIES_FILE" 2>/dev/null)
183     [ "$lustre_patch" ] || \
184         fatal 1 "Could not determine Lustre version from $SERIES series."
185
186     awk '/^\+#define LUSTRE_KERNEL_VERSION /{ print $3 }' \
187         "$TOPDIR/kernel_patches/patches/$lustre_patch" 2>/dev/null
188 }
189
190 load_target()
191 {
192     EXTRA_VERSION_save="$EXTRA_VERSION"
193
194     . "$TARGET_FILE"
195
196     [ "$KERNEL" ] || fatal 1 "Target $TARGET did not specify a kernel."
197     [ "$SERIES" ] || fatal 1 "Target $TARGET did not specify a patch series."
198 #    [ "$CONFIG" ] || fatal 1 "Target $TARGET did not specify a kernel config."
199     [ "$VERSION" ] || fatal 1 "Target $TARGET did not specify the kernel version."
200     
201     if [ "$KERNELDIR" ] ; then
202         KERNEL_FILE="$KERNELDIR/$KERNEL"
203         [ -r "$KERNELDIR/$KERNEL" ] || \
204             fatal 1 "Target $TARGET's kernel file $KERNEL not found in kernel directory $KERNELDIR."
205     fi
206
207     SERIES_FILE="$TOPDIR/kernel_patches/series/$SERIES"
208     [ -r "$SERIES_FILE" ] || \
209         fatal 1 "Target $TARGET's series $SERIES missing from $TOPDIR/kernel_patches/series."
210
211     TARGET_ARCH=${TARGET_ARCH:-$BASE_ARCHS}
212     CONFIG_TARGET="$TARGET-${TARGET_ARCH}${TARGET_CONFIG:+-$TARGET_CONFIG}"
213     CONFIG_FILE="$TOPDIR/kernel_patches/kernel_configs/kernel-$VERSION-$CONFIG_TARGET.config"
214     [ -r "$CONFIG_FILE" ] ||
215         fatal 1 "Target $TARGET's config file $CONFIG_FILE missing from $TOPDIR/kernel_patches/configs."
216
217     if [ "$EXTRA_VERSION_save" ] ; then
218         EXTRA_VERSION="$EXTRA_VERSION_save"
219     else
220         EXTRA_VERSION="${EXTRA_VERSION}_lustre.$(get_lustre_version)"
221     fi
222     EXTRA_VERSION=${EXTRA_VERSION//-/_}
223 }
224
225 tarflags()
226 {
227     case "$1" in
228         '')
229             fatal 1 "tarflags(): File name argument missing."
230             ;;
231         *.tar.gz)
232             echo 'zxf'
233             ;;
234         *.tar.bz2)
235             echo 'jxf'
236             ;;
237         *)
238             fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
239             ;;
240     esac
241 }
242
243 untar()
244 {
245     echo "Untarring ${1##*/}..."
246     tar $(tarflags $1) $1
247 }
248
249
250 extract_kernel()
251 {
252     (( $UNPACK_KERNEL )) || return 0
253     pushd "$TOPDIR" >/dev/null
254     if [ -d linux ] ; then
255         [ -L linux ] && rm -rf $(readlink linux)
256         rm -rf linux
257     fi
258     untar "$KERNEL_FILE"
259     [ -d linux ] || ln -sf linux* linux
260     popd >/dev/null
261 }
262
263 patch_kernel()
264 {
265     (( $UNPACK_KERNEL )) || return 0
266     pushd "$TOPDIR/linux" >/dev/null
267     echo -n "Applying patch"
268     for patch in $(<"$SERIES_FILE") ; do
269         PATCH_FILE="$TOPDIR/kernel_patches/patches/$patch"
270         [ -r "$PATCH_FILE" ] || \
271             fatal 1 "Patch file not found: $patch"
272         echo -n " $patch"
273         patch -s -p1 < "$PATCH_FILE" || fatal 1 "Error applying patch $patch."
274     done
275     echo
276     popd >/dev/null
277 }
278
279 depend_kernel()
280 {
281     (( $DEPEND_KERNEL )) || return 0
282     # we need to override $CC at make time, since there is no
283     # configure
284     MAKE="make -s CC=$CC"
285     pushd "$TOPDIR/linux" >/dev/null
286     echo "Overriding EXTRAVERSION in kernel..."
287     perl -p -i -e "s/^EXTRAVERSION.*/EXTRAVERSION = -${EXTRA_VERSION}${TARGET_CONFIG}/" Makefile
288     echo "Making depend in $PWD..."
289     $MAKE mrproper || fatal 1 "Error running make mrproper"
290     cp "$CONFIG_FILE" .config
291     $MAKE oldconfig_nonint || fatal 1 "Error running make oldconfig"
292     $MAKE -j $JOBS dep || fatal 1 "Error running make dep"
293     $MAKE include/linux/version.h || fatal 1 "Error making include/linux/version.h"
294 }
295
296 build_kernel()
297 {
298     (( $BUILD_KERNEL )) || return 0
299     # we need to override $CC at make time, since there is no
300     # configure
301     MAKE="make -s CC=$CC"
302     echo "Building kernel in $PWD..."
303     case "$TARGET_ARCH" in
304         i386 | i586 | i686 | athlon | x86_64)
305             $MAKE -j $JOBS -s bzImage || fatal 1 "Error making bzImage."
306             ;;
307         *)
308             $MAKE -j $JOBS -s boot || fatal 1 "Error making boot."
309             ;;
310     esac
311     $MAKE -j $JOBS -s modules || fatal 1 "Error building modules."
312
313     popd >/dev/null
314 }
315
316 configure_lustre()
317 {
318     (( $BUILD_LUSTRE )) || return 0
319     pushd "$TOPDIR" >/dev/null
320     [ -f Makefile ] && make -s clean
321     [ -f configure ] || sh ./autogen.sh
322     ./configure --with-linux=$PWD/linux $CONFIGURE_FLAGS || \
323         fatal 1 "Error configuring Lustre."
324     popd >/dev/null
325 }
326
327 build_lustre()
328 {
329     (( $BUILD_LUSTRE )) || return 0
330     pushd "$TOPDIR" >/dev/null
331     make -j $JOBS -s || fatal 1 "Error building Lustre."
332     popd >/dev/null
333 }
334
335 install_kernel()
336 {
337     (( $INSTALL_KERNEL )) || return 0
338     FULL_VERSION="${VERSION}-${EXTRA_VERSION}${TARGET_CONFIG}"
339     pushd "$TOPDIR/linux" >/dev/null
340     mkdir -p "$DESTDIR/boot"
341
342     install -m 644 System.map "$DESTDIR/boot/System.map-${FULL_VERSION}"
343     # install -m 644 module-info ...
344     install -m 644 "$CONFIG_FILE" "$DESTDIR/boot/config-${FULL_VERSION}"
345
346     mkdir -p "$DESTDIR/dev/shm"
347
348     case "$TARGET_ARCH" in
349         i386 | i586 | i686 | athlon)
350             cp arch/i386/boot/bzImage "$DESTDIR/boot/vmlinuz-${FULL_VERSION}"
351             cp vmlinux "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
352             ;;
353         x86_64)
354             cp arch/x86_64/boot/bzImage "$DESTDIR/boot/vmlinuz-${FULL_VERSION}"
355             cp vmlinux "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
356             ;;
357         ia64)
358             gzip -cfv vmlinux > vmlinuz
359             mkdir -p "$DESTDIR/boot/efi/redhat"
360             install -m 755 vmlinux "$DESTDIR/boot/efi/redhat/vmlinux-${FULL_VERSION}"
361             install -m 755 vmlinuz "$DESTDIR/boot/efi/redhat/vmlinuz-${FULL_VERSION}"
362             ln -sf "efi/redhat/vmlinux-${FULL_VERSION}" "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
363             ln -sf "efi/redhat/vmlinuz-${FULL_VERSION}" "$DESTDIR/boot/vmlinuz-${FULL_VERSION}"
364             ;;
365         *)
366             cp vmlinuz "$DESTDIR/boot/vmlinuz-${FULL_VERSION}"
367             cp vmlinux "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
368             ;;
369     esac
370
371     mkdir -p "$DESTDIR/lib/modules/${FULL_VERSION}"
372     make CC="$CC" INSTALL_MOD_PATH="$DESTDIR" KERNELRELEASE="$FULL_VERSION" \
373         -s modules_install || \
374         fatal 1 "Error installing modules."
375
376     popd >/dev/null
377 }
378
379 install_lustre()
380 {
381     (( $INSTALL_LUSTRE )) || return 0
382     FULL_VERSION="${VERSION}-${EXTRA_VERSION}${TARGET_CONFIG}"
383     pushd "$TOPDIR" >/dev/null
384     make -s install "DESTDIR=$DESTDIR" KERNELRELEASE="$FULL_VERSION" || fatal 1 "Error installing Lustre."
385     popd >/dev/null
386 }
387
388 save_headers()
389 {
390     echo "Saving headers for $1 $2..."
391     pushd linux >/dev/null
392
393     KVERREL="${VERSION}-${EXTRA_VERSION}"
394     # deal with the kernel headers that are version specific
395     
396     saveddir="$RPM_BUILD_ROOT/usr/src/linux-${KVERREL}/savedheaders/$2/$1"
397     mkdir -p "$saveddir"
398     install -m 644 include/linux/autoconf.h "$saveddir/autoconf.h"
399     install -m 644 include/linux/version.h  "$saveddir/version.h"
400     mv include/linux/modules "$saveddir/"
401     echo $2 $1 ../../savedheaders/$2/$1/ >>  $RPM_BUILD_ROOT/usr/src/linux-${KVERREL}/savedheaders/list
402     popd >/dev/null
403 }
404
405 save_all_headers()
406 {
407     (( $SAVE_HEADERS )) || return 0
408
409     for arch in $BIGMEM_ARCHS ; do
410         save_headers bigmem $arch
411     done
412
413     for arch in $BOOT_ARCHS ; do
414         save_headers BOOT $arch
415     done
416
417     for arch in $JENSEN_ARCHS ; do
418         save_headers jensen $arch
419     done
420
421     for arch in $SMP_ARCHS ; do
422         save_headers smp $arch
423     done
424
425     for arch in $UP_ARCHS ; do
426         save_headers up $arch
427     done
428 }
429
430 longopts="build,build-lustre,build-kernel,depend-kernel,destdir:,extraversion:"
431 longopts="$longopts,help,install,install-lustre,install-kernel,kerneldir:"
432 longopts="$longopts,save-headers,target:,target-arch:,target-config:,unpack-kernel"
433
434 options=$(getopt -o hj: -l "$longopts" -- "$@")
435
436 eval set -- "$options"
437     
438 while [ "$1" ] ; do
439     case "$1" in
440         '')
441             usage 1
442             ;;
443         --build)
444             BUILD_LUSTRE=1
445             BUILD_KERNEL=1
446             DEPEND_KERNEL=1
447             UNPACK_KERNEL=1
448             shift
449             ;;
450         --build-lustre)
451             BUILD_LUSTRE=1
452             shift
453             ;;
454         --build-kernel)
455             BUILD_KERNEL=1
456             DEPEND_KERNEL=1
457             shift
458             ;;
459         --depend-kernel)
460             DEPEND_KERNEL=1
461             shift
462             ;;
463         --destdir)
464             DESTDIR=$2
465             shift 2
466             ;;
467         --extraversion)
468             EXTRA_VERSION=$2
469             shift 2
470             ;;
471         --help | -h)
472             usage 0
473             ;;
474         --install)
475             INSTALL_LUSTRE=1
476             INSTALL_KERNEL=1
477             shift
478             ;;
479         --install-lustre)
480             INSTALL_LUSTRE=1
481             shift
482             ;;
483         --install-kernel)
484             INSTALL_KERNEL=1
485             shift
486             ;;
487         -j)
488             JOBS=$2
489             shift 2
490             ;;
491         --kerneldir)
492             KERNELDIR=$2
493             shift 2
494             ;;
495         --save-headers)
496             SAVE_HEADERS=1
497             shift
498             ;;
499         --target)
500             TARGET=$2
501             shift 2
502             ;;
503         --target-arch)
504             TARGET_ARCH=$2
505             shift 2
506             ;;
507         --target-config)
508             TARGET_CONFIG=$2
509             shift 2
510             ;;
511         --unpack-kernel)
512             UNPACK_KERNEL=1
513             shift
514             ;;
515         --)
516             shift
517             CONFIGURE_FLAGS=$@
518             break
519             ;; 
520         *)
521             usage 1 "Unrecognized option: $1"
522             ;;
523     esac
524 done
525
526 check_options
527 load_target
528
529 extract_kernel
530 patch_kernel
531
532 depend_kernel
533 build_kernel
534
535 configure_lustre
536 build_lustre
537
538 install_kernel
539 install_lustre
540
541 save_all_headers
542
543 exit 0