]> git.pld-linux.org Git - packages/rpm-build-tools.git/blob - builder.sh
- Removed not needed (and not working ;) ) "/bin/sh -c ".
[packages/rpm-build-tools.git] / builder.sh
1 #!/bin/sh
2 # -----------
3 # $Id$
4 # Exit codes:
5 #       0 - succesful
6 #       1 - help dispayed
7 #       2 - no spec file name in cmdl parameters
8 #       3 - spec file not stored in repo
9 #       4 - some source, patch or icon files not stored in repo
10 #       5 - package build failed
11
12 VERSION="\
13 Build package utility from PLD CVS repository
14 V 0.10 (C) 1999-2001 Tomasz K³oczko".
15
16 PATH="/bin:/usr/bin:/usr/sbin:/sbin:/usr/X11R6/bin"
17  
18 COMMAND="build"
19
20 SPECFILE=""
21 BE_VERBOSE=""
22 QUIET=""
23 CLEAN=""
24 DEBUG=""
25 NOURLS=""
26 NOCVS=""
27 ALLWAYS_CVSUP="yes"
28 if [ -s CVS/Root ]; then
29     CVSROOT=$(cat CVS/Root)
30 else
31     CVSROOT=${CVSROOT:-""}
32 fi
33 # Example: LOGFILE='../log.$PACKAGE_NAME'
34 # Yes, you can use variable name! Note _single_ quotes!
35 LOGFILE=''
36 CHMOD="yes"
37 CHMOD_MODE="0444"
38 RPMOPTS=""
39 BCOND=""
40
41 PATCHES=""
42 SOURCES=""
43 ICONS=""
44 PACKAGE_RELEASE=""
45 PACKAGE_VERSION=""
46 PACKAGE_NAME=""
47 WGET_RETRIES=${MAX_WGET_RETRIES:-0}
48
49 DEF_NICE_LEVEL=0
50
51 FAIL_IF_NO_SOURCES="yes"
52
53 GETURI="wget -c -nd -t$WGET_RETRIES"
54
55 if [ -f ~/etc/builderrc ]; then
56     . ~/etc/builderrc
57 elif [ -f ~/.builderrc ]; then
58     . ~/.builderrc
59 fi
60
61 #---------------------------------------------
62 # functions
63
64 usage()
65 {
66     if [ -n "$DEBUG" ]; then set -xv; fi
67     echo "\
68 Usage: builder [-D|--debug] [-V|--version] [-a|--as_anon] [-b|-ba|--build]
69         [-bb|--build-binary] [-bs|--build-source] [{-B|--branch} <branch>]
70         [{-d|--cvsroot} <cvsroot>] [-g|--get] [-h|--help]
71         [{-l,--logtofile} <logfile>] [-m|--mr-proper] [-q|--quiet]
72         [-r <cvstag>] [{-T--tag <cvstag>] [-Tvs|--tag-version-stable]
73         [-Tvd|--tag-version-devel] [-Ts|--tag-stable] [-Td|--tag-devel]
74         [-Tv|--tag-version] [-u|--no-urls] [-v|--verbose] [--opts <rpm opts>] 
75         [--with/--without pkg] [--define <macro> <value>] <package>.spec
76
77         -D, --debug     - enable script debugging mode,
78         -V, --version   - output builder version
79         -a, --as_anon   - get files via pserver as cvs@anoncvs.pld.org.pl,
80         -b, -ba,
81         --build         - get all files from CVS repo or HTTP/FTP and build
82                           package from <package>.spec,
83         -bb, --build-binary
84                         - get all files from CVS repo or HTTP/FTP and build
85                           binary only package from <package>.spec,
86         -bs,
87         --build-source  - get all files from CVS repo or HTTP/FTP and only
88                           pack them into src.rpm,
89         -B, --branch    - add branch
90         -c, --clean     - clean all temporarily created files (in BUILD,
91                           SOURCES, SPECS and \$RPM_BUILD_ROOT),
92         -d <cvsroot>, --cvsroot <cvsroot>
93                         - setup \$CVSROOT,
94         -g, --get       - get <package>.spec and all related files from
95                           CVS repo or HTTP/FTP,
96         -h, --help      - this message,
97         -l <logfile>, --logtofile <logfile>
98                         - log all to file,
99         -m, --mr-proper - only remove all files related to spec file and
100                           all work resources,
101         -nc, --no-cvs   - don't download from CVS, if source URL is given,
102         -nu, --no-urls  - don't try to download from FTP/HTTP location,
103         -ns, --no-srcs  - don't downland Sources
104         --opts <rpm opts>
105                         - additional options for rpm
106         -q, --quiet     - be quiet,
107         -r <cvstag>, --cvstag <cvstag>
108                         - build package using resources from specified CVS
109                           tag,
110         -T <cvstag> , --tag <cvstag>
111                         - add cvs tag <cvstag> for files,
112         -Tvs, --tag-version-stable
113                         - add cvs tags STABLE and NAME-VERSION-RELESE for files,
114         -Tvd, --tag-version-devel
115                         - add cvs tags STABLE and NAME-VERSION-RELESE for files,
116         -Ts, --tag-stable
117                         - add cvs tag STABLE for files,
118         -Td, --tag-devel
119                         - add cvs tag DEVEL for files,
120         -Tv, --tag-version
121                         - add cvs tag NAME-VERSION-RELESE for files,
122         -v, --verbose   - be verbose,
123         --define        - define a macro
124
125 "
126 }
127
128 parse_spec()
129 {
130     if [ -n "$DEBUG" ]; then 
131         set -x;
132         set -v;
133     fi
134
135     cd $SPECS_DIR
136
137     if [ "$NOSRCS" != "yes" ]; then
138         SOURCES="`rpm -bp --nobuild $BCOND --define 'prep %dump' $SPECFILE 2>&1 | awk '/SOURCEURL[0-9]+/ {print $3}'`"
139     fi
140     if (rpm -bp --nobuild $BCOND --define 'prep %dump' $SPECFILE 2>&1 | grep -qEi ":.*nosource.*1"); then
141         FAIL_IF_NO_SOURCES="no"
142     fi
143
144     PATCHES="`rpm -bp --nobuild $BCOND --define 'prep %dump' $SPECFILE 2>&1 | awk '/PATCHURL[0-9]+/ {print $3}'`"
145     ICONS="`awk '/^Icon:/ {print $2}' ${SPECFILE}`"
146     PACKAGE_NAME="`rpm -q --qf '%{NAME}\n' --specfile ${SPECFILE} 2> /dev/null | head -1`"
147     PACKAGE_VERSION="`rpm -q --qf '%{VERSION}\n' --specfile ${SPECFILE} 2> /dev/null| head -1`"
148     PACKAGE_RELEASE="`rpm -q --qf '%{RELEASE}\n' --specfile ${SPECFILE} 2> /dev/null | head -1`"
149
150     if [ -n "$BE_VERBOSE" ]; then
151         echo "- Sources :  `nourl $SOURCES`" 
152         if [ -n "$PATCHES" ]; then
153                 echo "- Patches :  `nourl $PATCHES`"
154         else
155                 echo "- Patches :  *no patches needed*"
156         fi
157         if [ -n "$ICONS" ]; then
158             echo "- Icon    :  `nourl $ICONS`"
159         else
160             echo "- Icon    :  *no package icon*"
161         fi
162         echo "- Name    : $PACKAGE_NAME"
163         echo "- Version : $PACKAGE_VERSION"
164         echo "- Release : $PACKAGE_RELEASE"
165     fi
166 }
167
168 Exit_error()
169 {
170     if [ -n "$DEBUG" ]; then 
171         set -x;
172         set -v; 
173     fi
174
175     cd $__PWD
176
177     case "$1" in
178     "err_no_spec_in_cmdl" )
179         echo "ERROR: spec file name not specified.";
180         exit 2 ;;
181     "err_no_spec_in_repo" )
182         echo "Error: spec file not stored in CVS repo.";
183         exit 3 ;;
184     "err_no_source_in_repo" )
185         echo "Error: some source, patch or icon files not stored in CVS repo. ($2)";
186         exit 4 ;;
187     "err_build_fail" )
188         echo "Error: package build failed.";
189         exit 5 ;;
190     esac
191 }
192
193 init_builder()
194 {
195     if [ -n "$DEBUG" ]; then 
196         set -x;
197         set -v; 
198     fi
199
200     SOURCE_DIR="`rpm --eval '%{_sourcedir}'`"
201     SPECS_DIR="`rpm --eval '%{_specdir}'`"
202
203     __PWD=`pwd`
204 }
205
206 get_spec()
207 {
208     if [ -n "$DEBUG" ]; then 
209         set -x;
210         set -v; 
211     fi
212
213     cd $SPECS_DIR
214
215     OPTIONS="up "
216
217     if [ -n "$CVSROOT" ]; then
218         OPTIONS="-d $CVSROOT $OPTIONS"
219     fi
220     if [ -n "$CVSTAG" ]; then
221         OPTIONS="$OPTIONS -r $CVSTAG"
222     else
223         OPTIONS="$OPTIONS -A"
224     fi
225
226     cvs $OPTIONS $SPECFILE
227     if [ "$?" -ne "0" ]; then
228         Exit_error err_no_spec_in_repo;
229     fi
230         if [ ! -f "$SPECFILE" ]; then
231         Exit_error err_no_spec_in_repo;
232         fi
233     
234     if [ "$CHMOD" = "yes" -a -n "$SPECFILE" ]; then
235         chmod $CHMOD_MODE $SPECFILE
236     fi
237     unset OPTIONS
238     grep -E -m 1 "^#.*Revision:.*Date" $SPECFILE
239 }
240
241 get_files()
242 {
243     GET_FILES="$@"
244
245     if [ -n "$DEBUG" ]; then 
246         set -x;
247         set -v; 
248     fi
249
250     if [ -n "$1$2$3$4$5$6$7$8$9${10}" ]; then
251         cd $SOURCE_DIR
252
253         OPTIONS="up "
254         if [ -n "$CVSROOT" ]; then
255             OPTIONS="-d $CVSROOT $OPTIONS"
256         fi
257         if [ -n "$CVSTAG" ]; then
258             OPTIONS="$OPTIONS -r $CVSTAG"
259         else
260             OPTIONS="$OPTIONS -A"
261         fi
262         for i in $GET_FILES; do
263             if [ ! -f `nourl $i` ] || [ $ALLWAYS_CVSUP = "yes" ]; then
264                 if echo $i | grep -vE '(http|ftp|https|cvs)://' | grep -qE '\.(gz|bz2)$']; then
265                         echo "Warning: no URL given for $i"
266                 fi
267                 
268                 if [ -z "$NOCVS" ]|| [ `echo $i | grep -vE '(ftp|http|https)://'` ]; then
269                         cvs $OPTIONS `nourl $i`
270                 fi
271                 
272                 if [ -z "$NOURLS" ]&&[ ! -f "`nourl $i`" ] && [ `echo $i | grep -E 'ftp://|http://|https://'` ]; then
273                         ${GETURI} "$i"
274                 fi
275
276                 if [ ! -f "`nourl $i`" -a "$FAIL_IF_NO_SOURCES" != "no" ]; then
277                         Exit_error err_no_source_in_repo $i;
278                 fi
279             fi
280         done
281         
282         if [ "$CHMOD" = "yes" ]; then
283             CHMOD_FILES="`nourl $GET_FILES`"
284             if [ -n "$CHMOD_FILES" ]; then
285                     chmod $CHMOD_MODE $CHMOD_FILES
286             fi
287         fi
288         unset OPTIONS
289     fi
290 }
291
292 tag_files()
293 {
294     TAG_FILES="$@"
295
296     if [ -n "$DEBUG" ]; then 
297         set -x;
298         set -v; 
299     fi
300
301     if [ -n "$1$2$3$4$5$6$7$8$9${10}" ]; then
302         echo $PACKAGE_VERSION
303         echo $PACKAGE_RELEASE
304         TAG=$PACKAGE_NAME-`echo $PACKAGE_VERSION | sed -e "s/\./\_/g"`-`echo $PACKAGE_RELEASE | sed -e "s/\./\_/g"`
305         echo "CVS tag: $TAG"
306
307         OPTIONS="tag -F"
308         if [ -n "$CVSROOT" ]; then
309             OPTIONS="-d $CVSROOT $OPTIONS"
310         fi
311
312         cd $SOURCE_DIR
313         for i in $TAG_FILES; do
314             if [ -f `nourl $i` ]; then
315                 cvs $OPTIONS $TAG `nourl $i`
316                 cvs $OPTIONS STABLE `nourl $i`
317             else
318                 Exit_error err_no_source_in_repo $i
319             fi
320         done
321
322         cd $SPECS_DIR
323         cvs $OPTIONS $TAG $SPECFILE
324         cvs $OPTIONS STABLE $SPECFILE
325
326         unset OPTIONS
327     fi
328 }
329
330 branch_files()
331 {
332         TAG=$1
333         echo "CVS branch tag: $TAG"
334         shift;
335
336         TAG_FILES="$@"
337
338         if [ -n "$DEBUG" ]; then
339                 set -x;
340                 set -v;
341         fi
342
343         if [ -n "$1$2$3$4$5$6$7$8$9${10}" ]; then
344                 
345                 OPTIONS="tag -b"
346                 if [ -n "$CVSROOT" ]; then
347                         OPTIONS="-d $CVSROOT $OPTIONS"
348                 fi
349                 cd $SOURCE_DIR
350                 for i in $TAG_FILES; do
351                         if [ -f `nourl $i` ]; then
352                                 cvs $OPTIONS $TAG `nourl $i`
353                         else
354                                 Exit_error err_no_source_in_repo $i
355                         fi
356                 done
357                 cd $SPECS_DIR
358                 cvs $OPTIONS $TAG $SPECFILE
359
360                 unset OPTIONS
361         fi
362 }
363
364 build_package()
365 {
366     if [ -n "$DEBUG" ]; then 
367         set -x;
368         set -v; 
369     fi
370
371     cd $SPECS_DIR
372     case "$COMMAND" in
373         build )
374             BUILD_SWITCH="-ba" ;;
375         build-binary )
376             BUILD_SWITCH="-bb" ;;
377         build-source )
378             BUILD_SWITCH="-bs --nodeps" ;;
379     esac
380     if [ -n "$LOGFILE" ]; then
381         LOG=`eval echo $LOGFILE`
382         eval nice -n ${DEF_NICE_LEVEL} time rpm $BUILD_SWITCH -v $QUIET $CLEAN $RPMOPTS $BCOND $SPECFILE 2>&1 | tee $LOG
383     else
384         eval nice -n ${DEF_NICE_LEVEL} rpm $BUILD_SWITCH -v $QUIET $CLEAN $RPMOPTS $BCOND $SPECFILE
385     fi
386
387     if [ "$?" -ne "0" ]; then
388         Exit_error err_build_fail;
389     fi
390     unset BUILD_SWITCH
391 }
392
393 nourl()
394 {
395         echo "$@" | sed 's#\<\(ftp\|http\|https\|cvs\)://[^ ]*/##g'
396 }
397 #---------------------------------------------
398 # main()
399
400 if [ "$#" = 0 ]; then
401     usage;
402     exit 1
403 fi
404
405 while test $# -gt 0 ; do
406     case "${1}" in
407         -D | --debug )
408             DEBUG="yes"; shift ;;
409         -V | --version )
410             COMMAND="version"; shift ;;
411         -a | --as_anon )
412             CVSROOT=":pserver:cvs@anoncvs.pld.org.pl:/cvsroot"; shift ;;
413         -b | -ba | --build )
414             COMMAND="build"; shift ;;
415         -bb | --build-binary )
416             COMMAND="build-binary"; shift ;;
417         -bs | --build-source )
418             COMMAND="build-source"; shift ;;
419         -B | --branch )
420             COMMAND="branch"; shift; TAG="${1}"; shift;;
421         -c | --clean )
422             CLEAN="--clean --rmspec --rmsource"; shift ;;
423         -d | --cvsroot )
424             shift; CVSROOT="${1}"; shift ;;
425         -g | --get )
426             COMMAND="get"; shift ;;
427         -h | --help )
428             COMMAND="usage"; shift ;;
429         -l | --logtofile )
430             shift; LOGFILE="${1}"; shift ;;
431         -ni| --nice )
432             shift; DEF_NICE_LEVEL=${1}; shift ;;
433         -m | --mr-proper )
434             COMMAND="mr-proper"; shift ;;
435         -nc | --no-cvs )
436             NOCVS="yes"; shift ;;
437         -nu | --no-urls )
438             NOURLS="yes"; shift ;;
439         -ns | --no-srcs )
440             NOSRCS="yes"; shift ;;
441         --opts )
442             shift; RPMOPTS="${1}"; shift ;;
443         --with | --without )
444             BCOND="$BCOND $1 $2" ; shift 2 ;;
445         -q | --quiet )
446             QUIET="--quiet"; shift ;;
447         -r | --cvstag )
448             shift; CVSTAG="${1}"; shift ;;
449         -Tvs | --tag-version-stable )
450             COMMAND="tag";
451             TAG="STABLE"
452             TAG_VERSION="yes"
453             shift;;
454         -Tvd | --tag-version-devel )
455             COMMAND="tag";
456             TAG="DEVEL"
457             TAG_VERSION="yes"
458             shift;;
459         -Ts | --tag-stable )
460             COMMAND="tag";
461             TAG="STABLE"
462             TAG_VERSION="no"
463             shift;;
464         -Td | --tag-devel )
465             COMMAND="tag";
466             TAG="DEVEL"
467             TAG_VERSION="no"
468             shift;;
469         -Tv | --tag-version )
470             COMMAND="tag";
471             TAG_VERSION="yes"
472             shift;;
473         -T | --tag )
474             COMMAND="tag";
475             shift
476             TAG="$1"
477             TAG_VERSION="no"
478             shift;;
479         -v | --verbose )
480             BE_VERBOSE="1"; shift ;;
481         --define)
482             shift
483             MACRO="${1}"
484             VALUE="${2}"
485             shift 2
486             RPMOPTS="${RPMOPTS} --define \"${MACRO} ${VALUE}\""
487             ;;
488         * )
489             SPECFILE="${1}"; shift ;;
490     esac
491 done
492
493 if [ -n "$DEBUG" ]; then 
494         set -x;
495         set -v; 
496 fi
497
498 case "$COMMAND" in
499     "build" | "build-binary" | "build-source" )
500         init_builder;
501         if [ -n "$SPECFILE" ]; then
502             get_spec;
503             parse_spec;
504             if [ -n "$ICONS" ]; then
505                 get_files $ICONS;
506                 parse_spec;
507             fi
508             get_files "$SOURCES $PATCHES";
509             build_package;
510         else
511             Exit_error err_no_spec_in_cmdl;
512         fi
513         ;;
514     "branch" )
515         init_builder;
516         if [ -n "$SPECFILE" ]; then
517                 get_spec;
518                 parse_spec;
519                 if [ -n "$ICONS" ]; then
520                         get_files $ICONS
521                         parse_spec;
522                 fi
523                 get_files $SOURCES $PATCHES;
524                 branch_files $TAG "$SOURCES $PATCHES $ICONS";
525         else
526                 Exit_error err_no_spec_in_cmdl;
527         fi
528         ;;
529     "get" )
530         init_builder;
531         if [ -n "$SPECFILE" ]; then
532             get_spec;
533             parse_spec;
534             if [ -n "$ICONS" ]; then
535                 get_files $ICONS
536                 parse_spec;
537             fi
538             get_files $SOURCES $PATCHES
539         else
540             Exit_error err_no_spec_in_cmdl;
541         fi
542         ;;
543     "tag" )
544         init_builder;
545         if [ -n "$SPECFILE" ]; then
546             get_spec;
547             parse_spec;
548             if [ -n "$ICONS" ]; then
549                 get_files $ICONS
550                 parse_spec;
551             fi
552             get_files $SOURCES $PATCHES;
553             tag_files "$SOURCES $PATCHES $ICONS";
554         else
555             Exit_error err_no_spec_in_cmdl;
556         fi
557         ;;
558     "mr-proper" )
559         rpm --clean --rmsource --rmspec --force --nodeps $SPECFILE
560         ;;
561     "usage" )
562         usage;;
563     "version" )
564         echo "$VERSION";;
565 esac
566
567 cd $__PWD
This page took 0.133814 seconds and 4 git commands to generate.