Whamcloud - gitweb
b=21586 More stderr/stdout redirections
[fs/lustre-release.git] / build / lbuild.old_school
1 # vim:expandtab:shiftwidth=4:softtabstop=4:tabstop=4:
2
3 OLD_SCHOOL=true
4
5 RHBUILD=${RHBUILD:-0}
6 SUSEBUILD=${SUSEBUILD:-0}
7 LINUX26=${LINUX26:-0}
8 SUSEBUILD=${SUSEBUILD:-0}
9
10 # make sure this module does not get used for anything other than RHEL4
11 # as this will die when our RHEL4 support (read: need to build binaries)
12 # dies
13 if [ "$DISTRO" != "rhel4" ]; then
14     fatal 1 "lbuild.old_school is deprecated and only supported for RHEL4
15 to add lbuild support for $DISTRO you probably want to create an lbuild-$DISTRO
16 file in the lustre-build module"
17 fi
18
19 build_tarball() {
20     local TARGET=$1
21     local SRPM=$2
22
23     if [ "$TARGET" = "rhel-2.6" -o "$TARGET" = "rhel-2.4" ]; then
24         local SPEC=""
25         if [ "$TARGET" = "rhel-2.6" ]; then
26             SPEC=kernel-2.6.spec
27             OLDCONFIG=nonint_oldconfig
28         elif [ "$TARGET" = "rhel-2.4" ]; then
29             SPEC=kernel-2.4.spec
30             OLDCONFIG=oldconfig
31         fi
32
33         RPMTOPDIR=$(mktemp -d $KERNELDIR/rpm_XXXXXX)
34         mkdir $RPMTOPDIR/BUILD/
35         rpm -ivh $KERNELDIR/$SRPM --define "_topdir $RPMTOPDIR" || \
36             { rm -rf $RPMTOPDIR; fatal 1 "Error installing kernel SRPM."; }
37         $RPMBUILD -bp --nodeps --target i686 $RPMTOPDIR/SPECS/$SPEC --define "_topdir $RPMTOPDIR" 2>&1
38         pushd $RPMTOPDIR/BUILD/kernel-${lnxmaj}/linux-${lnxmaj} && {
39             make mrproper
40             cp configs/kernel-${lnxmaj}-i686-smp.config .config
41             if ! make $OLDCONFIG > /dev/null; then
42                 fatal 1 "error trying to make $OLDCONFIG while building a tarball from SRPM."
43             fi
44             make include/linux/version.h
45             rm -f .config
46             cd ..
47             tar cjf $KERNEL_FILE linux-${lnxmaj}
48         }
49         popd
50         rm -rf $RPMTOPDIR
51     fi
52 }
53
54 download_and_build_tarball() {
55     local target=$1
56     local kernel_file=$2
57
58     local srpm=kernel-${lnxmaj}-${lnxrel}.src.rpm
59
60     echo "Downloading http://downloads.lustre.org/public/kernels/$target/old/$srpm..."
61     if ! wget -nv "http://downloads.lustre.org/public/kernels/$target/old/$srpm" \
62         -O "$KERNELDIR/$srpm" ; then
63         fatal 1 "Could not download target $kernel_file's kernel SRPM $srpm from downloads.lustre.org."
64     fi
65     [ -s "$KERNELDIR/$srpm" ] || {
66         rm -rf $KERNELDIR/$srpm
67         fatal 1 "Could not download target $kernel_file's kernel SRPM $srpm from downloads.lustre.org."
68     }
69
70     build_tarball $target $srpm
71 }
72
73 unpack_linux() {
74
75     untar "$KERNEL_FILE" || fatal 1 "Error unpacking Linux tarball"
76     [ -d linux ] || ln -sf linux* linux
77
78 }
79
80 patch_linux() {
81
82     [ "$SERIES" ] || return 0
83
84     do_patch_linux true
85
86     echo "Replacing .config files..."
87     [ -d linux/configs ] || mkdir linux/configs || \
88         fatal 1 "Error creating configs directory."
89     rm -f linux/configs/*
90     copysuccess=0
91     for patchesdir in "$EXTERNAL_PATCHES" "lustre/lustre/kernel_patches" ; do
92         [ "$patchesdir" ] && \
93             cp -v $patchesdir/kernel_configs/kernel-${VERSION}-${TARGET}*.config linux/configs/ >/dev/null && copysuccess=1
94     done
95     [ "$copysuccess" = "1" ] || \
96         fatal 1 "Error copying in kernel configs."
97 }
98
99 pack_linux() {
100     TARBALL="$(readlink linux)-$EXTRA_VERSION.tar.gz"
101     echo "Creating patched linux tarball $TARBALL..."
102     tar zcf "$TARBALL" "$(readlink linux)" \
103         --exclude "CVS" --exclude ".cvsignore" || \
104         --exclude "*.orig" --exclude "*~" --exclude "*.rej" || \
105         fatal 1 "Error creating patched Linux tarball."
106 }
107
108 clean_linux() {
109     [ -d linux ] || return 0
110     echo "Cleaning linux..."
111     [ -L linux ] && rm -rf $(readlink linux)
112     rm -rf linux
113 }
114
115 prep_kernel_build() {
116     local lmakeopts="\"\""
117     if $XEN; then
118         lmakeopts="--xen"
119     fi
120     # make .spec file
121     ENABLE_INIT_SCRIPTS=""
122     sed \
123         -e "s^@BASE_ARCHS@^$BASE_ARCHS^g" \
124         -e "s^@BIGMEM_ARCHS@^$BIGMEM_ARCHS^g" \
125         -e "s^@BIGSMP_ARCHS@^$BIGSMP_ARCHS^g" \
126         -e "s^@BOOT_ARCHS@^$BOOT_ARCHS^g" \
127         -e "s^@CONFIGURE_FLAGS@^$CONFIGURE_FLAGS^g" \
128         -e "s^@ENABLE_INIT_SCRIPTS@^$ENABLE_INIT_SCRIPTS^g" \
129         -e "s^@JENSEN_ARCHS@^$BOOT_ARCHS^g" \
130         -e "s^@KERNEL_EXTRA_VERSION@^$EXTRA_VERSION^g" \
131         -e "s^@KERNEL_EXTRA_VERSION_DELIMITER@^$EXTRA_VERSION_DELIMITER^g" \
132         -e "s^@KERNEL_TARGET_DELIMITER@^$TARGET_DELIMITER^g" \
133         -e "s^@KERNEL_RELEASE@^${EXTRA_VERSION//-/_}^g" \
134         -e "s^@KERNEL_SOURCE@^$KERNEL^g" \
135         -e "s^@KERNEL_VERSION@^$VERSION^g" \
136         -e "s^@LINUX26@^$LINUX26^g" \
137         -e "s^@LUSTRE_SOURCE@^${LUSTRE##*/}^g" \
138         -e "s^@LUSTRE_TARGET@^$TARGET^g" \
139         -e "s^@PSERIES64_ARCHS@^$PSERIES64_ARCHS^g" \
140         -e "s^@RHBUILD@^$RHBUILD^g" \
141         -e "s^@SMP_ARCHS@^$SMP_ARCHS^g" \
142         -e "s^@SUSEBUILD@^$SUSEBUILD^g" \
143         -e "s^@UP_ARCHS@^$UP_ARCHS^g" \
144         -e "s^@LMAKEOPTS@^$lmakeopts^g" \
145         < $TOPDIR/lustre/build/lustre-kernel-2.4.spec.in \
146         > lustre-kernel-2.4.spec
147     [ -d SRPMS ] || mkdir SRPMS
148     [ -d RPMS ] || mkdir RPMS
149     [ -d BUILD ] || mkdir BUILD
150     [ -d SOURCES ] || mkdir SOURCES
151     for script in linux-{rhconfig.h,merge-config.awk,merge-modules.awk} \
152         suse-{functions.sh,post.sh,postun.sh,trigger-script.sh.in} \
153         sles8-{pre,post,postun,update_{INITRD_MODULES,rcfile_setting}}.sh ; do
154         cp $TOPDIR/lustre/build/$script SOURCES
155     done
156     cp "$LUSTRE" "$KERNEL_FILE" SOURCES
157     if [ "$EXTERNAL_PATCHES" -a -d "$EXTERNAL_PATCHES" ] ; then
158         tar zcf SOURCES/external-patches.tar.gz -C "$EXTERNAL_PATCHES" series targets patches kernel_configs
159     else
160         touch SOURCES/external-patches.tar.gz
161     fi
162 }
163
164 clean_lustre() {
165     [ -d lustre ] || return 0
166     echo "Cleaning Lustre..."
167     [ -L lustre ] && rm -rf $(readlink lustre)
168     rm -rf lustre
169 }
170
171 build_kernel() {
172     echo "Building kernel + Lustre RPMs for: $BUILD_ARCHS..."
173     targets=
174     for arch in $BUILD_ARCHS ; do
175         targets="--target $arch $targets"
176     done
177
178     local rpmbuildopt='-bb'
179 #    if $NORPM; then
180 #        rpmbuildopt='-bc'
181 #        echo NORPM mode. Only compiling.
182 #        echo "XXX: need to fix lmake - add options to do rpmbuild -bc instead of -bb"
183 #    fi
184
185     $RPMBUILD $targets $rpmbuildopt lustre-kernel-2.4.spec \
186         --define "_tmppath $TMPDIR" \
187         --define "_topdir $TOPDIR" 2>&1 || \
188         fatal 1 "Error building rpms for $BUILD_ARCHS."
189
190     if $DO_SRC; then
191         $RPMBUILD -bs lustre-kernel-2.4.spec \
192             --define "_tmppath $TMPDIR" \
193             --define "_topdir $TOPDIR" 2>&1 || \
194             fatal 1 "Error building .src.rpm."
195     fi
196
197     ( $(skeep_ldiskfs_rpm $TAG) ) && return
198
199     pushd $TOPDIR/BUILD/lustre*/ldiskfs || return 255
200     make dist
201     if [ "$?" != "0" ] ; then
202         popd
203         return 255
204     fi
205     cp lustre-ldiskfs*.tar.gz $TOPDIR/SOURCES
206
207     gen_lustre_version
208
209     local ldiskfs_spec=lustre-ldiskfs.spec
210     [ -f "$ldiskfs_spec" ] && sed \
211     -e "s^Release: .*$^Release: $LUSTRE_EXTRA_VERSION^" \
212     < $ldiskfs_spec \
213     > ../lustre-ldiskfs.spec
214
215     $RPMBUILD $targets $rpmbuildopt ../lustre-ldiskfs.spec \
216         --define "_tmppath /var/tmp" \
217         --define "_topdir $TOPDIR"
218     if [ "$?" != "0" ] ; then
219         popd
220         return 255
221     fi
222
223     if $DO_SRC; then
224             $RPMBUILD -bs ../lustre-ldiskfs.spec \
225             --define "_tmppath /var/tmp" \
226             --define "_topdir $TOPDIR"
227         if [ "$?" != "0" ] ; then
228             popd
229             return 255
230         fi
231     fi
232     popd
233 }
234
235 #get date of last changed target/config/series/patches
236 get_last_source_date() {
237     local filelist="${TOPDIR}/lustre/lustre/kernel_patches/series/${SERIES} \
238         $CONFIG_FILE"
239     local TOPDIRnew=$(echo ${TOPDIR} | sed -e s/\\//\\\\\\//g)
240     filelist="$filelist $( \
241         cat ${TOPDIR}/lustre/lustre/kernel_patches/series/${SERIES} | \
242         sed -e s/^/${TOPDIRnew}\\/lustre\\/lustre\\/kernel_patches\\/patches\\// 2>&1)"
243     local sourcelastdate=$( find ${filelist} -name CVS -prune -o \
244                 -type f -printf "%T@\n" 2>&1 | sort | tail -1 )
245     is_integer $sourcelastdate && echo $sourcelastdate
246 }
247
248 #check if variable is integer
249 is_integer() {
250     local invariable=$1
251     [ "$invariable" = "" ] && return 255
252     local invariableint=$( echo $invariable | sed -e s/[^0-9]//g )
253     [ "$invariable" = "$invariableint" ] || return 255
254 }
255
256 #store RPMs and/or BUILD dir for future reuse
257 store_for_reuse() {
258     local rpmonly=$1
259     if [ ! "$REUSEBUILD" = "" ] && [ -d  "/$REUSEBUILD/" ] ; then
260         [ -d "${REUSEBUILD}/${TIMESTAMP}" ] || mkdir "${REUSEBUILD}/${TIMESTAMP}"
261         [ -d "${REUSEBUILD}/${TIMESTAMP}" ] || return 255
262     else
263         return 255
264     fi
265
266     local lnxrelnew=${lnxrel//-/_}
267     local EXTRA_VERSIONnew=${EXTRA_VERSION//-/_}
268     local KERNELRPMnew=$(basename "$KERNELRPM")
269     if [ ! "$rpmonly" = "rpmonly" ]; then
270             local builddir=
271         if [ ! "$KERNELCOMPILEDIR" = "" ]; then
272             builddir="$KERNELCOMPILEDIR"
273         else
274             builddir="BUILD/lustre-kernel-${lnxmaj}/lustre/linux-${lnxmaj}"
275             [ "$KERNELCOMPILEDIR" = "" ] || builddir="$KERNELCOMPILEDIR"
276             [ -d "$builddir" ] || builddir="BUILD/lustre-kernel-${lnxmaj}/lustre/linux-${lnxmaj}.${lnxrel}"
277             [ -d "$builddir" ] || builddir="BUILD/lustre-kernel-${lnxmaj}/lustre/linux-${lnxmaj}-${lnxrel}"
278             if [ ! -d "$builddir" ]; then
279                 pushd "BUILD/lustre-kernel-${lnxmaj}/lustre/" || return 255
280                 local basebuilddir=$(ls -d linux-${lnxmaj}* | head -1)
281                 [ "$basebuilddir" = "" ] || builddir="BUILD/lustre-kernel-${lnxmaj}/lustre/${basebuilddir}"
282                 popd
283             fi
284         fi
285         [ -d "$builddir" ] || return 255
286         local dstdir="${REUSEBUILD}/${TIMESTAMP}/linux-${KERNCONFSMPTYPE}-${lnxmaj}-${EXTRA_VERSIONnew}.${TARGET_ARCH}"
287         ( $PATCHLESS ) && dstdir="${REUSEBUILD}/${TIMESTAMP}/linux-$KERNELRPMnew" && \
288                 dstdir="${dstdir%.rpm}"
289         [ -d "$dstdir" ] && rm -rf "$dstdir"
290         mv "${builddir}" "$dstdir" || return 255
291         if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
292             # move the OFED kernel-ib-devel tree as well
293             mv "${builddir%/*}/kernel-ib-devel/usr/src/ofa_kernel" "${dstdir%/*}" || return 255
294         fi
295     fi
296     #store kernel rpm
297     local kernelrpmname="kernel-lustre-${KERNCONFSMPTYPE}-${lnxmaj}-${EXTRA_VERSIONnew}.${TARGET_ARCH}.rpm"
298     [ -f "RPMS/${TARGET_ARCH}/${kernelrpmname}" ] || kernelrpmname="kernel-${KERNCONFSMPTYPE}-${lnxmaj}-${EXTRA_VERSNnew}.${TARGET_ARCH}.rpm"
299     ( $PATCHLESS ) && [ -f "$KERNELRPM" ] && kernelrpmname="$KERNELRPMnew"
300     if [ "$rpmonly" = "rpmonly" ] && [ -f "${REUSEBUILD}/${TIMESTAMP}/${kernelrpmname}" ]; then
301         echo "RPM already exist in store directory tree"
302     else
303         [ -f "RPMS/${TARGET_ARCH}/${kernelrpmname}" ] && cp -f "RPMS/${TARGET_ARCH}/${kernelrpmname}" "${REUSEBUILD}/${TIMESTAMP}/"
304     fi
305     #store kernel source rpm
306     kernelrpmname="kernel-lustre-source-${lnxmaj}-${EXTRA_VERSIONnew}.${TARGET_ARCH}.rpm"
307     [ -f "RPMS/${TARGET_ARCH}/${kernelrpmname}" ] || kernelrpmname="kernel-source-${lnxmaj}-${EXTRA_VERSIONnew}.${TARGET_ARCH}.rpm"
308     ( $PATCHLESS ) && [ -f "$KERNELSOURCERPM" ] && kernelrpmname=$(basename "$KERNELSOURCERPM")
309     if [ "$rpmonly" = "rpmonly" ] && [ -f "${REUSEBUILD}/${TIMESTAMP}/${kernelrpmname}" ]; then
310         echo "RPM already exist in store directory tree"
311     else
312             [ -f "RPMS/${TARGET_ARCH}/${kernelrpmname}" ] && cp -f "RPMS/${TARGET_ARCH}/${kernelrpmname}" "${REUSEBUILD}/${TIMESTAMP}/"
313     fi
314     if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
315         # store kernel-ib RPMs
316         local rpmname
317         local ofed_version=$(echo $OFED_VERSION |
318                              sed -re 's/-(20[0-9]{6,6}-[0-9]{4,4}|rc[0-9]*)$//')
319         for rpmname in "kernel-ib" "kernel-ib-devel"; do
320             rpmname="${rpmname}-${ofed_version}"
321             if $PATCHLESS; then
322                 rpmname="${rpmname}-${LINUXRELEASE//-/_}"
323             else
324                 rpmname="${rpmname}-${lnxmaj}${EXTRA_VERSION_DELIMITER//-/_}${EXTRA_VERSIONnew}${TARGET_DELIMITER//-/_}${KERNCONFSMPTYPE}"
325             fi
326             rpmname="${rpmname}.${TARGET_ARCH}.rpm"
327             if [ "$rpmonly" = "rpmonly" ] && [ -f "${REUSEBUILD}/${TIMESTAMP}/${rpmname}" ]; then
328                 echo "RPM already exist in store directory tree"
329             else
330                 [ -f "RPMS/${TARGET_ARCH}/${rpmname}" ] && cp -f "RPMS/${TARGET_ARCH}/${rpmname}" "${REUSEBUILD}/${TIMESTAMP}/"
331             fi
332         done
333     fi
334 }
335
336 #look for kernel source RPM
337 find_linux_source_rpm() {
338     local rpmfile=
339     local findarch=true
340     local arch=
341     local pathtorpms=
342     [ ! "$TARGET_ARCH" = "" ] && arch=$TARGET_ARCH && findarch=false
343     
344     if ! $findarch; then
345         pathtorpms="${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}/${arch}"
346         [ -d $pathtorpms ] || return 255
347         case "$DISTRO" in
348             rhel4)
349                 rpmfile="kernel-${lnxmaj}-${lnxrel}.src.rpm"
350             ;;
351             sles10)
352                 rpmfile="kernel-source-${lnxmaj}.${lnxrel}.${arch}.rpm"
353             ;;
354             *)
355                 rpmfile="kernel-source-${lnxmaj}-${lnxrel}.${arch}.rpm"
356             ;;
357         esac
358         [ -f "${pathtorpms}/${rpmfile}" ] || return 255
359         KERNELSOURCERPM="${pathtorpms}/${rpmfile}"
360     else
361         for arch in $TARGET_ARCHS_ALL; do
362         pathtorpms="${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}/${arch}"
363         [ -d $pathtorpms ] || continue
364         case "$DISTRO" in
365             rhel4)
366                 rpmfile="kernel-${lnxmaj}-${lnxrel}.src.rpm"
367             ;;
368             sles10)
369                 rpmfile="kernel-source-${lnxmaj}.${lnxrel}.${arch}.rpm"
370             ;;
371             *)
372                 rpmfile="kernel-source-${lnxmaj}-${lnxrel}.${arch}.rpm"
373             ;;
374         esac
375         [ -f "${pathtorpms}/${rpmfile}" ] || continue
376         KERNELSOURCERPM="${pathtorpms}/${rpmfile}"
377         TARGET_ARCH=${arch}
378         break
379         done
380     fi
381     [ -f "${KERNELSOURCERPM}" ] || return 255
382 }
383
384 #unpack and make symlinks for reusing kernel RPM
385 reuse_kernel_rpm() {
386     local pathtorpm=$1
387     local pathtokernelibrpm=$2
388     [ "$pathtorpm" = "" ] && return 255
389     [ -f "$pathtorpm" ] || return 255
390     [ -d $TOPDIR/reused ] || mkdir $TOPDIR/reused
391     pushd $TOPDIR/reused || return 255
392
393     rpm2cpio < $pathtorpm | cpio -idc
394     [ ${PIPESTATUS[0]} -eq 0 ] || return 255
395
396     if [ -n "$pathtokernelibrpm" ] && [ -f "$pathtokernelibrpm" ]; then
397         rpm2cpio < $pathtokernelibrpm | cpio -idc
398         [ ${PIPESTATUS[0]} -eq 0 -o ${PIPESTATUS[1]} -eq 0 ] || return 255
399         CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/ofa_kernel ${CONFIGURE_FLAGS}"
400     fi
401
402     local smptype=
403     if pushd usr/src/linux-*-obj/${TARGET_ARCH}; then
404         local smptypes="$SMPTYPES"
405         [ "$RPMSMPTYPE" = "" ] || smptypes=$RPMSMPTYPE
406         ( ! $PATCHLESS ) && [ ! "$KERNCONFSMPTYPE" = "" ] && smptypes="$KERNCONFSMPTYPE"
407         local cursmptype=
408         for cursmptype in $smptypes; do
409             [ "$cursmptype" = "''" ] && continue
410             [ -d $cursmptype ] && smptype=$cursmptype
411             [ -d $smptype ] && break
412         done
413         popd
414     fi
415     if [ "${smptype}" = "" ]; then
416         popd
417         return 255 # cannot detect smp type
418     fi
419     if pushd usr/src/linux-*-obj/${TARGET_ARCH}/$smptype/include2; then
420         local base=$(readlink asm)
421         if [ ! -d "/${base}/" ]; then
422             rm -f asm
423             base=$(basename "$base")
424             if pushd ../../../../linux-*/include; then
425                 local lsrc=$(pwd)
426                 popd
427                 [ -d "$lsrc/${base}" ] && ln -s $lsrc/${base} asm
428             fi
429         fi
430         popd
431         read a b < <(echo $(pwd)/usr/src/linux-*)
432         if [[ $a == $(pwd)/* && $b = $(pwd)/* ]]; then
433             cp -f $a/include/linux/config.h $b/${TARGET_ARCH}/$smptype/include/linux/
434             cp $b/${TARGET_ARCH}/$smptype/.config $a/
435             [ -f "$b/${TARGET_ARCH}/$smptype/.config" ] && KERNELRPMCONFIG="$b/${TARGET_ARCH}/$smptype/.config"
436             cp $b/${TARGET_ARCH}/$smptype/.kernelrelease $a/
437             [ -f "$b/${TARGET_ARCH}/$smptype/.kernelrelease" ] && KERNELRPMRELEASE="$b/${TARGET_ARCH}/$smptype/.kernelrelease"
438             LINUX=$a
439             LINUXOBJ=$b/${TARGET_ARCH}/$smptype
440 #            local fname=$(basename $kernel_rpm)
441 #            KERNELRPMSDIR=${kernel_rpm%$fname}
442         fi
443     fi
444     popd
445     [ "$LINUX" = "" ] && return 255
446     [ -d "$LINUX" ] || return 255
447 }
448
449 #build linux kernel rpm
450 build_linux_rpm() {
451     pushd $LINUX || return 255
452     make binrpm-pkg || ( popd ; return 255 )
453     local addlnxrel=
454     [ -f ".version" ] && addlnxrel="-$(cat .version)"
455     popd
456     local arch=
457     for arch in $TARGET_ARCHS_ALL; do
458         [ -f "/usr/src/rpm/RPMS/$arch/kernel-$lnxmaj.${lnxrel}${addlnxrel}.$arch.rpm" ] && \
459             KERNELRPM="/usr/src/rpm/RPMS/$arch/kernel-$lnxmaj.${lnxrel}${addlnxrel}.$arch.rpm" && \
460             TARGET_ARCH="$arch"
461         [ -f "/usr/src/packages/RPMS/$arch/kernel-$lnxmaj.${lnxrel}${addlnxrel}.$arch.rpm" ] && \
462             KERNELRPM="/usr/src/packages/RPMS/$arch/kernel-$lnxmaj.${lnxrel}${addlnxrel}.$arch.rpm" && \
463             TARGET_ARCH="$arch"
464     done
465     [ "$KERNELRPM" = "" ] || return
466     return 255
467 }
468
469 #build linux kernel
470 build_linux() {
471     local nofullmake=$1
472     local nocopykernel=$2
473     pushd $LINUX || fatal 1 "Kernel source not found"
474     [ "$nofullmake" = "nofullmake" ] || make mrproper
475     [ "$nofullmake" = "nofullmake" ] || rm -f rpm-release
476 #    [ "$nocopykernel" = "copyrpmkernel" ] || rm -f localversion-*
477     [ "$nocopykernel" = "copykernel" ] && [ -f "$CONFIG_FILE" ] && cp $CONFIG_FILE .config
478     if [ "$nocopykernel" = "copyrpmkernel" ]; then
479         [ -f "$KERNELRPMCONFIG" ] && cp $KERNELRPMCONFIG .config
480         if [ -f "$KERNELRPMRELEASE" ]; then
481             cp $KERNELRPMRELEASE .
482         else
483             sed -e "s/^EXTRAVERSION\s\+=\s\+.*$/EXTRAVERSION = -${lnxrel}/" < Makefile > Makefile.new
484             [ -f "Makefile.new" ] && mv Makefile.new Makefile
485         fi
486     fi
487     [ -f ".config" ] || ( popd ; echo "Cannot find .config file"; return 255 )
488     make oldconfig || ( popd ; return 255 )
489     make include/linux/version.h
490     if [ ! "$nofullmake" = "nofullmake" ]; then
491         make || ( popd ; return 255 )
492     fi
493     popd
494     return
495 }
496
497 #build patchless lustre
498 patchless_build_sequence() {
499     if [ -f $LINUX/Makefile ]; then
500         # Get the correct kernel release - I'm unsure how this can ever
501         # work otherwise, unless you're using the exact same kernel version
502         # Lustre is shipped with.
503
504         local LINUXRELEASE=$(find_linux_release ${LINUXOBJ:-$LINUX})
505         if [ -z "$LINUXRELEASE" ]; then
506             echo "Failed to find linux release in ${LINUXOBJ:-$LINUX}"
507             RC=255
508         fi
509
510         lnxmaj=$(echo $LINUXRELEASE | cut -f1 -d-)
511         EXTRA_VERSION=$(echo $LINUXRELEASE | cut -f2 -d-)_lustre.$LUSTRE_VERSION
512         RPMSMPTYPE=" "
513         build_lustre "${LINUX}" "${LINUXOBJ}" && buildsuccess=true
514     else
515     #try to build from kernel-devel RPM (RHEL)
516     LINUX=
517     TARGET_ARCH=
518     local rpmfound=false
519     local buildsuccess=false
520     local storeforreuse=false
521     if [ "$KERNELRPMSBASE" = "" ] || [ ! -d "$KERNELRPMSBASE" ]; then
522         return 255
523     fi
524     [ -d $TOPDIR/reused ] && rm -rf $TOPDIR/reused
525
526     local delimiter=${EXTRA_VERSION_DELIMITER:-"-"}
527
528     # default to source type -source and special case below
529     local type=-source
530     case "$DISTRO" in
531         rhel*)
532             type=-devel
533             ;;
534     esac
535
536     local kernel_devel_rpm
537
538     if ! kernel_devel_rpm=$(find_linux_rpm "$type" "$delimiter"); then
539         fatal 1 "Could not find the kernel$type RPM in ${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
540     fi
541
542     # find_linux_rpm() used to set these globals, but now it's a function
543     # run in a subshell so it's unable to set globals in our namespace
544     TARGET_ARCH=$(rpm -q --queryformat "%{ARCH}" -p "$kernel_devel_rpm")
545     BUILD_ARCHS="$TARGET_ARCH"
546
547     unpack_linux_devel_rpm "$kernel_devel_rpm" "$delimiter" && rpmfound=true
548
549     [ -d SRPMS ] || mkdir SRPMS
550     [ -d RPMS ] || mkdir RPMS
551     [ -d BUILD ] || mkdir BUILD
552     [ -d SOURCES ] || mkdir SOURCES
553
554     # first build kernel-ib
555     if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
556         $rpmfound && build_kernel_ib
557     fi
558     ( $rpmfound ) && build_lustre "${LINUX}" "${LINUXOBJ}" && buildsuccess=true && find_linux_source_rpm
559     fi
560
561     if $buildsuccess; then
562         [ -d "RPMS/${TARGET_ARCH}" ] && [ -f "$KERNELRPM" ] && \
563             cp "$KERNELRPM" RPMS/${TARGET_ARCH}/
564         [ -d "RPMS/${TARGET_ARCH}" ] && [ -f "$KERNELSOURCERPM" ] && \
565             cp "$KERNELSOURCERPM" RPMS/${TARGET_ARCH}/
566         KERNELCOMPILEDIR="$LINUX"
567         if $storeforreuse; then
568             store_for_reuse || echo "Cannot store for future reuse"
569         fi
570
571         return
572     elif ! $rpmfound; then
573         echo "COULD NOT FIND VENDOR -devel or -source RPM for $DISTRO/$TARGET_ARCH: $lnxmaj-$lnxrel in $KERNELRPMSBASE"
574         return 255
575     else
576         echo "Patchless build failed."
577         return 255
578     fi
579 }
580
581 #check timestamp value. should bi 14-digits string
582 check_timestamp() {
583     local invalue=$1
584     local timestampnodig=$(echo $invalue | sed -e s/[0-9]*//g)
585     [ "$timestampnodig" = "" ] || return 255
586     local timestamplength="${#invalue}"
587     [ $timestamplength -eq 14 ] || return 255
588 }
589
590 # get list of suitable directories with potential reused staff
591 get_reuse_dir_list() {
592     local rpmonly=$1
593     local reusedkernelmasknew=$2
594     local buildtimestamp=
595     local dirsforreuse=
596     local sourcelastdate=$(get_last_source_date)
597     for buildtimestamp in $(ls "$REUSEBUILD/" 2>&1); do
598         [ -d "$REUSEBUILD/$buildtimestamp" ] || continue
599         check_timestamp "$buildtimestamp" || continue
600         local buildtimestampstr=$(echo $buildtimestamp | \
601             sed -e "s^\(....\)\(..\)\(..\)\(..\)\(..\)\(..\)^\1-\2-\3 \4:\5:\6 GMT^g")
602         local buildtimestampepoch=$(date --date="$buildtimestampstr"  +%s )
603         #check for suitable date
604             if ! $PATCHLESS; then
605             [ $buildtimestampepoch -ge $sourcelastdate ] || continue
606             fi
607         #check for suitable version
608         if [ "$rpmonly" = "rpmonly" ]; then
609             local reusedkernelprefix="kernel-lustre-"
610             ( $PATCHLESS ) && reusedkernelprefix=
611             local rpmmask="${reusedkernelprefix}${REUSEDKERNELMASK}"
612             [ "$reusedkernelmasknew" = "" ] || rpmmask="$reusedkernelmasknew"
613             [ -f $REUSEBUILD/$buildtimestamp/${rpmmask}.rpm ] && \
614                 dirsforreuse="$dirsforreuse $REUSEBUILD/$buildtimestamp"
615         else
616             local rpmmask="$REUSEDKERNELMASK"
617             [ "$reusedkernelmasknew" = "" ] || rpmmask="$reusedkernelmasknew"
618             pushd $REUSEBUILD/$buildtimestamp/linux-${rpmmask} > /dev/null 2>&1 || continue
619             local curdir=$(pwd)
620             dirsforreuse="$dirsforreuse $curdir"
621             popd
622         fi
623     done
624     echo "$dirsforreuse"
625 }
626
627 #try to reuse old RPM
628 build_sequence_rpm_reuse() {
629     local sourcerpm=$1
630     [ "$REUSERPM" = "" ] && [ "$REUSEBUILD" = "" ] && return 255
631     local dirsforreuse=
632     if ! [ "$REUSEBUILD" = "" ] && [ -d "$REUSEBUILD" ]; then #try to reuse RPM
633         local REUSEDKERNELMASKnew=$(echo $REUSEDKERNELMASK | sed -e "s/^[^0-9]*//")
634         REUSEDKERNELMASKnew="kernel-lustre-source-${REUSEDKERNELMASKnew}"
635         local dirsforreuse="$(get_reuse_dir_list rpmonly $REUSEDKERNELMASKnew)"
636         local buildsuccess=false
637         LINUXOBJ=
638         for curdir in $(echo $dirsforreuse); do
639             [ -d "$curdir" ] || continue
640             local reusedkernelprefix="kernel-lustre-"
641             local reusedkernelrpm=
642             [ -f ${curdir}/${reusedkernelprefix}${REUSEDKERNELMASK}.rpm ] && \
643                 reusedkernelrpm=$(ls ${curdir}/${reusedkernelprefix}${REUSEDKERNELMASK}.rpm | head -1 )
644             [ -f "$reusedkernelrpm" ] || continue
645
646             local reusedkernelsourcerpm=
647             [ -f ${curdir}/${REUSEDKERNELMASKnew}.rpm ] && \
648                 reusedkernelsourcerpm=$(ls ${curdir}/${REUSEDKERNELMASKnew}.rpm | head -1 )
649             [ -f "$reusedkernelsourcerpm" ] || continue
650
651             # don't need to check for kernel-ib RPM reuse here because sles9 is not supported
652             # by OFED >= 1.3.0 and this function appears to only be used for sles9
653
654             [ -d $TOPDIR/reused ] && rm -rf $TOPDIR/reused
655             reuse_kernel_rpm "$reusedkernelsourcerpm" "" && build_linux nofullmake copyrpmkernel && build_lustre "${LINUX}" "${LINUXOBJ}" && buildsuccess=true
656             ( $buildsuccess ) || continue
657             if ( ! $NORPM ) && ( ! $PATCHLESS ) ; then
658                 [ -f "$reusedkernelrpm" ] && \
659                     cp -f  "$reusedkernelrpm"  RPMS/${TARGET_ARCH}/ > /dev/null 2>&1
660
661                 [ -f "$reusedkernelsourcerpm" ] && \
662                     cp -f  "$reusedkernelsourcerpm"  RPMS/${TARGET_ARCH}/ > /dev/null 2>&1 && \
663                     touch RPMS/${TARGET_ARCH}/kernel_was_reused
664             fi
665             return
666         done
667     fi
668     return 255
669 }
670
671 #try to reuse old BUILD dir
672 build_sequence_reuse() {
673     local sourcerpm=$1
674     [ "$REUSERPM" = "" ] && [ "$REUSEBUILD" = "" ] && return 255
675     local dirsforreuse=
676     if [ ! "$REUSEBUILD" = "" ] && [ -d "$REUSEBUILD" ]; then #try to reuse old kernel build directory
677         local dirsforreuse="$(get_reuse_dir_list)"
678         local buildsuccess=false
679         LINUXOBJ=
680         local REUSEDKERNELMASKnew=$(echo $REUSEDKERNELMASK | sed -e "s/^[^0-9]*//")
681         for curdir in $(echo $dirsforreuse); do
682             local reusedkernelrpm=
683             local reusedkernelsourcerpm=
684             local reusedkernelibrpm=
685             [ -d "$curdir" ] || continue
686             [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" -a 
687               ! -d "${curdir%/*}/ofa_kernel" ] && continue
688             local reusedkernelprefix="kernel-lustre-"
689             ( $PATCHLESS ) && reusedkernelprefix=
690             [ -f ${curdir}/../${reusedkernelprefix}${REUSEDKERNELMASK}.rpm ] && \
691                 reusedkernelrpm=$(ls ${curdir}/../${reusedkernelprefix}${REUSEDKERNELMASK}.rpm | head -1 )
692             reusedkernelprefix="kernel-lustre-source-"
693             [ -f ${curdir}/../${reusedkernelprefix}${REUSEDKERNELMASKnew}.rpm ] && \
694                 reusedkernelsourcerpm=$(ls ${curdir}/../${reusedkernelprefix}${REUSEDKERNELMASKnew}.rpm | head -1 ) 
695             if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
696                 gen_lustre_version
697                 reusedkernelprefix="kernel-ib-"
698                 [ -f ${curdir}/../${reusedkernelprefix}${OFED_VERSION}-${LUSTRE_EXTRA_VERSION}.${TARGET_ARCH}.rpm ] && \
699                     reusedkernelibrpm=$(ls ${curdir}/../${reusedkernelprefix}${OFED_VERSION}-${LUSTRE_EXTRA_VERSION}.${TARGET_ARCH}.rpm | head -1 ) 
700                     reusedkernelibdevelrpm=$(ls ${curdir}/../${reusedkernelprefix}devel-${OFED_VERSION}-${LUSTRE_EXTRA_VERSION}.${TARGET_ARCH}.rpm | head -1 ) 
701             fi
702             if ! ( $NORPM ) && ! [ -f "$reusedkernelrpm" ]; then #kernel rpm not found. Build all
703                 continue
704             fi
705             if ! ( $NORPM ) && ! [ -f "$reusedkernelsourcerpm" ]; then #kernel source rpm not found. Build all
706                 continue
707             fi
708             if [ -n "$OFED_VERSION" ]; then
709                 if [ "$OFED_VERSION" != "inkernel" ]; then
710                     if ! ( $NORPM ) && [ ! -f "$reusedkernelibrpm" -o ! -f "$reusedkernelibdevelrpm"]; then #kernel-ib{,-devel} rpm not found. Build all
711                         continue
712                     fi
713                     CONFIGURE_FLAGS="--with-o2ib=${curdir%/*}/ofa_kernel ${CONFIGURE_FLAGS}"
714                 else
715                     CONFIGURE_FLAGS="--with-o2ib=yes ${CONFIGURE_FLAGS}"
716                 fi
717             fi
718             LINUX="$curdir"
719             build_lustre "${LINUX}" "${LINUXOBJ}" || continue
720             touch "$curdir/../"
721             buildsuccess=true
722             if ( ! $NORPM ) && ( ! $PATCHLESS ) ; then
723                 [ -f "$reusedkernelrpm" ] && \
724                     cp -f  "$reusedkernelrpm"  RPMS/${TARGET_ARCH}/ > /dev/null 2>&1 && \
725                     touch RPMS/${TARGET_ARCH}/kernel_was_reused
726                 [ -f "$reusedkernelsourcerpm" ] && \
727                     cp -f  "$reusedkernelsourcerpm"  RPMS/${TARGET_ARCH}/ > /dev/null 2>&1
728                 [ -f "$reusedkernelibrpm" ] && \
729                     cp -f  "$reusedkernelibrpm"  RPMS/${TARGET_ARCH}/ > /dev/null 2>&1
730                     cp -f  "$reusedkernelibdevelrpm"  RPMS/${TARGET_ARCH}/ > /dev/null 2>&1
731             fi
732             return
733         done
734     fi
735     return 255
736 }
737
738 build_sequence() {
739     if $DO_SRC; then
740         unpack_linux
741         patch_linux
742         pack_linux
743         clean_linux
744     fi
745     prep_kernel_build || return 255
746     clean_lustre || return 255
747
748     build_kernel || return 255
749 }
750
751 old_school_download_kernel() {
752
753     if [ "$KERNELDIR" ] ; then
754         KERNEL_FILE="$KERNELDIR/$KERNEL"
755         if [ ! -r "$KERNEL_FILE" ] ; then
756             # see if we have an SRPM we can build a tarball for
757             KERNEL_SRPM=kernel-${lnxmaj}-${lnxrel}.src.rpm
758             if [ -r "$KERNELDIR/$KERNEL_SRPM" ] ; then
759                 build_tarball $CANONICAL_TARGET $KERNEL_SRPM
760             else
761                 if $DOWNLOAD; then
762                     echo "Downloading http://downloads.lustre.org/public/kernels/$DISTRO/old/$KERNEL..."
763                     if ! wget -nv "http://downloads.lustre.org/public/kernels/$DISTRO/old/$KERNEL" -O "$KERNELDIR/$KERNEL" ; then
764                         # see if we can do it with an SRPM from the download site
765                         download_and_build_tarball $CANONICAL_TARGET $KERNEL_FILE
766                     else
767                         [ -s "$KERNELDIR/$KERNEL" ] || {
768                             rm -rf "$KERNELDIR/$KERNEL"
769                             fatal 1 "Target $TARGET's kernel $KERNEL not found in directory $KERNELDIR."
770                         }
771                     fi
772                 else
773                     fatal 1 "Target $TARGET's kernel file $KERNEL not found in kernel directory $KERNELDIR."
774                 fi
775             fi
776         fi
777     fi
778 }