+ if [[ -n "$ASSERT" ]]; then
+ local ASSERT_ARG=
+ ASSERT_ARG='--enable-assert'
+ BUILD_CONFIGURE_ARG="$ASSERT_ARG $BUILD_CONFIGURE_ARG"
+ fi
+
+ if [[ -n "$CONFIGURE_ARG" ]]; then
+ BUILD_CONFIGURE_ARG= "$BUILD_CONFIGURE_ARG $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
+ *-darwin-*)
+ CC=clang CXX=clang++ $top_srcdir/configure $BUILD_CONFIGURE_ARG || die "Cannot execute CC=clang CXX=clang++ configure $BUILD_CONFIGURE_ARG $PREFIX_ARG"
+ ret=$?
+ ;;
+ rhel-5*)
+ command_exists 'gcc44' || die "Could not locate gcc44"
+ CC=gcc44 CXX=gcc44 $top_srcdir/configure $BUILD_CONFIGURE_ARG $PREFIX_ARG || die "Cannot execute CC=gcc44 CXX=gcc44 configure $BUILD_CONFIGURE_ARG $PREFIX_ARG"
+ ret=$?
+ ;;
+ *)
+ $CONFIGURE $BUILD_CONFIGURE_ARG $PREFIX_ARG
+ ret=$?
+ ;;
+ esac
+
+ if [ $ret -ne 0 ]; then
+ die "Could not execute $CONFIGURE $BUILD_CONFIGURE_ARG $PREFIX_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 --show-reachable=yes --track-fds=yes --malloc-fill=A5 --free-fill=DE"
+ 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_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_MAKE" ]]; then
+ MAKE=$OLD_MAKE
+ fi
+
+ if [[ -n "$OLD_TESTS_ENVIRONMENT" ]]; then
+ TESTS_ENVIRONMENT=$OLD_TESTS_ENVIRONMENT
+ fi
+
+ OLD_CONFIGURE=
+ OLD_CONFIGURE_ARG=
+ OLD_MAKE=
+ OLD_TESTS_ENVIRONMENT=
+
+ export -n CC CXX
+}
+
+function push_PREFIX_ARG ()
+{
+ if [[ -n "$OLD_PREFIX_ARG" ]]; then
+ die "OLD_PREFIX_ARG was set on push, programmer error!"
+ fi
+
+ if [[ -n "$PREFIX_ARG" ]]; then
+ OLD_PREFIX_ARG=$PREFIX_ARG
+ PREFIX_ARG=
+ fi
+
+ if [[ -n "$1" ]]; then
+ PREFIX_ARG="--prefix=$1"
+ fi
+}
+
+function pop_PREFIX_ARG ()
+{
+ if [[ -n "$OLD_PREFIX_ARG" ]]; then
+ PREFIX_ARG=$OLD_PREFIX_ARG
+ OLD_PREFIX_ARG=
+ else
+ PREFIX_ARG=
+ fi
+}
+
+function push_TESTS_ENVIRONMENT ()
+{
+ if [[ -n "$OLD_TESTS_ENVIRONMENT" ]]; then
+ die "OLD_TESTS_ENVIRONMENT was set on push, programmer error!"
+ fi
+
+ if [[ -n "$TESTS_ENVIRONMENT" ]]; then
+ OLD_TESTS_ENVIRONMENT=$TESTS_ENVIRONMENT
+ TESTS_ENVIRONMENT=
+ fi
+}
+
+function pop_TESTS_ENVIRONMENT ()
+{
+ TESTS_ENVIRONMENT=
+ if [[ -n "$OLD_TESTS_ENVIRONMENT" ]]; then
+ TESTS_ENVIRONMENT=$OLD_TESTS_ENVIRONMENT
+ OLD_TESTS_ENVIRONMENT=
+ fi
+}
+
+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
+}
+
+function make_valgrind ()
+{
+ if [[ "$VENDOR_DISTRIBUTION" == 'darwin' ]]; then
+ make_darwin_malloc
+ return
+ fi
+
+ # 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
+
+ # If we are required to run configure, do so now
+ run_configure_if_required
+
+ push_TESTS_ENVIRONMENT
+
+ # If we don't have a configure, then most likely we will be missing libtool
+ assert_file 'configure'
+ if [[ -f 'libtool' ]]; then
+ TESTS_ENVIRONMENT="./libtool --mode=execute $VALGRIND_COMMAND"
+ else
+ TESTS_ENVIRONMENT="$VALGRIND_COMMAND"
+ fi
+
+ make_target 'check' || return 1
+
+ pop_TESTS_ENVIRONMENT
+}
+
+function make_install_system ()
+{
+ local INSTALL_LOCATION=$(mktemp -d /tmp/XXXXXXXXXX)
+ push_PREFIX_ARG $INSTALL_LOCATION
+
+ if [ ! -d $INSTALL_LOCATION ] ; then
+ die "ASSERT temp directory not found '$INSTALL_LOCATION'"
+ fi
+
+ run_configure #install_buid_dir
+
+ push_TESTS_ENVIRONMENT
+
+ make_target 'install'
+
+ make_target 'installcheck'
+
+ make_target 'uninstall'
+
+ pop_TESTS_ENVIRONMENT
+ pop_PREFIX_ARG
+
+ rm -r -f $INSTALL_LOCATION
+ make 'distclean'
+
+ if [ -f 'Makefile' ]; then
+ die "ASSERT Makefile should not exist"
+ fi
+
+ safe_popd
+}
+
+function make_darwin_malloc ()
+{
+ run_configure_if_required
+
+ old_MallocGuardEdges=$MallocGuardEdges
+ MallocGuardEdges=1
+ old_MallocErrorAbort=$MallocErrorAbort
+ MallocErrorAbort=1
+ old_MallocScribble=$MallocScribble
+ MallocScribble=1
+
+ make_check
+
+ MallocGuardEdges=$old_MallocGuardEdges
+ MallocErrorAbort=$old_MallocErrorAbort
+ MallocScribble=$old_MallocScribble
+}
+
+function snapshot_check ()
+{
+ if [ ! -f "$BOOTSTRAP_SNAPSHOT_CHECK" ]; then
+ make_for_snapshot
+ fi
+
+ if [ -n "$BOOTSTRAP_SNAPSHOT_CHECK" ]; then
+ assert_file "$BOOTSTRAP_SNAPSHOT_CHECK" 'snapshot check failed'
+ fi
+}
+
+# This will reset our environment, and make sure built files are available.
+function make_for_snapshot ()
+{
+ # Make sure it is clean
+ make_maintainer_clean
+
+ run_configure
+ make_target 'dist'
+ make_target 'distclean'
+
+ # We should have a configure, but no Makefile at the end of this exercise
+ assert_no_file 'Makefile'
+ assert_exec_file 'configure'
+
+ snapshot_check
+}
+
+function check_mingw ()
+{
+ command_exists 'mingw64-configure'
+ ret=$?
+ if [ "$ret" -ne 0 ]; then
+ return 1
+ fi
+
+ command_exists 'mingw64-make'
+ ret=$?
+ if [ "$ret" -ne 0 ]; then
+ return 1
+ fi
+
+ return 0
+}
+
+function check_clang ()
+{
+ command_exists 'clang'
+ ret=$?
+ if [ "$ret" -ne 0 ]; then
+ return 1
+ fi
+
+ return 0
+}
+
+function check_clang_analyzer ()
+{
+ command_exists 'scan-build'
+ ret=$?
+ if [ "$ret" -ne 0 ]; then
+ return 1
+ fi
+
+ return 0
+}
+
+function make_skeleton ()
+{
+ run_configure
+ ret=$?
+
+ if [ $ret -eq 0 ]; then
+ assert_file 'Makefile'
+
+ make_target 'all' 'warn'
+ ret=$?
+ if [ $ret -ne 0 ]; then
+ warn "$MAKE failed"
+ else
+ if [[ -n "$DISPLAY" ]]; then
+ if command_exists 'wine'; then
+ TESTS_ENVIRONMENT='wine'
+ fi
+ fi
+
+ if [[ -n "$TESTS_ENVIRONMENT" ]]; then
+ make_target 'check' 'warn' || warn "$MAKE check failed"
+ ret=$?
+ fi
+ fi
+
+ if $jenkins_build_environment; then
+ make_target 'clean' 'warn'
+ fi
+ fi
+
+ return $ret
+}
+
+function make_for_mingw ()
+{
+ if ! check_mingw; then
+ return 1
+ fi
+
+ # Make sure it is clean
+ if [ -f Makefile -o -f configure ]; then
+ make_maintainer_clean
+ fi
+
+ run_autoreconf
+
+ save_BUILD
+
+ CONFIGURE='mingw64-configure'
+ MAKE='mingw64-make'
+ CONFIGURE_ARGS='--enable-static --disable-shared'
+
+ make_skeleton
+ ret=$?
+
+ restore_BUILD
+
+ return $ret
+}
+
+function make_for_clang ()
+{
+ if ! check_clang; then
+ return 1
+ fi
+
+ # Make sure it is clean
+ if [ -f Makefile -o -f configure ]; then
+ make_maintainer_clean
+ fi
+
+ run_autoreconf
+
+ save_BUILD
+
+ CC=clang CXX=clang++
+ export CC CXX
+
+ make_skeleton
+ ret=$?
+
+ make_target 'check'
+
+ restore_BUILD
+
+ return $ret
+}
+
+function make_for_clang_analyzer ()
+{
+ if ! check_clang; then
+ return 1
+ fi
+
+ if ! check_clang_analyzer; then
+ die 'clang-analyzer was not found'
+ fi
+
+ # Make sure it is clean
+ if [ -f Makefile -o -f configure ]; then
+ make_maintainer_clean
+ fi
+
+ run_autoreconf
+
+ save_BUILD
+
+ CC=clang CXX=clang++
+ export CC CXX
+ CONFIGURE_ARGS='--enable-debug'
+
+ make_skeleton
+ ret=$?
+
+ make_target 'clean' 'warn'
+
+ scan-build -o clang-html make -j4 -k
+
+ restore_BUILD
+
+ return $ret
+}
+
+# If we are locally testing, we should make sure the environment is setup correctly
+function check_for_jenkins ()
+{
+ if ! $jenkins_build_environment; then
+ echo "Not inside of jenkins"
+
+ if [ -f 'configure' ]; then
+ make_maintainer_clean
+ fi
+
+ if $BOOTSTRAP_SNAPSHOT; then
+ make_for_snapshot
+ fi
+ fi
+}
+
+function make_universe ()
+{
+ make_for_snapshot
+ make_valgrind
+ make_gdb
+ make_rpm
+ make_for_clang
+ make_for_clang_analyzer
+
+ if [ check_mingw -eq 0 ]; then
+ make_for_mingw
+ fi
+
+ make_distcheck
+ make_install_system
+}
+
+function make_for_continuus_integration ()
+{
+ # Setup the environment if we are local
+ check_for_jenkins
+
+ # No matter then evironment, we should not have a Makefile at this point
+ assert_no_file 'Makefile'
+
+ # Platforms which require bootstrap should have some setup done before we hit this stage.
+ # If we are building locally, skip this step, unless we are just testing locally.
+ if $BOOTSTRAP_SNAPSHOT; then
+ snapshot_check
+ else
+ # If we didn't require a snapshot, then we should not have a configure
+ assert_no_file 'configure'
+
+ run_autoreconf
+ fi
+
+ assert_no_file 'Makefile' 'Programmer error, Makefile existed where build state should have been clean'
+
+ case $HOST_OS in
+ *-fedora-*)
+ run_configure
+
+ assert_exec_file 'configure'
+ assert_file 'Makefile'
+
+ make_target 'all'
+
+ # make rpm includes "make distcheck"
+ if [[ -f rpm.am ]]; then
+ make_rpm
+ elif [[ -d rpm ]]; then
+ make_rpm
+ else
+ make_distcheck
+ fi
+
+ assert_exec_file 'configure'
+ assert_file 'Makefile'
+
+ make_install_system
+ ;;
+ *-precise-*)
+ run_configure
+
+ assert_exec_file 'configure'
+ assert_file 'Makefile'
+
+ make_target 'all'
+
+ make_distcheck
+
+ assert_exec_file 'configure'
+ assert_file 'Makefile'
+
+ make_valgrind
+
+ assert_exec_file 'configure'
+ assert_file 'Makefile'
+
+ make_install_system
+ ;;
+ *)
+ make_jenkins_default
+ ;;
+ esac
+
+ make_maintainer_clean
+
+ safe_popd
+}
+
+# The point to this test is to test bootstrap.sh itself
+function self_test ()
+{
+ # We start off with a clean env
+ make_maintainer_clean
+
+ eval "./bootstrap.sh jenkins" || die "failed 'jenkins'"
+ eval "./bootstrap.sh all" || die "failed 'all'"
+ eval "./bootstrap.sh gdb" || die "failed 'gdb'"
+ eval "./bootstrap.sh maintainer-clean" || die "failed 'maintainer-clean'"
+}
+
+function make_install_html ()
+{
+ run_configure_if_required
+ assert_file 'configure'
+
+ make_target 'install-html'
+}
+
+function make_gdb ()
+{
+ if command_exists 'gdb'; then
+ run_configure_if_required
+
+ push_TESTS_ENVIRONMENT
+
+ # Set ENV GDB_COMMAND
+ if [[ -z "$GDB_COMMAND" ]]; then
+ setup_gdb_command
+ fi
+
+ # If we don't have a configure, then most likely we will be missing libtool
+ assert_file 'configure'
+ if [[ -f 'libtool' ]]; then
+ TESTS_ENVIRONMENT="./libtool --mode=execute $GDB_COMMAND"
+ else
+ TESTS_ENVIRONMENT="$GDB_COMMAND"
+ fi
+
+ make_target 'check'
+
+ if [ -f 'gdb.txt' ]; then
+ rm 'gdb.txt'
+ fi
+
+ pop_TESTS_ENVIRONMENT
+
+ if [ -f '.gdb_history' ]; then
+ rm '.gdb_history'
+ fi
+
+ if $jenkins_build_environment; then
+ make_target 'clean'
+ fi
+ else
+ echo 'gdb was not present'
+ return 1
+ fi
+}
+
+# $1 target to compile
+# $2 to die, or not to die, based on contents
+function make_target ()
+{
+ if [ -z "$1" ]; then
+ die "Programmer error, no target provided for make"
+ fi
+
+ if [ ! -f 'Makefile' ]; then
+ die "Programmer error, make was called before configure"
+ run_configure
+ fi
+
+ if [ -n "$TESTS_ENVIRONMENT" ]; then
+ if $VERBOSE; then
+ echo "TESTS_ENVIRONMENT=$TESTS_ENVIRONMENT"
+ fi
+ fi
+
+ if [ -z "$MAKE" ]; then
+ die "MAKE was not set"
+ fi
+
+ # $2 represents error or warn
+ run $MAKE $1
+ ret=$?
+
+ if [ $ret -ne 0 ]; then
+ if [ -n "$2" ]; then
+ warn "Failed to execute $MAKE $1: $ret"
+ else
+ die "Failed to execute $MAKE $1: $ret"
+ fi
+ fi
+
+ return $ret
+}
+
+function make_distcheck ()
+{
+ make_target 'distcheck'
+}
+
+function make_rpm ()
+{
+ if command_exists 'rpmbuild'; then
+ if [ -f 'rpm.am' -o -d 'rpm' ]; then
+ run_configure_if_required
+ make_target 'rpm'
+
+ if $jenkins_build_environment; then
+ make_target 'clean'
+ fi
+
+ fi
+ fi
+}
+
+function make_maintainer_clean ()
+{
+ run_configure_if_required
+ make_target 'maintainer-clean' 'no_error'
+
+ # Lets make sure we really cleaned up the environment
+ assert_no_file 'Makefile'
+ assert_no_file 'configure'
+ assert_no_directory 'autom4te.cache'
+}
+
+function make_check ()
+{
+ make_target 'check'
+}
+
+function make_jenkins_default ()
+{
+ run_configure
+ make_target 'all'
+}
+
+function make_default ()
+{
+ run_configure_if_required
+ make_target 'all'
+}
+
+function run_configure_if_required ()
+{
+ run_autoreconf_if_required
+
+ if [ ! -f 'Makefile' ]; then
+ run_configure
+ fi
+
+ assert_file 'Makefile' 'configure did not produce a Makefile'
+}
+
+function run_autoreconf_if_required ()
+{
+ if [ ! -x 'configure' ]; then
+ run_autoreconf
+ fi
+
+ assert_exec_file 'configure'
+}
+
+function run_autoreconf ()
+{
+ if [[ -z "$AUTORECONF" ]]; then
+ die "Programmer error, tried to call run_autoreconf () but AUTORECONF was not set"