PROGRAM=${0##*/}
APPDIR=$(d=$0; [ -L "$d" ] && d=$(readlink -f "$d"); dirname "$d")
-RCSID='$Id: builder,v 1.649 2011/07/14 07:31:59 arekm Exp $' r=${RCSID#* * } rev=${r%% *}
+RCSID='$Id: builder,v 1.669 2011/12/10 16:18:35 glen Exp $' r=${RCSID#* * } rev=${r%% *}
VERSION="v0.35/$rev"
VERSIONSTRING="\
Build package utility from PLD Linux Packages repository
# See LOGFILE example.
DATE=`date +%Y-%m-%d_%H-%M-%S`
+# target arch, can also be used for log file naming
+TARGET=$(rpm -E %{_target})
+
# Example: LOGFILE='../log.$PACKAGE_NAME'
# Example: LOGFILE='../LOGS/log.$PACKAGE_NAME.$DATE'
# Example: LOGFILE='$PACKAGE_NAME/$PACKAGE_NAME.$DATE.log'
PACKAGE_NAME=""
ASSUMED_NAME=""
PROTOCOL="http"
+
+# use lftp by default when available
+USE_LFTP=
+lftp --version > /dev/null 2>&1 && USE_LFTP=yes
+
WGET_RETRIES=${MAX_WGET_RETRIES:-0}
CVS_COMMAND=${CVS_COMMAND:-cvs}
GETURI="axel -a $AXEL_OPTS"
GETURI2="$GETURI"
OUTFILEOPT="-o"
+elif [ -n "$USE_LFTP" ]; then
+ GETURI=download_lftp
+ GETURI2=$GETURI
+ OUTFILEOPT=""
else
wget --help 2>&1 | grep -q -- ' --no-check-certificate ' && WGET_OPTS="$WGET_OPTS --no-check-certificate"
wget --help 2>&1 | grep -q -- ' --inet ' && WGET_OPTS="$WGET_OPTS --inet"
GETLOCAL="cp -a"
-if (rpm --version 2>&1 | grep -q '4.0.[0-2]'); then
+if rpm --version 2>&1 | grep -q '4.0.[0-2]'; then
RPM="rpm"
RPMBUILD="rpm"
else
#---------------------------------------------
# functions
+download_lftp() {
+ local outfile=$1 url=$2 retval tmpfile
+ # TODO: use mktemp
+ tmpfile=$outfile.tmp
+ lftp -c "
+ $([ "$DEBUG" = "yes" ] && echo "debug 5;")
+ set ssl:verify-certificate no;
+ set net:max-retries $WGET_RETRIES;
+ set http:user-agent \"$USER_AGENT\";
+ pget -n 10 -c \"$url\" -o \"$tmpfile\"
+ "
+
+ retval=$?
+ if [ $retval -eq 0 ]; then
+ mv -f "$tmpfile" "$outfile"
+ else
+ rm -f "$tmpfile"
+ fi
+ return $retval
+}
+
usage() {
if [ -n "$DEBUG" ]; then set -xv; fi
echo "\
-bp, --build-prep - execute the %prep phase of <package>.spec,
-bc - execute the %build phase of <package>.spec,
-bi - execute the %install phase of <package>.spec
--bl - execute the %files phase of <package>.spec
+-bl - execute the %files phase of <package>.spec
-bs, --build-source - get all files from CVS repo or HTTP/FTP and only pack
them into src.rpm,
--short-circuit - short-circuit build
-B, --branch - add branch
-c, --clean - clean all temporarily created files (in BUILD\$RPM_BUILD_ROOT) after rpmbuild commands.
may be used with building process.
--m, --mr-proper - clean all temporarily created files (in BUILD, SOURCES,
- SPECS and \$RPM_BUILD_ROOT and CVS/Entries). Doesn't run
- any rpm building.
--cf, --cvs-force - use -F when tagging (useful when moving branches)
+-m, --mr-proper - clean all temporarily created files (in BUILD, SOURCES, SPECS and \$RPM_BUILD_ROOT
+ and CVS/Entries). Doesn't run any rpm building.
+-cf, --cvs-force - use -F when tagging (useful when moving branches)
-d <cvsroot>, --cvsroot <cvsroot>
- setup \$CVSROOT,
---define <macro> <value>
- - define a macro <macro> with value <value>,
---alt_kernel <kernel>
- - same as --define 'alt_kernel <kernel>'
+--define <macro> <value> - define a macro <macro> with value <value>,
+--alt_kernel <kernel> - same as --define 'alt_kernel <kernel>'
--nodeps - rpm won't check any dependences
--g, --get - get <package>.spec and all related files from CVS repo
- or HTTP/FTP,
--h, --help - this message,
+-g, --get - get <package>.spec and all related files from CVS repo or HTTP/FTP
+-h, --help - this message
-jN, -j N - set %_smp_mflags to propagate concurrent jobs
--ftp, --http - use ftp or http protocol to access distfiles server
-l <logfile>, --logtofile <logfile>
- log all to file,
-nc, --no-cvs - don't download sources from CVS, if source URL is given,
--ncs, --no-cvs-specs
- - don't check specs in CVS
+-ncs, --no-cvs-specs - don't check specs in CVS
-nd, --no-distfiles - don't download from distfiles
-nm, --no-mirrors - don't download from mirror, if source URL is given,
-nu, --no-urls - don't try to download from FTP/HTTP location,
-sd, --source-distfiles - list sources available from distfiles (intended for offline
operations; does not work when Icon field is present
but icon file is absent),
--sc, --source-cvs - list sources available from CVS
+-sc, --source-cvs - list sources available from CVS
-sdp, --source-distfiles-paths - list sources available from distfiles -
paths relative to distfiles directory (intended for offline
operations; does not work when Icon field is present
- add cvs tag <cvstag> for files,
-Tvs, --tag-version-stable
- add cvs tags STABLE and NAME-VERSION-RELEASE for files,
--Ts, --tag-stable
- - add cvs tag STABLE for files,
--Tv, --tag-version
- - add cvs tag NAME-VERSION-RELEASE for files,
+-Ts, --tag-stable - add cvs tag STABLE for files,
+-Tv, --tag-version - add cvs tag NAME-VERSION-RELEASE for files,
-Tp, --tag-prefix <prefix>
- add <prefix> to NAME-VERSION-RELEASE tags,
-tt, --test-tag <prefix>
-u, --try-upgrade - check version, and try to upgrade package
-un, --try-upgrade-with-float-version
- as above, but allow float version
- php-pear-Services_Digg/
+ php-pear-Services_Digg/
--upgrade-version - upgrade to specified version in try-upgrade
--use-greed-sources
- try download source from tag head if don't find it in
- abort instead of applying patch <patchnumber>
--show-bconds - show available conditional builds, which can be used
- with --with and/or --without switches.
---show-bcond-args - show active bconds, from ~/.bcondrc. this is used by
- ./repackage.sh script. in other words, the output is
- parseable by scripts.
+--show-bcond-args - show active bconds, from ~/.bcondrc. this is used by ./repackage.sh script.
+ In other words, the output is parseable by scripts.
--show-avail-bconds - show available bconds
--with/--without <feature>
- conditional build package depending on %_with_<feature>/
--with feat1 feat2 feat3 --without feat4 feat5 --with feat6
constructions. Set GROUP_BCONDS to yes to make use of it.
--target <platform>, --target=<platform>
- - build for platform <platform>.
---init-rpm-dir - initialize ~/rpm directory structure
+ - build for platform <platform>.
+--init-rpm-dir - initialize ~/rpm directory structure
"
}
cd $PACKAGE_DIR
cache_rpm_dump
- if (rpm_dump | grep -qEi ":.*nosource.*1"); then
+ if rpm_dump | grep -qEi ":.*nosource.*1"; then
FAIL_IF_NO_SOURCES="no"
fi
if [ "$NOCVSSPEC" != "yes" ]; then
if [ ! -s CVS/Root -a "$NOCVSSPEC" != "yes" ]; then
- echo "Warning: No CVS access defined - using local .spec file"
+ echo "Warning: No CVS access defined in $(pwd)- using local .spec file"
NOCVSSPEC="yes"
fi
# create symlinks for tools
if [ "$SYMLINK_TOOLS" != "no" ]; then
for a in dropin md5 adapter builder {relup,compile,repackage,rsync,pearize}.sh pldnotify.awk; do
+ # skip tools that don't exist in top dir
[ -f $a ] || continue
- ln -sf ../$a $ASSUMED_NAME
+ # skip tools that already exist
+ [ -f $ASSUMED_NAME/$a ] && continue
+ ln -s ../$a $ASSUMED_NAME
cvsignore_df $a
done
fi
src_no() {
local file="$1"
# escape some regexp characters if part of file name
- file=$(echo "$file" | sed -e 's#\([\+\*\.]\)#\\\1#g')
+ file=$(echo "$file" | sed -e 's#\([\+\*\.\&\#\?]\)#\\\1#g')
cd $PACKAGE_DIR
rpm_dump | \
grep -E "(SOURCE|PATCH)URL[0-9]*[ ]*${file}""[ ]*$" | \
if [ -n "$ADD5" ] && is_url $i || [ -n "$md5" ]; then
local tag="# $srcno-md5:\t"
if [[ "$md5" == *NoSource* ]]; then
- tag="# NoSource$srcno-md5:\t"
+ tag="# No$srcno-md5:\t"
elif [ -n "$USEDIGEST" ]; then
tag="BuildRequires:\tdigest(%SOURCE$srcno) = "
fi
im="$i"
fi
update_shell_title "${GETURI%% *}: $im"
- ${GETURI} "$im" ${OUTFILEOPT} "$target" || \
+ ${GETURI} ${OUTFILEOPT} "$target" "$im" || \
if [ "`echo $im | grep -E 'ftp://'`" ]; then
update_shell_title "${GETURI2%% *}: $im"
- ${GETURI2} "$im" ${OUTFILEOPT} "$target"
+ ${GETURI2} ${OUTFILEOPT} "$target" "$im"
fi
test -s "$target" || rm -f "$target"
fi
return 0;
fi
- TAG=$1
+ local _TAG=$1
+ # escape some regexp characters if part of TAG
+ _TAG=$(echo "$_TAG" | sed -e 's#\([\+\*\.]\)#\\\1#g')
+
cd "$PACKAGE_DIR"
- $CVS_COMMAND status -v $SPECFILE | grep -Eiq "${TAG}.+(branch: [0-9.]+)"
+ $CVS_COMMAND status -v $SPECFILE | grep -Eiq "${_TAG}.+(branch: [0-9.]+)"
return $?
}
# w32codec-installer license_agreement
# php +mysqli
# ---
- if ([ -f $HOME/.bcondrc ] || ([ -n $HOME_ETC ] && [ -f $HOME_ETC/.bcondrc ])); then
+ if [ -f $HOME/.bcondrc ] || ([ -n $HOME_ETC ] && [ -f $HOME_ETC/.bcondrc ]); then
:
else
return
get_spec
parse_spec
+ local builddir=$(eval $RPM $RPMOPTS --eval '%{_builddir}')
+
# remove from CVS/Entries
cvs_entry_remove $PACKAGE_DIR $SPECFILE $SOURCES $PATCHES
# remove spec and sources
- $RPMBUILD --clean --rmsource --rmspec --nodeps --define "_specdir $PACKAGE_DIR" --define "_sourcedir $PACKAGE_DIR" $SPECFILE
+ $RPMBUILD --clean --rmsource --rmspec --nodeps --define "_specdir $PACKAGE_DIR" --define "_sourcedir $PACKAGE_DIR" --define "_builddir $builddir" $SPECFILE
}
#---------------------------------------------
# ./builder -bs test.spec -r AC-branch -Tp auto-ac- -tt
if [ -n "$TEST_TAG" ]; then
local TAGVER=`make_tagver`
+ # escape some regexp characters if part of TAGVER
+ TAGVER=$(echo "$TAGVER" | sed -e 's#\([\+\*\.]\)#\\\1#g')
echo "Searching for tag $TAGVER..."
TAGREL=$($CVS_COMMAND status -v $SPECFILE | grep -E "^[[:space:]]*${TAGVER}[[[:space:]]" | sed -e 's#.*(revision: ##g' -e 's#).*##g')
if [ -n "$TAGREL" ]; then