chiark / gitweb /
el/dot-emacs.el: Better fontification for Ediff.
[profile] / bin / mdw-build
index 9717a207ede5906a4c685ee33a55f2b834b62255..24ae04adeae90e693846dce1e1cb6f011ef26a1e 100755 (executable)
 
 set -e
 
+###--------------------------------------------------------------------------
+### Configuration.
+
+unset checkout checkoutrev
+unset setup setupcmd
+unset sign signkey
+unset sbuild sbuildsrv
+unset upload uploadpath
+unset dput dputtarget
+unset build distcheck debian clean vpath native
+for i in \
+  "/etc/mdw-build.conf" \
+  "${XDG_CONFIG_HOME-$HOME/.config}/mdw-build.conf" \
+  "./.mdw-build.conf"
+do
+  if [ -f "$i" ]; then . "$i"; fi
+done
+default_depends () {
+  var=$1 want=$2
+  eval "p=\${$var+t} q=\${$want+t}"
+  case $p,$q in t,*) ;; *,t) eval "$var=yes" ;; *) eval "$var=no" ;; esac
+}
+: ${checkout=yes} ${checkoutrev=HEAD}
+: ${build=test}
+: ${setup=yes} ${setupcmd=mdw-setup}
+: ${distcheck=yes}
+: ${debian=yes}
+: ${clean=yes}
+: ${vpath=yes}
+: ${native=yes}
+default_depends sbuild sbuildsrv
+default_depends sign signkey
+default_depends upload uploadpath
+default_depends dput dputtarget
+: ${DEB_BUILD_OPTIONS=parallel=4}; export DEB_BUILD_OPTIONS
+
 ###--------------------------------------------------------------------------
 ### Parse options.
 
+prog=${0##*/}
+
 usage () {
   cat <<EOF
-Usage: $0 [-vr] BUILDOPT
+Usage: $prog [-vr] BUILDOPT
 
 Build options:
 
   [no]checkout[=REV]
   [no]release
-  [no]setup
+  [no]setup[=RUNE]
   [no]distcheck
   [no]debian
-  [no]upload
+  [no]upload[=SERVER:PATH]
+  [no]dput[=TARGET]
   [no]clean
   [no]vpath
+  [no]sbuild[=SERVER]
+  [no]sign[=KEYID]
+  [no]native
 EOF
 }
 
@@ -85,27 +127,36 @@ done
 shift $((OPTIND - 1))
 
 ## Parse the build options.
-checkout=yes
-checkoutrev=HEAD
-build=test
-setup=yes
-distcheck=yes
-debian=yes
-upload=yes
-clean=yes
-vpath=yes
+maybe_set () {
+  var=$1 want=$2
+  eval "p=\${$want+t}\${$want-nil}"
+  case $p in
+    t) eval $var=yes ;;
+    nil) echo >&2 "$prog: $want not set"; exit 1 ;;
+  esac
+}
 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 | vpath)
+    setup)     setup=yes setupcmd=mdw-setup ;;
+    setup=*)   setup=yes setupcmd=${opt#*=} ;;
+    upload)    maybe_set upload uploadpath ;;
+    upload=*)  upload=yes uploadpath=${opt#*=} ;;
+    sign)      maybe_set sign signkey ;;
+    sign=*)    sign=yes signkey=${opt#*=} ;;
+    sbuild)    maybe_set sbuild sbuildsrv ;;
+    sbuild=*)  sbuild=yes sbuildsrv=${opt#*=} ;;
+    dput)      maybe_set dput dputtarget ;;
+    dput=*)    dput=yes dputtarget=${opt#*=} ;;
+
+    distcheck | debian | clean | vpath | native)
       eval "$opt=yes"
       ;;
-    nosetup | nodistcheck | nodebian | noupload | noclean | novpath)
+    nocheckout | nosetup | nodistcheck | nodebian | \
+    noupload | nodput | noclean | novpath | nonative | nosbuild | nosign)
       eval "${opt#no}=no"
       ;;
     *)
@@ -192,8 +243,15 @@ while [ ! -f configure.ac -a ! -f configure.in -a \
 done
 assign srcpath $(pwd)
 
+## Build any necessary qualifiers.
+qual= sep=.
+case ${SBOX_SESSION_DIR+t},${DEB_BUILD_ARCH+t} in
+  t,t) qual=$qual$sep$DEB_BUILD_ARCH; sep=- ;;
+  t,*) fail "unknown build arch" ;;
+esac
+
 ## Construct the output directory.
-assign releasepath $srcpath/dist-$build
+assign releasepath $srcpath/dist-$build$qual
 chmod -R +w $releasepath 2>/dev/null || :
 rm -rf $releasepath 2>/dev/null || :
 mkdir $releasepath
@@ -217,7 +275,7 @@ case "$checkout,$setup,$(yesno [ -d $srcpath/.git ])" in
     cd $srcpath
     [ "$(git ls-files -m)" = "" ] ||
       warn "working tree has uncommitted changes"
-    gitver=$(git describe --abbrev=4)
+    ;;
 esac
 
 ## Is there Debian build equipment?
@@ -236,6 +294,18 @@ case "$debian,$(yesno [ -d $srcpath/debian ])" in
     ;;
 esac
 
+## Maybe check out 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
+    gitver=$(git describe --abbrev=4)
+    ;;
+esac
+
 ## Check the version number.
 hack_dch_p=no
 case "$gitver,$debver" in
@@ -249,21 +319,10 @@ case "$gitver,$debver" in
     ;;
 esac
 
-## Maybe check out 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
+    run $setupcmd
     ;;
 esac
 
@@ -310,15 +369,19 @@ esac
 
 cd $releasepath
 
-if ! tar tf $buildpath/$distdir.tar.gz 2>/dev/null | grep -q RELEASE; then
-  fail "missing RELEASE file in distribution"
-fi
+case $native in
+  yes)
+    if ! tar tf $buildpath/$distdir.tar.gz 2>/dev/null | grep -q RELEASE
+    then
+      fail "missing RELEASE file in distribution"
+    fi
+    ;;
+esac
 
 run mv $buildpath/$distdir.tar.gz .
-case $build in
-  release)
-    run gpg -u$(mdw-conf releasekey) -ab -o$distdir.tar.gz.gpg \
-      $distdir.tar.gz
+case $build,$sign in
+  release,yes)
+    run gpg -u$signkey -ab -o$distdir.tar.gz.gpg $distdir.tar.gz
     ;;
 esac
 
@@ -342,24 +405,23 @@ EOF
        mv debian/changelog.new debian/changelog
        ;;
     esac
-    run dpkg-buildpackage -k$(mdw-conf releasekey)
+    case $sbuild,$build,$sign in
+      yes,release,yes) run mdw-sbuild -k$signkey $sbuildsrv ;;
+      yes,*) run mdw-sbuild $sbuildsrv ;;
+      no,release,yes) run dpkg-buildpackage -k$signkey ;;
+      no,*) run dpkg-buildpackage -us -uc ;;
+    esac
     ;;
 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 $distdir.tar.gz.gpg \
-      $(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
+  yes,test) info "Test build: not uploading." ;;
+  yes,release) run rsync $distdir.tar.gz $distdir.tar.gz.gpg $uploadpath ;;
+esac
+case "$debian,$upload,$dput,$build" in
+  yes,yes,yes,release) run dput -f $dputtarget *.changes ;;
 esac
 
 ## Tidy up.