#
# - automate builds with sbuild and dinstall the result
#
-# Copyright (c) 2008 martin f. krafft <madduck@debian.org>
+# Copyright (c) 2008–2010 martin f. krafft <madduck@debian.org>
# Released under the terms of the Artistic Licence 2.0.
#
set -eu
ME="${0##*/}"
BUILDDIR="$(mktemp -dt $ME.XXXXXXXX)"
-trap "cd /tmp && rm -r '$BUILDDIR'" 0
+cleanup() {
+ cd /tmp && rm -r "$BUILDDIR"
+ trap - 1 2 3 4 5 6 7 8 10 11 12 13 14 15
+}
+trap cleanup 1 2 3 4 5 6 7 8 10 11 12 13 14 15
BUNDLE_DIR="${TMPDIR:-/tmp}"
TARGET_DIR="$PWD"
print_bundle_location() {
echo "Bundle available at $@ ."
}
+postbuild() {
+ :
+}
KEYID=
echo
echo "Valid options are:"
cat <<-_eof | column -s\& -t
- --dist & specify the target distribution (default: sid)
+ --dist & specify the target distribution (default: from changes file)
--arch & specify the target architecture (default: $DEB_BUILD_ARCH)
+ -sa & pass --force-orig-source to sbuild
+ -B & do a binary-only build
-h|--help & show this output.
-V|--version & show version information.
_eof
}
+binonly=0
sbuild_args=
+sbuild_args_sourceful=
schangesfile=
arch=
-dist=
for opt in "$@"; do
case "$opt" in
-h|--help) usage; exit 0;;
-V|--version) about; exit 0;;
--arch=*) arch="${opt#--arch=}";;
- --dist=*) dist="${opt#--dist=}";;
+ -D) sbuild_args="${sbuild_args:+$sbuild_args }$opt";;
-sa) sbuild_args="${sbuild_args:+$sbuild_args }--force-orig-source";;
+ -B) binonly=1;;
--*) sbuild_args="${sbuild_args:+$sbuild_args }$opt";;
*_source.changes)
if [ -z "$schangesfile" ]; then
fi
;;
*)
- echo "E: unknown option: $opt" >&1
+ echo "E: unknown option: $opt" >&2
exit 1
;;
esac
exit 1
fi
-[ -z "$arch" ] && arch="$DEB_BUILD_ARCH"
-[ -z "$dist" ] && dist="unstable"
+dist="$(sed -ne 's,Distribution: ,,p' "$schangesfile")"
schangesfile_basename="${schangesfile##*/}"
+packagename="${schangesfile_basename%%_*}"
packagenameversion="${schangesfile_basename%_*}"
+debversion="${packagenameversion#*_}"
+upstream_version="${debversion%-*}"
+dscfile_basename="$packagenameversion".dsc
case "$schangesfile" in
*/*) cd "${schangesfile%/*}";;
dcmd cp "${schangesfile##*/}" "$BUILDDIR"
schangesfile="$schangesfile_basename"
+OLDPWD="$PWD"
cd "$BUILDDIR"
-sbuild $sbuild_args --arch="$arch" --arch-all --dist="$dist" --keyid=$KEYID \
- "$packagenameversion".dsc
+dcmd "$dscfile_basename" | while read f; do
+ test -f "$f" && continue
-changesfile="${packagenameversion}_${arch}.changes"
+ case "$f" in
+ *.tar.gz|*.tar.bz2|*.tar.lzma|*.tar.xz)
+ if [ -f "$OLDPWD/$f" ]; then
+ echo "I: using existing tarball for $upstream_version…" >&2
+ cp $OLDPWD/$f $f
+ else
+ last_version="$(apt-cache madison $packagename | sed -rne "s,.+(\<${upstream_version}[^[:space:]]+).*,\1,p")"
+ echo "I: fetching missing tarball for $upstream_version (from $last_version)…" >&2
+ if ! apt-get --tar-only --only-source source "${packagename}=${last_version}"; then
+ echo "E: I do not know how to obtain the file: $f" >&2
+ exit 1
+ fi
+ fi
+ ;;
+ *)
+ echo "E: I do not know how to obtain the file: $f" >&2
+ exit 1
+ ;;
+ esac
+done
-mv "$changesfile" "${changesfile}.binonly"
-mergechanges "$schangesfile" "${changesfile}.binonly" > "$changesfile"
-rm "${changesfile}.binonly" "$schangesfile"
+rm $schangesfile
+unset schangesfile
-#TODO sign here
+[ -z "$arch" ] && arch="$DEB_BUILD_ARCH"
-dinstall "$dist" "$changesfile"
+target_arch="$(sed -ne 's,^Architecture: ,,p' $dscfile_basename)"
+case "$binonly/$target_arch" in
+ 1/all)
+ echo "E: cannot build arch:all packages with -B." >&2
+ exit 1
+ ;;
+ 0/all) arch=all;;
+ */any)
+ arch="$(schroot -l | sed -rne 's,^sid-([^-]+).*,\1,p' | uniq | tr '\n' ' ')"
+ ;;
+esac
-DATESTR="$(date +%Y.%m.%d.%H%M%S)"
-BUILD_PREFIX="${packagenameversion}_${arch}.${DATESTR}"
+if [ "$binonly" = 0 ]; then
+ sbuild_args_sourceful="--source"
+fi
-mv current "${BUILD_PREFIX}".buildlog
-rm -f current-*
+for a in $arch; do
+ echo "I: building $packagenameversion for $a/$dist…" >&2
-bundle="${BUNDLE_DIR}/${BUILD_PREFIX}".bundle.tar
-tar -chf "$bundle" *
-chmod 644 "$bundle"
+ case "$a" in
+ all)
+ arch_arg=--arch-all
+ a="$DEB_BUILD_ARCH"
+ ;;
+ *) arch_arg="--arch=$a";;
+ esac
+
+ sbuild $sbuild_args $sbuild_args_sourceful \
+ $arch_arg --dist="$dist" --keyid=$KEYID \
+ "$dscfile_basename" || ret=$?
+
+ changesfile="${packagenameversion}_${a}.changes"
+
+ if [ -n "$sbuild_args_sourceful" ]; then
+ schangesfile="${packagenameversion}_source+${changesfile#${packagenameversion}_}"
+ mv "$changesfile" "$schangesfile"
+ changesfile="$schangesfile"
+ fi
-rm -r "$BUILDDIR"
-trap - 0
+ # subsequent iterations should be binonly
+ sbuild_args_sourceful=
+ echo "I: running post-build hook ($packagenameversion/$a/$dist)…" >&2
+ postbuild "$dist" "$a" "$changesfile"
+ echo "I: running dinstall ($packagenameversion/$a/$dist)…" >&2
+ dinstall "$dist" "$changesfile"
+
+ echo "I: done building $packagenameversion for $a/$dist" >&2
+done
+
+if [ -n "${schangesfile:-}" ]; then
+ sarch="${schangesfile##*_}"; sarch=${sarch%.changes}
+ other_archs="$(for i in *.changes; do
+ [ "$i" = "$schangesfile" ] && continue
+ t="${i##*_}"; echo "${t%.changes}"
+ done)"
+
+ if [ -n "$other_archs" ]; then
+ combined_arch="${sarch}+${other_archs}"
+ mergechanges *.changes > ${packagenameversion}_${combined_arch}.changes
+ arch="$combined_arch"
+ else
+ arch="$sarch"
+ fi
+fi
+
+bundle="${BUNDLE_DIR}/${packagenameversion}_${arch}_bundle.tar.gz"
+tar -chzf "$bundle" *
+chmod 644 "$bundle"
print_bundle_location "$bundle"
+cleanup
+
exit 0