#!/bin/sh
# Build HDF5 library by doing configure, make, and tests.
# Usage: See USAGE()
# Programmer: Albert Cheng
# Creation date: Jul  9, 2003

# Some handy definitions
USAGE()
{
cat <<EOF
Buildhdf5 builds the HDF5 library by running configure, make and make check.
It skips the configure part if one has been done already.  In effect, one
can continue from a previous build.

Command Syntax
==============
buildhdf5 [-config] [-gass] [-srcdir dir] config-arguments ...
   -config:	run configure only. [default to do build too]
   -gass:	configure for the GASS driver
   -help:	show this help page
   -n:   	no execution, just show commands
   -srcdir:	use dir as the source directory
             	   [Note: this is different from --srcdir
             	    which will be passed to configure]
   all other arguments are passed to configure


Configure in place or by srcdir
===============================
By default, the command looks for the configure command in
'.' and then '../hdf5'.  When it finds it, it uses it to do
the configure part.  In effect, if ./configure is found, it
does the build in place.  If it finds ../hdf5/configure, it
does the --srcdir (that is separated source) build.  Therefore,
if you have the following structure setup, you can run multiple
hosts building simultantously using a common source code.
     hdf5_1.4/hdf5        # holds the source
	  .../arabica     # for SunOS 2.7
	  .../arabicapp   # for SunOS 2.7 parallel
	  .../burrwhite   # for Linux 2.4

Installing binary
=================
This command always install the binary in \$PWD/installdir.
This allows multiple install testing in the same host if the srcdir
configure is used.
EOF
}


TIMESTAMP()
{
    echo "=====" "`date`" "====="
}


QUIT()
{
    TIMESTAMP
}


# Do one step bracketed with time stamps
# The '< /dev/null' is needed to prevent some applications like MPI
# jobs blocked for reading when they read stdin unnecessary.
STEP()
{
    banner="$1"
    command="$2"
    resultfile="$3"

    echo "$banner"
    (TIMESTAMP; nerror=0 ;
	echo "eval $command"
	eval $command || nerror=1 ;
	TIMESTAMP; exit $nerror) < /dev/null >> "$resultfile" 2>&1
    if [ $? -ne 0 ]; then
	echo "error in '$banner'.  buildhdf5 aborted."
	exit 1
    fi
}


# Try locate the HDF4 library
# This is a hack because there is no consistent place to find
# the valid HDF library.
LOCATE_HDF4()
{
    OS=`uname -s`
    echo OS=$OS
    case "$OS" in
	HP-UX)
	    h4paths="/afs/ncsa/packages/hdf/HPUX_10.20"
	    ;;
	IRIX)
	    h4paths="/afs/ncsa/packages/hdf/4.1r3_irix"
	    ;;
	IRIX64)
	    case "$CC" in
	    *-n32)
		h4paths="/afs/ncsa/packages/hdf/IRIX64-n32_6.5"
		;;
	    *)
		h4paths="/afs/ncsa/packages/hdf/IRIX64_6.5"
		;;
	    esac
	    ;;
	Linux)
	    h4paths="/afs/ncsa/packages/hdf/linux"
	    ;;
	OSF1)
	    h4paths="/afs/ncsa/packages/hdf/OSF1_V4.0"
	    ;;
	*)
	    h4paths="/usr/ncsa /usr/sdt"
	    ;;
    esac
    echo $h4paths
    for h4 in $h4paths; do
	if [ -f $h4/lib/libdf.a -a -f $h4/include/hdf.h ]; then
	    WITH_H4="--with-hdf4=$h4/include,$h4/lib"
	    break
	fi
    done
    echo WITH_H4="$WITH_H4"
}


# Try locate the Fortran compiler
# This is a hack because there is no consistent fortran compiler name
LOCATE_FORTRAN()
{
    OS=`uname -s`
    echo OS=$OS
    case "$OS" in
	IRIX64)
	    case "$CC" in
	    *-n32)
		gasspaths=/usr/local/globus-install-1.1.1/development/mips-sgi-irix6.5-n32_nothreads_standard_debug
		sslpaths=/usr/local/ssl-n32
		;;
	    *)
		gasspaths=/usr/local/globus-install-1.1.1/development/mips-sgi-irix6.5-64_nothreads_standard_debug
		sslpaths=/usr/local/ssl
		;;
	    esac
	    ;;
	*)
	    ;;
    esac
    echo gasspaths=$gasspaths
    echo $sslpaths=$sslpaths
    for x in $gasspaths dummy; do
	if [ $x != dummy -a -f $x/lib/libglobus_gass_cache.a ]; then
	   WITH_GASS="--with-gass=$x/include,$x/lib"
	   break
	fi
    done
    for x in $sslpaths dummy; do
	if [ $x != dummy -a -f $x/lib/libssl.a ]; then
	   WITH_SSL="--with-ssl=$x/lib"
	   break
	fi
    done

    echo WITH_GASS="$WITH_GASS"
    echo WITH_SSL="$WITH_SSL"

}


# Try locate the GASS software library
# This is a hack because there is no consistent place to find
# the valid HDF library.
LOCATE_GASS()
{
    OS=`uname -s`
    echo OS=$OS
    case "$OS" in
	IRIX64)
	    case "$CC" in
	    *-n32)
		gasspaths=/usr/local/globus-install-1.1.1/development/mips-sgi-irix6.5-n32_nothreads_standard_debug
		sslpaths=/usr/local/ssl-n32
		;;
	    *)
		gasspaths=/usr/local/globus-install-1.1.1/development/mips-sgi-irix6.5-64_nothreads_standard_debug
		sslpaths=/usr/local/ssl
		;;
	    esac
	    ;;
	*)
	    ;;
    esac
    echo gasspaths=$gasspaths
    echo $sslpaths=$sslpaths
    for x in $gasspaths dummy; do
	if [ $x != dummy -a -f $x/lib/libglobus_gass_cache.a ]; then
	   WITH_GASS="--with-gass=$x/include,$x/lib"
	   break
	fi
    done
    for x in $sslpaths dummy; do
	if [ $x != dummy -a -f $x/lib/libssl.a ]; then
	   WITH_SSL="--with-ssl=$x/lib"
	   break
	fi
    done

    echo WITH_GASS="$WITH_GASS"
    echo WITH_SSL="$WITH_SSL"

}


# Configure.  Default to do --srcdir.
CONFIG()
{
    INSTALLDIR=`pwd`/installdir

    test -d $INSTALLDIR ||  ( echo mkdir $INSTALLDIR; \
	test "$NOEXEC" != 'noexec' && mkdir $INSTALLDIR )
    CMD="$SRCDIR/configure --prefix=$INSTALLDIR $*"
    echo $CMD
    if [ "$NOEXEC" != 'noexec' ]; then
	$CMD
    else
	true		# set exit code as 0
    fi
}

# Main body
TIMESTAMP
trap QUIT 0

#
# setup
#
MAKE=${MAKE:-'gmake'}
export MAKE
CONFIGURE="CONFIG"
CONFIG_ONLY=no		# default is configure and build
NOEXEC=			# default to execute commands
SRCDIRLIST=". ../hdf5"  # places to look for configure
nerror=0

# parse some options
while [ $# -gt 0 ]; do
    case "$1" in
	-config)
	    # do configure only
	    CONFIG_ONLY=yes
	    ;;
	-gass)
	    LOCATE_GASS
	    ;;
	-help)
	    USAGE
	    exit 0
	    ;;
	-n)
	    NOEXEC='noexec'
	    ;;
	-srcdir)
	    shift
	    SRCDIRLIST="$1"
	    ;;
	*)	# Quit parsing
	    break
	    ;;
    esac
    shift
done
	    
# Figure out if srcdir is wished.
# Make sure we are at the library root level
# by checking couple typical files.  Not bullet-proof.
for SRCDIR in $SRCDIRLIST dummy; do
    if [ x-$SRCDIR = x-dummy ]; then
	break
    fi
    if [ -d $SRCDIR/src -a -d $SRCDIR/config -a -f $SRCDIR/configure ]
    then
	break
    fi
done

if [ x-$SRCDIR = x-dummy ]; then
    echo "Could not find the source dir or configure script.  Abort."
    exit 1
fi

# Configure
# no configure if already done.
if [ ! -f config.status ]; then
    CONFIGURE="$CONFIGURE $WITH_SSL $WITH_GASS"
    STEP "Configure HDF5..." "$CONFIGURE $*" "#config"
else
    STEP "Confiugre Skipped" "echo Confiugre Skipped" "#config"
fi

if [ x-$CONFIG_ONLY = x-yes ]; then
    exit 0
fi


# Compile
STEP "Make HDF5..." "$MAKE" "#make"

# Tests
STEP "Testing HDF5..." "$MAKE check" "#test"

# all done
echo "No Errors encountered"
TIMESTAMP
