#! /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. ###-------------------------------------------------------------------------- ### Conventions for build systems. ### ### This script is designed to work with a variety of `make'-based build ### systems, but there are a number of conventions which must be followed if ### this is going to work properly. ### ### * There must be a `configure.ac', `configure.in', or `.links' file, or ### a `.git' directory in the project top-level, so that we can find it. ### ### * The following `make' variables must be assigned in the top-level ### Makefile, after `mdw-build' has constructed it. ### ### distdir The name of the top-level project directory in the ### source distribution, and the base name for ### distribution archives; should be of the form ### `PROJECT-VERSION'. ### ### The following `make' targets must be available in the top-level ### Makefile. ### ### dist Write to $(distdir).tar.gz a source distribution of ### the package. ### ### distcheck As for `dist', but also build and test the project. ### ### * The source distribution constructed by `make dist' must contain a file ### $(distdir)/RELEASE containing the release name. This isn't currently ### tested, but it might be later. 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 -a ! -d .git ]; 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 tf $buildpath/$distdir.tar.gz 2>/dev/null | 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 ftp.distorted.org.uk:~ftp/pub/mdw/) case "$debian" in yes) run dput -f $(mdw-conf dput-target distorted) *.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 --------------------------------------------------