+function rebuild_host_os ()
+{
+ HOST_OS="${UNAME_MACHINE_ARCH}-${VENDOR}-${VENDOR_DISTRIBUTION}-${VENDOR_RELEASE}-${UNAME_KERNEL}-${UNAME_KERNEL_RELEASE}"
+ if [ -z "$1" ]; then
+ if $VERBOSE; then
+ echo "HOST_OS=$HOST_OS"
+ fi
+ fi
+}
+
+# Validate the distribution name, or toss an erro
+# values: darwin,fedora,rhel,ubuntu,debian,opensuse
+function set_VENDOR_DISTRIBUTION ()
+{
+ local dist=`echo "$1" | tr '[A-Z]' '[a-z]'`
+ case "$dist" in
+ darwin)
+ VENDOR_DISTRIBUTION='darwin'
+ ;;
+ fedora)
+ VENDOR_DISTRIBUTION='fedora'
+ ;;
+ rhel)
+ VENDOR_DISTRIBUTION='rhel'
+ ;;
+ debian)
+ VENDOR_DISTRIBUTION='debian'
+ ;;
+ ubuntu)
+ VENDOR_DISTRIBUTION='ubuntu'
+ ;;
+ suse)
+ VENDOR_DISTRIBUTION='opensuse'
+ ;;
+ opensuse)
+ VENDOR_DISTRIBUTION='opensuse'
+ ;;
+ *)
+ die "attempt to set an invalid VENDOR_DISTRIBUTION=$dist"
+ ;;
+ esac
+}
+
+# Validate a Vendor's release name/number
+function set_VENDOR_RELEASE ()
+{
+ local release=`echo "$1" | tr '[A-Z]' '[a-z]'`
+
+ if $DEBUG; then
+ echo "VENDOR_DISTRIBUTION:$VENDOR_DISTRIBUTION"
+ echo "VENDOR_RELEASE:$release"
+ fi
+
+ case $VENDOR_DISTRIBUTION in
+ darwin)
+ case $release in
+ 10.6*)
+ VENDOR_RELEASE='snow_leopard'
+ ;;
+ 10.7*)
+ VENDOR_RELEASE='mountain'
+ ;;
+ mountain)
+ VENDOR_RELEASE='mountain'
+ ;;
+ 10.8.*)
+ echo "mountain_lion"
+ VENDOR_RELEASE='mountain_lion'
+ ;;
+ *)
+ echo $VENDOR_RELEASE
+ VENDOR_RELEASE='unknown'
+ ;;
+ esac
+ ;;
+ fedora)
+ VENDOR_RELEASE="$release"
+ if [[ "x$VENDOR_RELEASE" == '18' ]]; then
+ VENDOR_RELEASE='sphericalcow'
+ fi
+ ;;
+ rhel)
+ VENDOR_RELEASE="$release"
+ ;;
+ debian)
+ VENDOR_RELEASE="$release"
+ ;;
+ ubuntu)
+ VENDOR_RELEASE="$release"
+ if [[ "x$VENDOR_RELEASE" == 'x12.04' ]]; then
+ VENDOR_RELEASE="precise"
+ elif [[ "x$VENDOR_RELEASE" == 'x12.10' ]]; then
+ VENDOR_RELEASE="quantal"
+ elif [[ "x$VENDOR_RELEASE" == 'x13.04' ]]; then
+ VENDOR_RELEASE="raring"
+ fi
+ ;;
+ opensuse)
+ VENDOR_RELEASE="$release"
+ ;;
+ unknown)
+ die "attempt to set VENDOR_RELEASE without setting VENDOR_DISTRIBUTION"
+ ;;
+ *)
+ die "attempt to set with an invalid VENDOR_DISTRIBUTION=$VENDOR_DISTRIBUTION"
+ ;;
+ esac
+}
+
+
+# Valid values are: apple, redhat, centos, canonical, oracle, suse
+function set_VENDOR ()
+{
+ local vendor=`echo "$1" | tr '[A-Z]' '[a-z]'`
+
+ case $vendor in
+ apple)
+ VENDOR='apple'
+ ;;
+ redhat)
+ VENDOR='redhat'
+ ;;
+ fedora)
+ VENDOR='redhat'
+ ;;
+ redhat-release-server-*)
+ VENDOR='redhat'
+ ;;
+ enterprise-release-*)
+ VENDOR='oracle'
+ ;;
+ centos)
+ VENDOR='centos'
+ ;;
+ canonical)
+ VENDOR='canonical'
+ ;;
+ ubuntu)
+ VENDOR='canonical'
+ ;;
+ debian)
+ VENDOR='debian'
+ ;;
+ opensuse)
+ VENDOR='suse'
+ ;;
+ suse)
+ VENDOR='suse'
+ ;;
+ *)
+ die "An attempt was made to set an invalid VENDOR=$_vendor"
+ ;;
+ esac
+
+ set_VENDOR_DISTRIBUTION $2
+ set_VENDOR_RELEASE $3
+
+ # Set which vendor/versions we trust for autoreconf
+ case $VENDOR_DISTRIBUTION in
+ fedora)
+ if [[ "x$VENDOR_RELEASE" == 'x18' ]]; then
+ AUTORECONF_REBUILD_HOST=true
+ elif [[ "x$VENDOR_RELEASE" == 'xsphericalcow' ]]; then
+ AUTORECONF_REBUILD_HOST=true
+ elif [[ "x$VENDOR_RELEASE" == 'x19' ]]; then
+ AUTORECONF_REBUILD_HOST=true
+ fi
+ ;;
+ canonical)
+ if [[ "x$VENDOR_RELEASE" == 'xprecise' ]]; then
+ AUTORECONF_REBUILD_HOST=true
+ elif [[ "x$VENDOR_RELEASE" == 'xquantal' ]]; then
+ AUTORECONF_REBUILD_HOST=true
+ fi
+ ;;
+ esac
+
+}
+
+function determine_target_platform ()
+{
+ UNAME_MACHINE_ARCH=`(uname -m) 2>/dev/null` || UNAME_MACHINE_ARCH=unknown
+ UNAME_KERNEL=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+ UNAME_KERNEL_RELEASE=`(uname -r) 2>/dev/null` || UNAME_KERNEL_RELEASE=unknown
+
+ if [[ -x '/usr/bin/sw_vers' ]]; then
+ local _VERSION=`/usr/bin/sw_vers -productVersion`
+ set_VENDOR 'apple' 'darwin' $_VERSION
+ elif [[ $(uname) == 'Darwin' ]]; then
+ set_VENDOR 'apple' 'darwin' 'mountain'
+ elif [[ -f '/etc/fedora-release' ]]; then
+ local fedora_version=`cat /etc/fedora-release | awk ' { print $3 } '`
+ set_VENDOR 'redhat' 'fedora' $fedora_version
+ elif [[ -f '/etc/centos-release' ]]; then
+ local centos_version=`cat /etc/centos-release | awk ' { print $7 } '`
+ set_VENDOR 'centos' 'rhel' $centos_version
+ elif [[ -f '/etc/SuSE-release' ]]; then
+ local suse_distribution=`head -1 /etc/SuSE-release | awk ' { print $1 } '`
+ local suse_version=`head -1 /etc/SuSE-release | awk ' { print $2 } '`
+ set_VENDOR 'suse' $suse_distribution $suse_version
+ elif [[ -f '/etc/redhat-release' ]]; then
+ local rhel_version=`cat /etc/redhat-release | awk ' { print $7 } '`
+ local _vendor=`rpm -qf /etc/redhat-release`
+ set_VENDOR $_vendor 'rhel' $rhel_version
+ elif [[ -f '/etc/os-release' ]]; then
+ source '/etc/os-release'
+ set_VENDOR $ID $ID $VERSION_ID
+ elif [[ -x '/usr/bin/lsb_release' ]]; then
+ local _ID=`/usr/bin/lsb_release -s -i`
+ local _VERSION=`/usr/bin/lsb_release -s -r`
+ set_VENDOR $_ID $_ID $_VERSION_ID
+ elif [[ -f '/etc/lsb-release' ]]; then
+ source '/etc/lsb-release'
+ set_VENDOR 'canonical' $DISTRIB_ID $DISTRIB_CODENAME
+ fi
+
+ rebuild_host_os
+}
+
+function run_configure ()
+{
+ # We will run autoreconf if we are required
+ run_autoreconf_if_required
+
+ # We always begin at the root of our build
+ if [ ! popd ]; then
+ die "Programmer error, we entered run_configure with a stacked directory"
+ fi
+
+ if ! command_exists "$CONFIGURE"; then
+ die "$CONFIGURE does not exist"
+ fi
+
+ local BUILD_DIR="$1"
+ if [[ -n "$BUILD_DIR" ]]; then
+ rm -r -f $BUILD_DIR
+ mkdir -p $BUILD_DIR
+ safe_pushd $BUILD_DIR
+ fi
+
+ # Arguments for configure
+ local BUILD_CONFIGURE_ARG=
+
+ # If ENV DEBUG is set we enable both debug and asssert, otherwise we see if this is a VCS checkout and if so enable assert
+ # Set ENV ASSERT in order to enable assert.
+ # If we are doing a valgrind run, we always compile with assert disabled
+ if $valgrind_run; then
+ BUILD_CONFIGURE_ARG+= '--enable-assert=no'
+ else
+ if $DEBUG; then
+ BUILD_CONFIGURE_ARG+=' --enable-debug --enable-assert'
+ elif [[ -n "$VCS_CHECKOUT" ]]; then
+ BUILD_CONFIGURE_ARG+=' --enable-assert'
+ fi
+ fi
+
+ if [[ -n "$CONFIGURE_ARG" ]]; then
+ BUILD_CONFIGURE_ARG+=" $CONFIGURE_ARG"
+ fi
+
+ if [[ -n "$PREFIX_ARG" ]]; then
+ BUILD_CONFIGURE_ARG+=" $PREFIX_ARG"
+ fi
+
+ ret=1;
+ # If we are executing on OSX use CLANG, otherwise only use it if we find it in the ENV
+ case $HOST_OS in
+ *-darwin-*)
+ CC=clang CXX=clang++ $top_srcdir/configure $BUILD_CONFIGURE_ARG || die "Cannot execute CC=clang CXX=clang++ configure $BUILD_CONFIGURE_ARG"
+ ret=$?
+ ;;
+ rhel-5*)
+ command_exists 'gcc44' || die "Could not locate gcc44"
+ CC=gcc44 CXX=gcc44 $top_srcdir/configure $BUILD_CONFIGURE_ARG || die "Cannot execute CC=gcc44 CXX=gcc44 configure $BUILD_CONFIGURE_ARG"
+ ret=$?
+ ;;
+ *)
+ $CONFIGURE $BUILD_CONFIGURE_ARG
+ ret=$?
+ ;;
+ esac
+
+ if [ $ret -ne 0 ]; then
+ die "Could not execute $CONFIGURE $BUILD_CONFIGURE_ARG"
+ fi
+
+ if [ ! -f 'Makefile' ]; then
+ die "Programmer error, configure was run but no Makefile existed after $CONFIGURE was run"
+ fi
+}
+
+function setup_gdb_command () {
+ GDB_TMPFILE=$(mktemp /tmp/gdb.XXXXXXXXXX)
+ echo 'set logging overwrite on' > $GDB_TMPFILE
+ echo 'set logging on' >> $GDB_TMPFILE
+ echo 'set environment LIBTEST_IN_GDB=1' >> $GDB_TMPFILE
+ echo 'run' >> $GDB_TMPFILE
+ echo 'thread apply all bt' >> $GDB_TMPFILE
+ echo 'quit' >> $GDB_TMPFILE
+ GDB_COMMAND="gdb -f -batch -x $GDB_TMPFILE"
+}
+
+function setup_valgrind_command () {
+ VALGRIND_PROGRAM=`type -p valgrind`
+ if [[ -n "$VALGRIND_PROGRAM" ]]; then
+ VALGRIND_COMMAND="$VALGRIND_PROGRAM --error-exitcode=1 --leak-check=yes --malloc-fill=A5 --free-fill=DE --xml=yes --xml-file=\"valgrind-%p.xml\" --gen-suppressions=yes --log-file=\"valgrind-%p.txt\""
+ fi
+}
+
+function save_BUILD ()
+{
+ if [[ -n "$OLD_CONFIGURE" ]]; then
+ die "OLD_CONFIGURE($OLD_CONFIGURE) was set on push, programmer error!"
+ fi
+
+ if [[ -n "$OLD_CONFIGURE_ARG" ]]; then
+ die "OLD_CONFIGURE_ARG($OLD_CONFIGURE_ARG) was set on push, programmer error!"
+ fi
+
+ if [[ -n "$OLD_PREFIX" ]]; then
+ die "OLD_PREFIX($OLD_PREFIX) was set on push, programmer error!"
+ fi
+
+ if [[ -n "$OLD_MAKE" ]]; then
+ die "OLD_MAKE($OLD_MAKE) was set on push, programmer error!"
+ fi
+
+ if [[ -n "$OLD_TESTS_ENVIRONMENT" ]]; then
+ die "OLD_TESTS_ENVIRONMENT($OLD_TESTS_ENVIRONMENT) was set on push, programmer error!"
+ fi
+
+ if [[ -n "$CONFIGURE" ]]; then
+ OLD_CONFIGURE=$CONFIGURE
+ fi
+
+ if [[ -n "$CONFIGURE_ARG" ]]; then
+ OLD_CONFIGURE_ARG=$CONFIGURE_ARG
+ fi
+
+ if [[ -n "$MAKE" ]]; then
+ OLD_MAKE=$MAKE
+ fi
+
+ if [[ -n "$TESTS_ENVIRONMENT" ]]; then
+ OLD_TESTS_ENVIRONMENT=$TESTS_ENVIRONMENT
+ fi
+}
+
+function restore_BUILD ()
+{
+ if [[ -n "$OLD_CONFIGURE" ]]; then
+ CONFIGURE=$OLD_CONFIGURE
+ fi
+
+ if [[ -n "$OLD_CONFIGURE_ARG" ]]; then
+ CONFIGURE_ARG=$OLD_CONFIGURE_ARG
+ fi
+
+ if [[ -n "$OLD_PREFIX" ]]; then
+ PREFIX_ARG=$OLD_PREFIX
+ fi
+
+ if [[ -n "$OLD_MAKE" ]]; then
+ MAKE=$OLD_MAKE
+ fi
+
+ if [[ -n "$OLD_TESTS_ENVIRONMENT" ]]; then
+ TESTS_ENVIRONMENT=$OLD_TESTS_ENVIRONMENT
+ fi
+
+ OLD_CONFIGURE=
+ OLD_CONFIGURE_ARG=
+ OLD_PREFIX=
+ OLD_MAKE=
+ OLD_TESTS_ENVIRONMENT=
+
+ export -n CC CXX
+}
+
+function safe_pushd ()
+{
+ pushd $1 &> /dev/null ;
+
+ if [ -n "$BUILD_DIR" ]; then
+ if $VERBOSE; then
+ echo "BUILD_DIR=$BUILD_DIR"
+ fi
+ fi
+}
+
+function safe_popd ()
+{
+ local directory_to_delete=`pwd`
+ popd &> /dev/null ;
+ if [ $? -eq 0 ]; then
+ if [[ "$top_srcdir" == "$directory_to_delete" ]]; then
+ die "We almost deleted top_srcdir($top_srcdir), programmer error"
+ fi
+
+ rm -r -f "$directory_to_delete"
+ fi
+}