| 1 | #! /bin/sh -e |
| 2 | ### |
| 3 | ### Build a Debian package on an sbuild server. |
| 4 | ### |
| 5 | ### (c) 2016 Mark Wooding |
| 6 | ### |
| 7 | |
| 8 | ###----- Licensing notice --------------------------------------------------- |
| 9 | ### |
| 10 | ### This program is free software; you can redistribute it and/or modify |
| 11 | ### it under the terms of the GNU General Public License as published by |
| 12 | ### the Free Software Foundation; either version 2 of the License, or |
| 13 | ### (at your option) any later version. |
| 14 | ### |
| 15 | ### This program is distributed in the hope that it will be useful, |
| 16 | ### but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 17 | ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 18 | ### GNU General Public License for more details. |
| 19 | ### |
| 20 | ### You should have received a copy of the GNU General Public License |
| 21 | ### along with this program; if not, write to the Free Software Foundation, |
| 22 | ### Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| 23 | |
| 24 | ###-------------------------------------------------------------------------- |
| 25 | ### Some utilities. |
| 26 | |
| 27 | prog=${0##*/} |
| 28 | |
| 29 | fail () { echo >&2 "$prog: $*"; exit 1; } |
| 30 | usage () { echo "usage: $prog [-ain] [-k KEYID] [-t TARGET] HOST"; } |
| 31 | fail_usage () { usage >&2; exit 1; } |
| 32 | |
| 33 | ###-------------------------------------------------------------------------- |
| 34 | ### Parse options. |
| 35 | |
| 36 | bogusp=nil noactp=nil signp=nil |
| 37 | unset buildopts pkgs |
| 38 | while getopts "haik:np:t:" opt; do |
| 39 | case $opt in |
| 40 | h) |
| 41 | usage |
| 42 | cat <<EOF |
| 43 | |
| 44 | Options: |
| 45 | -h Show this help text. |
| 46 | -a Build only architecture-dependent packages. |
| 47 | -i Build only architecture-neutral packages. |
| 48 | -k KEYID Sign the result using KEYID. |
| 49 | -n Don't actually do the build. |
| 50 | -p DIR Upload additional packages from DIR. |
| 51 | -t TARGET Build in TARGET build environment. |
| 52 | EOF |
| 53 | exit 0 |
| 54 | ;; |
| 55 | a) buildopts="${buildopts+$buildopts }-a" ;; |
| 56 | i) buildopts="${buildopts+$buildopts }-i" ;; |
| 57 | k) signp=t keyid=$OPTARG ;; |
| 58 | n) buildopts="${buildopts+$buildopts }-n" noactp=t ;; |
| 59 | p) pkgs=$OPTARG ;; |
| 60 | t) buildopts="${buildopts+$buildopts }-t$OPTARG" ;; |
| 61 | *) bogusp=t ;; |
| 62 | esac |
| 63 | done |
| 64 | shift $(( $OPTIND - 1 )) |
| 65 | case $# in |
| 66 | 1) host=$1 ;; |
| 67 | *) bogusp=t ;; |
| 68 | esac |
| 69 | case $bogusp in t) fail_usage ;; esac |
| 70 | case $noactp in t) signp=nil ;; esac |
| 71 | case ${pkgs-/hack} in /*) ;; *) pkgs=$(pwd)/$pkgs ;; esac |
| 72 | |
| 73 | ###-------------------------------------------------------------------------- |
| 74 | ### Main program. |
| 75 | |
| 76 | ## Figure out the package name and version number. |
| 77 | unset pkg ver |
| 78 | while read tag value; do |
| 79 | case $tag in |
| 80 | Source:) pkg=$value ;; |
| 81 | Version:) ver=$value ;; |
| 82 | esac |
| 83 | done <<EOF |
| 84 | $(dpkg-parsechangelog) |
| 85 | EOF |
| 86 | case ${pkg+t} in t) ;; *) fail "can't figure out the package name" ;; esac |
| 87 | case ${ver+t} in t) ;; *) fail "can't figure out the package version" ;; esac |
| 88 | |
| 89 | ## Build a Debian source package. Don't sign anything yet. That will happen |
| 90 | ## at the end, all in one go. |
| 91 | dpkg-buildpackage -S -uc -us -d -i |
| 92 | cd .. |
| 93 | dsc=${pkg}_${ver}.dsc |
| 94 | [ -f "$dsc" ] || fail "where is my \`.dsc' file?" |
| 95 | |
| 96 | ## Actually do the build. Get a build directory assigned by the server, |
| 97 | ## upload the sources, run the build, and collect the results. |
| 98 | builddir=$(ssh "$host" mdw-sbuild-server dir "$pkg/$ver") |
| 99 | dcmd rsync -a "$dsc" "$host:$builddir/" |
| 100 | case ${pkgs+t} in t) rsync -a "$pkgs/" "$host:$builddir/pkgs/" ;; esac |
| 101 | set +e; ssh "$host" mdw-sbuild-server $buildopts build "$builddir" |
| 102 | rc=$?; set -e |
| 103 | rsync -a "$host:$builddir/" ./ |
| 104 | case $rc in 0) ;; *) exit $rc ;; esac |
| 105 | |
| 106 | ## Merge the change files together, and maybe sign the result. |
| 107 | chchch=${pkg}_${ver}_source.changes |
| 108 | for i in "${pkg}_${ver}"_*.changes; do |
| 109 | case " $chchch " in *" $i "*) ;; *) chchch="$chchch $i" ;; esac |
| 110 | done |
| 111 | mergechanges -f $chchch |
| 112 | rm $chchch |
| 113 | case $signp in |
| 114 | t) debsign -k"$keyid" "${pkg}_${ver}_multi.changes" ;; |
| 115 | esac |