source: projects/mkkpkg/trunk/mkkpkg @ 6587

Revision 6587, 28.5 KB checked in by daisuke, 12 years ago (diff)

kernel 3.x support

Line 
1#!/bin/bash
2#
3# mkkpkg: make new configured kernel package from kernel-xx-xx.src.rpm
4#
5# [Version 2.3.2] Jul 10 2000
6# Modified by sagami@pc.highway.ne.jp
7# - see Chgangelog
8#
9# [Version 2.3.0] Apr 20 2000
10# Modified by SAGAMI <sagami@pc.highway.ne.jp>
11# - renewed srpm checking process
12# - renewed RPMDIR checking precess
13# - and more...
14#
15# [Version 2.2.5] Mar 3 2000
16# Modified by Jun Nishii <jun@vinelinux.org>
17# - bug fix: set ARCH as i386 (i586 does not make pcmcia now)
18#
19# [Version 2.2.4] Feb 29 2000
20# Modified by Jun Nishii <jun@vinelinux.org>
21# - fix a small bug: patch from Shoji Matsumoto
22#
23# [Version 2.2.3] Feb 29 2000
24# Modified by Jun Nishii <jun@vinelinux.org>
25# - mkkpkg-2.2.3
26# - fix a bug and typo by Toru Sagami, thanks.
27#
28# [Version 2.2.2] Feb 25 2000
29# Modified by Jun Nishii <jun@vinelinux.org>
30# - fix a bug: wrong path for SRPMS
31#
32# [Version 2.2.1] Feb 25 2000
33# Modified by Jun Nishii <jun@vinelinux.org>
34# - fix a bug: lost definition of RPMRC
35#
36# [Version 2.2] Feb 24 2000
37# Modified by SAGAMI <sagami@pc.highway.ne.jp>
38# - fixed some bugs
39#   - 2.1 exits -1 in anyways :-p
40#   - BUILDMODE -> RPMBUILDMODE
41#   - Some ENV value needs {,}?
42#   - RPMDIR sometimes NULL
43# - moved /usr/bin/mkkpkg to /usr/sbin/mkkpkg
44# - tweaken, using --showrc --rmspec
45# - dont include packager tag in new spec file, because rpm will include it
46#   if defined in rpmmacros
47# - awk ARGV problems in parser
48#
49# [Version 2.1] Jan 30 2000
50# Modified by Jun Nishii <jun@vinelinux.org>
51# - merge patch from SAGAMI <sagami@pc.highway.ne.jp>
52#      + bug fix for processing .rpmmacros
53#      + use --target
54#      + added Packager, Vendor, Distribution in new spec file
55#      + --clean, --rmsource
56#      + use new revision number for new spec file name
57#      + modify messages
58# - clean up script
59#
60# [Version 2.0]
61# Modified by Jun Nishii <jun@vinelinux.org> Jan 10 2000
62# - use parsespec to remove smp, BOOT, BOOTsmp entry
63#
64# Modified by Yasuhide OOMORI <dasen@typhoon.co.jp>
65# - Quick hack about rpmdir.
66# - Modified for mistyping of new revision:
67#     -- remove control character
68# - Modified to quickly make one kernel:
69#     -- no compile for smp or BOOT kernel.
70#
71# [Verion 1.0]
72# Written by MATSUMOTO Shoji <vine@flatout.org>
73# This script must be distributed by Project Vine <Vine@vinelinux.org>.
74# The responsibility of any trouble with this script is on you.
75#
76############################################################
77
78MKKPKGVERSION=2.5.2
79CMDNAME=`basename $0`
80RETVAL=0
81
82############################################################
83### some functions
84
85showUsage(){
86        echo "$CMDNAME: make new configured kernel package from kernel-xx-xx.src.rpm"
87        echo "usage: $CMDNAME [-v] <sourcepackage> [config|menuconfig|xconfig]"
88        echo "Try \`$CMDNAME --help' for more"
89}
90
91showHelp(){
92echo "$CMDNAME:"
93echo "  make new configured kernel package from kernel SRPM."
94echo ""
95echo "  usage:"
96echo "  $CMDNAME --version     : show version and exit"
97echo "  $CMDNAME --help        : print this message and exit"
98echo ""
99echo "  $CMDNAME [-v] <sourcepackage> [config|menuconfig|xconfig] [...]"
100echo "    [-v|--verbose]     : be a little verbose"
101echo "    <sourcepackage>    : kernel SOURCE RPM (SRPM) to use"
102echo "    [config]           : execute \`make config'"
103echo "    [menuconfig]       : execute \`make menuconfig' (default)"
104echo "    [xconfig]          : execute \`make xconfig'"
105echo "    [gconfig]          : execute \`make gconfig' (for 2.6.x)"
106echo "    [--release=RELEASE]: RELEASE for user's release number"
107echo "    [--buildmode=MODE] : rpm build mode MODE [-ba|-bb]"
108echo "    [--rpmarg=RPMARG]  : additional rpm arguments RPMARG for building"
109echo "    [--english]        : show Configure.help in English (if available)"
110echo "    [--tmpdir=TMPDIR]  : directory to which log message goes"
111echo "    [--output=FILENAME]: log message to FILENAME in TMPDIR"
112#echo "    [--fetch]          : fetch SRPM via apt-get"
113#echo "    [--disable-edit]   : disable to edit SPEC file with EDITOR"
114echo "    [--target=ARCH]    : build target architecture ARCH"
115echo "    [--enable-smp]     : create smp/BOOT packages as well"
116#echo "    [--fast]           : build rpm without \"nice\""
117#echo "    [--fastest]        : build rpm with \"nice --19\" (root privileged)"
118#echo "    [--devel]          : assuming --smp --fast --verbose..."
119#echo "    [--rebuild]        : just rebuild SRPM (what for?)"
120echo ""
121}
122
123showbuildnotice(){
124if [ $QUIET != "true" ] ; then
125echo ""
126echo "  Log output goes to $TMPDIR/$LOGFILE."
127echo "  You can read it by following sequence:"
128echo "    1. Push \"Ctrl+Z\" to suspend the next long process"
129echo "    2. Type \"bg\" to continue background"
130echo "    3. Use \"less\" to print $TMPDIR/$LOGFILE"
131echo "    3.1 Push \"Shift+F\" to \"Forward forever; like tail -f\""
132echo "    3.2 If you want to stop reading, Push \"Ctrl+C\""
133echo "    4. Type \"fg\" to get back to $CMDNAME"
134echo "    X. If you are using X, you can read log thru another term window"
135echo ""
136echo "  It takes about 10-240 minutes depending on your configuration and also"
137echo -e "  depending on your machine: It's \\033[1;31mnot freezing!\\033[0;39m"
138echo ""
139echo "Ready for Action?"
140fi
141}
142
143checkDir(){
144if [ ! -d $1 ] ; then
145        echo "directory not found: $1"
146        return 1
147elif [ ! -w $1 ] ; then
148        echo "permission denied: $1"
149        return 1
150fi
151return 0
152}
153
154checkFile(){
155if [ ! -f $1 ] ; then
156        echo "file not found: $1"
157        return 1
158fi
159return 0
160}
161
162#rpm3var () {
163#       var=`rpm --showrc | sed -e "s/%{name}/$NAME/" \
164#        | awk "/-[0-9]+[:=][[:blank:]]+$1[[:blank:]]/ {print \\$3}"`
165#       while test -n "`echo $var | egrep '%\{[_a-zA-Z]+\}'`"; do
166#               v=`echo $var | sed 's/.*%{\([_a-zA-Z]\+\)}.*/\1/'`
167#               w="`rpm3var $v`"
168#               var=`echo $var | sed "s,%{\\([_a-zA-Z]\\+\\)},$w,g"`
169#       done
170#       echo $var
171#}
172rpm3var () {
173        var=$(rpm --eval "%$1" | sed -e "s|%{name}|$NAME|" -e "s|\${HOME}|$HOME|")
174        echo $var
175}
176
177
178getrpmmacro () {
179        macro=`rpm --showrc | grep ^.*[0-9][:=][[:space:]]"$1" \
180         | sed "s/^.*$1[[:space:]]//"`
181        echo $macro
182}
183
184askyesno () {
185        yesno=""
186        while [ -z "$yesno" ] ; do
187        echo -n "$1 [y/n] "
188        read yesno
189        yesno=`echo $yesno | tr -d '[:cntrl:]' | tr '[:upper:]' '[:lower:]'`
190        [ "$yesno" = "y" ] && return 1
191        [ "$yesno" = "n" ] && return 0
192        yesno=""
193        done
194}
195
196checkTMPdir () {
197        if [ -f $TMPDIR/$LOGFILE ] ; then
198        echo "$CMDNAME found: $TMPDIR/$LOGFILE"
199        LANG=C ls -l $TMPDIR/$LOGFILE
200        echo ""
201        echo "The log might be that of previous attempt, but we don't override it"
202        echo "even if you are root or owner. Delete it and try again. Also check if"
203        echo "someone else (including you) is running $CMDNAME."
204        exit -1
205        fi
206return 0
207}
208
209listbuilddir (){
210        find $1 -maxdepth 1 -type d -printf "%f\n" >$2
211}
212
213rpmqueryformat(){
214        rpm -qp $1 --queryformat "%{$2}" 2>/dev/null
215}
216############################################################
217### runtime environment
218LANGUAGE=
219
220############################################################
221### process arguments
222
223MARCH=`uname -m`
224case "$MARCH" in
225        *86)    ARCH=i686 ;;
226        x86_64) ARCH=x86_64 ;;
227        *)      ARCH=$MARCH ;;
228esac
229# ARCH=`uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/`
230
231TMPDIR=${TMPDIR:=/tmp}
232DISTRIBUTION=${DISTRIBUTION:-Local}
233LOGFILE=kernel-mkkpkg.log
234CONFMETHOD=menuconfig
235MESG=true
236QUIET=echo
237NICE=nice
238CONFIGURED=
239HELP=
240SMP=
241
242############################################################
243
244while [ $# -gt 0 ] ; do
245        case "$1" in
246        ####### experts only #######
247        # Yes, SMP actually means that we(who?) also build BOOT/mol packages.
248        --clean)
249                CLEAN="1" ;;
250        --noclean)
251                CLEAN="" ;;
252        --devel|--develo|--develop)
253                DEVEL="1"
254                # assuming --fast --smp --verbose --eng
255                { NICE="" ; SMP="1" ; MESG=echo ; HELP=en ; }
256        #DATE=`date +'%Y%m%d%I%M'`
257                #LOGFILE="kernel-mkkpkg-"${DATE}.log
258                ;;
259        --disable-smp|--without-smp|--nosmp|--smp=n*)
260                SMP="" ;;
261        --noenv|--noenvc|--noenvch|--noenvche|--noenvchec|--noenvcheck)
262                NOENVCHEKCK="1" ;;
263        --enable-smp|--with-smp|--smp|--smp=y*)
264                # SMP other than == 1 have no meanings
265                SMP="1" ;;
266        --fast|--disable-nice|--without-nice)
267                NICE="" ;;
268        --fastest)
269                NICE=""
270                [ "`id -u`" = "0" ] && NICE="nice --19"
271                ;;
272        --reb|--rebu|--rebui|--rebuil|--rebuild)
273                CONFMETHOD=[none]
274                REBUILD="1" ;;
275        ####### experts only #######
276        ####### experimental #######
277        --apt-get|--aptget|--fetch)
278                if [ -x ${APTGET:=/usr/bin/apt-get} ] ; then
279                        FETCH="LC_MESSAGES=C $APTGET -qq source kernel"
280                        FETCHFILE=`eval $FETCH --no-act | awk '{print $3}'`
281                        if [ ! -z "$FETCHFILE" ] ; then
282                                $QUIET "fetching source file $FETCHFILE via apt-get..."
283                                eval $FETCH
284                                if [ $? -ne 0 ] ; then
285                                        $QUIET "fetching source file via apt-get faild."
286                                else
287                                        $QUIET "fetched $FETCHFILE"
288                                        [ -f "$FETCHFILE" ] || $QUIET ", but not found"
289                                fi
290                        else
291                                $QUIET "fetching source file via apt-get failed."
292                        fi
293                        [ -f "$FETCHFILE" ] && SRPM=$FETCHFILE
294                fi
295                ;;
296        ####### experimental #######
297        --arg=*|--rpmarg=*)
298                RPMARG=`echo $1 | sed 's/.*=//'`
299                [ "$RPMARG" = "--nobuild" -o "$RPMARG" = "--test" ] && RPMARG=""
300                ;;
301        --edit|--enable-edit)
302                EDIT=y ;;
303        --noedit|--disable-edit)
304                EDIT="n" ;;
305        --en|--eng|--english)
306                HELP=en ;;
307        --ja|--jp|--japan|--japanese)
308                HELP=ja ;;
309        -h|--h|--he|--hel|--help)
310                showHelp && exit 0 ;;
311        --mode=*|--buildmode=*|--rpmbuildmode=*)
312                RPMBUILDMODE=`echo $1 | sed 's/.*=//'`
313                case "$RPMBUILDMODE" in
314                        --rebuild|rebuild) REBUILD="1" ;;
315                        -bs|bs|-ba|ba) RPMBUILDMODE="-ba" ;;
316                        -bb|bb) RPMBUILDMODE="-bb" ;;
317#                       -bc|bc) RPMBUILDMODE="-bc" ;;
318#                       -bi|bi) RPMBUILDMODE="-bi" ;;
319                        *) RPMBUILDMODE="" ;;
320                esac
321                ;;
322        --output=*)
323                LOGFILE=`echo $1 | sed 's/.*=//' | xargs basename`
324                ;;
325        --q|--qu|--qui|--quie|--quiet|--silent)
326                QUIET=true
327                MESG=true
328                ;;
329        --rel=*|--release=*|--rev=*|--revision=*)
330                NREV=`echo $1 | sed 's/.*=//' | sed -e 's/.*smp.*//' -e 's/.*mol.*//'`
331                ;;
332        --skip|--skipconfig|--skip-config|--config=skip)
333                CONFIGURED=y
334                CONFMETHOD=[skipped]
335                ;;
336        --specfile=*)
337                SPEC=`echo $1 | sed 's/.*=//'`
338                if [ ! -f "$SPEC" ] ; then
339                        echo "$CMDNAME: missing SPECFILE $SPEC" && exit 1
340                fi
341                SRPMDIR=`rpm3var _srcrpmdir`
342                NVR=`rpm -q --specfile $SPEC \
343                        --qf '%{NAME}-%{VERSION}-%{RELEASE}\n' | head -1`
344                if [ -z "$NVR" ] ; then
345                        echo "$CMDNAME: failed to query $SPEC"
346                        exit 1
347                fi
348                rpmbuild -bs $SPEC >/dev/null 2>&1
349                if [ $? -ne 0 ] ; then
350                        echo "$CMDNAME: failed to build $SPEC"
351                        exit 1
352                fi
353                SRPM="${SRPMDIR}/${NVR}.src.rpm"
354                if [ ! -f "$SRPM" ] ; then
355                        echo "$CMDNAME: missing SRPM $SRPM"
356                        exit 1
357                fi
358                [ -z "$RPMBUILDMODE" ] && RPMBUILDMODE="-ba"
359                ;;
360        --target=*|--target|--arch=*)
361                ARCH=`echo $1 | sed 's/.*=//' | sed 's/.*noarch.*//'`
362                if [ "$1" = "--target" -a ! -f "$2" ] ; then
363                        ARCH=`echo $2 | sed 's/.*=//' | sed 's/.*noarch.*//'`
364                fi
365                COMPAT=`LANG=C rpm --showrc | grep "^compatible build archs:" | \
366                  sed 's/compatible build archs://'`
367                MATCHED=""
368                for i in $COMPAT ; do
369                        [ "$ARCH" = "$i" ] && MATCHED="y"
370                done
371                [ ! "$MATCHED" = "y" ] && ARCH=""
372                [ "$1" = "--target" -a -n "$ARCH" ] && shift
373                ;;
374        --tmpdir=*|--tmp=*)
375                TMPDIR=`echo $1 | sed 's/.*=//'`
376                if [ ! -d "$TMPDIR" -o ! -w "$TMPDIR" ] ; then
377                        echo "$CMDNAME: can't write in $TMPDIR" && exit 1
378                fi
379                ;;
380        --config|config)
381                CONFMETHOD=config ;;
382        --old|--oldconfig|oldconfig)
383                CONFMETHOD=oldconfig ;;
384        --menu|--menuconfig|menuconfig)
385                CONFMETHOD=menuconfig ;;
386        --xconfig|--Xconfig|xconfig|Xconfig)
387                CONFMETHOD=xconfig
388                [ -z "$DISPLAY" ] && CONFMETHOD=menuconfig
389                ;;
390        --gconfig|gconfig)
391                CONFMETHOD=gconfig
392                [ -z "$DISPLAY" ] && CONFMETHOD=menuconfig
393                ;;
394        -v|--verb|--verbo|--verbos|--verbose)
395                MESG=echo
396                QUIET=echo
397                ;;
398        --vers|--versi|--versio|--version)
399                echo "$CMDNAME: version $MKKPKGVERSION"
400                exit 0
401                ;;
402        *)
403                [ -f $1 ] && SRPM=$1
404                if [ -z "$SRPM" ] ; then
405                echo "$CMDNAME error: invalid option $1"
406                showUsage && exit 1
407                fi
408                ;;
409        esac
410        shift
411done
412
413# with no arguments
414if [ -z "$SRPM" ] ; then
415        showUsage && exit
416fi
417
418############################################################
419# Print first banner. Can you read?
420# 34 blue 32 green 35 purple 31 red 33 yellow
421$MESG -e "\\033[1;34m$CMDNAME\\033[0;39m verbose mode"
422$MESG "$CMDNAME will execute \"make $CONFMETHOD\""
423
424############################################################
425## check SRPM and get KVER KREV from it
426
427# checking its signiture...
428rpm -K $SRPM >/dev/null
429if [ $? -ne 0 ] ; then
430        echo "`basename $SRPM`: didn't pass \"rpm -K\""
431        exit -1
432fi
433
434# checking if it's srpm...
435if [ "`file -L $SRPM | cut -d" " -f4`" != "src" ] ; then
436        echo "`basename $SRPM`: does not appear to be src rpm"
437        exit -1
438fi
439
440NAME=`rpmqueryformat $SRPM NAME`
441KVER=`rpmqueryformat $SRPM VERSION`
442KREV=`rpmqueryformat $SRPM RELEASE`
443SRPMNAME=${NAME}-${KVER}-${KREV}
444#SRPMNAME=`file -L $SRPM | cut -d" " -f6`
445
446############################################################
447## rebuild SRPM and exit (experts only)
448## do nothing other than rebuild: what for? -- It's for logged and timed.
449
450if [ "$REBUILD" = "1" ] ; then
451        LOGFILE=kernel-$KVER-$KREV-$ARCH.log
452        $QUIET "`LANG=C date '+%c'`"
453        $QUIET -n "$CMDNAME: rebuilding `basename $SRPM` for $ARCH..."
454        KSTARTTIME=`LANG=C date '+%s'`
455        eval LANG=C $NICE rpmbuild --rebuild $SRPM --target $ARCH $RPMARG \
456         >$TMPDIR/$LOGFILE 2>&1
457        RETVAL=$?
458        $QUIET "exit $RETVAL"
459        KENDTIME=`LANG=C date '+%s'`
460        BUILDLAPSE=`expr $KENDTIME - $KSTARTTIME`
461        $QUIET "Lapse: `expr $BUILDLAPSE / 60` min `expr $BUILDLAPSE % 60` sec" \
462        | tee -a $TMPDIR/$LOGFILE
463        gzip --force --best --quiet $TMPDIR/$LOGFILE
464        exit $RETVAL
465fi
466
467############################################################
468## set and check RPMDIR
469
470PACKAGER=`getrpmmacro packager`
471[ -z "$PACKAGER" ] && PACKAGER="$(whoami) <$(whoami)@$(hostname)>"
472TOPDIR=`rpm3var _topdir`
473BUILDDIR=`rpm3var _builddir`
474RPMDIR=`rpm3var _rpmdir`
475SPECDIR=`rpm3var _specdir`
476SRCDIR=`rpm3var _sourcedir`
477SRPMDIR=`rpm3var _srcrpmdir`
478
479if [ "$NOENVCHEKCK" != "1" ] ;then
480for dir in $TOPDIR $BUILDDIR $RPMDIR $SPECDIR \
481        $SRCDIR $SRPMDIR $RPMDIR/${ARCH}; do
482        checkDir $dir || {
483                mkdir -p $dir || exit -1
484        }
485done
486#checkDir $RPMDIR/noarch || exit -1
487$MESG Using rpmdir: $TOPDIR
488fi
489
490############################################################
491# checking if it's kernel and version is supported
492
493case "$NAME" in
494        kernel30|kernel26) # random guess (will be examined later)
495                BUILDLINUXDIR=${BUILDDIR}/${NAME}-${KVER}/linux-${KVER} ;;
496        kernel25) # random guess (will be examined later)
497                BUILDLINUXDIR=${BUILDDIR}/${NAME}-${KVER}/linux ;;
498        kernel24) # support for 2.4.x
499                BUILDLINUXDIR=${BUILDDIR}/linux-${KVER} ;;
500        kernel22) # random guess (will be examined later)
501                BUILDLINUXDIR=${BUILDDIR}/linux ;;
502        kernel)
503                case "$KVER" in
504                2.6*|3.*) # support for 2.6.x/3.x
505                        BUILDLINUXDIR=${BUILDDIR}/${NAME}-${KVER}/linux-${KVER} ;;
506                2.4*) # support for 2.4.x
507                        BUILDLINUXDIR=${BUILDDIR}/linux-${KVER} ;;
508                2.2*) # as of 2.2.17, it is OK.
509                        BUILDLINUXDIR=${BUILDDIR}/linux ;;
510                *)
511                        echo "`basename $SRPM`: version $KVER package is not supported"
512                        BUILDLINUXDIR=${BUILDDIR}/${NAME}-${KVER}/linux
513                        echo "try to detect \"linux\" directory to build..."
514                        ;;
515                esac
516                ;;
517        *)
518                echo "`basename $SRPM`: does not appear to be kernel package"
519                exit -1
520                ;;
521esac
522$MESG Using buildlinuxdir: $BUILDLINUXDIR
523
524
525############################################################
526## extract file names from SRPM
527
528# first $TMPFILE is made here
529TMPFILE=`mktemp $TMPDIR/$CMDNAME.XXXXXX` || \
530        { echo "could not create temporary file" ; exit 1 ; }
531rpm -qlp $SRPM >$TMPFILE
532SPEC="$SPECDIR/`grep '.spec$' $TMPFILE`"
533KCFG="`grep \"$ARCH.config\" $TMPFILE | tail -1`"
534
535# this is unusual, almost impossible
536if [ -z "$SPEC" ] ; then
537        echo "can't find SPEC file"
538        rm -f $TMPFILE && exit -1
539fi
540
541# as for now, srpm must have "$ARCH.config"
542if [ -z "$KCFG" ] ; then
543        echo "can't find default configuration file for $ARCH"
544        rm -f $TMPFILE && exit -1
545fi
546
547$MESG Using SPEC file: $SPEC
548$MESG Using kernel config file: $KCFG
549
550############################################################
551## install SRPM: "rpm -i" by root is thought to be a hole...
552
553$MESG "Executing \"rpm -ivh $SRPM\""
554rpm -ivh $SRPM >/dev/null 2>&1
555sync && sleep 1
556
557# checking files in source dir not only for nosrc, but also for src
558if [ "$NOENVCHEKCK" != "1" ] ;then
559$MESG -n "Checking files in SOURCES..."
560for file in `cat $TMPFILE | grep -v '\.spec$'` ; do
561        checkFile $SRCDIR/$file
562        if [ $? -ne 0 ] ; then
563                echo "It must be placed in or symbolic linked from ${SRCDIR}"
564                rm -f $TMPFILE && exit -1
565        fi
566done
567$MESG "done."
568fi
569
570# first $TMPFILE is removed here
571rm -f $TMPFILE
572
573############################################################
574## before expand SRPM: it costs a while and overrides BUILD
575## check if exists kernel-mkkpkg.log ($LOGFILE)
576## perhaps someone else is running mkkpkg, really?
577
578checkTMPdir
579
580############################################################
581## expand SRPM and find BUILDLINUXDIR (kind of ugly...)
582
583# print second -for "panpie"- banner
584if [ "$MESG" != "echo" ] ; then
585        $QUIET -e "Welcome to \\033[1;35m$CMDNAME\\033[0;39m"
586        $QUIET "" && sleep 1
587fi
588$QUIET "Please wait for a while \"make $CONFMETHOD\" to be executed..."
589
590# first, we clean up existing BUILDLINUXDIR (if any) by executing -bs
591mkdir -p $SRPMDIR/.${CMDNAME}.tmp
592rpmbuild -bs --clean $SPEC --define "_srcrpmdir $SRPMDIR/.${CMDNAME}.tmp" >/dev/null 2>&1
593rm -rf $SRPMDIR/.${CMDNAME}.tmp
594TMPPRE=`mktemp $TMPDIR/$CMDNAME.XXXXXX` || \
595        { echo "could not create temporary file" ; exit 1 ; }
596listbuilddir $BUILDDIR $TMPPRE
597
598# then, we expand
599$QUIET -n "Executing \"rpmbuild -bp $SPEC\"..."
600if ! rpmbuild -bp $SPEC >/dev/null 2>&1 ; then
601        echo "" && echo "Failed to expand sources/patches."
602        rm -f $TMPPRE && exit -1
603else
604        sync && sleep 3
605fi
606$QUIET "done."
607
608# afterwards, we examine and detect buildlinuxdir
609TMPPOST=`mktemp $TMPDIR/$CMDNAME.XXXXXX` || \
610        { echo "could not create temporary file" ; exit 1 ; }
611listbuilddir $BUILDDIR $TMPPOST
612TMPDIFF=`mktemp $TMPDIR/$CMDNAME.XXXXXX` || \
613        { echo "could not create temporary file" ; exit 1 ; }
614diff -B $TMPPRE $TMPPOST | grep "^> " | sed 's,^> ,,' >$TMPDIFF
615rm -f $TMPPRE $TMPPOST
616
617$MESG -n "Examining and detecting buildlinuxdir..."
618if [ ! -d "$BUILDLINUXDIR" ] ; then
619        BUILDLINUXDIR=""
620        for i in `cat $TMPDIFF` ; do
621                # kernel-2.2
622                if [ "$i" = "linux" -a -d "$BUILDDIR/linux" ] ; then
623                        BUILDLINUXDIR="$BUILDDIR/linux"
624                # kernel-2.4
625                elif [ -d "$BUILDDIR/$i/linux" ] ; then
626                        BUILDLINUXDIR="$BUILDDIR/$i/linux"
627                fi
628        done
629        if [ -z "$BUILDLINUXDIR" ] ; then
630                echo "Can't detect RPM_BUILD_ROOT/linux directory"
631                rm -f $TMPDIFF && exit -1
632        fi
633fi
634$MESG "done."
635$MESG Using buildlinuxdir: $BUILDLINUXDIR
636rm -f $TMPDIFF
637
638############################################################
639## get release(revision) number
640
641while [ "$NREV" = "" ] ; do
642        echo -n "Input your kernel Revision [SRPM = $KREV]: "
643        read NREV
644
645        # remove control character in string
646        # string "smp" is bad thing for kernel-headers and /boot/kernel.h
647        NREV=`echo $NREV | tr -d '[:cntrl:]' | sed 's/.*smp.*//'`
648
649        if [ -f ${RPMDIR}/${ARCH}/kernel-${KVER}-${NREV}.${ARCH}.rpm ] ; then
650                echo "${RPMDIR}/${ARCH}/kernel-${KVER}-${NREV}.${ARCH}.rpm found."
651                askyesno "  Override?"
652                [ $? = 0 ] && NREV=""
653        elif [ "${KVER}-${NREV}" = "`uname -r`" ] ; then
654                echo "${KVER}-${NREV} is same as currently running."
655                askyesno "  Override?"
656                [ $? = 0 ] && NREV=""
657        # Confirmation of kernel release(revision)
658        elif [ -n "$NREV" ] ; then
659                askyesno "  kernel Revision [yours = $NREV]. OK?"
660                [ $? = 0 ] && NREV=""
661        fi
662done
663
664############################################################
665## make spec file
666
667NSPEC=${SPECDIR}/kernel-${KVER}-${NREV}.spec
668if [ "$NSPEC" = "$SPEC" ] ; then
669        mv -f $SPEC ${SPEC}.${CMDNAME}
670        SPEC=${SPEC}.${CMDNAME}
671fi
672
673### poor spec type detection (new type has build* macros)
674newtypespec=""
675for i in buildsmp buildBOOT buildenterprise ; do
676        grep -q "^[[:space:]]*%define[[:space:]]$i" $SPEC && newtypespec="1"
677done
678
679if [ "$SMP" = "1" -o "$newtypespec" = "1" ] ; then
680        [ ! "$SMP" = "1" ] && SMP="0"
681        cp -f $SPEC $NSPEC
682        TMPOUT=`mktemp $TMPDIR/.specout.XXXXXX` || \
683                { echo "could not create temporary file" ; exit 1 ; }
684
685        # we leave buildenterprise as it is (might be 0 by default)
686        # for i in buildsmp buildBOOT buildmol buildenterprise; do
687        for i in buildsmp buildBOOT buildmol ; do
688        sed -e "s/^[[:space:]]*\(%define[[:space:]]$i\).*/\1 $SMP/" < $NSPEC > $TMPOUT
689        mv -f $TMPOUT $NSPEC
690        done
691
692else
693        # oldtype without smp (default)
694        PARSESPEC=/usr/share/mkkpkg/parsespec
695        if [ ! -x $PARSESPEC ] ; then
696                echo "can't execute: $PARSESPEC" && exit -1
697        fi
698        $PARSESPEC $SPEC > $NSPEC
699fi
700
701if [ ! "$DEVEL" = "1" ] ; then
702        # common substitution
703        TMPOUT=`mktemp $TMPDIR/.specout.XXXXXX` || \
704                { echo "could not create temporary file" ; exit 1 ; }
705        sed -e "s/^Release.*/Release: $NREV/" \
706         -e "s/^Vendor.*/Vendor: mkkpkg ($SRPMNAME)/" \
707         -e "s/^Distribution.*/Distribution: $DISTRIBUTION/" \
708         -e "s/^Packager.*/Packager: $PACKAGER/" < $NSPEC >$TMPOUT
709        mv -f $TMPOUT $NSPEC
710else
711        # we do not want filename and tags above to be changed!
712        mv -f $NSPEC $SPEC
713        NSPEC=$SPEC
714fi
715
716$MESG "created new SPEC file: " $NSPEC
717$MESG "  from \"Release: $KREV\" to \"Release: $NREV\""
718# dont rm -f $SPEC now
719
720############################################################
721## run editor
722
723$QUIET "" && sleep 1
724cp -f $NSPEC $NSPEC.$$
725
726if [ ! "$EDIT" = "y" -a ! "$EDIT" = "n" ] ; then
727        askyesno "Do you want to edit `basename $NSPEC`?"
728        [ $? = 1 ] && EDIT="y"
729fi
730
731while [ "$EDIT" = "y" ] ; do
732        echo -n "Push \"enter\" to edit SPEC file [${EDITOR:=vi}]: "
733        read TMPEDITOR
734        [ "$TMPEDITOR" ] && EDITOR=$TMPEDITOR
735        $EDITOR $NSPEC \
736                || { echo "can't start editor. Continue..." ; EDITOR="" ; }
737        askyesno "Have you finished editting `basename $NSPEC`?"
738        [ $? = 1 ] && EDIT=""
739done
740
741if ! diff -bB $NSPEC.$$ $NSPEC >/dev/null ; then
742        echo "detected modified SPEC file"
743        rpm -q --specfile $NSPEC >/dev/null
744        if [ $? -ne 0 ] ; then
745                echo "You made a mistake while editing $NSPEC"
746                rm -f $NSPEC.$$ && exit -1
747        fi
748        UREV="`rpm -q --queryformat "%{RELEASE}\n" --specfile $NSPEC | uniq`"
749        UVER="`rpm -q --queryformat "%{VERSION}\n" --specfile $NSPEC | uniq`"
750        if [ "$UREV" != "$NREV" ] ; then
751                echo "Change detected after edit:"
752                UREV=`echo $UREV | sed 's/.*smp.*//'`
753                if [ -z "$UREV" ] ; then
754                        echo "$CMDNAME error: still \"smp\" string in RELEASE."
755                        rm -f $NSPEC.$$ && exit -1
756                fi
757                echo "  from \"Release: $NREV\" to \"Release: $UREV\""
758                NREV=$UREV
759        fi
760        # BTW, how come you persist in using mkkpkg?
761        if [ "$UVER" != "$KVER" ] ; then
762                echo "  from \"Version: $KVER\" to \"Version: $UVER\""
763                KVER=$UVER
764        fi
765
766        askyesno "Do you want to re-expand sources/patches with new SPEC file?"
767        if [ $? = 1 ] ; then
768                echo "Executing \"rpmbuild -bp $NSPEC\""
769                TMPOUT=`mktemp $TMPDIR/${CMDNAME}-expand.XXXXXX` || \
770                        { echo "could not create temporary file" ; exit 1 ; }
771                if rpmbuild -bp $NSPEC >$TMPOUT 2>&1 ; then
772                        sync && sleep 3
773                        echo "Succeeded in expanding sources/patches."
774                        rm -f $TMPOUT
775                else
776                        echo "Failed to expand sources/patches."
777                        echo "See $TMPOUT."
778                        rm -f $NSPEC.$$ && exit -1
779                fi
780        fi
781fi
782rm -f $NSPEC.$$
783[ "$NSPEC" != "$SPEC" ] && rm -f $SPEC
784############################################################
785## asking whether to build srpm
786
787if [ -z "$RPMBUILDMODE" ] ; then
788        askyesno "Do you want to build SRPM? (If no, only RPMs are built)"
789        if [ $? = 1 ] ; then
790                RPMBUILDMODE="-ba"
791                $MESG "  OK, SRPM and RPMs will be built."
792        else
793                RPMBUILDMODE="-bb"
794                $MESG "  OK, only RPMs will be built."
795        fi
796fi
797
798############################################################
799## now make config
800
801checkDir $BUILDLINUXDIR || exit -1
802
803if [ "$HELP" = "en" ] ; then
804if [ "$NOENVCHEKCK" != "1" ] ;then
805        if [ -L $BUILDLINUXDIR/Documentation/Configure.help \
806           -a -f $BUILDLINUXDIR/Documentation/Configure.help.en ] ; then
807        pushd $BUILDLINUXDIR/linux/Documentation >/dev/null 2>&1
808        $MESG "Using Configure.help.en ..."
809        ln -sf Configure.help.en Configure.help
810        popd >/dev/null 2>&1
811        fi
812fi
813fi
814
815# make sure EXTRAVERSION says what we want it to say, but...
816perl -pi -e "s/^EXTRAVERSION.*/EXTRAVERSION = -${NREV}/" \
817 $BUILDLINUXDIR/Makefile || :
818
819if [ "$SMP" = "1" ] ; then
820        if [ ! "$ARCH" = "ppc" ] ; then
821        CONFFILE="`set +f; echo $BUILDLINUXDIR/configs/{*-$ARCH,*-$ARCH-smp,*-$ARCH-BOOT}.config`"
822        else
823        CONFFILE="`set +f; echo $BUILDLINUXDIR/configs/{*-$ARCH,*-$ARCH-smp,*-$ARCH-mol,*-$ARCH-BOOT}.config`"
824        fi
825else
826        CONFFILE="`set +f; echo $BUILDLINUXDIR/configs/*-$ARCH.config`"
827fi
828
829while [ -z "$CONFIGURED" ] ; do
830        for file in $CONFFILE ; do
831                if [ -f $file ] ; then
832                        KCFG=`basename $file`
833                        $MESG "Copying $KCFG into source tree for $ARCH"
834                        cp -f $file $BUILDLINUXDIR/.config
835                elif [ "$SMP" != "1" ] ; then
836                        # Could this sentence be evalueted?!
837                        $MESG "Missing?! `basename $file`, using default?!"
838                else
839                        $MESG -n "Ignoring... "
840                        $MESG "`basename $file` seems to be BOOT on non-base architecture"
841                        KCFG=""
842                fi
843
844                if [ -n "$KCFG" ] ; then
845                        echo "Ready for make \"$CONFMETHOD\" by $KCFG"
846                        echo -n "[Push enter to continue] "
847                        read
848                        make -s $CONFMETHOD -C $BUILDLINUXDIR
849                        if [ $? -ne 0 ] ; then
850                        askyesno "Something wrong with \"make $CONFMETHOD\". Continue?"
851                                [ $? = 0 ] && exit -1
852                        fi
853                        checkFile $BUILDLINUXDIR/.config || \
854                                { echo "$BUILDLINUXDIR/.config is missing " ; exit -1 ; }
855                        ## leaving original and user-configured .configs in SOURCES
856                        $MESG "mv $SRCDIR/${KCFG}{,.mkkpkg}"
857                        mv -f $SRCDIR/${KCFG}{,.mkkpkg}
858                        $MESG "Copying .config into $SRCDIR/${KCFG}"
859                        ## ad-hoc fix (20050621)
860                        case "$ARCH" in
861                            *86) echo "# i386"    > $SRCDIR/${KCFG} ;;
862                            ppc) echo "# powerpc" > $SRCDIR/${KCFG} ;;
863                            *)  echo "# $ARCH"    > $SRCDIR/${KCFG} ;;
864                        esac
865                        cat $BUILDLINUXDIR/.config >> $SRCDIR/${KCFG}
866                        ## cp -f $BUILDLINUXDIR/.config $SRCDIR/${KCFG}
867                fi
868        echo "" && sleep 1
869        done
870        CONFIGURED="y"
871done
872
873# it will create these binaries, but some of them are only for base arch.
874TMPFILE=`mktemp $TMPDIR/$CMDNAME.XXXXXX` || \
875        { echo "could not create temporary file" ; exit 1 ; }
876rpm -q --specfile $NSPEC | sed "s/$/\.$ARCH\.rpm/g" | sort > $TMPFILE
877
878############################################################
879## now build rpm package
880
881## test $RPMARG
882if [ -n "$RPMARG" ] ; then
883        if ! rpmbuild -bp $NSPEC --target=$ARCH $RPMARG --nobuild >/dev/null 2>&1
884        then
885                RPMARG=""
886        fi
887fi
888
889RPMBUILDCMD="rpmbuild $RPMBUILDMODE $NSPEC --target=$ARCH $RPMARG >$TMPDIR/$LOGFILE 2>&1"
890ADDITIONALFLAGS="smp=$SMP build=${NICE:-fast}"
891
892# output lines should be less than 24 lines.
893clear
894if [ $QUIET != "true" ] ;then
895echo ""
896echo -e "\\033[1;32m$CMDNAME\\033[0;39m"
897echo ""
898echo "Now we are prepared for executing:"
899echo "  rpmbuild $RPMBUILDMODE $NSPEC --target=$ARCH $RPMARG"
900fi
901
902if [ ! "$DEVEL" = "1" ] ; then
903        [ "$SMP" = "1" -o ! "$NICE" = "nice" ] && echo "With: $ADDITIONALFLAGS"
904        showbuildnotice
905        echo -n "[Push enter to continue] "
906        read
907fi
908$QUIET "Started: `LANG=C date '+%c'`"
909echo -n "Building..."
910
911## Build
912KSTARTTIME=`LANG=C date '+%s'`
913if checkTMPdir ; then
914        eval $NICE $RPMBUILDCMD
915        RETVAL=$?
916fi
917
918############################################################
919## check return value and whether package are made
920
921KENDTIME=`LANG=C date '+%s'`
922BUILDLAPSE=`expr $KENDTIME - $KSTARTTIME`
923
924# echo "EXIT $RETVAL" | mail -s "$COMNAME finised on `hostname`" `whoami`
925
926if [ $RETVAL -ne 0 ] ; then
927        echo "" && echo "Errored: `LANG=C date '+%c'`"
928        echo -n "[Push enter] "
929        read
930        echo "Some errors were occurred with non-zero status $RETVAL."
931        echo "Please check $TMPDIR/$LOGFILE."
932        rm -f $TMPFILE && exit -1
933fi
934
935echo ""
936$QUIET "Finished: `LANG=C date '+%c'`"
937$MESG "Lapse: `expr $BUILDLAPSE / 60` min `expr $BUILDLAPSE % 60` sec"
938echo -n "[Push enter] "
939read
940
941NEWRPM=${RPMDIR}/${ARCH}/${NAME}-${KVER}-${NREV}.${ARCH}.rpm
942if [ -f $NEWRPM ] ; then
943        echo "Created:"
944        for i in `cat $TMPFILE` ; do
945        [ -f $RPMDIR/${ARCH}/$i ] && LANG=C ls $RPMDIR/${ARCH}/$i
946        done
947else
948        echo "$NEWRPM does not seem to have been created."
949        echo "Please check $TMPDIR/$LOGFILE."
950        rm -f $TMPFILE && exit -1
951fi
952
953NEWSRPM="${SRPMDIR}/`rpmqueryformat $NEWRPM SOURCERPM`"
954if [ "$RPMBUILDMODE" = "-ba" ] ; then
955        if [ -f $NEWSRPM ] ; then
956                # echo "Created:"
957                LANG=C ls $NEWSRPM
958        else
959                echo "$NEWSRPM does not seem to have been created."
960                # dont exit! it is trivial
961        fi
962fi
963
964############################################################
965## clean up
966
967if [ "$CLEAN" != "1" ] ;then
968        echo "How do you want $LOGFILE in $TMPDIR?"
969        echo -n "m)move to $HOME  r)remove  *)leave in $TMPDIR : "
970        read yn
971        yn=`echo $yn | tr -d '[:cntrl:]' | tr '[:upper:]' '[:lower:]'`
972else
973        yn=r
974fi
975
976if [ "$yn" = "r" ] ; then
977        rm -f $TMPDIR/$LOGFILE
978elif [ "$yn" = "m" ] ; then
979        if [ -n "$HOME" ] ; then
980                [ "$HOME" != "$TMPDIR" ] && mv -f $TMPDIR/$LOGFILE $HOME
981                gzip --quiet --force --best $HOME/$LOGFILE
982        fi
983fi
984
985askyesno "Do you want to clean up BUILD tree and files in SOURCES?"
986[ $? = 1 ]  && CLEAN=1
987
988if [ "$CLEAN" = "1" ] ;then
989        rpmbuild --rmsource --rmspec --clean --force $NSPEC >/dev/null 2>&1
990        rm -f $SPEC
991        rm -f $SRCDIR/*.config.mkkpkg
992fi
993
994############################################################
995## terminates
996
997rm -f $TMPFILE
998exit 0
999
1000# vim6: ts=4 tw=0 nolist ai laststatus=2 statusline=%<%f%h%m%r%y%=%l,%c%V\ %P
1001# $Id: mkkpkg,v 1.22 2007/08/09 02:50:53 shaolin Exp $
Note: See TracBrowser for help on using the repository browser.