#!/bin/sh
#
# Copyright by The HDF Group.
# Copyright by the Board of Trustees of the University of Illinois.
# All rights reserved.
#
# This file is part of HDF5.  The full HDF5 copyright notice, including
# terms governing use, modification, and redistribution, is contained in
# the COPYING file, which can be found at the root of the source code
# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
# If you do not have access to either file, you may request a copy from
# help@hdfgroup.org.
#
# 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] [-szlib] [-help] [-n] [-srcdir dir] [-fortran] [-cxx] [-pp] config-arguments ...
   -config:	run configure only. [default to do build too]
   -szlib:      configure in the szlib option
   -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]
   -fortran:	add --enable-fortran
   -cxx:	add --enable-cxx
   -pp:		add --enable-parallel
   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_v1.7/hdf5       # holds the source
	  .../sunbox      # for SunOS
	  .../linux       # for Linux
	  .../linuxpp     # for Linux parallel
EOF
}


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


QUIT()
{
    # print the closing time
    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 SZLIB.
# This is a hack because there is no consistent szlib pathname.
LOCATE_SZLIB()
{
    # Try to guess what domain I am in.
    if [ -d /usr/hdf/bin ]; then
	# I am in an THG host.
	mydomain=thg
    elif [ -d /afs/ncsa/projects/hdf/packages ]; then
	# I am in an NCSA host that has AFS.
	mydomain=ncsa
    else
	mydomain=unknown
    fi
    
    case $mydomain in
	thg)
	    # THG hosts
	    OS=`uname -s`
	    echo OS=$OS
	    case "$OS" in
		Linux)
		    case `uname -m` in
		    i686)	# 32 bits
			szlibpaths="/home/packages/szip/static/encoder/Linux2.6-gcc"
			;;
		    x86_64)	# 64 bits
			szlibpaths="/home/packages/szip/static/encoder/Linux2.6-x86_64-gcc"
			;;
		    *)
			# Don't know.  Give a shot at standard places.
			szlibpaths="/usr/hdf /usr/local"
			;;
		    esac
		    ;;
		SunOS)
		    szlibpaths="/home/packages/szip/static/encoder/SunOS-5.10"
		    ;;
		FreeBSD)
		    case `uname -m` in
		    i386)	# 32 bits
			szlibpaths="/home/packages/szip/static/encoder/FreeBSD"
			;;
		    amd64)	# 64 bits
			szlibpaths="/home/packages/szip/static/encoder/FreeBSD-64"
			;;
		    *)
			# Don't know.  Give a shot at standard places.
			szlibpaths="/usr/hdf /usr/local"
			;;
		    esac
		    ;;
		*)
		    # Don't know.  Give a shot at standard places.
		    szlibpaths="/usr/hdf /usr/local"
		    ;;
	    esac
	    ;;	# end of case thg
	ncsa)
	    # ncsa hosts
	    OS=`uname -s`
	    echo OS=$OS
	    case "$OS" in
		HP-UX)
		    szlibpaths="/afs/ncsa/projects/hdf/packages/szip_new/HPUX-11.00"
		    ;;
		Linux)
		    case `uname -m` in
		    i686)
			szlibpaths="/afs/ncsa/projects/hdf/packages/szip_new/Linux2.4"
			;;
		    *)
			# Don't know.  Give a shot at standard places.
			szlibpaths="/usr/ncsa /usr/sdt"
			;;
		    esac
		    ;;
		SunOS)
		    szlibpaths="/afs/ncsa/projects/hdf/packages/szip_new/SunOS_5.8"
		    ;;
		*)
		    # Don't know.  Give a shot at standard places.
		    szlibpaths="/usr/ncsa /usr/sdt"
		    ;;
	    esac
	    ;;	# end of case ncsa
	unknown)
	    # Unknow domain. Give a shot at the some standard places.
	    szlibpaths="/usr/local"
	    ;;
    esac	# end of case $mydomain





    echo szlibpaths=$szlibpaths
    for x in $szlibpaths dummy; do
	if [ $x != dummy -a -f $x/include/szlib.h -a -f $x/lib/libsz.a ]; then
	   WITH_SZLIB="--with-szlib=$x"
	   break
	fi
    done

    echo WITH_SZLIB="$WITH_SZLIB"
}


# Configure.  Default to do --srcdir.
CONFIG()
{
    CMD="$SRCDIR/configure $*"
    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
CONFIG_CMD="CONFIG"
CONFIG_OP=		# configure options
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
	    ;;
	-szlib)
	    LOCATE_SZLIB
	    CONFIG_OP="$CONFIG_OP $WITH_SZLIB"
	    ;;
	-help)
	    USAGE
	    exit 0
	    ;;
	-n)
	    NOEXEC='noexec'
	    ;;
	-srcdir)
	    shift
	    SRCDIRLIST="$1"
	    ;;
	-cxx)
	    CONFIG_OP="$CONFIG_OP --enable-cxx"
	    ;;
	-fortran)
	    CONFIG_OP="$CONFIG_OP --enable-fortran"
	    ;;
	-pp)
	    CONFIG_OP="$CONFIG_OP --enable-parallel"
	    ;;
	*)	# pass it as a configure option
	    CONFIG_OP="$CONFIG_OP $1"
	    ;;
    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
    STEP "Configure HDF5..." "$CONFIG_CMD $CONFIG_OP" "#config"
else
    STEP "Configure Skipped" "echo Configure Skipped" "#config"
fi

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


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

# Serial tests 
STEP "Testing HDF5 serial parts..." "$MAKE check-s" "#test-s"

# Parallel tests
STEP "Testing HDF5 parallel parts..." "$MAKE check-p" "#test-p"

# all done
echo "No Errors encountered"