chiark / gitweb /
mdw-build: Bring into the fold.
authorMark Wooding <mdw@distorted.org.uk>
Sat, 27 Dec 2008 11:56:06 +0000 (11:56 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 27 Dec 2008 12:10:25 +0000 (12:10 +0000)
mdw-build [new file with mode: 0755]
setup

diff --git a/mdw-build b/mdw-build
new file mode 100755 (executable)
index 0000000..903db37
--- /dev/null
+++ b/mdw-build
@@ -0,0 +1,260 @@
+#! /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 --------------------------------------------------
diff --git a/setup b/setup
index da71b34dc1cb69568d022364c4d2d59a78045128..15292b6841a973aa415dcdd529a272930ace758d 100755 (executable)
--- a/setup
+++ b/setup
@@ -187,6 +187,7 @@ echo " done."
 scripts="
   mdw-editor
   mdw-conf
+  mdw-build
   movemail-hack
   emerge-hack
   lesspipe.sh