forked from Mirrors/freeswitch
e364450a57
This lets us set the suite name in the changelog file to e.g. sid-experimental. This way we can share a single debian repo URL for all versions, but make sure that incoming files are directed to the correct distro.
480 lines
14 KiB
Bash
Executable File
480 lines
14 KiB
Bash
Executable File
#!/bin/bash
|
|
##### -*- mode:shell-script; indent-tabs-mode:nil; sh-basic-offset:2 -*-
|
|
##### Author: Travis Cross <tc@traviscross.com>
|
|
|
|
set -e
|
|
|
|
ddir="."
|
|
[ -n "${0%/*}" ] && ddir="${0%/*}"
|
|
cd $ddir/../
|
|
|
|
#### lib
|
|
|
|
err () {
|
|
echo "$0 error: $1" >&2
|
|
exit 1
|
|
}
|
|
|
|
announce () {
|
|
cat >&2 <<EOF
|
|
|
|
########################################################################
|
|
## $1
|
|
########################################################################
|
|
|
|
EOF
|
|
}
|
|
|
|
xread () {
|
|
local xIFS="$IFS"
|
|
IFS=''
|
|
read $@
|
|
local ret=$?
|
|
IFS="$xIFS"
|
|
return $ret
|
|
}
|
|
|
|
mk_dver () { echo "$1" | sed -e 's/-/~/g'; }
|
|
mk_uver () { echo "$1" | sed -e 's/-.*$//' -e 's/~/-/'; }
|
|
dsc_source () { dpkg-parsechangelog | grep '^Source:' | awk '{print $2}'; }
|
|
dsc_ver () { dpkg-parsechangelog | grep '^Version:' | awk '{print $2}'; }
|
|
up_ver () { mk_uver "$(dsc_ver)"; }
|
|
dsc_base () { echo "$(dsc_source)_$(dsc_ver)"; }
|
|
up_base () { echo "$(dsc_source)-$(up_ver)"; }
|
|
|
|
find_distro () {
|
|
case "$1" in
|
|
experimental) echo "sid";;
|
|
unstable) echo "sid";;
|
|
testing) echo "jessie";;
|
|
stable) echo "wheezy";;
|
|
oldstable) echo "squeeze";;
|
|
*) echo "$1";;
|
|
esac
|
|
}
|
|
|
|
find_suite () {
|
|
case "$1" in
|
|
sid) echo "unstable";;
|
|
jessie) echo "testing";;
|
|
wheezy) echo "stable";;
|
|
squeeze) echo "oldstable";;
|
|
*) echo "$1";;
|
|
esac
|
|
}
|
|
|
|
#### debian/rules helpers
|
|
|
|
create_dbg_pkgs () {
|
|
for x in $ddir/*; do
|
|
test ! -d $x && continue
|
|
test "$x" = "tmp" -o "$x" = "source" && continue
|
|
test ! "$x" = "${x%-dbg}" && continue
|
|
test ! -d $x/usr/lib/debug && continue
|
|
mkdir -p $x-dbg/usr/lib
|
|
mv $x/usr/lib/debug $x-dbg/usr/lib/
|
|
done
|
|
}
|
|
|
|
cwget () {
|
|
local url="$1" f="${1##*/}"
|
|
echo "fetching: $url to $f" >&2
|
|
if [ -n "$FS_FILES_DIR" ]; then
|
|
if ! [ -s "$FS_FILES_DIR/$f" ]; then
|
|
(cd $FS_FILES_DIR && wget -N "$url")
|
|
fi
|
|
cp -a $FS_FILES_DIR/$f .
|
|
else
|
|
wget -N "$url"
|
|
fi
|
|
}
|
|
|
|
getlib () {
|
|
local url="$1" f="${1##*/}"
|
|
cwget "$url"
|
|
tar -xv --no-same-owner --no-same-permissions -f "$f"
|
|
rm -f "$f" && mkdir -p $f && touch $f/.download-stamp
|
|
}
|
|
|
|
getlibs () {
|
|
# get pinned libraries
|
|
getlib http://downloads.mongodb.org/cxx-driver/mongodb-linux-x86_64-v1.8-latest.tgz
|
|
getlib http://files.freeswitch.org/downloads/libs/json-c-0.9.tar.gz
|
|
getlib http://files.freeswitch.org/downloads/libs/libmemcached-0.32.tar.gz
|
|
getlib http://files.freeswitch.org/downloads/libs/soundtouch-1.7.1.tar.gz
|
|
getlib http://files.freeswitch.org/downloads/libs/flite-1.5.4-current.tar.bz2
|
|
getlib http://files.freeswitch.org/downloads/libs/sphinxbase-0.7.tar.gz
|
|
getlib http://files.freeswitch.org/downloads/libs/pocketsphinx-0.7.tar.gz
|
|
getlib http://files.freeswitch.org/downloads/libs/communicator_semi_6000_20080321.tar.gz
|
|
getlib http://files.freeswitch.org/downloads/libs/celt-0.10.0.tar.gz
|
|
getlib http://files.freeswitch.org/downloads/libs/opus-1.1.tar.gz
|
|
getlib http://files.freeswitch.org/downloads/libs/openldap-2.4.19.tar.gz
|
|
getlib http://download.zeromq.org/zeromq-2.1.9.tar.gz \
|
|
|| getlib http://download.zeromq.org/historic/zeromq-2.1.9.tar.gz
|
|
getlib http://files.freeswitch.org/downloads/libs/freeradius-client-1.1.6.tar.gz
|
|
getlib http://files.freeswitch.org/downloads/libs/lame-3.98.4.tar.gz
|
|
getlib http://files.freeswitch.org/downloads/libs/libshout-2.2.2.tar.gz
|
|
getlib http://files.freeswitch.org/downloads/libs/mpg123-1.13.2.tar.gz
|
|
getlib http://files.freeswitch.org/downloads/libs/v8-3.24.14.tar.bz2
|
|
# cleanup mongo
|
|
(
|
|
cd mongo-cxx-driver-v1.8
|
|
rm -rf config.log .sconf_temp *Test *Example
|
|
find . -name "*.o" -exec rm -f {} \;
|
|
)
|
|
}
|
|
|
|
check_repo_clean () {
|
|
git diff-index --quiet --cached HEAD \
|
|
|| err "uncommitted changes present"
|
|
git diff-files --quiet \
|
|
|| err "unclean working tree"
|
|
git diff-index --quiet HEAD \
|
|
|| err "unclean repository"
|
|
! git ls-files --other --error-unmatch . >/dev/null 2>&1 \
|
|
|| err "untracked files or build products present"
|
|
}
|
|
|
|
get_last_release_ver () {
|
|
grep -m1 -e '^AC_INIT' configure.in \
|
|
| cut -d, -f2 \
|
|
| sed -e 's/\[//' -e 's/\]//' -e 's/ //g'
|
|
}
|
|
|
|
get_nightly_version () {
|
|
local commit="$(git rev-list -n1 --abbrev=10 --abbrev-commit HEAD)"
|
|
echo "$(get_last_release_ver)+git~$(date -u '+%Y%m%dT%H%M%SZ')~$commit"
|
|
}
|
|
|
|
get_nightly_revision_human () {
|
|
echo "git $(git rev-list -n1 --abbrev=7 --abbrev-commit HEAD) $(date -u '+%Y-%m-%d %H:%M:%SZ')"
|
|
}
|
|
|
|
create_orig () {
|
|
{
|
|
set -e
|
|
local OPTIND OPTARG
|
|
local uver="" hrev="" bundle_deps=false modules_list="" zl=9e
|
|
while getopts 'bm:nv:z:' o "$@"; do
|
|
case "$o" in
|
|
b) bundle_deps=true;;
|
|
m) modules_list="$OPTARG";;
|
|
n) uver="nightly";;
|
|
v) uver="$OPTARG";;
|
|
z) zl="$OPTARG";;
|
|
esac
|
|
done
|
|
shift $(($OPTIND-1))
|
|
if [ -z "$uver" ] || [ "$uver" = "nightly" ]; then
|
|
uver="$(get_nightly_version)"
|
|
hrev="$(get_nightly_revision_human)"
|
|
fi
|
|
local treeish="$1" dver="$(mk_dver "$uver")"
|
|
local orig="../freeswitch_$dver.orig.tar.xz"
|
|
[ -n "$treeish" ] || treeish="HEAD"
|
|
check_repo_clean
|
|
git reset --hard "$treeish"
|
|
mv .gitattributes .gitattributes.orig
|
|
local -a args=(-e '\bdebian-ignore\b')
|
|
test "$modules_list" = "non-dfsg" || args+=(-e '\bdfsg-nonfree\b')
|
|
grep .gitattributes.orig "${args[@]}" \
|
|
| while xread l; do
|
|
echo "$l export-ignore" >> .gitattributes
|
|
done
|
|
if $bundle_deps; then
|
|
(cd libs && getlibs)
|
|
git add -f libs
|
|
fi
|
|
./build/set-fs-version.sh "$uver" "$hrev" && git add configure.in
|
|
echo "$uver" > .version && git add -f .version
|
|
git commit --allow-empty -m "nightly v$uver"
|
|
git archive -v \
|
|
--worktree-attributes \
|
|
--format=tar \
|
|
--prefix=freeswitch-$uver/ \
|
|
HEAD \
|
|
| xz -c -${zl}v > $orig
|
|
mv .gitattributes.orig .gitattributes
|
|
git reset --hard HEAD^ && git clean -fdx
|
|
} 1>&2
|
|
echo $orig
|
|
}
|
|
|
|
set_modules_quicktest () {
|
|
cat > debian/modules.conf <<EOF
|
|
applications/mod_commands
|
|
EOF
|
|
}
|
|
|
|
create_dsc () {
|
|
{
|
|
set -e
|
|
local OPTIND OPTARG modules_conf="" modules_list="" speed="normal" suite_postfix="" suite_postfix_p=false zl=9
|
|
while getopts 'f:m:s:u:z:' o "$@"; do
|
|
case "$o" in
|
|
f) modules_conf="$OPTARG";;
|
|
m) modules_list="$OPTARG";;
|
|
s) speed="$OPTARG";;
|
|
u) suite_postfix="$OPTARG"; suite_postfix_p=true; ;;
|
|
z) zl="$OPTARG";;
|
|
esac
|
|
done
|
|
shift $(($OPTIND-1))
|
|
local distro="$(find_distro $1)" orig="$2"
|
|
local suite="$(find_suite $distro)"
|
|
local orig_ver="$(echo "$orig" | sed -e 's/^.*_//' -e 's/\.orig\.tar.*$//')"
|
|
local dver="${orig_ver}-1~${distro}+1"
|
|
$suite_postfix_p && { suite="${distro}${suite_postfix}"; }
|
|
[ -x "$(which dch)" ] \
|
|
|| err "package devscripts isn't installed"
|
|
if [ -n "$modules_conf" ]; then
|
|
cp $modules_conf debian/modules.conf
|
|
fi
|
|
local bootstrap_args=""
|
|
if [ -n "$modules_list" ]; then
|
|
if [ "$modules_list" = "non-dfsg" ]; then
|
|
bootstrap_args="-mnon-dfsg"
|
|
else set_modules_${modules_list}; fi
|
|
fi
|
|
(cd debian && ./bootstrap.sh -c $distro $bootstrap_args)
|
|
case "$speed" in
|
|
paranoid) sed -i ./debian/rules \
|
|
-e '/\.stamp-bootstrap:/{:l2 n; /\.\/bootstrap.sh -j/{s/ -j//; :l3 n; b l3}; b l2};' ;;
|
|
reckless) sed -i ./debian/rules \
|
|
-e '/\.stamp-build:/{:l2 n; /make/{s/$/ -j/; :l3 n; b l3}; b l2};' ;;
|
|
esac
|
|
[ "$zl" -ge "1" ] || zl=1
|
|
git add debian/rules
|
|
dch -b -m -v "$dver" --force-distribution -D "$suite" "Nightly build."
|
|
git add debian/changelog && git commit -m "nightly v$orig_ver"
|
|
dpkg-source -i.* -Zxz -z${zl} -b .
|
|
dpkg-genchanges -S > ../$(dsc_base)_source.changes
|
|
local dsc="../$(dsc_base).dsc"
|
|
git reset --hard HEAD^ && git clean -fdx
|
|
} 1>&2
|
|
echo $dsc
|
|
}
|
|
|
|
fmt_debug_hook () {
|
|
cat <<'EOF'
|
|
#!/bin/bash
|
|
export debian_chroot="cow"
|
|
cd /tmp/buildd/*/debian/..
|
|
/bin/bash < /dev/tty > /dev/tty 2> /dev/tty
|
|
EOF
|
|
}
|
|
|
|
build_debs () {
|
|
{
|
|
set -e
|
|
local OPTIND OPTARG debug_hook=false hookdir="" cow_build_opts=""
|
|
while getopts 'Bbd' o "$@"; do
|
|
case "$o" in
|
|
B) cow_build_opts="--debbuildopts '-B'";;
|
|
b) cow_build_opts="--debbuildopts '-b'";;
|
|
d) debug_hook=true;;
|
|
esac
|
|
done
|
|
shift $(($OPTIND-1))
|
|
local distro="$(find_distro $1)" dsc="$2" arch="$3"
|
|
if [ -z "$distro" ] || [ "$distro" = "auto" ]; then
|
|
if ! (echo "$dsc" | grep -e '-[0-9]*~[a-z]*+[0-9]*'); then
|
|
err "no distro specified or found"
|
|
fi
|
|
local x="$(echo $dsc | sed -e 's/^[^-]*-[0-9]*~//' -e 's/+[^+]*$//')"
|
|
distro="$(find_distro $x)"
|
|
fi
|
|
[ -n "$arch" ] || arch="$(dpkg-architecture | grep '^DEB_BUILD_ARCH=' | cut -d'=' -f2)"
|
|
[ -x "$(which cowbuilder)" ] \
|
|
|| err "package cowbuilder isn't installed"
|
|
local cow_img=/var/cache/pbuilder/base-$distro-$arch.cow
|
|
cow () {
|
|
cowbuilder "$@" \
|
|
--distribution $distro \
|
|
--architecture $arch \
|
|
--basepath $cow_img
|
|
}
|
|
if ! [ -d $cow_img ]; then
|
|
announce "Creating base $distro-$arch image..."
|
|
cow --create
|
|
fi
|
|
announce "Updating base $distro-$arch image..."
|
|
local x=5
|
|
while ! cow --update; do
|
|
[ $x -lt 1 ] && break; sleep 60; x=$((x-1))
|
|
done
|
|
announce "Building $distro-$arch DEBs from $dsc..."
|
|
if $debug_hook; then
|
|
mkdir -p .hooks
|
|
fmt_debug_hook > .hooks/C10shell
|
|
chmod +x .hooks/C10shell
|
|
hookdir=$(pwd)/.hooks
|
|
fi
|
|
cow --build $dsc \
|
|
--hookdir "$hookdir" \
|
|
--buildresult ../ \
|
|
$cow_build_opts
|
|
} 1>&2
|
|
echo ${dsc%.dsc}_${arch}.changes
|
|
}
|
|
|
|
build_all () {
|
|
local OPTIND OPTARG
|
|
local orig_opts="" dsc_opts="" deb_opts="" modlist=""
|
|
local archs="" distros="" orig="" depinst=false par=false
|
|
while getopts 'a:bc:df:ijl:m:no:s:u:v:z:' o "$@"; do
|
|
case "$o" in
|
|
a) archs="$archs $OPTARG";;
|
|
b) orig_opts="$orig_opts -b";;
|
|
c) distros="$distros $OPTARG";;
|
|
d) deb_opts="$deb_opts -d";;
|
|
f) dsc_opts="$dsc_opts -f$OPTARG";;
|
|
i) depinst=true;;
|
|
j) par=true;;
|
|
l) modlist="$OPTARG";;
|
|
m) orig_opts="$orig_opts -m$OPTARG"; dsc_opts="$dsc_opts -m$OPTARG";;
|
|
n) orig_opts="$orig_opts -n";;
|
|
o) orig="$OPTARG";;
|
|
s) dsc_opts="$dsc_opts -s$OPTARG";;
|
|
u) dsc_opts="$dsc_opts -u$OPTARG";;
|
|
v) orig_opts="$orig_opts -v$OPTARG";;
|
|
z) orig_opts="$orig_opts -z$OPTARG"; dsc_opts="$dsc_opts -z$OPTARG";;
|
|
esac
|
|
done
|
|
shift $(($OPTIND-1))
|
|
[ -n "$archs" ] || archs="amd64 i386"
|
|
[ -n "$distros" ] || distros="sid jessie wheezy squeeze"
|
|
! $depinst || aptitude install -y \
|
|
rsync git less cowbuilder ccache \
|
|
devscripts equivs build-essential
|
|
[ -n "$orig" ] || orig="$(create_orig $orig_opts HEAD | tail -n1)"
|
|
if [ -n "$modlist" ]; then
|
|
local modtmp="$(mktemp /tmp/modules-XXXXXXXXXX.conf)"
|
|
> $modtmp
|
|
for m in "$modlist"; do printf '%s\n' "$m" >> $modtmp; done
|
|
dsc_opts="$dsc_opts -f${modtmp}"; fi
|
|
[ -n "$orig" ] || orig="$(create_orig $orig_opts HEAD | tail -n1)"
|
|
mkdir -p ../log
|
|
> ../log/changes
|
|
echo; echo; echo; echo
|
|
trap 'echo "Killing children...">&2; for x in $(jobs -p); do kill $x; done' EXIT
|
|
if [ "${orig:0:2}" = ".." ]; then
|
|
for distro in $distros; do
|
|
echo "Creating $distro dsc..." >&2
|
|
local dsc="$(create_dsc $dsc_opts $distro $orig 2>../log/$distro | tail -n1)"
|
|
echo "Done creating $distro dsc." >&2
|
|
if [ "${dsc:0:2}" = ".." ]; then
|
|
local lopts="-b"
|
|
for arch in $archs; do
|
|
{
|
|
echo "Building $distro-$arch debs..." >&2
|
|
local changes="$(build_debs $lopts $deb_opts $distro $dsc $arch 2>../log/$distro-$arch | tail -n1)"
|
|
echo "Done building $distro-$arch debs." >&2
|
|
if [ "${changes:0:2}" = ".." ]; then
|
|
echo "$changes" >> ../log/changes
|
|
fi
|
|
} &
|
|
$par || wait
|
|
lopts="-B"
|
|
done
|
|
fi
|
|
done
|
|
! $par || wait
|
|
fi
|
|
[ -z "$modlist" ] || rm -f $modtmp
|
|
trap - EXIT
|
|
cat ../log/changes
|
|
}
|
|
|
|
usage () {
|
|
cat >&2 <<EOF
|
|
$0 [opts] [cmd] [cmd-opts]
|
|
|
|
options:
|
|
|
|
-d Enable debugging mode.
|
|
|
|
commands:
|
|
|
|
archive-orig
|
|
|
|
build-all
|
|
|
|
[ This must be run as root! ]
|
|
|
|
-a Specify architectures
|
|
-b Bundle downloaded libraries in source package
|
|
-c Specify distributions
|
|
-d Enable cowbuilder debug hook
|
|
-f <modules.conf>
|
|
Build only modules listed in this file
|
|
-i Auto install build deps on host system
|
|
-j Build debs in parallel
|
|
-l <modules>
|
|
-m [ quicktest | non-dfsg ]
|
|
Choose custom list of modules to build
|
|
-n Nightly build
|
|
-o <orig-file>
|
|
Specify existing .orig.tar.xz file
|
|
-s [ paranoid | reckless ]
|
|
Set FS bootstrap/build -j flags
|
|
-u <suite-postfix>
|
|
Specify a custom suite postfix
|
|
-v Set version
|
|
-z Set compression level
|
|
|
|
build-debs <distro> <dsc-file> <architecture>
|
|
|
|
[ This must be run as root! ]
|
|
|
|
-B Binary architecture-dependent build
|
|
-b Binary-only build
|
|
-d Enable cowbuilder debug hook
|
|
|
|
create-dbg-pkgs
|
|
|
|
create-dsc <distro> <orig-file>
|
|
|
|
-f <modules.conf>
|
|
Build only modules listed in this file
|
|
-m [ quicktest | non-dfsg ]
|
|
Choose custom list of modules to build
|
|
-s [ paranoid | reckless ]
|
|
Set FS bootstrap/build -j flags
|
|
-u <suite-postfix>
|
|
Specify a custom suite postfix
|
|
-z Set compression level
|
|
|
|
create-orig <treeish>
|
|
|
|
-b Bundle downloaded libraries in source package
|
|
-m [ quicktest | non-dfsg ]
|
|
Choose custom list of modules to build
|
|
-n Nightly build
|
|
-v Set version
|
|
-z Set compression level
|
|
|
|
EOF
|
|
exit 1
|
|
}
|
|
|
|
while getopts 'dh' o "$@"; do
|
|
case "$o" in
|
|
d) set -vx;;
|
|
h) usage;;
|
|
esac
|
|
done
|
|
shift $(($OPTIND-1))
|
|
|
|
cmd="$1"; [ -n "$cmd" ] || usage
|
|
shift
|
|
case "$cmd" in
|
|
archive-orig) archive_orig "$@" ;;
|
|
build-all) build_all "$@" ;;
|
|
build-debs) build_debs "$@" ;;
|
|
create-dbg-pkgs) create_dbg_pkgs ;;
|
|
create-dsc) create_dsc "$@" ;;
|
|
create-orig) create_orig "$@" ;;
|
|
*) usage ;;
|
|
esac
|