--- /dev/null
+#!/bin/bash
+
+# use svn propset svn:keywords Revision to enable this
+REVISION=$(echo '$Revision$' | sed -e 's,\$,,g' -e 's,^\w*:\s,,' )
+
+COMMAND=$(basename $0)
+ROOT=/build
+CHROOTBINDIR=/root/bin
+
+# default values, tunable with command-line options
+SVNPATH="svn+ssh://build@svn.one-lab.org/svn/build/trunk"
+DISTRO=onelab
+MAILTO="onelab-build@one-lab.org"
+TAGSFILE=onelab-tags.mk
+
+####################
+# plc chroot runs in UTC
+DATE=$(date -u +'%Y.%m.%d')
+
+### in the root context
+function do_chroot () {
+ chroot /plc/devel/root su - build <<EOF
+$CHROOTBINDIR/$COMMAND $@
+EOF
+}
+
+# Notify recipient of failure
+function failure() {
+ touch ${BUILD}.broken
+ if [ -n "$MAILTO" ] ; then
+ tail -c 8k ${BUILD}/log-build.txt | mail -s "Failures for ${BUILD}" $MAILTO
+ fi
+ exit 1
+}
+
+function success () {
+ touch ${BUILD}.ok
+ if [ -n "$MAILTO" ] ; then
+ (echo "http://build.one-lab.org/$DISTRO/$BASE" ; echo "Completed on $(date)" ) | mail -s "Successfull build in ${BUILD}" $MAILTO
+ fi
+ exit 0
+}
+
+function create_base () {
+ i=
+ while ! mkdir ${BASE}${i} 2>/dev/null ; do
+ [ -z ${i} ] && BASE=${BASE}.
+ i=$((${i}+1))
+ if [ $i -gt 100 ] ; then
+ echo "$0: Failed to create release directory `pwd`/${BASE}${i}"
+ exit 1
+ fi
+ done
+ BASE=${BASE}${i}
+}
+
+function use_base () {
+ [ ! -d $BASE ] && mkdir $BASE
+ if [ ! -d $BASE ] ; then
+ echo $COMMAND failed to create base $BASE
+ exit 1
+ fi
+}
+
+function build () {
+ trap failure ERR INT
+ set -x
+
+ echo -n "============================== Starting $COMMAND on "
+ date
+
+ cd $ROOT
+ svn co $SVNPATH $BASE
+
+ # if TAGSTAG specified : update TAGSFILE with this tag
+ if [ -n "$TAGSTAG" ] ; then
+ cd $BASE
+ svn up -r $TAGSTAG $TAGSFILE
+ cd -
+ fi
+
+ show_env
+
+ echo "Running make IN build $(pwd)"
+ make ${MAKEOPTS[@]} TAGSFILE=${TAGSFILE} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE $MAKETARGETS
+
+ # only if successful
+ rm -f latest
+ ln -s $BASE latest
+
+ success
+}
+
+function show_env () {
+ echo ROOT=$ROOT
+ echo DISTRO=$DISTRO
+ echo BASE=$BASE
+ echo SVNPATH=$SVNPATH
+ echo MAKEVARS="${MAKEVARS[@]}"
+ echo MAKEOPTS="${MAKEOPTS[@]}"
+ echo TAGSFILE="$TAGSFILE"
+ echo TAGSTAG="$TAGSTAG"
+ echo "XXXXXXXXXXXXXXXXXXXX Contents of tags definition file $TAGSFILE"
+ cat $BASE/$TAGSFILE
+ echo "XXXXXXXXXXXXXXXXXXXX end tags definition"
+}
+
+function usage () {
+ echo "Usage: $COMMAND [option] make-targets"
+ echo "This is revision $REVISION"
+ echo "Supported options"
+ echo " -b BASE - may include @, then replaced with current date"
+ echo " -u : uses directory given as BASE as is, even if already exists"
+ echo " -e : exits (does nothing) if BASE already exists"
+ echo " -d DISTRO"
+ echo " -t TAGSFILE"
+ echo " -r TAGSTAG - a tag that refers to TAGSFILE - defaults to HEAD"
+ echo " -s MAKEVAR=value - spaces in value are not supported"
+ echo " -n passed to make"
+ echo " -v verbose"
+ echo " -m MAILTO"
+ echo " -s SVNPATH"
+ exit 1
+}
+
+function main () {
+
+ if [ -d /plc/devel/data ] ; then
+ do_chroot "$@"
+ else
+ MAKEVARS=()
+ MAKEOPTS=()
+ while getopts "b:ued:t:r:B:s:nvm:s:h" opt ; do
+ case $opt in
+ b) BASE=$OPTARG ;;
+ u) USEOLD=true ;;
+ e) EXITIFOLD=true ;;
+ d) DISTRO=$OPTARG ;;
+ t) TAGSFILE=$OPTARG ;;
+ r) TAGSTAG=$OPTARG ;;
+ s) MAKEVARS=(${MAKEVARS[@]} $OPTARG) ;;
+ n) MAILTO="" ; MAKEOPTS=(${MAKEOPTS[@]} -n) ;;
+ v) set -x ;;
+ m) MAILTO=$OPTARG ;;
+ s) SVNPATH=$OPTARG ;;
+ h|*) usage ;;
+ esac
+ done
+
+ shift $(($OPTIND - 1))
+
+ ROOT=$ROOT/$DISTRO
+ cd $ROOT
+
+ MAKETARGETS="$@"
+
+ ### set BASE from DISTRO, if unspecified
+ [ -z "$BASE" ] && BASE=${DISTRO}
+ BASE=$(echo ${BASE} | sed -e "s,@,${DATE},g")
+
+ if [ -n "$EXITIFOLD" -a -d "$BASE" ] ; then
+ echo "$COMMAND: -e : exits on existing base directory $BASE"
+ BUILD=$ROOT/$BASE
+ failure
+ exit 1
+ fi
+
+ if [ -n "$USEOLD" ] ; then
+ use_base $BASE
+ else
+ create_base
+ fi
+ BUILD=$ROOT/$BASE
+
+ build >> ${BUILD}/log-build.txt 2>&1
+ fi
+}
+
+##########
+main "$@"