#! /bin/sh
# configure script for Diag
# note: has nothing to do with GNU autoconf
# last modified 6 Jun 11 th


LC_ALL=C
export LC_ALL

test=test$$
trap "rm -fr $test*" 0 1 2 3 15

if (echo "test\c"; echo 1,2,3) | grep c > /dev/null ; then
  if (echo -n test; echo 1,2,3) | grep n > /dev/null ; then
    echo_n=
    echo_c='
'
  else
    echo_n=-n
    echo_c=
  fi
else
  echo_n=
  echo_c='\c'
fi


findprog()
{
  echo $echo_n "looking for $1... $echo_c" 1>&2
  shift
  for prog in "$@" ; do
    full="`which \"$prog\" 2> /dev/null`"
    if [ -x "$full" ] ; then
      echo $full 1>&2
      echo $prog
      return 0
    fi
  done
  echo "no $@ in your path" 1>&2
  return 1
}


CONF_OS=`uname -s`
CONF_HOSTTYPE=`tcsh -cf 'echo $HOSTTYPE'`
CONF_PREFIX=$CONF_HOSTTYPE
CONF_SRC=`dirname $0`/src

case $CONF_HOSTTYPE in
*cyg*) CONF_EXE=.exe ;;
esac

for arg in "$@" ; do
  case "$arg" in
  --prefix=*)
	CONF_PREFIX=`expr "$arg" : ".*--prefix=\(.*\)"` ;;
  --static)
	CONF_STATIC="-static"
	case "$CONF_OS" in
# Apple discourages static linking, see
# http://developer.apple.com/qa/qa2001/qa1118.html,
# so we make only libgcc static.  For a static libg2c do:
# sudo chmod 000 /usr/local/lib/libg2c.dylib
	Darwin) CONF_STATIC="-static-libgcc" ;;
	esac ;;
  --quad)
	CONF_QUAD=1 ;;
  --debug)
	CONF_DEBUG="-O0 -g" ;;
  --32)
	CONF_MACH=32 ;;
  --64)
	CONF_MACH=64 ;;
  --help)
	cat << _EOF_ 1>&2
$0 configures Diag, i.e. determines or guesses the
compiler and flags and writes out a makefile.

$0 understands the following options:

--prefix=DIR        use DIR as installation directory,

--static            link the executables statically,

--quad              compiles with quadruple precision (ifort and xlf only),

--debug             compiles with optimization disabled.

--32                force 32-bit compilation

--64                force 64-bit compilation

_EOF_
	exit 1 ;;
  -*)
	echo "Warning: $arg is not a valid option." 1>&2 ;;
  *=*)
	eval `echo $arg\" | sed 's/=/="/'` ;;
  *)
	echo "Warning: $arg is not a valid argument." 1>&2 ;;
  esac
done

CONF_M=${CONF_MACH:+-m$CONF_MACH}


## look for some programs

CONF_MAKE=`findprog make gmake Make make` || exit 1

CONF_CC=`findprog gcc $CC gcc` || exit 1

CONF_CFLAGS="${CFLAGS-${CONF_DEBUG--O3 -g} -fomit-frame-pointer -ffast-math -Wall} $CONF_STATIC $CONF_M"

CONF_FC=`findprog f77 $FC ${CONF_QUAD+ifort} pgf77 ifort xlf fort77 f77 f90 g77 g95 gfortran` || exit 1

CONF_DEF="-D"

case "`$CONF_FC --version -c 2>&1`" in
*G95*)
  CONF_FFLAGS="-O0 -g -ffixed-line-length-132 -freal-loops $CONF_STATIC $CONF_M $FFLAGS" ;;
*GNU*)
  case "$CONF_FC" in
  *gfortran*) CONF_WARN="-Wall -Wtabs ${CONF_DEBUG:+-ffpe-trap=invalid,overflow,zero}" ;;
  *) CONF_WARN="-Wall" ;;
  esac
  CONF_FFLAGS="-O0 -g -ffixed-line-length-none $CONF_WARN $CONF_STATIC $CONF_M $FFLAGS" ;;
#  case $CONF_HOSTTYPE in
#  *cyg*) CONF_FFLAGS="$CONF_FFLAGS -mno-cygwin"
#         CONF_CFLAGS="$CONF_CFLAGS -mno-cygwin" ;;
#  esac
*)
  CONF_FFLAGS="${FFLAGS-default}"
  [ "$CONF_FFLAGS" = default ] && case "$CONF_FC$CONF_HOSTTYPE" in
  *pgf77*)
	CONF_FFLAGS="${CONF_DEBUG--O3 -g} ${CONF_DEBUG:+-Ktrap=fp} -Mextend -Minform=inform -g77libs ${CONF_STATIC+-Bstatic} $CONF_M" ;;
  *ifort*)
	CONF_FFLAGS="${CONF_DEBUG--O3 -g} -extend_source -warn truncated_source -assume bscc $CONF_STATIC ${CONF_STATIC+-static-intel} ${CONF_QUAD+-r16 -DDBLE=QEXT -DDIMAG=QIMAG -DDCONJG=QCONJG -DDCMPLX=QCMPLX} $CONF_M" ;;
  *alpha)
	CONF_FFLAGS="-old_f77 ${CONF_DEBUG--O3 -g3} ${CONF_DEBUG:+-fpe0} -extend_source -warn truncated_source ${CONF_STATIC+-non_shared}" ;;
  *sun* | *sparc*)
	CONF_FFLAGS="${CONF_DEBUG--O3 -g} ${CONF_DEBUG:+-ftrap=common} -e ${CONF_STATIC+-Bstatic}" ;;
  *hp*)
	CONF_FFLAGS="${CONF_DEBUG--O2 -g} ${CONF_DEBUG:++FPVZO} +es +U77 ${CONF_STATIC+-Wl,-noshared}" ;;
  *xlf*)
	CONF_FFLAGS="${CONF_DEBUG--O2 -g} ${CONF_DEBUG:+-qflttrap=enable:invalid:overflow:zerodivide} -qfixed=132 -qmaxmem=-1 -qextname ${CONF_QUAD+-qautodbl=dbl}"
	CONF_DEF="-WF,-D" ;;
  *)
	CONF_FFLAGS="${CONF_DEBUG--O -g}" ;;
  esac
  ;;
esac


## are we 32- or 64-bit?

[ -z "$CONF_MACH" ] && case "`uname -m`" in
*86*)	echo $echo_n "C object files are... $echo_c" 1>&2
	CONF_MACH=32
	rm -fr $test*
	cat > $test.c << _EOF_
#include <stdio.h>
int main() { printf("Hello World\n"); }
_EOF_
	$CONF_CC $CONF_CFLAGS -c -o $test.o $test.c > /dev/null 2>&1
	case "`file $test.o`" in
	*x86?64*) CONF_MACH=64 ;;
	esac
	echo "$CONF_MACH-bit"
	CONF_M="-m$CONF_MACH"
	CONF_CFLAGS="$CONF_CFLAGS $CONF_M" ;;
esac

[ "$CONF_MACH" = 64 ] && CONF_LIBDIRSUFFIX=64


## can we do MathLink compilations

echo $echo_n "do we have MathLink... $echo_c" 1>&2

rm -fr $test*

cat > $test.tm << _EOF_
:Begin:
:Function: test
:Pattern: Test[i_Integer]
:Arguments: {i}
:ArgumentTypes: {Integer}
:ReturnType: Integer
:End:

#include "mathlink.h"

static int test(const int i) {
  return i + 1;
}

int main(int argc, char **argv) {
  return MLMain(argc, argv);
}
_EOF_

CONF_MCC=${MCC:-mcc}
FCC="$CONF_SRC/fcc"
REALCC="$CONF_CC" CC="$FCC" CXX="$FCC" PATH="$PATH:$CONF_SRC" \
  "$CONF_MCC" ${CONF_STATIC+-st} $CONF_CFLAGS \
    -o $test$CONF_EXE $test.tm > /dev/null 2>&1

if [ -x $test$CONF_EXE ] ; then
  echo "yes" 1>&2
  CONF_ML=1
else
  echo "no" 1>&2
  CONF_ML=0
fi


echo "creating makefile" 1>&2

cat - `dirname $0`/makefile.in > makefile << _EOF_
# --- variables defined by configure ---

SRC = `dirname $0`/src
PREFIX = $CONF_PREFIX
LIBDIRSUFFIX = $CONF_LIBDIRSUFFIX

EXE = $CONF_EXE
DEF = $CONF_DEF

FC = $CONF_FC
FFLAGS = $CONF_FFLAGS

CC = $CONF_CC
CFLAGS = $CONF_CFLAGS

ML = $CONF_ML
MCC = $CONF_MCC
MCFLAGS = ${CONF_STATIC+-st} ${CONF_MACH+-b$CONF_MACH} \$(CFLAGS)

# --- end defs by configure ---


_EOF_


echo "" 1>&2
echo "now you must run $CONF_MAKE" 1>&2
echo "" 1>&2

exit 0

