X-Git-Url: https://git.distorted.org.uk/~mdw/profile/blobdiff_plain/92b05c85154487f824b37a607c38cad4aa20fe27..c0a4a95f5bc569e8418b396da691b5fc411e3f9c:/bin/mdw-sbuild-server diff --git a/bin/mdw-sbuild-server b/bin/mdw-sbuild-server index d04f5a2..b9872bd 100755 --- a/bin/mdw-sbuild-server +++ b/bin/mdw-sbuild-server @@ -33,7 +33,6 @@ do done : ${buildroot=$HOME/build} : ${default_targets="wheezy-amd64 wheezy-i386"} -: ${parallel=-j3} : ${DEB_BUILD_OPTIONS=parallel=4}; export DEB_BUILD_OPTIONS ###-------------------------------------------------------------------------- @@ -42,7 +41,7 @@ done prog=${0##*/} fail () { echo >&2 "$prog: $*"; exit 1; } -usage () { echo "usage: $prog [-ain] [-t TARGET] COMMAND [ARGUMENTS ...]"; } +usage () { echo "usage: $prog [-aiknT] [-t TARGET] [-A DBPARGS] COMMAND [ARGUMENTS ...]"; } fail_usage () { usage >&2; exit 1; } want_1 () { @@ -57,13 +56,27 @@ want_1 () { echo "$1" } +run () { + case $notreally in + t) echo "+ $*" ;; + nil) nice "$@" ;; + esac +} + +decor () { + tag=$1 marker=$2 + while IFS= read -r line; do + printf "%-21s %c %s\n" "$tag" "$marker" "$line" + done +} + ###-------------------------------------------------------------------------- ### Parse options. -bogusp=nil archp=nil indepp=nil makeopts="" -unset targets +bogusp=nil archp=nil indepp=nil keepon=nil notreally=nil +unset targets dbpargs -while getopts "haint:" opt; do +while getopts "haint:A:T" opt; do case $opt in h) usage @@ -73,8 +86,11 @@ Options: -h Show this help text. -a Build only architecture-dependent packages. -i Build only architecture-neutral packages. + -k Keep going even if one fails. -n Don't actually do the build. -t TARGET Build in TARGET build environment. + -A ARGS Pass ARGS to \`dpkg-buildpackage'. + -T Don't run the tests. Commands available: @@ -91,8 +107,16 @@ EOF ;; a) archp=t ;; i) indepp=t ;; - n) makeopts="${makeopts+$makeopts }-n" ;; + k) keepon=t ;; + n) notreally=t ;; t) targets="${targets+$targets }$OPTARG" ;; + A) dbpargs="${dbpargs+$dbpargs }$OPTARG" ;; + T) + case " $DEB_BUILD_OPTIONS " in + *" nocheck "*) ;; + *) DEB_BUILD_OPTIONS=${DEB_BUILD_OPTIONS+"$DEB_BUILD_OPTIONS "} nocheck ;; + esac + ;; *) bogusp=nil ;; esac done @@ -137,6 +161,7 @@ case "$#,$1" in ## racing with another process, but that's why we're trying in a loop. if mkdir "$ver#$nn" >/dev/null 2>&1; then winp=t + cd "$ver#$nn" break fi @@ -149,6 +174,9 @@ case "$#,$1" in ## Make sure we actually succeeded. case $winp in t) ;; *) fail "failed to create build directory" ;; esac + ## Make an empty directory for dependency packages. + mkdir -p pkgs/ + ## Done. echo "$buildroot/$dist#$nn" ;; @@ -171,6 +199,7 @@ case "$#,$1" in unset first rest; anyp=nil depp=nil allp=nil wantarchs=$(sed -n '/^[Aa]rchitecture:/ s/^[^:]*: *//p' "$dsc") : ${wantarchs:=any} + unset buildarchs buildarchs_seen=: ## Work through the available targets assigning builds to them. This is ## actually a little tricky. @@ -182,6 +211,14 @@ case "$#,$1" in */*) target=${archs%/*} host=${archs#*/} ;; *) target=$archs host=$archs; t=$suite-$target/$host ;; esac + case $buildarchs_seen in + *:$target:*) + ;; + *) + buildarchs=${buildarchs+$buildarchs }$target + buildarchs_seen=$buildarchs_seen$target: + ;; + esac ## Work through the architectures which we can build. for arch in $wantarchs; do @@ -201,7 +238,7 @@ case "$#,$1" in *) ## There's at least one architecture-specific package. - ## If we don't want to build architecture-specific package then + ## If we don't want to build architecture-specific packages then ## there's nothing to do. case $archp in nil) continue ;; esac @@ -233,48 +270,51 @@ case "$#,$1" in esac case $archp in t) ;; - nil) firstopt="$firstopt --debbuildopt=-A" ;; + nil) firstopt="$firstopt --no-arch-any" ;; esac - ## Build a cheesy makefile to run these in parallel. - cat >build.mk <build-status.\$\$full; \\ - sbuild \\ - --dist=\$\$suite --build=\$\$host --host=\$\$target \\ - --chroot=\$\$suite-\$\$host --verbose \$1 \$(DSC); \\ - rc=\$\$?; case \$\$rc in \\ - 0) echo ok >build-status.\$\$full ;; \\ - *) echo failed rc=\$\$rc >build-status.\$\$full ;; \\ - esac; } | \\ - while IFS= read -r line; do \\ - printf "%s: %s\n" "\$\$full" "\$\$line"; \\ - done; \\ - read st _ build-status.${i%/*}; done - - ## And we're ready to go. - mkfifo pipeout - cat pipeout& catpid=$! - set +e; make -fbuild.mk $parallel $makeopts -k all >pipeout - rc=$?; set -e - wait $! - rm build.mk pipeout build-status.* - find . -maxdepth 1 -type l -exec rm {} \; + ## Build the builds sequentially. Tests can conflict with each other, + ## e.g., over port numbers. + rc=0 buildopt=$firstopt + for t in $first $rest; do + host=${t##*/} full=${t%/*} + suite=${full%%-*} target=${full#*-} + + ## And we're ready to go. + exec 3>&1 + thisrc=$( + { { { { set +e + run sbuild --extra-package=$pkgs.$target \ + --dist=$suite --build=$host --host=$target \ + --chroot=$suite-$host --verbose $buildopt $dsc \ + ${dbpargs+--debbuildopts="$dbpargs"} \ + 3>&- 4>&- 5>&- + echo $? >&5 + } | + decor "$full" "|" >&4; } 2>&1 | + decor "$full" "*" >&4; } 4>&1 | + cat -u >&3; } 5>&1 &- + case $thisrc in 0) ;; + *) + echo failed rc=$thisrc >$stat; rc=$thisrc + case $keepon in nil) break ;; esac + ;; + esac + buildopt=--no-arch-all + done exit $rc ;; build,*)