--- /dev/null
+#! /bin/bash
+###
+### Build script for Debian packages
+###
+### (c) 2008 Mark Wooding
+###
+
+###----- Licensing notice ---------------------------------------------------
+###
+### This program is free software; you can redistribute it and/or modify
+### it under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 2 of the License, or
+### (at your option) any later version.
+###
+### This program is distributed in the hope that it will be useful,
+### but WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with this program; if not, write to the Free Software Foundation,
+### Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+set -e
+
+###--------------------------------------------------------------------------
+### Parse options.
+
+usage () {
+ cat <<EOF
+Usage: $0 [-vr] BUILDOPT
+
+Build options:
+
+ [no]checkout[=REV]
+ [no]release
+ [no]setup
+ [no]distcheck
+ [no]debian
+ [no]upload
+ [no]clean
+EOF
+}
+
+## Parse simple options.
+verbose=no
+while getopts "hvr" opt; do
+ case "$opt" in
+ h) usage; exit 0 ;;
+ v) verbose=yes ;;
+ *) exit 1 ;;
+ esac
+done
+shift $((OPTIND - 1))
+
+## Parse the build options.
+checkout=yes
+checkoutrev=HEAD
+build=test
+setup=yes
+distcheck=yes
+debian=yes
+upload=yes
+clean=yes
+for opt; do
+ case "$opt" in
+ checkout) checkout=yes checkoutrev=HEAD ;;
+ checkout=*) checkout=yes checkoutrev=${opt#*=} ;;
+ nocheckout) checkout=no ;;
+ release) build=release ;;
+ norelease) build=test ;;
+
+ setup | distcheck | debian | upload | clean)
+ eval "$opt=yes"
+ ;;
+ nosetup | nodistcheck | nodebian | noupload | noclean)
+ eval "${opt#no}=no"
+ ;;
+ *)
+ usage >&2
+ exit 1
+ ;;
+ esac
+done
+
+###--------------------------------------------------------------------------
+### Utility functions.
+
+exec 3>&2 4>/dev/null 5>&2
+
+notify () {
+ colour=$1 message=$2
+ echo $message >&4
+ echo "$(tput bold; tput setaf $colour)$message$(tput sgr0; tput op)" >&5
+}
+
+fail () {
+ notify 1 "!!! $*"
+ exit 1
+}
+
+info () {
+ notify 6 "--- $*"
+}
+
+assign () {
+ info "$1 = $2"
+ eval "$1=$2"
+}
+
+runx () {
+ notify 2 "+++ $*"
+ "$@" 2>&3 || fail "$1: exit $?"
+}
+
+run () { runx "$@" >&3; }
+
+yesno () {
+ echo -n "(test $*)" >&4
+ if "$@" >&4 2>&4; then
+ echo "(yes)" >&4
+ echo yes
+ else
+ echo "(no)" >&4
+ echo no
+ fi
+}
+
+###--------------------------------------------------------------------------
+### Do the building.
+
+## Find the top-level package directory.
+while [ ! -f configure.ac -a ! -f configure.in -a ! -f .links ]; do
+ case "$(pwd)" in
+ /)
+ fail "couldn't find top-level directory"
+ ;;
+ esac
+ cd ..
+done
+assign srcpath $(pwd)
+
+## Construct the output directory.
+assign releasepath $srcpath/dist-$build
+chmod -R +w $releasepath 2>/dev/null|| :
+rm -rf $releasepath 2>/dev/null || :
+mkdir $releasepath
+case $verbose in
+ no)
+ exec 4>$releasepath/mdw-build.log 3>&4 ||
+ fail "Failed to create log."
+ ;;
+esac
+
+## Maybe check out a copy of the source.
+case "$checkout,$setup,$(yesno [ -d $srcpath/.git ])" in
+ yes,no,*)
+ fail "Inconsistent options: can't check out without setup."
+ ;;
+ yes,yes,no)
+ info "No Git repository found."
+ ;;
+ yes,yes,yes)
+ cd $srcpath
+ [ "$(git ls-files -m)" = "" ] ||
+ fail "working tree has uncommitted changes"
+ cd $releasepath
+ run git clone -sn $srcpath/.git _source
+ assign srcpath $releasepath/_source
+ cd $srcpath
+ run git checkout -b mdw-build $checkoutrev
+ ;;
+esac
+
+## Maybe refresh the build machinery.
+case "$setup" in
+ yes)
+ run mdw-setup
+ ;;
+esac
+
+## Initialize the build directory.
+if [ -e $srcpath/configure ]; then
+ assign buildpath $releasepath/_build
+ mkdir $buildpath
+ cd $buildpath
+ run $srcpath/configure
+else
+ info "no configure script"
+ assign buildpath $srcpath
+ cd $srcpath
+fi
+
+## Discover the release name.
+cat >find-distdir.mk <<'EOF'
+include Makefile
+print-distdir:
+ @echo $(distdir)
+EOF
+assign distdir $(make -f find-distdir.mk print-distdir)
+
+## Get a tarball distribution.
+case "$distcheck" in
+ yes)
+ run make distcheck
+ ;;
+ no)
+ run make dist
+ ;;
+esac
+
+cd $releasepath
+
+if ! tar tfz $buildpath/$distdir.tar.gz | grep -q RELEASE; then
+ fail "missing RELEASE file in distribution"
+fi
+
+run mv $buildpath/$distdir.tar.gz .
+
+## Maybe build the Debian packages.
+case "$debian,$(yesno [ -d $srcpath/debian ])" in
+ yes,no)
+ info "No debian directory found."
+ debian=no
+ ;;
+ yes,yes)
+ run tar xvfz $distdir.tar.gz
+ cd $distdir
+ run dpkg-buildpackage -k$(mdw-conf releasekey)
+ ;;
+esac
+
+## Maybe upload Debian packages.
+cd $releasepath
+case "$upload,$build" in
+ yes,test)
+ info "Test build: not uploading."
+ ;;
+ yes,release)
+ cp $distdir.tar.gz /home/ftp/pub/mdw/
+ case "$debian" in
+ yes)
+ run dput -f $(mdw-conf dput-target metalzone) *.changes
+ ;;
+ esac
+esac
+
+## Tidy up.
+case "$clean" in
+ yes)
+ rm -rf $releasepath/$distdir
+ rm -rf $releasepath/_source
+ rm -rf $releasepath/_build
+ ;;
+esac
+
+## Done.
+info "All OK."
+
+###----- That's all, folks --------------------------------------------------