## 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
## 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"
;;
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.
for t in $targets; do
+ ## Dissect the target name.
+ suite=${t%%-*} archs=${t#*-}
+ case $archs 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
case $arch 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
## If we can't build it then we shouldn't try.
- if ! dpkg-architecture -a"$os-${t#*-}" -i"$arch"; then
+ if ! dpkg-architecture -a"$os-$target" -i"$arch"; then
continue
fi
nil) firstopt="$firstopt --debbuildopt=-A" ;;
esac
+ ## Sort out the additional packages. This is rather annoying, because
+ ## sbuild(1) does this in a really stupid way.
+ rm -rf pkgs.*
+ for a in $buildarchs; do
+ mkdir pkgs.$a
+ for f in $(dpkg-scanpackages -a$a pkgs/ |
+ sed -n '/^Filename: /s///p')
+ do
+ ln $f pkgs.$a/
+ done
+ done
+
## Build a cheesy makefile to run these in parallel.
cat >build.mk <<EOF
### -*-makefile-*-
REST = $rest
sbuild-wrap = \\
t=\$@; \\
- { echo started >build-status.\$\$t; \\
+ host=\$\${t\#\#*/} full=\$\${t%/*}; \\
+ suite=\$\${full%%-*} target=\$\${full\#*-}; \\
+ { echo started >build-status.\$\$full; \\
sbuild \\
- --dist=\$\${t%-*} --arch=\$\${t\#*-} \\
- --chroot=\$@ --verbose \$1 \$(DSC); \\
+ --extra-package=pkgs.\$\$target/ \\
+ --dist=\$\$suite --build=\$\$host --host=\$\$target \\
+ --chroot=\$\$suite-\$\$host --verbose \$1 \$(DSC); \\
rc=\$\$?; case \$\$rc in \\
- 0) echo ok >build-status.\$\$t ;; \\
- *) echo failed rc=\$\$rc >build-status.\$\$t ;; \\
+ 0) echo ok >build-status.\$\$full ;; \\
+ *) echo failed rc=\$\$rc >build-status.\$\$full ;; \\
esac; } | \\
while IFS= read -r line; do \\
- printf "%s: %s\n" "\$\$t" "\$\$line"; \\
+ printf "%s: %s\n" "\$\$full" "\$\$line"; \\
done; \\
- read st _ <build-status.\$\$t && \\
+ read st _ <build-status.\$\$full && \\
case \$\$st in ok) exit 0 ;; *) exit 1 ;; esac
all: \$(FIRST) \$(REST)
\$(FIRST):; \$(call sbuild-wrap,$firstopt)
EOF
## Make some marker files to say things are in progress.
- for i in $first $rest; do echo "starting" >build-status.$i; done
+ for i in $first $rest; do echo "starting" >build-status.${i%/*}; done
## And we're ready to go.
mkfifo pipeout