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/)
23 # provided by target file
56 TOPDIR="${0%%${0##*/}}"
57 if [ "${TOPDIR}" ] ; then
58 TOPDIR=$(canon "${TOPDIR}/..")
66 while [ ! -d $retdir/BUILD ] ; do
67 retdir=$(canon "$retdir/..")
68 if [ "$retdir" = "/" ] ; then
84 [ "$2" ] && echo "${0##*/}: $2"
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}"
102 Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
107 same as --build-kernel --build-lustre --unpack-kernel
110 configure and compile lustre. Requires that --build-kernel was
114 configure and compile a kernel. Implies --depend-kernel.
115 Requires that --unpack-kernel was already run.
118 Prepares a kernel tree for building (similar to make mrproper
119 oldconfig dep). Requires that --unpack-kernel was already run.
122 Root directory to install into (like DESTDIR with auto*).
124 --extraversion=EXTRAVERSION
125 Overrides the target kernel\'s EXTRAVERSION text.
128 Display this message.
131 same as --install-kernel --install-lustre
134 run make install in the Lustre tree.
137 install the kernel image and modules.
140 This works just like the -j option to make, and is passed to make
143 --kerneldir=KERNELDIR
144 Directory containing linux source tarballs.
147 Name of the configuration to use. The available targets are
151 Specifies an architecture to use when choosing a kernel config
152 file. Default is i386.
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.
160 Untars and patches the kernel source.
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
175 (( $BUILD_LUSTRE || $BUILD_KERNEL || $DEPEND_KERNEL || \
176 $INSTALL_LUSTRE || $INSTALL_KERNEL || $SAVE_HEADERS || \
177 $UNPACK_KERNEL )) || \
178 fatal 1 "No commands specified."
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."
187 if (( $INSTALL_LUSTRE || $INSTALL_KERNEL || $SAVE_HEADERS )) ; then
188 [ -z "$DESTDIR" -o -d "$DESTDIR" ] || \
189 fatal 1 "$DESTDIR is not a directory."
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."
197 if [ -z "$JOBS" -o "$JOBS" -lt "1" ] ; then
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)."
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
217 [ "$lustre_patch" ] || \
218 fatal 1 "Could not determine Lustre version from $SERIES series."
220 awk '/^\+#define LUSTRE_KERNEL_VERSION /{ print $3 }' \
221 "$TOPDIR/lustre/kernel_patches/patches/$lustre_patch" 2>/dev/null
226 EXTRA_VERSION_save="$EXTRA_VERSION"
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."
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."
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."
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."
256 if [ "$EXTRA_VERSION_save" ] ; then
257 EXTRA_VERSION="$EXTRA_VERSION_save"
259 EXTRA_VERSION="${EXTRA_VERSION}_lustre.$(get_lustre_version)"
267 fatal 1 "tarflags(): File name argument missing."
276 fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
283 echo "Untarring ${1##*/}..."
284 tar $(tarflags $1) $1
290 (( $UNPACK_KERNEL )) || return 0
291 pushd "$TOPDIR" >/dev/null
292 if [ -d linux ] ; then
293 [ -L linux ] && rm -rf $(readlink linux)
297 [ -d linux ] || ln -sf linux* linux
303 (( $UNPACK_KERNEL )) || return 0
304 [ "$SERIES" ] || return 0
305 pushd "$TOPDIR/linux" >/dev/null
306 for series in $SERIES ; do
307 echo -n "Applying series $series:"
308 SERIES_FILE="$TOPDIR/lustre/kernel_patches/series/$series"
309 for patch in $(<"$SERIES_FILE") ; do
310 PATCH_FILE="$TOPDIR/lustre/kernel_patches/patches/$patch"
311 [ -r "$PATCH_FILE" ] || \
312 fatal 1 "Patch file not found: $patch"
314 patch -s -p1 < "$PATCH_FILE" || fatal 1 "Error applying patch $patch."
327 if [ "$ARCH" ] ; then
328 MAKE_ARCH="$MAKE ARCH=$ARCH"
334 MAKE_ARCH="$MAKE ARCH=$TARGET_ARCH"
338 MAKE_J="$MAKE -j $JOBS"
343 (( $DEPEND_KERNEL )) || return 0
344 # we need to override $CC at make time, since there is no
347 pushd "$TOPDIR/linux" >/dev/null
348 echo "Overriding EXTRAVERSION in kernel..."
349 perl -p -i -e "s/^EXTRAVERSION.*/EXTRAVERSION = -${EXTRA_VERSION}${TARGET_CONFIG}/" Makefile
350 echo "Making depend in $PWD..."
351 $MAKE "$MAKE_CC" mrproper || fatal 1 "Error running make mrproper"
352 cp "$CONFIG_FILE" .config
353 for oc in oldconfig_nonint silentoldconfig oldconfig ; do
354 if grep -q "$oc" Makefile ; then
355 $MAKE "$MAKE_CC" $oc || fatal 1 "Error running make oldconfig"
361 $MAKE "$MAKE_CC" include/asm
364 $MAKE "$MAKE_CC" symlinks
365 $MAKE "$MAKE_CC" dep || fatal 1 "Error running make dep"
368 $MAKE "$MAKE_CC" include/linux/version.h || fatal 1 "Error making include/linux/version.h"
373 (( $BUILD_KERNEL )) || return 0
375 echo "Building kernel in $PWD..."
376 case "$TARGET_ARCH" in
377 i386 | i586 | i686 | athlon | x86_64)
378 $MAKE_J "$MAKE_CC" bzImage || fatal 1 "Error making bzImage."
381 $MAKE_J "$MAKE_CC" vmlinux || fatal 1 "Error making vmlinux."
384 $MAKE_J "$MAKE_CC" boot || fatal 1 "Error making boot."
387 $MAKE_J "$MAKE_CC" modules || fatal 1 "Error building modules."
395 (( $BUILD_LUSTRE )) || return 0
396 pushd "$TOPDIR" >/dev/null
397 [ -f Makefile ] && make -s clean
398 [ -f configure ] || sh ./autogen.sh
399 ./configure --with-linux=$PWD/linux $CONFIGURE_FLAGS || \
400 fatal 1 "Error configuring Lustre."
406 (( $BUILD_LUSTRE )) || return 0
408 FULL_VERSION="${VERSION}-${EXTRA_VERSION}${TARGET_CONFIG}"
409 pushd "$TOPDIR" >/dev/null
411 -e s^@VERSION@^${LUSTRE_VERSION}^g \
412 -e s^@LINUXRELEASE@^${FULL_VERSION}^g \
413 -e s^@RELEASE@^${FULL_VERSION//-/_}^g \
414 -e s^@ac_configure_args@^"--with-linux=${PWD}/linux ${CONFIGURE_FLAGS}"^g \
415 < build/lustre.spec.in \
417 $RPMBUILD --target ${TARGET_ARCH} -bb build/lustre.spec \
418 --define "_topdir $(lbuild_topdir)" || \
419 fatal 1 "Error building Lustre rpms."
420 # $MAKE_J "$MAKE_CC" || fatal 1 "Error building Lustre."
426 (( $INSTALL_KERNEL )) || return 0
428 FULL_VERSION="${VERSION}-${EXTRA_VERSION}${TARGET_CONFIG}"
429 pushd "$TOPDIR/linux" >/dev/null
430 mkdir -p "$DESTDIR/boot"
432 install -m 644 System.map "$DESTDIR/boot/System.map-${FULL_VERSION}"
433 # install -m 644 module-info ...
434 install -m 644 "$CONFIG_FILE" "$DESTDIR/boot/config-${FULL_VERSION}"
436 mkdir -p "$DESTDIR/dev/shm"
437 mkdir -p "$DESTDIR/lib/modules/${FULL_VERSION}"
439 $MAKE "$MAKE_CC" INSTALL_MOD_PATH="$DESTDIR" KERNELRELEASE="$FULL_VERSION" \
440 -s modules_install || \
441 fatal 1 "Error installing modules."
443 case "$TARGET_ARCH" in
444 i386 | i586 | i686 | athlon)
445 cp arch/i386/boot/bzImage "$DESTDIR/boot/vmlinuz-${FULL_VERSION}"
446 cp vmlinux "$DESTDIR/lib/modules/${FULL_VERSION}/"
447 ln -sf "../lib/modules/${FULL_VERSION}/vmlinux" "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
450 cp arch/x86_64/boot/bzImage "$DESTDIR/boot/vmlinuz-${FULL_VERSION}"
451 cp vmlinux "$DESTDIR/lib/modules/${FULL_VERSION}/"
452 ln -sf "../lib/modules/${FULL_VERSION}/vmlinux" "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
455 cp vmlinux "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
456 ln -sf "$DESTDIR/boot/vmlinux-${FULL_VERSION}" "../lib/modules/${FULL_VERSION}/vmlinux"
459 gzip -cfv vmlinux > vmlinuz
460 mkdir -p "$DESTDIR/boot/efi/redhat"
461 install -m 755 vmlinux "$DESTDIR/lib/modules/${FULL_VERSION}/"
462 install -m 755 vmlinuz "$DESTDIR/boot/efi/redhat/vmlinuz-${FULL_VERSION}"
463 ln -sf "../../../lib/modules/${FULL_VERSION}/vmlinux" "$DESTDIR/boot/efi/redhat/vmlinux-${FULL_VERSION}"
464 ln -sf "efi/redhat/vmlinux-${FULL_VERSION}" "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
465 ln -sf "efi/redhat/vmlinuz-${FULL_VERSION}" "$DESTDIR/boot/vmlinuz-${FULL_VERSION}"
468 cp vmlinuz "$DESTDIR/boot/vmlinuz-${FULL_VERSION}"
469 cp vmlinux "$DESTDIR/lib/modules/${FULL_VERSION}/vmlinux-${FULL_VERSION}"
470 ln -sf "../lib/modules/${FULL_VERSION}/vmlinux-${FULL_VERSION}" "$DESTDIR/boot/vmlinux-${FULL_VERSION}"
474 if [ -e init/kerntypes.o ] ; then
475 cp init/kerntypes.o "$DESTDIR/boot/Kerntypes-${FULL_VERSION}"
483 (( $INSTALL_LUSTRE )) || return 0
486 FULL_VERSION="${VERSION}-${EXTRA_VERSION}${TARGET_CONFIG}"
487 pushd "$TOPDIR" >/dev/null
488 $MAKE "$MAKE_CC" -s install "DESTDIR=$DESTDIR" KERNELRELEASE="$FULL_VERSION" || fatal 1 "Error installing Lustre."
494 (( $BUILD_KERNEL )) || return 0
495 (( $SUSEBUILD )) || return 0
497 FULL_VERSION="${VERSION}-${EXTRA_VERSION}${TARGET_CONFIG}"
498 mkdir -p "${TOPDIR}/modules-${FULL_VERSION}"
499 for dir in /usr/src/kernel-modules/* ; do
500 # we are replacing lustre-lite, so don't include it
501 if [ ${dir##*/} != "lustre-lite" -a -e $dir/Makefile ]; then
502 build_dir="${TOPDIR}/modules-${FULL_VERSION}/${dir##*/}"
503 cp -a $dir $build_dir
504 # these modules are terrible, and don't all build
505 $MAKE_J "$MAKE_CC" -C $build_dir modules KERNEL_SOURCE="${TOPDIR}/linux"
512 local file=$1 name=${1%.ko}
514 | sed -ne 's,^0*\([0-9a-f]\{8\}\) A __crc_\(.*\),0x\1\t\2\t'"$name"',p'
519 (( $INSTALL_KERNEL )) || return 0
520 (( $LINUX26 )) || return 0
522 FULL_VERSION="${VERSION}-${EXTRA_VERSION}${TARGET_CONFIG}"
523 for build_dir in "${TOPDIR}/modules-${FULL_VERSION}/*" ; do
524 [ -d $build_dir ] || continue
525 # these modules are terrible, and don't all build
526 $MAKE "$MAKE_CC" -C $build_dir KERNEL_SOURCE="${TOPDIR}/linux" INSTALL_MOD_PATH="$DESTDIR"
529 moddir="${DESTDIR}/lib/modules/${FULL_VERSION}"
531 for module in $(find * -name '*.ko'); do
535 for module in $(find * -path 'kernel/*' -prune -o \
536 -name '*.ko' -print); do
540 | gzip -c9 > "${DESTDIR}/boot/symvers-${VERSION}-${EXTRA_VERSION}-${TARGET_ARCH}${TARGET_CONFIG}.gz"
545 (( $SAVE_HEADERS )) || return 0
547 echo "Saving headers for ${TARGET_CONFIG:-up} ${TARGET_ARCH}..."
548 pushd linux >/dev/null
550 KVERREL="${VERSION}-${EXTRA_VERSION}"
551 # deal with the kernel headers that are version specific
553 saveddir="$RPM_BUILD_ROOT/usr/src/linux-${KVERREL}/savedheaders/${TARGET_ARCH}/${TARGET_CONFIG:-up}"
555 install -m 644 include/linux/autoconf.h "$saveddir/autoconf.h"
556 install -m 644 include/linux/version.h "$saveddir/version.h"
557 mv include/linux/modules "$saveddir/"
558 echo ${TARGET_ARCH} ${TARGET_CONFIG} ../../savedheaders/${TARGET_ARCH}/${TARGET_CONFIG:-up}/ \
559 >> "$RPM_BUILD_ROOT/usr/src/linux-${KVERREL}/savedheaders/list"
565 (( $SAVE_HEADERS )) || return 0
567 for arch in $BIGMEM_ARCHS ; do
568 save_headers bigmem $arch
571 for arch in $BOOT_ARCHS ; do
572 save_headers BOOT $arch
575 for arch in $JENSEN_ARCHS ; do
576 save_headers jensen $arch
579 for arch in $SMP_ARCHS ; do
580 save_headers smp $arch
583 for arch in $BIGSMP_ARCHS ; do
584 save_headers bigsmp $arch
586 for arch in $PSERIES64_ARCHS ; do
587 save_headers pseries64 $arch
589 for arch in $UP_ARCHS ; do
590 save_headers up $arch
594 longopts="build,build-lustre,build-kernel,depend-kernel,destdir:,extraversion:"
595 longopts="$longopts,help,install,install-lustre,install-kernel,kerneldir:"
596 longopts="$longopts,save-headers,target:,target-arch:,target-config:,unpack-kernel"
598 options=$(getopt -o hj: -l "$longopts" -- "$@")
600 eval set -- "$options"
685 usage 1 "Unrecognized option: $1"