+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
+set_VENDOR_DISTRIBUTION ()
+{
+ local dist="$(echo "$1" | tr '[:upper:]' '[:lower:]')"
+ 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
+set_VENDOR_RELEASE ()
+{
+ local release="$(echo "$1" | tr '[:upper:]' '[:lower:]')"
+
+ if $verbose; 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'
+ ;;
+ 10.9)
+ echo "mavericks"
+ VENDOR_RELEASE='mavericks'
+ ;;
+ 10.9.*)
+ echo "mavericks"
+ VENDOR_RELEASE='mavericks'
+ ;;
+ *)
+ echo $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
+set_VENDOR ()
+{
+ local vendor="$(echo "$1" | tr '[:upper:]' '[:lower:]')"
+
+ 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
+
+}
+
+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="$(awk ' { print $3 } ' < /etc/fedora-release)"
+ set_VENDOR 'redhat' 'fedora' $fedora_version
+ elif [[ -f '/etc/centos-release' ]]; then
+ local centos_version="$(awk ' { print $7 } ' < /etc/centos-release)"
+ 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="$(awk ' { print $7 } ' < /etc/redhat-release)"
+ 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
+}
+
+run_configure ()
+{
+ # We will run autoreconf if we are required
+ run_autoreconf_if_required
+
+ # We always begin at the root of our build
+ if [ ! $? ]; 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
+ fi
+
+ # Arguments for configure
+ local BUILD_CONFIGURE_ARG=''
+
+ # If 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 $BUILD_CONFIGURE_ARG"
+ else
+ if $debug; then
+ BUILD_CONFIGURE_ARG="--enable-debug --enable-assert $BUILD_CONFIGURE_ARG"
+ elif [[ -n "$VCS_CHECKOUT" ]]; then
+ BUILD_CONFIGURE_ARG="--enable-assert $BUILD_CONFIGURE_ARG"
+ fi
+ fi
+
+ if [[ -n "$CONFIGURE_ARG" ]]; then
+ BUILD_CONFIGURE_ARG="$CONFIGURE_ARG $BUILD_CONFIGURE_ARG"
+ fi
+
+ if [[ -n "$PREFIX_ARG" ]]; then
+ BUILD_CONFIGURE_ARG="$PREFIX_ARG $BUILD_CONFIGURE_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
+ rhel-5*)
+ command_exists 'gcc44' || die "Could not locate gcc44"
+ run CC=gcc44 CXX=gcc44 $top_srcdir/configure "$BUILD_CONFIGURE_ARG" || die "Cannot execute CC=gcc44 CXX=gcc44 configure $BUILD_CONFIGURE_ARG"
+ ret=$?
+ ;;
+ *)
+ run $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
+}
+
+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"
+}
+
+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\""
+ fi
+}
+
+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_LOG_COMPILER" ]]; then
+ die "OLD_LOG_COMPILER($OLD_LOG_COMPILER) 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 "$LOG_COMPILER" ]]; then
+ OLD_LOG_COMPILER=$LOG_COMPILER
+ fi
+}
+
+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_LOG_COMPILER" ]]; then
+ LOG_COMPILER=$OLD_LOG_COMPILER
+ fi
+
+ OLD_CONFIGURE=
+ OLD_CONFIGURE_ARG=
+ OLD_PREFIX=
+ OLD_MAKE=
+ OLD_LOG_COMPILER=
+
+ export -n CC CXX
+}
+
+make_valgrind ()
+{
+ # If the env VALGRIND_COMMAND is set then we assume it is valid
+ local valgrind_was_set=false
+ if [[ -z "$VALGRIND_COMMAND" ]]; then
+ setup_valgrind_command
+ if [[ -n "$VALGRIND_COMMAND" ]]; then
+ valgrind_was_set=true
+ fi
+ else
+ valgrind_was_set=true
+ fi
+
+ # If valgrind_was_set is set to no we bail
+ if ! $valgrind_was_set; then
+ echo 'valgrind was not present'
+ return 1
+ fi
+
+ save_BUILD
+
+ valgrind_run=true
+
+ # If we are required to run configure, do so now
+ run_configure