VERSION="\
Build package utility from PLD Linux CVS repository
-V 0.13 (C) 1999-2005 Free Penguins".
+v0.15 (C) 1999-2006 Free Penguins".
PATH="/bin:/usr/bin:/usr/sbin:/sbin:/usr/X11R6/bin"
COMMAND="build"
NOCVS=""
NOCVSSPEC=""
NODIST=""
+NOINIT=""
UPDATE=""
UPDATE5=""
ADD5=""
CHMOD="no"
CHMOD_MODE="0444"
RPMOPTS=""
+RPMBUILDOPTS=""
BCOND=""
GROUP_BCONDS="no"
CVSIGNORE_DF="no"
ATTICDISTFILES_SERVER="://attic-distfiles.pld-linux.org"
DEF_NICE_LEVEL=19
+SCHEDTOOL="auto"
FAIL_IF_NO_SOURCES="yes"
#REMOVE_BUILD_REQUIRES="force"
#GROUP_BCONDS="yes"
#LOGFILE='../LOGS/log.$PACKAGE_NAME.$DATE'
+#TITLECHANGE=no
#
SU_SUDO=""
if [ -n "$HOME_ETC" ]; then
wget --help 2>&1 | grep -q ' \-\-no-check\-certificate ' && WGET_OPTS="$WGET_OPTS --no-check-certificate"
+if [ "$SCHEDTOOL" = "auto" ]; then
+ if [ -x /usr/bin/schedtool ] && schedtool -B -e echo >/dev/null; then
+ SCHEDTOOL="schedtool -B -e"
+ else
+ SCHEDTOOL="no"
+ fi
+fi
+
if [ -n "$USE_PROZILLA" ]; then
GETURI="proz --no-getch -r -P ./ -t$WGET_RETRIES $PROZILLA_OPTS"
GETURI2="$GETURI"
if [ -n "$LASTLOG_FILE" ]; then
echo "LASTLOG=$LOG" > $LASTLOG_FILE
fi
- (nice -n ${DEF_NICE_LEVEL} ${POLDEK_CMD} `while test $# -gt 0; do echo "$1 ";shift;done` ; echo $? > ${RES_FILE})|tee -a $LOG
+ (${NICE_COMMAND} ${POLDEK_CMD} `while test $# -gt 0; do echo "$1 ";shift;done` ; echo $? > ${RES_FILE})|tee -a $LOG
return $exit_pldk
else
- (nice -n ${DEF_NICE_LEVEL} ${POLDEK_CMD} `while test $# -gt 0; do echo "$1 ";shift;done` ; echo $? > ${RES_FILE}) 1>&2 >/dev/null
+ (${NICE_COMMAND} ${POLDEK_CMD} `while test $# -gt 0; do echo "$1 ";shift;done` ; echo $? > ${RES_FILE}) 1>&2 >/dev/null
return `cat ${RES_FILE}`
rm -rf ${RES_FILE}
fi
-ns, --no-srcs - don't download Sources
-ns0, --no-source0 - don't download Source0
-nn, --no-net - don't download anything from the net
+-ni, --no-init - don't initialize builder paths (SPECS and SOURCES)
-ske,
--skip-existing-files - skip existing files in get_files
--opts <rpm opts> - additional options for rpm
-FRB, --force-remove-build-requires
- remove all you fetched with -R or --fetch-build-requires
remember, this option works without confirmation,
+-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),
+-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
+ but icon file is absent),
-sf, --source-files - list sources - bare filenames (intended for offline
operations; does not work when Icon field is present
- but icon file is absent),
+ but icon file is absent),
-sp, --source-paths - list sources - filenames with full local paths (intended for
offline operations; does not work when Icon field is present
- but icon file is absent),
+ but icon file is absent),
-su, --source-urls - list urls - urls to sources and patches
intended for copying urls with spec with lots of macros in urls
-T <cvstag> , --tag <cvstag>
--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>.
+ - build for platform <platform>.
+--init-rpm-dir - initialize ~/rpm directory structure
"
}
local len=${COLUMNS:-80}
local msg=$(echo "$*" | cut -c-$len)
- echo >&2 "$(date +%s.%N) $*"
- msg="builder[$SPECFILE] ${SHELL_TITLE_PREFIX:+$SHELL_TITLE_PREFIX }$msg"
- case "$TERM" in
- cygwin|xterm*)
- echo >&2 -ne "\033]1;$msg\007\033]2;$msg\007"
- ;;
- screen*)
- echo >&2 -ne "\033]0;$msg\007"
- ;;
- esac
+ if [ -n "$BE_VERBOSE" ]; then
+ echo >&2 "$(date +%s.%N) $*"
+ fi
+
+ if [ "x$TITLECHANGE" == "xyes" -o "x$TITLECHANGE" == "x" ]; then
+ local pkg
+ if [ -n "$PACKAGE_NAME" ]; then
+ pkg=${PACKAGE_NAME}-${PACKAGE_VERSION}-${PACKAGE_RELEASE}
+ else
+ pkg=${SPECFILE}
+ fi
+
+ msg="$pkg: ${SHELL_TITLE_PREFIX:+$SHELL_TITLE_PREFIX }$msg"
+ case "$TERM" in
+ cygwin|xterm*)
+ echo >&2 -ne "\033]1;$msg\007\033]2;$msg\007"
+ ;;
+ screen*)
+ echo >&2 -ne "\033]0;$msg\007"
+ ;;
+ esac
+ fi
}
# set TARGET from BuildArch: from SPECFILE
fi
update_shell_title "cache_rpm_dump"
-rpm_dump_cache=`
+ local rpm_dump
+ rpm_dump=`
+
# we reset macros not to contain macros.build as all the %() macros are
- # executed here, while none of them are actually needed
+ # executed here, while none of them are actually needed.
# what we need from dump is NAME, VERSION, RELEASE and PATCHES/SOURCES.
- # macros.build + macros contained at the time of this writing 70 %() macros
- local macrofiles='/usr/lib/rpm/macros:~/etc/.rpmmacros:~/.rpmmacros'
- local dump='%{echo:z: PACKAGE_NAME %{name} }%dump'
+ # at the time of this writing macros.build + macros contained 70 "%(...)" macros.
+ macrofiles="/usr/lib/rpm/macros:$SPECS_DIR/.builder-rpmmacros:~/etc/.rpmmacros:~/.rpmmacros"
+ dump='%{echo:dummy: PACKAGE_NAME %{name} }%dump'
# FIXME: better ideas than .rpmrc?
- printf 'include:/usr/lib/rpm/rpmrc\nmacrofiles:%s\n' $macrofiles > .rpmrc
+ printf 'include:/usr/lib/rpm/rpmrc\nmacrofiles:%s\n' $macrofiles > .builder-rpmrc
+# TODO: move these to /usr/lib/rpm/macros
+ cat > .builder-rpmmacros <<'EOF'
+%requires_releq_kernel_up %{nil}
+%requires_releq_kernel_smp %{nil}
+%requires_releq() %{nil}
+%pyrequires_eq() %{nil}
+%requires_eq() %{nil}
+%requires_eq_to() %{nil}
+%releq_kernel_up ERROR
+%releq_kernel_smp ERROR
+%kgcc_package ERROR
+%_fontsdir ERROR
+%ruby_version ERROR
+%ruby_ver_requires_eq() %{nil}
+%ruby_mod_ver_requires_eq() %{nil}
+%__php_api_requires() %{nil}
+%php_major_version ERROR
+%php_api_version ERROR
+%py_ver ERROR
+EOF
case "$RPMBUILD" in
- rpm )
- rpm --rcfile .rpmrc -bp --nodeps --define "prep $dump" $BCOND $TARGET_SWITCH $SPECFILE 2>&1
- ;;
- rpmbuild )
- rpmbuild --rcfile .rpmrc --nodigest --nosignature --nobuild --define "prep $dump" $BCOND $TARGET_SWITCH $SPECFILE 2>&1
- ;;
- esac`
-# if [ $? -gt 0 ]; then
-# echo "$rpm_dump_cache" | sed -ne '/^error:/,$p' >&2
-# Exit_error err_build_fail;
-# fi
+ rpm)
+ ARGS='-bp'
+ ;;
+ rpmbuild)
+ ARGS='--nodigest --nosignature --nobuild'
+ ;;
+ esac
+ $RPMBUILD --rcfile .builder-rpmrc $ARGS --nodeps --define "prep $dump" $BCOND $TARGET_SWITCH $SPECFILE 2>&1
+ `
+ if [ $? -gt 0 ]; then
+ error=$(echo "$rpm_dump" | sed -ne '/^error:/,$p')
+ echo "$error" >&2
+ Exit_error err_build_fail;
+ fi
+
+ # make small dump cache
+ rpm_dump_cache=`echo "$rpm_dump" | awk '
+ $2 ~ /^SOURCEURL/ {print}
+ $2 ~ /^PATCHURL/ {print}
+ $2 ~ /^nosource/ {print}
+ $2 ~ /^PACKAGE_/ {print}
+ '`
+
update_shell_title "cache_rpm_dump: OK!"
}
echo "$rpm_dump_cache"
}
+get_icons()
+{
+ update_shell_title "get icons"
+ ICONS="`awk '/^Icon:/ {print $2}' ${SPECFILE}`"
+ if [ -z "$ICONS" ]; then
+ return
+ fi
+
+ rpm_dump_cache="böö" NODIST="yes" UPDATE5= get_files $ICONS
+}
+
parse_spec()
{
update_shell_title "parsing specfile"
set -v;
fi
+ # icons are needed for successful spec parse
+ get_icons;
+
cd $SPECS_DIR
cache_rpm_dump
set -v;
fi
- SOURCE_DIR="`$RPM --eval '%{_sourcedir}'`"
- SPECS_DIR="`$RPM --eval '%{_specdir}'`"
+ if [ "$NOINIT" != "yes" ] ; then
+ SOURCE_DIR="`eval $RPM $RPMOPTS --eval '%{_sourcedir}'`"
+ SPECS_DIR="`eval $RPM $RPMOPTS --eval '%{_specdir}'`"
+ else
+ SOURCE_DIR="."
+ SPECS_DIR="."
+ fi
__PWD="`pwd`"
}
fi
}
+distfiles_path ()
+{
+ echo "by-md5/$(src_md5 "$1" | sed -e 's|^\(.\)\(.\)|\1/\2/&|')/$(basename "$1")"
+}
+
distfiles_url ()
{
- echo "$PROTOCOL$DISTFILES_SERVER/distfiles/by-md5/$(src_md5 "$1" | sed -e 's|^\(.\)\(.\)|\1/\2/&|')/$(basename "$1")"
+ echo "$PROTOCOL$DISTFILES_SERVER/distfiles/$(distfiles_path "$1")"
}
distfiles_attic_url ()
{
- echo "$PROTOCOL$ATTICDISTFILES_SERVER/distfiles/Attic/by-md5/$(src_md5 "$1" | sed -e 's|^\(.\)\(.\)|\1/\2/&|')/$(basename "$1")"
+ echo "$PROTOCOL$ATTICDISTFILES_SERVER/distfiles/Attic/$(distfiles_path "$1")"
}
good_md5 ()
local result=1
local retries_counter=0
- update_shell_title "cvsup: $# files"
+ if [ $# = 1 ]; then
+ update_shell_title "cvsup: $*"
+ else
+ update_shell_title "cvsup: $# files"
+ fi
while [ "$result" != "0" -a "$retries_counter" -le "$CVS_RETRIES" ]; do
retries_counter=$(( $retries_counter + 1 ))
output=$(LC_ALL=C cvs $OPTIONS "$@" 2>&1)
echo "Warning: no URL given for $i"
fi
- if [ -n "$(src_md5 "$i")" ] && [ -z "$NODIST" ]; then
+ if [ -z "$NODIST" ] && [ -n "$(src_md5 "$i")" ]; then
if good_md5 "$i" && good_size "$i"; then
echo "$(nourl "$i") having proper md5sum already exists"
continue
rm -f "$target"
FROM_DISTFILES=0
fi
- elif [ -z "$(src_md5 "$i")" -a "$NOCVS" != "yes" ]; then
- get_files_cvs="$get_files_cvs $fp"
- update_shell_title "$fp (will cvs up later)"
- cvsup=1
+ elif [ "$NOCVS" != "yes" -a -z "$(src_md5 "$i")" ]; then
+ if [ $# -gt 1 ]; then
+ get_files_cvs="$get_files_cvs $fp"
+ update_shell_title "$fp (will cvs up later)"
+ cvsup=1
+ else
+ cvsup $fp
+ fi
fi
if [ -z "$NOURLS" ] && [ ! -f "$fp" -o -n "$UPDATE" ] && [ "`echo $i | grep -E 'ftp://|http://|https://'`" ]; then
eval "perl -pi -e 's/Version:\t"$TOLDVER"/Version:\t"$TNEWVER"/gs' $SPECFILE"
eval "perl -pi -e 's/Release:\t[1-9]{0,4}/Release:\t0.1/' $SPECFILE"
parse_spec;
- if [ -n "$ICONS" ]; then
- get_files $ICONS;
- parse_spec;
- fi
NODIST="yes" UPDATE5="yes" get_files $SOURCES $PATCHES;
unset TOLDVER TNEWVER TNOTIFY
fi
echo "LASTLOG=$LOG" > $LASTLOG_FILE
fi
RES_FILE=~/tmp/$RPMBUILD-exit-status.$RANDOM
- (time eval nice -n ${DEF_NICE_LEVEL} $RPMBUILD $BUILD_SWITCH -v $QUIET $CLEAN $RPMOPTS $BCOND $TARGET_SWITCH $SPECFILE; echo $? > $RES_FILE) 2>&1 |tee $LOG
+ (time eval ${NICE_COMMAND} $RPMBUILD $BUILD_SWITCH -v $QUIET $CLEAN $RPMOPTS $RPMBUILDOPTS $BCOND $TARGET_SWITCH $SPECFILE; echo $? > $RES_FILE) 2>&1 |tee $LOG
RETVAL=`cat $RES_FILE`
rm $RES_FILE
if [ -n "$LOGDIROK" ] && [ -n "$LOGDIRFAIL" ]; then
fi
fi
else
- eval nice -n ${DEF_NICE_LEVEL} $RPMBUILD $BUILD_SWITCH -v $QUIET $CLEAN $RPMOPTS $BCOND $TARGET_SWITCH $SPECFILE
+ eval ${NICE_COMMAND} $RPMBUILD $BUILD_SWITCH -v $QUIET $CLEAN $RPMOPTS $RPMBUILDOPTS $BCOND $TARGET_SWITCH $SPECFILE
RETVAL=$?
fi
if [ "$RETVAL" -ne "0" ]; then
if [ -n "$TRY_UPGRADE" ]; then
- echo "\n!!! Package with new version cannot be build automagically\n"
+ echo "\n!!! Package with new version cannot be built automagically\n"
mv -f $SPECFILE.bak $SPECFILE
fi
Exit_error err_build_fail;
fi
}
+init_rpm_dir() {
+
+ TOP_DIR="`eval $RPM $RPMOPTS --eval '%{_topdir}'`"
+ CVSROOT=":pserver:cvs@$CVS_SERVER:/cvsroot"
+
+ mkdir -p $TOP_DIR/{RPMS,BUILD,SRPMS}
+ cd $TOP_DIR
+ cvs -d $CVSROOT co SOURCES/.cvsignore SPECS/{mirrors,adapter{,.awk},fetchsrc_request,builder,repackage.sh}
+
+ init_builder
+
+ echo "To checkout *all* .spec files:"
+ echo "- remove $SPECS_DIR/CVS/Entries.Static"
+ echo "- run cvs up in $SPECS_DIR dir"
+
+ echo ""
+ echo "To commit with your developer account:"
+ echo "- edit $SPECS_DIR/CVS/Root"
+ echo "- edit $SOURCE_DIR/CVS/Root"
+}
+
#---------------------------------------------
# main()
NOSRCS="yes"
ALWAYS_CVSUP="no"
shift;;
+ -ni | --no-init )
+ NOINIT="yes"
+ shift;;
--opts )
shift; RPMOPTS="$RPM_OPTS ${1}"; shift ;;
--nopatch | -np )
-FRB | --force-remove-build-requires)
REMOVE_BUILD_REQUIRES="force"
shift ;;
+ -sd | --sources-distfiles)
+ COMMAND="list-sources-distfiles"
+ shift ;;
+ -sdp | --sources-distfiles-paths)
+ COMMAND="list-sources-distfiles-paths"
+ shift ;;
-sf | --sources-files)
COMMAND="list-sources-files"
shift ;;
-Upi | --update-poldek-indexes )
UPDATE_POLDEK_INDEXES="yes"
shift ;;
+ --init-rpm-dir)
+ COMMAND="init_rpm_dir";
+ shift ;;
-u | --try-upgrade )
TRY_UPGRADE="1"; shift ;;
-un | --try-upgrade-with-float-version )
RPMOPTS="${RPMOPTS} --nodeps"
;;
-debug)
- RPMOPTS="${RPMOPTS} -debug"; shift ;;
+ RPMBUILDOPTS="${RPMBUILDOPTS} -debug"; shift ;;
* )
SPECFILE="${1}"
# check if specname was passed as specname:cvstag
esac
fi
+if [ "$SCHEDTOOL" != "no" ]; then
+ NICE_COMMAND="$SCHEDTOOL"
+else
+ NICE_COMMAND="nice -n ${DEF_NICE_LEVEL}"
+fi
+
update_shell_title "$COMMAND"
case "$COMMAND" in
"build" | "build-binary" | "build-source" | "build-prep" )
fi
fi
- if [ -n "$ICONS" ]; then
- get_files $ICONS;
- parse_spec;
- fi
if [ -n "$NOSOURCE0" ] ; then
SOURCES=`echo $SOURCES | xargs | sed -e 's/[^ ]*//'`
fi
if [ -n "$SPECFILE" ]; then
get_spec;
parse_spec;
- if [ -n "$ICONS" ]; then
- get_files $ICONS
- parse_spec;
- fi
get_files $SOURCES $PATCHES;
branch_files $TAG "$SOURCES $PATCHES $ICONS";
else
init_builder;
if [ -n "$SPECFILE" ]; then
get_spec;
- parse_spec;
- if [ -n "$ICONS" ]; then
- OLD_UPDATE5=$UPDATE5
- UPDATE5= get_files $ICONS
- UPDATE5=$OLD_UPDATE5
- parse_spec;
- fi
+ parse_spec
+
if [ -n "$NOSOURCE0" ] ; then
SOURCES=`echo $SOURCES | xargs | sed -e 's/[^ ]*//'`
fi
if [ -n "$SPECFILE" ]; then
get_spec;
parse_spec;
- if [ -n "$ICONS" ]; then
- get_files $ICONS
- parse_spec;
- fi
+
# don't fetch sources from remote locations
new_SOURCES=""
for file in $SOURCES
echo $SOURCE_DIR/$(echo $SAP | awk '{gsub(/.*\//,"") ; print }')
done
;;
+ "list-sources-distfiles-paths" )
+ init_builder
+ NOCVSSPEC="yes"
+ DONT_PRINT_REVISION="yes"
+ get_spec
+ parse_spec
+ SAPS="$SOURCES $PATCHES"
+ for SAP in $SAPS ; do
+ if [ -n "$(src_md5 "$SAP")" ]; then
+ distfiles_path "$SAP"
+ fi
+ done
+ ;;
+ "list-sources-distfiles" )
+ init_builder
+ NOCVSSPEC="yes"
+ DONT_PRINT_REVISION="yes"
+ get_spec
+ parse_spec
+ SAPS="$SOURCES $PATCHES"
+ for SAP in $SAPS ; do
+ if [ -n "$(src_md5 "$SAP")" ]; then
+ distfiles_url "$SAP"
+ fi
+ done
+ ;;
+ "init_rpm_dir")
+ init_rpm_dir
+ ;;
"usage" )
usage;;
"version" )