source: projects/mkkpkg/trunk/mkkpkg @ 3666

Revision 3666, 28.6 KB checked in by daisuke, 13 years ago (diff)

fix Makefile

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.7*) # random guess (will be examined later)
505                        BUILDLINUXDIR=${BUILDDIR}/${NAME}-${KVER}/linux ;;
506                2.6*) # support fir 2.6.x (for future support)
507                        BUILDLINUXDIR=${BUILDDIR}/${NAME}-${KVER}/linux-${KVER} ;;
508                2.4*) # support for 2.4.x
509                        BUILDLINUXDIR=${BUILDDIR}/linux-${KVER} ;;
510                2.2*) # as of 2.2.17, it is OK.
511                        BUILDLINUXDIR=${BUILDDIR}/linux ;;
512                *)
513                        echo "`basename $SRPM`: version $KVER package is not supported"
514                        BUILDLINUXDIR=${BUILDDIR}/${NAME}-${KVER}/linux
515                        echo "try to detect \"linux\" directory to build..."
516                        ;;
517                esac
518                ;;
519        *)
520                echo "`basename $SRPM`: does not appear to be kernel package"
521                exit -1
522                ;;
523esac
524$MESG Using buildlinuxdir: $BUILDLINUXDIR
525
526
527############################################################
528## extract file names from SRPM
529
530# first $TMPFILE is made here
531TMPFILE=`mktemp $TMPDIR/$CMDNAME.XXXXXX` || \
532        { echo "could not create temporary file" ; exit 1 ; }
533rpm -qlp $SRPM >$TMPFILE
534SPEC="$SPECDIR/`grep '.spec$' $TMPFILE`"
535KCFG="`grep \"$ARCH.config\" $TMPFILE | tail -1`"
536
537# this is unusual, almost impossible
538if [ -z "$SPEC" ] ; then
539        echo "can't find SPEC file"
540        rm -f $TMPFILE && exit -1
541fi
542
543# as for now, srpm must have "$ARCH.config"
544if [ -z "$KCFG" ] ; then
545        echo "can't find default configuration file for $ARCH"
546        rm -f $TMPFILE && exit -1
547fi
548
549$MESG Using SPEC file: $SPEC
550$MESG Using kernel config file: $KCFG
551
552############################################################
553## install SRPM: "rpm -i" by root is thought to be a hole...
554
555$MESG "Executing \"rpm -ivh $SRPM\""
556rpm -ivh $SRPM >/dev/null 2>&1
557sync && sleep 1
558
559# checking files in source dir not only for nosrc, but also for src
560if [ "$NOENVCHEKCK" != "1" ] ;then
561$MESG -n "Checking files in SOURCES..."
562for file in `cat $TMPFILE | grep -v '\.spec$'` ; do
563        checkFile $SRCDIR/$file
564        if [ $? -ne 0 ] ; then
565                echo "It must be placed in or symbolic linked from ${SRCDIR}"
566                rm -f $TMPFILE && exit -1
567        fi
568done
569$MESG "done."
570fi
571
572# first $TMPFILE is removed here
573rm -f $TMPFILE
574
575############################################################
576## before expand SRPM: it costs a while and overrides BUILD
577## check if exists kernel-mkkpkg.log ($LOGFILE)
578## perhaps someone else is running mkkpkg, really?
579
580checkTMPdir
581
582############################################################
583## expand SRPM and find BUILDLINUXDIR (kind of ugly...)
584
585# print second -for "panpie"- banner
586if [ "$MESG" != "echo" ] ; then
587        $QUIET -e "Welcome to \\033[1;35m$CMDNAME\\033[0;39m"
588        $QUIET "" && sleep 1
589fi
590$QUIET "Please wait for a while \"make $CONFMETHOD\" to be executed..."
591
592# first, we clean up existing BUILDLINUXDIR (if any) by executing -bs
593mkdir -p $SRPMDIR/.${CMDNAME}.tmp
594rpmbuild -bs --clean $SPEC --define "_srcrpmdir $SRPMDIR/.${CMDNAME}.tmp" >/dev/null 2>&1
595rm -rf $SRPMDIR/.${CMDNAME}.tmp
596TMPPRE=`mktemp $TMPDIR/$CMDNAME.XXXXXX` || \
597        { echo "could not create temporary file" ; exit 1 ; }
598listbuilddir $BUILDDIR $TMPPRE
599
600# then, we expand
601$QUIET -n "Executing \"rpmbuild -bp $SPEC\"..."
602if ! rpmbuild -bp $SPEC >/dev/null 2>&1 ; then
603        echo "" && echo "Failed to expand sources/patches."
604        rm -f $TMPPRE && exit -1
605else
606        sync && sleep 3
607fi
608$QUIET "done."
609
610# afterwards, we examine and detect buildlinuxdir
611TMPPOST=`mktemp $TMPDIR/$CMDNAME.XXXXXX` || \
612        { echo "could not create temporary file" ; exit 1 ; }
613listbuilddir $BUILDDIR $TMPPOST
614TMPDIFF=`mktemp $TMPDIR/$CMDNAME.XXXXXX` || \
615        { echo "could not create temporary file" ; exit 1 ; }
616diff -B $TMPPRE $TMPPOST | grep "^> " | sed 's,^> ,,' >$TMPDIFF
617rm -f $TMPPRE $TMPPOST
618
619$MESG -n "Examining and detecting buildlinuxdir..."
620if [ ! -d "$BUILDLINUXDIR" ] ; then
621        BUILDLINUXDIR=""
622        for i in `cat $TMPDIFF` ; do
623                # kernel-2.2
624                if [ "$i" = "linux" -a -d "$BUILDDIR/linux" ] ; then
625                        BUILDLINUXDIR="$BUILDDIR/linux"
626                # kernel-2.4
627                elif [ -d "$BUILDDIR/$i/linux" ] ; then
628                        BUILDLINUXDIR="$BUILDDIR/$i/linux"
629                fi
630        done
631        if [ -z "$BUILDLINUXDIR" ] ; then
632                echo "Can't detect RPM_BUILD_ROOT/linux directory"
633                rm -f $TMPDIFF && exit -1
634        fi
635fi
636$MESG "done."
637$MESG Using buildlinuxdir: $BUILDLINUXDIR
638rm -f $TMPDIFF
639
640############################################################
641## get release(revision) number
642
643while [ "$NREV" = "" ] ; do
644        echo -n "Input your kernel Revision [SRPM = $KREV]: "
645        read NREV
646
647        # remove control character in string
648        # string "smp" is bad thing for kernel-headers and /boot/kernel.h
649        NREV=`echo $NREV | tr -d '[:cntrl:]' | sed 's/.*smp.*//'`
650
651        if [ -f ${RPMDIR}/${ARCH}/kernel-${KVER}-${NREV}.${ARCH}.rpm ] ; then
652                echo "${RPMDIR}/${ARCH}/kernel-${KVER}-${NREV}.${ARCH}.rpm found."
653                askyesno "  Override?"
654                [ $? = 0 ] && NREV=""
655        elif [ "${KVER}-${NREV}" = "`uname -r`" ] ; then
656                echo "${KVER}-${NREV} is same as currently running."
657                askyesno "  Override?"
658                [ $? = 0 ] && NREV=""
659        # Confirmation of kernel release(revision)
660        elif [ -n "$NREV" ] ; then
661                askyesno "  kernel Revision [yours = $NREV]. OK?"
662                [ $? = 0 ] && NREV=""
663        fi
664done
665
666############################################################
667## make spec file
668
669NSPEC=${SPECDIR}/kernel-${KVER}-${NREV}.spec
670if [ "$NSPEC" = "$SPEC" ] ; then
671        mv -f $SPEC ${SPEC}.${CMDNAME}
672        SPEC=${SPEC}.${CMDNAME}
673fi
674
675### poor spec type detection (new type has build* macros)
676newtypespec=""
677for i in buildsmp buildBOOT buildenterprise ; do
678        grep -q "^[[:space:]]*%define[[:space:]]$i" $SPEC && newtypespec="1"
679done
680
681if [ "$SMP" = "1" -o "$newtypespec" = "1" ] ; then
682        [ ! "$SMP" = "1" ] && SMP="0"
683        cp -f $SPEC $NSPEC
684        TMPOUT=`mktemp $TMPDIR/.specout.XXXXXX` || \
685                { echo "could not create temporary file" ; exit 1 ; }
686
687        # we leave buildenterprise as it is (might be 0 by default)
688        # for i in buildsmp buildBOOT buildmol buildenterprise; do
689        for i in buildsmp buildBOOT buildmol ; do
690        sed -e "s/^[[:space:]]*\(%define[[:space:]]$i\).*/\1 $SMP/" < $NSPEC > $TMPOUT
691        mv -f $TMPOUT $NSPEC
692        done
693
694else
695        # oldtype without smp (default)
696        PARSESPEC=/usr/share/mkkpkg/parsespec
697        if [ ! -x $PARSESPEC ] ; then
698                echo "can't execute: $PARSESPEC" && exit -1
699        fi
700        $PARSESPEC $SPEC > $NSPEC
701fi
702
703if [ ! "$DEVEL" = "1" ] ; then
704        # common substitution
705        TMPOUT=`mktemp $TMPDIR/.specout.XXXXXX` || \
706                { echo "could not create temporary file" ; exit 1 ; }
707        sed -e "s/^Release.*/Release: $NREV/" \
708         -e "s/^Vendor.*/Vendor: mkkpkg ($SRPMNAME)/" \
709         -e "s/^Distribution.*/Distribution: $DISTRIBUTION/" \
710         -e "s/^Packager.*/Packager: $PACKAGER/" < $NSPEC >$TMPOUT
711        mv -f $TMPOUT $NSPEC
712else
713        # we do not want filename and tags above to be changed!
714        mv -f $NSPEC $SPEC
715        NSPEC=$SPEC
716fi
717
718$MESG "created new SPEC file: " $NSPEC
719$MESG "  from \"Release: $KREV\" to \"Release: $NREV\""
720# dont rm -f $SPEC now
721
722############################################################
723## run editor
724
725$QUIET "" && sleep 1
726cp -f $NSPEC $NSPEC.$$
727
728if [ ! "$EDIT" = "y" -a ! "$EDIT" = "n" ] ; then
729        askyesno "Do you want to edit `basename $NSPEC`?"
730        [ $? = 1 ] && EDIT="y"
731fi
732
733while [ "$EDIT" = "y" ] ; do
734        echo -n "Push \"enter\" to edit SPEC file [${EDITOR:=vi}]: "
735        read TMPEDITOR
736        [ "$TMPEDITOR" ] && EDITOR=$TMPEDITOR
737        $EDITOR $NSPEC \
738                || { echo "can't start editor. Continue..." ; EDITOR="" ; }
739        askyesno "Have you finished editting `basename $NSPEC`?"
740        [ $? = 1 ] && EDIT=""
741done
742
743if ! diff -bB $NSPEC.$$ $NSPEC >/dev/null ; then
744        echo "detected modified SPEC file"
745        rpm -q --specfile $NSPEC >/dev/null
746        if [ $? -ne 0 ] ; then
747                echo "You made a mistake while editing $NSPEC"
748                rm -f $NSPEC.$$ && exit -1
749        fi
750        UREV="`rpm -q --queryformat "%{RELEASE}\n" --specfile $NSPEC | uniq`"
751        UVER="`rpm -q --queryformat "%{VERSION}\n" --specfile $NSPEC | uniq`"
752        if [ "$UREV" != "$NREV" ] ; then
753                echo "Change detected after edit:"
754                UREV=`echo $UREV | sed 's/.*smp.*//'`
755                if [ -z "$UREV" ] ; then
756                        echo "$CMDNAME error: still \"smp\" string in RELEASE."
757                        rm -f $NSPEC.$$ && exit -1
758                fi
759                echo "  from \"Release: $NREV\" to \"Release: $UREV\""
760                NREV=$UREV
761        fi
762        # BTW, how come you persist in using mkkpkg?
763        if [ "$UVER" != "$KVER" ] ; then
764                echo "  from \"Version: $KVER\" to \"Version: $UVER\""
765                KVER=$UVER
766        fi
767
768        askyesno "Do you want to re-expand sources/patches with new SPEC file?"
769        if [ $? = 1 ] ; then
770                echo "Executing \"rpmbuild -bp $NSPEC\""
771                TMPOUT=`mktemp $TMPDIR/${CMDNAME}-expand.XXXXXX` || \
772                        { echo "could not create temporary file" ; exit 1 ; }
773                if rpmbuild -bp $NSPEC >$TMPOUT 2>&1 ; then
774                        sync && sleep 3
775                        echo "Succeeded in expanding sources/patches."
776                        rm -f $TMPOUT
777                else
778                        echo "Failed to expand sources/patches."
779                        echo "See $TMPOUT."
780                        rm -f $NSPEC.$$ && exit -1
781                fi
782        fi
783fi
784rm -f $NSPEC.$$
785[ "$NSPEC" != "$SPEC" ] && rm -f $SPEC
786############################################################
787## asking whether to build srpm
788
789if [ -z "$RPMBUILDMODE" ] ; then
790        askyesno "Do you want to build SRPM? (If no, only RPMs are built)"
791        if [ $? = 1 ] ; then
792                RPMBUILDMODE="-ba"
793                $MESG "  OK, SRPM and RPMs will be built."
794        else
795                RPMBUILDMODE="-bb"
796                $MESG "  OK, only RPMs will be built."
797        fi
798fi
799
800############################################################
801## now make config
802
803checkDir $BUILDLINUXDIR || exit -1
804
805if [ "$HELP" = "en" ] ; then
806if [ "$NOENVCHEKCK" != "1" ] ;then
807        if [ -L $BUILDLINUXDIR/Documentation/Configure.help \
808           -a -f $BUILDLINUXDIR/Documentation/Configure.help.en ] ; then
809        pushd $BUILDLINUXDIR/linux/Documentation >/dev/null 2>&1
810        $MESG "Using Configure.help.en ..."
811        ln -sf Configure.help.en Configure.help
812        popd >/dev/null 2>&1
813        fi
814fi
815fi
816
817# make sure EXTRAVERSION says what we want it to say, but...
818perl -pi -e "s/^EXTRAVERSION.*/EXTRAVERSION = -${NREV}/" \
819 $BUILDLINUXDIR/Makefile || :
820
821if [ "$SMP" = "1" ] ; then
822        if [ ! "$ARCH" = "ppc" ] ; then
823        CONFFILE="`set +f; echo $BUILDLINUXDIR/configs/{*-$ARCH,*-$ARCH-smp,*-$ARCH-BOOT}.config`"
824        else
825        CONFFILE="`set +f; echo $BUILDLINUXDIR/configs/{*-$ARCH,*-$ARCH-smp,*-$ARCH-mol,*-$ARCH-BOOT}.config`"
826        fi
827else
828        CONFFILE="`set +f; echo $BUILDLINUXDIR/configs/*-$ARCH.config`"
829fi
830
831while [ -z "$CONFIGURED" ] ; do
832        for file in $CONFFILE ; do
833                if [ -f $file ] ; then
834                        KCFG=`basename $file`
835                        $MESG "Copying $KCFG into source tree for $ARCH"
836                        cp -f $file $BUILDLINUXDIR/.config
837                elif [ "$SMP" != "1" ] ; then
838                        # Could this sentence be evalueted?!
839                        $MESG "Missing?! `basename $file`, using default?!"
840                else
841                        $MESG -n "Ignoring... "
842                        $MESG "`basename $file` seems to be BOOT on non-base architecture"
843                        KCFG=""
844                fi
845
846                if [ -n "$KCFG" ] ; then
847                        echo "Ready for make \"$CONFMETHOD\" by $KCFG"
848                        echo -n "[Push enter to continue] "
849                        read
850                        make -s $CONFMETHOD -C $BUILDLINUXDIR
851                        if [ $? -ne 0 ] ; then
852                        askyesno "Something wrong with \"make $CONFMETHOD\". Continue?"
853                                [ $? = 0 ] && exit -1
854                        fi
855                        checkFile $BUILDLINUXDIR/.config || \
856                                { echo "$BUILDLINUXDIR/.config is missing " ; exit -1 ; }
857                        ## leaving original and user-configured .configs in SOURCES
858                        $MESG "mv $SRCDIR/${KCFG}{,.mkkpkg}"
859                        mv -f $SRCDIR/${KCFG}{,.mkkpkg}
860                        $MESG "Copying .config into $SRCDIR/${KCFG}"
861                        ## ad-hoc fix (20050621)
862                        case "$ARCH" in
863                            *86) echo "# i386"    > $SRCDIR/${KCFG} ;;
864                            ppc) echo "# powerpc" > $SRCDIR/${KCFG} ;;
865                            *)  echo "# $ARCH"    > $SRCDIR/${KCFG} ;;
866                        esac
867                        cat $BUILDLINUXDIR/.config >> $SRCDIR/${KCFG}
868                        ## cp -f $BUILDLINUXDIR/.config $SRCDIR/${KCFG}
869                fi
870        echo "" && sleep 1
871        done
872        CONFIGURED="y"
873done
874
875# it will create these binaries, but some of them are only for base arch.
876TMPFILE=`mktemp $TMPDIR/$CMDNAME.XXXXXX` || \
877        { echo "could not create temporary file" ; exit 1 ; }
878rpm -q --specfile $NSPEC | sed "s/$/\.$ARCH\.rpm/g" | sort > $TMPFILE
879
880############################################################
881## now build rpm package
882
883## test $RPMARG
884if [ -n "$RPMARG" ] ; then
885        if ! rpmbuild -bp $NSPEC --target=$ARCH $RPMARG --nobuild >/dev/null 2>&1
886        then
887                RPMARG=""
888        fi
889fi
890
891RPMBUILDCMD="rpmbuild $RPMBUILDMODE $NSPEC --target=$ARCH $RPMARG >$TMPDIR/$LOGFILE 2>&1"
892ADDITIONALFLAGS="smp=$SMP build=${NICE:-fast}"
893
894# output lines should be less than 24 lines.
895clear
896if [ $QUIET != "true" ] ;then
897echo ""
898echo -e "\\033[1;32m$CMDNAME\\033[0;39m"
899echo ""
900echo "Now we are prepared for executing:"
901echo "  rpmbuild $RPMBUILDMODE $NSPEC --target=$ARCH $RPMARG"
902fi
903
904if [ ! "$DEVEL" = "1" ] ; then
905        [ "$SMP" = "1" -o ! "$NICE" = "nice" ] && echo "With: $ADDITIONALFLAGS"
906        showbuildnotice
907        echo -n "[Push enter to continue] "
908        read
909fi
910$QUIET "Started: `LANG=C date '+%c'`"
911echo -n "Building..."
912
913## Build
914KSTARTTIME=`LANG=C date '+%s'`
915if checkTMPdir ; then
916        eval $NICE $RPMBUILDCMD
917        RETVAL=$?
918fi
919
920############################################################
921## check return value and whether package are made
922
923KENDTIME=`LANG=C date '+%s'`
924BUILDLAPSE=`expr $KENDTIME - $KSTARTTIME`
925
926# echo "EXIT $RETVAL" | mail -s "$COMNAME finised on `hostname`" `whoami`
927
928if [ $RETVAL -ne 0 ] ; then
929        echo "" && echo "Errored: `LANG=C date '+%c'`"
930        echo -n "[Push enter] "
931        read
932        echo "Some errors were occurred with non-zero status $RETVAL."
933        echo "Please check $TMPDIR/$LOGFILE."
934        rm -f $TMPFILE && exit -1
935fi
936
937echo ""
938$QUIET "Finished: `LANG=C date '+%c'`"
939$MESG "Lapse: `expr $BUILDLAPSE / 60` min `expr $BUILDLAPSE % 60` sec"
940echo -n "[Push enter] "
941read
942
943NEWRPM=${RPMDIR}/${ARCH}/${NAME}-${KVER}-${NREV}.${ARCH}.rpm
944if [ -f $NEWRPM ] ; then
945        echo "Created:"
946        for i in `cat $TMPFILE` ; do
947        [ -f $RPMDIR/${ARCH}/$i ] && LANG=C ls $RPMDIR/${ARCH}/$i
948        done
949else
950        echo "$NEWRPM does not seem to have been created."
951        echo "Please check $TMPDIR/$LOGFILE."
952        rm -f $TMPFILE && exit -1
953fi
954
955NEWSRPM="${SRPMDIR}/`rpmqueryformat $NEWRPM SOURCERPM`"
956if [ "$RPMBUILDMODE" = "-ba" ] ; then
957        if [ -f $NEWSRPM ] ; then
958                # echo "Created:"
959                LANG=C ls $NEWSRPM
960        else
961                echo "$NEWSRPM does not seem to have been created."
962                # dont exit! it is trivial
963        fi
964fi
965
966############################################################
967## clean up
968
969if [ "$CLEAN" != "1" ] ;then
970        echo "How do you want $LOGFILE in $TMPDIR?"
971        echo -n "m)move to $HOME  r)remove  *)leave in $TMPDIR : "
972        read yn
973        yn=`echo $yn | tr -d '[:cntrl:]' | tr '[:upper:]' '[:lower:]'`
974else
975        yn=r
976fi
977
978if [ "$yn" = "r" ] ; then
979        rm -f $TMPDIR/$LOGFILE
980elif [ "$yn" = "m" ] ; then
981        if [ -n "$HOME" ] ; then
982                [ "$HOME" != "$TMPDIR" ] && mv -f $TMPDIR/$LOGFILE $HOME
983                gzip --quiet --force --best $HOME/$LOGFILE
984        fi
985fi
986
987askyesno "Do you want to clean up BUILD tree and files in SOURCES?"
988[ $? = 1 ]  && CLEAN=1
989
990if [ "$CLEAN" = "1" ] ;then
991        rpmbuild --rmsource --rmspec --clean --force $NSPEC >/dev/null 2>&1
992        rm -f $SPEC
993        rm -f $SRCDIR/*.config.mkkpkg
994fi
995
996############################################################
997## terminates
998
999rm -f $TMPFILE
1000exit 0
1001
1002# vim6: ts=4 tw=0 nolist ai laststatus=2 statusline=%<%f%h%m%r%y%=%l,%c%V\ %P
1003# $Id: mkkpkg,v 1.22 2007/08/09 02:50:53 shaolin Exp $
Note: See TracBrowser for help on using the repository browser.