#! /bin/sh
#
# Copyright by The HDF Group.
# 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://www.hdfgroup.org/licenses.
# If you do not have access to either file, you may request a copy from
# help@hdfgroup.org.
#

############################################################################
##                                                                        ##
## Things You May Have to Modify:                                         ##
##                                                                        ##
## If the following paths don't point to the place were HDF5 is installed ##
## on your system (i.e., you received a binary distribution or moved the  ##
## files from the originally installed directory to another directory)    ##
## then modify them accordingly to represent the new paths.               ##
##                                                                        ##
############################################################################
prefix="/opt/local"
exec_prefix="${prefix}"
libdir="${exec_prefix}/lib"
includedir="${prefix}/include"
HL="hl"

############################################################################
##                                                                        ##
## Things You Can Modify to Override HDF5 Library Build Components:       ##
##                                                                        ##
## (Advanced usage - know what you're doing - you're on your own here.)   ##
## The four variables below can be used to insert paths and flags in      ##
## CPPFLAGS, CXXFLAGS, LDFLAGS, or LIBS in the h5cc compile line:         ##
##    $CXXLINKER $H5BLD_CPPFLAGS $CPPFLAGS $H5BLD_CXXFLAGS $CXXFLAGS      ##
##    $LDFLAGS $LIBS $clibpath $link_objs $link_args $shared_link         ##
##                                                                        ##
## These settings can be overridden by setting HDF5_CXXFLAGS,             ##
## HDF5_CPPFLAGS, HDF5_LDFLAGS, or HDF5_LIBS in the environment.          ##
##                                                                        ##
############################################################################
CXXFLAGSBASE=""
CPPFLAGSBASE=""
LDFLAGSBASE=""
LIBSBASE=""

############################################################################
##                                                                        ##
## You shouldn't have to modify anything below this line.                 ##
##                                                                        ##
############################################################################

# Constants definitions
EXIT_SUCCESS=0
EXIT_FAILURE=1

host_os="darwin14.5.0"

prog_name="`basename $0`"

qargs=""
compile_args=""
libraries=""
link_args=""
link_objs=""
clibpath=""

do_link="yes"
do_compile="no"
dash_c=""
get_output_file="no"

SHOW="eval"
CXXBASE="/usr/bin/clang++"
CXXLINKERBASE="/usr/bin/clang++"

# CXXFLAGS, CPPFLAGS and LDFLAGS are reserved for use by the script user.
# FLAGS brought from the hdf5 build are put in H5BLD_*FLAGS.

# User's CPPFLAGS and CXXFLAGS come after their H5BLD counterparts.  User's
# LDFLAGS come just before clibpath, user's LIBS come after $link_objs and
# before the hdf5 libraries in $link_args, followed by any external library
# paths and libraries from AM_LDFLAGS, LDFLAGS, AM_LIBS or LIBS carried in
# from the hdf5 build. The order of the flags is intended to give precedence
# to the user's flags.
H5BLD_CXXFLAGS=" -pipe -Os -stdlib=libc++ "
H5BLD_CPPFLAGS=" -isystem/opt/local/include/LegacySupport -I/opt/local/include"
H5BLD_LDFLAGS=" -lMacportsLegacySupport "
H5BLD_LIBS="/opt/local/lib/libaec/lib/libsz.dylib /opt/local/lib/libz.dylib -ldl -lm "

CXX="${HDF5_CXX:-$CXXBASE}"
CXXLINKER="${HDF5_CXXLINKER:-$CXXLINKERBASE}"
CXXFLAGS="${HDF5_CXXFLAGS:-$CXXFLAGSBASE}"
CPPFLAGS="${HDF5_CPPFLAGS:-$CPPFLAGSBASE}"
LDFLAGS="${HDF5_LDFLAGS:-$LDFLAGSBASE}"
LIBS="${HDF5_LIBS:-$LIBSBASE}"

# If a static library is available, the default will be to use it.  If the only
# available library is shared, it will be used by default.  The user can
# override either default, although choosing an unavailable library will result
# in link errors.
STATIC_AVAILABLE="yes"
if test "${STATIC_AVAILABLE}" = "yes"; then
  USE_SHARED_LIB="${HDF5_USE_SHLIB:-no}"
else
  USE_SHARED_LIB="${HDF5_USE_SHLIB:-yes}"
fi

usage() {
  # A wonderfully informative "usage" message.
  echo "usage: $prog_name [OPTIONS] <compile line>"
  echo "  OPTIONS:"
  echo "    -help        This help message."
  echo "    -echo        Show all the shell commands executed"
  echo "    -prefix=DIR  Prefix directory to find HDF5 lib/ and include/"
  echo "                   subdirectories [default: $prefix]"
  echo "    -show        Show the commands without executing them"
  echo "    -showconfig  Show the HDF5 library configuration summary"
  echo "    -shlib       Compile with shared HDF5 libraries [default for hdf5 built"
  echo "                                                     without static libraries]"
  echo "    -noshlib     Compile with static HDF5 libraries [default for hdf5 built"
  echo "                                                     with static libraries]"
  echo " "
  echo "  <compile line>  - the normal compile line options for your compiler."
  echo "                    $prog_name uses the same compiler you used to compile"
  echo "                    HDF5. Check with your compiler's man pages for more"
  echo "                    information on which options are needed."
  echo " "
  echo " You can override the compiler, linker, and whether or not to use static"
  echo " or shared libraries to compile your program by setting the following"
  echo " environment variables accordingly:"
  echo " "
  echo "   HDF5_CXX                 -  use a different C++ compiler"
  echo "   HDF5_CXXLINKER           -  use a different linker"
  echo "   HDF5_USE_SHLIB=[yes|no]  -  use shared or static version of the HDF5 library"
  echo "                                 [default: no except when built with only"
  echo "                                           shared libraries]"
  echo " You can also add or change paths and flags to the compile line using"
  echo " the following environment variables or by assigning them to their counterparts"
  echo " in the 'Things You Can Modify to Override...'" section of $prog_name
  echo " "
  echo "  Variable              Current value to be replaced"
  echo "  HDF5_CPPFLAGS         \"$CPPFLAGSBASE\""
  echo "  HDF5_CXXFLAGS         \"$CXXFLAGSBASE\""
  echo "  HDF5_LDFLAGS          \"$LDFLAGSBASE\""
  echo "  HDF5_LIBS             \"$LIBSBASE\""
  echo " "
  echo " Note that adding library paths to HDF5_LDFLAGS where another hdf5 version"
  echo " is located may link your program with that other hdf5 library version."
  echo " "
  exit $EXIT_FAILURE
}

# Show the configuration summary of the library recorded in the
# libhdf5.settings file reside in the lib directory.
showconfigure()
{
  cat ${libdir}/libhdf5.settings
  status=$?
}

# Main
status=$EXIT_SUCCESS

if test "$#" = "0"; then
  # No parameters specified, issue usage statement and exit.
  usage
fi

case "$CXX" in
  gcc)
    kind="gcc"
    ;;
  mpicc|mpcc|mpicc_r)
    # Is this gcc masquarading as an MPI compiler?
    if test "`${CXX} -v 2>&1 | sed -n 2p | cut -c1-3`" = "gcc"; then
      kind="gcc"
    else
      # Nope
      kind="$host_os"
    fi
    ;;
  *)
    kind="$host_os"
    ;;
esac

for arg in $@ ; do
  if test "x$get_output_file" = "xyes"; then
    link_args="$link_args $arg"
    output_file="$arg"
    get_output_file="no"
    continue
  fi

  case "$arg" in
    -c)
      compile_args="$compile_args $arg"

      if test "x$do_link" = "xyes" -a -n "$output_file"; then
        compile_args="$compile_args -o $output_file"
      fi

      do_link="no"
      dash_c="-c"
      ;;
    -o)
      if test "x$dash_c" = "x-c"; then
        compile_args="$compile_args $arg"
      else
        link_args="$link_args $arg"
        do_link="yes"
        get_output_file="yes"
      fi
      ;;
    -E|-M|-MT)
      compile_args="$compile_args $arg"
      dash_c="-c"
      do_link="no"
      ;;
    -l*)
      libraries=" $libraries $arg "
      ;;
    -prefix=*)
      prefix="`expr "$arg" : '-prefix=\(.*\)'`"
      ;;
    -echo)
      set -x
      ;;
    -show)
      SHOW="echo"
      ;;
    -showconfig)
      showconfigure
      exit $status
      ;;
    -shlib)
      USE_SHARED_LIB="yes"
      ;;
    -noshlib)
      USE_SHARED_LIB="no"
      ;;
    -help)
      usage
      ;;
    *\"*)
      qarg="'"$arg"'"
      qargs="$qargs $qarg"
      ;;
    *\'*)
      qarg='"'"$arg"'"'
      qargs="$qargs $qarg"
      ;;
    *)
      if [ -s "$arg" ] ; then
	ext=`expr "$arg" : '.*\(\..*\)'`
	if [ "$ext" = ".C" -o "$ext" = ".cxx" -o "$ext" = ".cpp" -o \
             "$ext" = ".cc" -o "$ext" = ".c" -o "$ext" = ".CC" ] ; then
	  do_compile="yes"
	  compile_args="$compile_args $arg"
	  fname=`basename $arg $ext`
	  link_objs="$link_objs $fname.o"
        elif [ "$ext" = ".o" ] ; then
          if test "x$dash_c" = "x-c"  ; then
	    compile_args="$compile_args $arg"
          else
	    do_link="yes"
	    link_objs="$link_objs $arg"
          fi
        elif test "x$ext" = "x.a"; then
          # This is an archive that we're linking in
          libraries=" $libraries $arg "
        else
          compile_args="$compile_args $arg"
          link_args="$link_args $arg"
        fi
      else
	compile_args="$compile_args $arg"
	link_args="$link_args $arg"
      fi
      ;;
  esac
done
link_args="$link_args $qargs"
if test "x$do_compile" = "xyes"; then
  if test "x$dash_c" = "x"; then
    dash_c="-c"
  fi
  $SHOW $CXX -I$includedir $H5BLD_CPPFLAGS $CPPFLAGS $H5BLD_CXXFLAGS $CXXFLAGS $dash_c $qargs $compile_args
  status=$?

  if test "$status" != "0"; then
    exit $status
  fi
fi

if test "x$do_link" = "xyes"; then
  shared_link=""
  # conditionally link with the hl library
  if test "X$HL" = "Xhl"; then
   libraries=" $libraries -lhdf5_hl_cpp -lhdf5_cpp -lhdf5_hl -lhdf5 "
  else
   libraries=" $libraries -lhdf5_cpp -lhdf5 "
  fi
  link_args="$link_args -L${libdir}"

  if test "x$USE_SHARED_LIB" = "xyes"; then
    case "$kind" in
      gcc|linux*)
        # MacOS X doesn't support the "-Wl,-rpath -Wl," style of linker flags.
        # It appears to want none of them specified.
        case "$host_os" in
          darwin*)          flag="" ;;
          *)                flag="-Wl,-rpath -Wl," ;;
        esac
        ;;
      hpux*)                flag="-Wl,+b -Wl," ;;
      freebsd*|solaris*)    flag="-R" ;;
      rs6000*|aix*)         flag="-L" ;;
      sgi)                  flag="-rpath " ;;
      *)                    flag="" ;;
    esac

    if test -n "$flag"; then
      shared_link="${flag}${libdir}"
    fi
  else
    # The "-lhdf5" & "-lhdf5_hl" flags are in here already...This is a static
    # compile though, so change it to the static version (.a) of the library.
    new_libraries=""
    for lib in $libraries; do
      case "$lib" in
        -lhdf5)
          new_libraries="$new_libraries ${libdir}/libhdf5.a"
          ;;
        -lhdf5_hl)
          new_libraries="$new_libraries ${libdir}/libhdf5_hl.a"
          ;;
        -lhdf5_cpp)
          new_libraries="$new_libraries ${libdir}/libhdf5_cpp.a"
          ;;
        -lhdf5_hl_cpp)
          new_libraries="$new_libraries ${libdir}/libhdf5_hl_cpp.a"
          ;;
        *)
          new_libraries="$new_libraries $lib"
          ;;
      esac
    done
    libraries="$new_libraries"
  fi

  for lib in $libraries; do
    if echo $link_args | grep " $lib " > /dev/null ||
       echo $link_args | grep " $lib$" > /dev/null; then
      :
    else
      link_args="$link_args $lib "
    fi
  done

  # The LIBS are just a bunch of -l* libraries necessary for the HDF5
  # module. It's okay if they're included twice in the compile line.
  link_args="$link_args $H5BLD_LDFLAGS $H5BLD_LIBS"

  # User's CPPFLAGS and CXXFLAGS come after their H5BLD counterparts.  User's
  # LDFLAGS come just before clibpath, user's LIBS come after $link_objs and
  # before the hdf5 libraries in $link_args, followed by any external library
  # paths and libraries from AM_LDFLAGS, LDFLAGS, AM_LIBS or LIBS carried in
  # from the hdf5 build. The order of the flags is intended to give precedence
  # to the user's flags.

  $SHOW $CXXLINKER $H5BLD_CPPFLAGS $CPPFLAGS $H5BLD_CXXFLAGS $CXXFLAGS $LDFLAGS $clibpath $link_objs $LIBS $link_args $shared_link

  status=$?
fi

exit $status
