X-Git-Url: http://git.pld-linux.org/?a=blobdiff_plain;f=builder.sh;h=108327ff54d58ee588b295e19cb59963f6ce3f90;hb=4f36e494fe926ebbd26c128e62ca742ee6b008f3;hp=545e0aec71f125aa0aa27e1549894a96cf8a70ad;hpb=cc97f1f331a8fe5854b9266855bf62efab5ceab3;p=packages%2Frpm-build-tools.git diff --git a/builder.sh b/builder.sh index 545e0ae..108327f 100644 --- a/builder.sh +++ b/builder.sh @@ -1,5 +1,6 @@ #!/bin/sh # ----------- +# $Id$ # Exit codes: # 0 - succesful # 1 - help dispayed @@ -10,10 +11,10 @@ VERSION="\ Build package utility from PLD CVS repository -V 0.7 (C) 1999 Tomasz K³oczko". +V 0.9 (C) 1999-2001 Tomasz K³oczko". PATH="/bin:/usr/bin:/usr/sbin:/sbin:/usr/X11R6/bin" - + COMMAND="build" SPECFILE="" @@ -22,9 +23,18 @@ QUIET="" CLEAN="" DEBUG="" NOURLS="" -CVSROOT=${CVSROOT:-""} +NOCVS="" +ALLWAYS_CVSUP="yes" +if [ -s CVS/Root ]; then + CVSROOT=$(cat CVS/Root) +else + CVSROOT=${CVSROOT:-""} +fi LOGFILE="" -CHMOD="yes" +CHMOD=${CHMOD:-"yes"} +CHMOD_MODE=${CHMOD_MODE:-444} +RPMOPTS="" +BCOND="" PATCHES="" SOURCES="" @@ -32,8 +42,17 @@ ICONS="" PACKAGE_RELEASE="" PACKAGE_VERSION="" PACKAGE_NAME="" +WGET_RETRIES=${MAX_WGET_RETRIES:-0} + +DEF_NICE_LEVEL=0 + +FAIL_IF_NO_SOURCES="yes" -if [ -f ~/.builderrc ]; then +GETURI="wget -c -nd -t$WGET_RETRIES" + +if [ -f ~/etc/builderrc ]; then + . ~/etc/builderrc +elif [ -f ~/.builderrc ]; then . ~/.builderrc fi @@ -45,10 +64,11 @@ usage() if [ -n "$DEBUG" ]; then set -xv; fi echo "\ Usage: builder [-D] [--debug] [-V] [--version] [-a] [--as_anon] [-b] [-ba] - [--build] [-bb] [--build-binary] [-bs] [--build-source] [-d ] - [--cvsroot ] [-g] [--get] [-h] [--help] [-l ] - [--logtofile ] [-q] [--quiet] [-r ] - [--cvstag ] [-v] [--verbose] .spec + [--build] [-bb] [--build-binary] [-bs] [--build-source] + [-d ] [--cvsroot ] [-g] [--get] [-h] [--help] + [-l ] [-m] [--mr-proper] [--logtofile ] [-q] [--quiet] + [-r ] [--cvstag ] [-u] [--no-urls] [-v] [--verbose] + [--opts ] [--with/--without pkg] .spec -D, --debug - enable script debugging mode, -V, --version - output builder version @@ -70,10 +90,16 @@ Usage: builder [-D] [--debug] [-V] [--version] [-a] [--as_anon] [-b] [-ba] CVS repo or HTTP/FTP, -h, --help - this message, -l, --logtofile - log all to file, + -m, --mr-proper - only remove all files related to spec file and + all work resources, + -nc, --no-cvs - don't download from CVS, if source URL is given, + -nu, --no-urls - don't try to download from FTP/HTTP location, + -ns, --no-srcs - don't downland Sources + --opts - additional options for rpm -q, --quiet - be quiet, -r, --cvstag - build package using resources from specified CVS tag, - -u, --no_urls - try to get sources only from CVS repo, + -T, --tag - add cvs tags for files, -v, --verbose - be verbose, " @@ -81,18 +107,26 @@ Usage: builder [-D] [--debug] [-V] [--version] [-a] [--as_anon] [-b] [-ba] parse_spec() { - if [ -n "$DEBUG" ]; then set -xv; fi + if [ -n "$DEBUG" ]; then + set -x; + set -v; + fi + + cd $SPECS_DIR - sed -e "s#%prep#%dump#I" $SPECFILE | grep -v -i "^Icon\:" > $SPECFILE.__ + if [ "$NOSRCS" != "yes" ]; then + SOURCES="`rpm -bp --nobuild --define 'prep %dump' $SPECFILE 2>&1 | awk '/SOURCEURL[0-9]+/ {print $3}'`" + fi + if (rpm -bp --nobuild --define 'prep %dump' $SPECFILE 2>&1 | grep -qEi ":.*nosource.*1"); then + FAIL_IF_NO_SOURCES="no" + fi - SOURCES="`rpm -bp --test $SPECFILE.__ 2>&1 | awk '/ SOURCEURL[0-9]+/ {print $3}'`" - PATCHES="`rpm -bp --test $SPECFILE.__ 2>&1 | awk '/ PATCHURL[0-9]+/ {print $3}'`" - ICONS="`awk '/^Icon:/ {print $2}' ${SPECFILE}`" - PACKAGE_NAME="`rpm -bp --test $SPECFILE.__ 2>&1 | awk '/ name/ {print $3}'`" - PACKAGE_VERSION="`rpm -bp --test $SPECFILE.__ 2>&1 | awk '/ PACKAGE_VERSION/ {print $3}'`" - PACKAGE_RELEASE="`rpm -bp --test $SPECFILE.__ 2>&1 | awk '/ PACKAGE_RELEASE/ {print $3}'`" - rm -f $SPECFILE.__ + PATCHES="`rpm -bp --nobuild --define 'prep %dump' $SPECFILE 2>&1 | awk '/PATCHURL[0-9]+/ {print $3}'`" + ICONS="`awk '/^Icon:/ {print $2}' ${SPECFILE}`" + PACKAGE_NAME="`rpm -q --qf '%{NAME}\n' --specfile ${SPECFILE} 2> /dev/null | head -1`" + PACKAGE_VERSION="`rpm -q --qf '%{VERSION}\n' --specfile ${SPECFILE} 2> /dev/null| head -1`" + PACKAGE_RELEASE="`rpm -q --qf '%{RELEASE}\n' --specfile ${SPECFILE} 2> /dev/null | head -1`" if [ -n "$BE_VERBOSE" ]; then echo "- Sources : `nourl $SOURCES`" @@ -114,11 +148,14 @@ parse_spec() Exit_error() { - if [ -n "$DEBUG" ]; then set -xv; fi + if [ -n "$DEBUG" ]; then + set -x; + set -v; + fi cd $__PWD - case "$@" in + case "$1" in "err_no_spec_in_cmdl" ) echo "ERROR: spec file name not specified."; exit 2 ;; @@ -126,7 +163,7 @@ Exit_error() echo "Error: spec file not stored in CVS repo."; exit 3 ;; "err_no_source_in_repo" ) - echo "Error: some source, patch or icon files not stored in CVS repo."; + echo "Error: some source, patch or icon files not stored in CVS repo. ($2)"; exit 4 ;; "err_build_fail" ) echo "Error: package build failed."; @@ -136,17 +173,23 @@ Exit_error() init_builder() { - if [ -n "$DEBUG" ]; then set -xv; fi + if [ -n "$DEBUG" ]; then + set -x; + set -v; + fi - SOURCE_DIR="`rpm --eval "%{_sourcedir}"`" - SPECS_DIR="`rpm --eval "%{_specdir}"`" + SOURCE_DIR="`rpm --eval '%{_sourcedir}'`" + SPECS_DIR="`rpm --eval '%{_specdir}'`" __PWD=`pwd` } get_spec() { - if [ -n "$DEBUG" ]; then set -xv; fi + if [ -n "$DEBUG" ]; then + set -x; + set -v; + fi cd $SPECS_DIR @@ -169,17 +212,22 @@ get_spec() Exit_error err_no_spec_in_repo; fi - if [ "$CHMODE" = "yes" ]; then - chmod 444 $SPECFILE + if [ "$CHMOD" = "yes" -a -n "$SPECFILE" ]; then + chmod $CHMOD_MODE $SPECFILE fi unset OPTIONS } -get_all_files() +get_files() { - if [ -n "$DEBUG" ]; then set -xv; fi + GET_FILES="$@" - if [ -n "$SOURCES$PATCHES$ICONS" ]; then + if [ -n "$DEBUG" ]; then + set -x; + set -v; + fi + + if [ -n "$1$2$3$4$5$6$7$8$9${10}" ]; then cd $SOURCE_DIR OPTIONS="up " @@ -191,34 +239,88 @@ get_all_files() else OPTIONS="$OPTIONS -A" fi + for i in $GET_FILES; do + if [ ! -f `nourl $i` ] || [ $ALLWAYS_CVSUP = "yes" ] + then + if + echo $i | grep -vE '(http|ftp|https|cvs)://' |\ + grep -qE '\.(gz|bz2)$' + then + echo "Warning: no URL given for $i" + fi + + if [ -z "$NOCVS" ]||\ + [ `echo $i | grep -vE '(ftp|http|https)://'` ] + then + cvs $OPTIONS `nourl $i` + fi + + if [ -z "$NOURLS" ]&&[ ! -f "`nourl $i`" ]&&\ + [ `echo $i | grep -E 'ftp://|http://|https://'` ] + then + ${GETURI} "$i" + fi - cvs $OPTIONS `nourl $SOURCES $PATCHES $ICONS` - - if [ -z "$NOURLS" ]; then - for i in $SOURCES $PATCHES $ICONS; do - if [ ! -f "`nourl $i`" ]&&\ - [ `echo $i | grep 'ftp://\|http://'` ]; then - wget -c -t0 "$i" - fi - done - fi - - for i in $SOURCES $PATCHES $ICONS; do - if [ ! -f "`nourl $i`" ]; then - Exit_error err_no_source_in_repo; + if [ ! -f "`nourl $i`" -a "$FAIL_IF_NO_SOURCES" != "no" ]; then + Exit_error err_no_source_in_repo $i; fi + fi done - + if [ "$CHMOD" = "yes" ]; then - chmod 444 `nourl $SOURCES $PATCHES $ICONS` + CHMOD_FILES="`nourl $GET_FILES`" + if [ -n "$CHMOD_FILES" ]; then + chmod $CHMOD_MODE $CHMOD_FILES + fi + fi + unset OPTIONS + fi +} + +tag_files() +{ + TAG_FILES="$@" + + if [ -n "$DEBUG" ]; then + set -x; + set -v; + fi + + if [ -n "$1$2$3$4$5$6$7$8$9${10}" ]; then + echo $PACKAGE_VERSION + echo $PACKAGE_RELEASE + TAG=$PACKAGE_NAME-`echo $PACKAGE_VERSION | sed -e "s/\./\_/g"`-`echo $PACKAGE_RELEASE | sed -e "s/\./\_/g"` + echo "CVS tag: $TAG" + + OPTIONS="tag -F" + if [ -n "$CVSROOT" ]; then + OPTIONS="-d $CVSROOT $OPTIONS" fi + + cd $SOURCE_DIR + for i in $TAG_FILES; do + if [ -f `nourl $i` ]; then + cvs $OPTIONS $TAG `nourl $i` + cvs $OPTIONS STABLE `nourl $i` + else + Exit_error err_no_source_in_repo $i + fi + done + + cd $SPECS_DIR + cvs $OPTIONS $TAG $SPECFILE + cvs $OPTIONS STABLE $SPECFILE + unset OPTIONS fi } build_package() { - if [ -n "$DEBUG" ]; then set -xv; fi + if [ -n "$DEBUG" ]; then + set -x; + set -v; + fi cd $SPECS_DIR case "$COMMAND" in @@ -227,9 +329,9 @@ build_package() build-binary ) BUILD_SWITCH="-bb" ;; build-source ) - BUILD_SWITCH="-bs" ;; + BUILD_SWITCH="-bs --nodeps" ;; esac - rpm $BUILD_SWITCH -v $QUIET $CLEAN $SPECFILE + nice -n ${DEF_NICE_LEVEL} rpm $BUILD_SWITCH -v $QUIET $CLEAN $RPMOPTS $BCOND $SPECFILE if [ "$?" -ne "0" ]; then Exit_error err_build_fail; @@ -239,7 +341,7 @@ build_package() nourl() { - echo "$@" | sed 's#\<\(ftp\|http\)://.*/##g' + echo "$@" | sed 's#\<\(ftp\|http\|https\|cvs\)://.*/##g' } #--------------------------------------------- # main() @@ -273,20 +375,37 @@ while test $# -gt 0 ; do COMMAND="usage"; shift ;; -l | --logtofile ) shift; LOGFILE="${1}"; shift ;; + -ni| --nice ) + shift; DEF_NICE_LEVEL=${1}; shift ;; + -m | --mr-proper ) + COMMAND="mr-proper"; shift ;; + -nc | --no-cvs ) + NOCVS="yes"; shift ;; + -nu | --no-urls ) + NOURLS="yes"; shift ;; + -ns | --no-srcs ) + NOSRCS="yes"; shift ;; + --opts ) + shift; RPMOPTS="${1}"; shift ;; + --with | --without ) + BCOND="$BCOND $1 $2" ; shift 2 ;; -q | --quiet ) QUIET="--quiet"; shift ;; -r | --cvstag ) shift; CVSTAG="${1}"; shift ;; + -T | --tag ) + COMMAND="tag"; shift;; -v | --verbose ) BE_VERBOSE="1"; shift ;; - -u | --no_urls ) - NOURLS="yes"; shift ;; * ) SPECFILE="${1}"; shift ;; esac done -if [ -n "$DEBUG" ]; then set -xv; fi +if [ -n "$DEBUG" ]; then + set -x; + set -v; +fi case "$COMMAND" in "build" | "build-binary" | "build-source" ) @@ -294,7 +413,11 @@ case "$COMMAND" in if [ -n "$SPECFILE" ]; then get_spec; parse_spec; - get_all_files; + if [ -n "$ICONS" ]; then + get_files $ICONS; + parse_spec; + fi + get_files "$SOURCES $PATCHES"; build_package; else Exit_error err_no_spec_in_cmdl; @@ -305,11 +428,33 @@ case "$COMMAND" in if [ -n "$SPECFILE" ]; then get_spec; parse_spec; - get_all_files; + if [ -n "$ICONS" ]; then + get_files $ICONS + parse_spec; + fi + get_files $SOURCES $PATCHES else Exit_error err_no_spec_in_cmdl; fi ;; + "tag" ) + init_builder; + if [ -n "$SPECFILE" ]; then + get_spec; + parse_spec; + if [ -n "$ICONS" ]; then + get_files $ICONS + parse_spec; + fi + get_files $SOURCES $PATCHES; + tag_files "$SOURCES $PATCHES $ICONS"; + else + Exit_error err_no_spec_in_cmdl; + fi + ;; + "mr-proper" ) + rpm --clean --rmsource --rmspec --force --nodeps $SPECFILE + ;; "usage" ) usage;; "version" ) @@ -317,3 +462,52 @@ case "$COMMAND" in esac cd $__PWD + +# $Log$ +# Revision 1.83 2001/10/10 08:41:32 misiek +# - allow more bconds than one +# +# Revision 1.82 2001/09/18 10:55:37 ankry +# - added support for limitting number of wget retries when fetching a file +# from ftp/http server via environment variable MAX_WGET_RETRIES. +# Defaults to infinite (0). +# +# Revision 1.81 2001/07/06 16:52:30 misiek +# - by default use CVSroot from CVS/Root and if it doesn't exist use from CVSROOT variable +# +# Revision 1.80 2001/06/22 18:52:39 misiek +# - added support for --with/--without options +# +# Revision 1.79 2001/05/28 14:44:16 baggins +# - if file is not in repo TELL which fucking file it is! +# +# Revision 1.78 2001/05/13 19:04:44 misiek +# fixes for ksh93 +# +# Revision 1.77 2001/05/13 10:51:30 misiek +# don't fail if no sources found (hack to allow build nosrc packages) +# +# Revision 1.76 2001/04/19 23:24:06 misiek +# fix chmod again +# +# Revision 1.75 2001/04/19 23:14:25 misiek +# redirect errors from query to /dev/null +# +# Revision 1.74 2001/04/02 15:39:29 misiek +# fix problems with get_files when no files passed +# +# Revision 1.73 2001/03/30 14:06:10 wiget +# massive typo by kloczek +# +# Revision 1.72 2001/03/26 22:16:22 kloczek +# - fixed grabbing name, version and release in parse_spec(), +# - added -T option (tag) (temporary it tags also additional STABLE tag - must +# be added -Ts for separate tagging as STABLE). +# +# Revision 1.71 2001/03/05 14:12:27 misiek +# fix chmod +# +# Revision 1.70 2001/03/03 19:55:42 misiek +# workaround for problems with rpm when icons isn't cvs up'ed +# +#