#! /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 <&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 } warn () { case $build in release) fail "$*" ;; *) notify 5 "??? $*" ;; esac } 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 ## Do we have a Git repository? 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." checkout=no gitver=none ;; yes,yes,yes) cd $srcpath [ "$(git ls-files -m)" = "" ] || warn "working tree has uncommitted changes" gitver=$(git describe) esac ## Is there Debian build equipment? case "$debian,$(yesno [ -d $srcpath/debian ])" in yes,no) info "No debian directory found." debian=no debver=none ;; yes,yes) debver=$(dpkg-parsechangelog | sed -n 's/^Version: //p') ;; esac ## Check the version number. case "$gitver,$debver" in none,* | *,none) ;; *) [ "$gitver" = "$debver" ] || warn "Git version $gitver doesn't match Debian version $debver" ;; esac ## Maybe check ot a copy of the source. case "$checkout" in yes) 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" in 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) run rsync $distdir.tar.gz \ $(mdw-conf upload-target metalzone.distorted.org.uk:/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 --------------------------------------------------