#! /bin/sh
# configure script for FormCalc
# note: has nothing to do with GNU autoconf
# this file is part of FormCalc
# last modified 15 Mar 13 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
  test -n "$CONF_TARGET" && for prog in "$@" ; do
    full="`which \"$CONF_TARGET-$prog\" 2> /dev/null`"
    test -x "$full" && {
      echo $full 1>&2
      echo $CONF_TARGET-$prog
      return 0
    }
  done
  for prog in "$@" ; do
    full="`which \"$prog\" 2> /dev/null`"
    test -x "$full" && {
      echo $full 1>&2
      echo $prog
      return 0
    }
  done
  echo "no $@ in your path" 1>&2
  return 1
}


findlib()
{
  echo $echo_n "looking for $1... $echo_c" 1>&2
  file=$2
  shift 2
  for base in "$@" ; do
    for path in \
      "${CONF_LIBDIRSUFFIX:+$base/lib$CONF_LIBDIRSUFFIX}" \
      "${CONF_LIBDIRSUFFIX:+$base/$CONF_DEFPREFIX/lib$CONF_LIBDIRSUFFIX}" \
      "$base/lib" \
      "$base/$CONF_DEFPREFIX/lib" \
      ${CONF_QUAD:+"$base/build-quad"} \
      "$base/build" \
      "$base/includects" \
      "$base/libs" \
      "$base/src" \
      "$base"
    do
      test -f "$path/$file" && {
        echo "$path" 1>&2
        echo "$path"
        return 0
      }
    done
  done
  echo "not found" 1>&2
  return 1
}


getldflags()
{
  # Mma 5.1's mcc needs -lpthread for static linking
  ldflags="$LDFLAGS -lpthread"

  while read line ; do
    set -- `echo $line | tr ':,()' '    '`
    case $1 in
    */collect2$CONF_EXE | */ld$CONF_EXE | ld$CONF_EXE) ;;
    *) continue ;;
    esac
    while test $# -gt 1 ; do
      shift
      case $1 in
      *.o | -lc | -lgcc*)
        ;;
      -l* | -L* | *.a)
        ldflags="$ldflags $1" ;;
      -Bstatic | -Bdynamic | *.ld)
        ldflags="$ldflags -Wl,$1" ;;
      /*)
        ldflags="$ldflags -L$1" ;;
      -rpath*)
        ldflags="$ldflags -Wl,$1,$2"
        shift ;;
      -dynamic-linker)
        shift ;;
      esac
    done
  done

  echo $ldflags
}


CONF_SRC=`dirname $0`
CONF_OS=`uname -s`
CONF_OSVER=`uname -r`
CONF_MACH=`uname -m`
CONF_DEFPREFIX="$CONF_MACH-$CONF_OS"
CONF_PREFIX="$CONF_DEFPREFIX"
test "$CONF_PREFIX" = x86_64-Linux && CONF_LIBDIRSUFFIX=64
CONF_TARGET=
CONF_STATIC=
CONF_STATIC_EXT=
CONF_QUAD=
CONF_DEBUG=
CONF_BITS=
CONF_EXE=
case "$CONF_OS" in
CYG*) CONF_EXE=.exe ;;
esac

CONF_MAKEARGS=0

for arg in "$@" ; do
  case "$arg" in
  --prefix=*)
	CONF_PREFIX=`expr "$arg" : ".*--prefix=\(.*\)"` ;;
  --host=*)
	CONF_TARGET=`expr "$arg" : ".*--host=\(.*\)"` ;;
  --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 | CYG*)
		CONF_STATIC_EXT=$CONF_STATIC
		CONF_STATIC= ;;
	esac ;;
  --quad)
	CONF_QUAD=1 ;;
  --debug)
	CONF_DEBUG="-O0 -g" ;;
  --32)
	CONF_BITS=32 ;;
  --64)
	CONF_BITS=64 ;;
  --make*)
	CONF_MAKEARGS="`expr "$arg" : "--make=\(.*\)"`" ;;
  --help)
	cat << _EOF_ 1>&2
$0 configures FormCalc-generated Fortran code, 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,

--host=HOST         target host triplet, e.g. i386-pc-linux,

--static            link the executables statically,

--quad              compile with quadruple precision (gfortran 4.6+, ifort and xlf only),

--debug             compile without optimization,

--32                force 32-bit compilation,

--64                force 64-bit compilation,

--make[=ARGS]       immediately continue with "make ARGS" after configure.

_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_BITS:+-m$CONF_BITS}


## look for some programs

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

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

CONF_CXX=`findprog g++ $CXX g++` || exit 1

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

CONF_AR=`findprog ar $AR ar`

CONF_RANLIB=`findprog ranlib $RANLIB ranlib`

CONF_NM=`findprog nm $NM nm`

CONF_DLLTOOL=`findprog dlltool $DLLTOOL dlltool`

CONF_DEF="-D"

case "`$CONF_FC --version -c 2>&1`" in
*G95*)
  CONF_FFLAGS="$FFLAGS -O3 -g -ffixed-line-length-132 -freal-loops $CONF_M $CONF_STATIC ${CONF_DEBUG:+-Wall}" ;;
*GNU*)
  CONF_FFLAGS="$FFLAGS -O3 -g -ffixed-line-length-none $CONF_M $CONF_STATIC ${CONF_DEBUG:+-Wall}"
  case "$CONF_FC" in
  *gfortran*)
	CONF_FFLAGS="$CONF_FFLAGS ${CONF_DEBUG:+-Wtabs -ffpe-trap=invalid,overflow,zero} -ff2c ${CONF_STATIC_EXT:+-static-libgfortran -static-libgcc} ${CONF_QUAD:+-fdefault-real-8}" ;;
  esac ;;
*)
  CONF_FFLAGS="${FFLAGS-default}"
  test "$CONF_FFLAGS" = default && case "$CONF_FC$CONF_MACH" in
  *pgf*)
	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 nouncalled -warn truncated_source -assume bscc $CONF_STATIC ${CONF_STATIC_EXT:+-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


## find the Fortran libraries

echo $echo_n "extracting the Fortran libraries... $echo_c" 1>&2

rm -fr $test*

cat > $test.f << _EOF_
	program dontpanic
	print *, "Hi"
	end
_EOF_

CONF_LDFLAGS=`$CONF_FC $CONF_FFLAGS -v -o $test $test.f 2>&1 | getldflags`

CONF_STDLIBS="$STDLIBS"
case "$CONF_OS$CONF_OSVER" in
Darwin10*) CONF_STDLIBS="$CONF_STDLIBS -lSystemStubs" ;;
esac

echo $CONF_LDFLAGS 1>&2


test -z "$CONF_BITS" && case "$CONF_MACH" in
*86*)	CONF_BITS=32
	case "`file $test`" in
	*x86?64*) CONF_BITS=64 ;;
	esac
	CONF_M="-m$CONF_BITS" ;;
esac


opt="-O3 -g"
case `$CONF_CC --version 2>&1 < /dev/null` in
*LLVM*) ;;
*gcc*4.2* | *gcc*4.4.3*) opt=-O0 ;;
esac
CONF_CFLAGS="${CFLAGS-${CONF_DEBUG:-$opt} -std=gnu99 -fomit-frame-pointer -ffast-math} $CONF_M $CONF_STATIC ${CONF_STATIC_EXT:+-static-libgcc}"

CONF_CXXFLAGS="$CXXFLAGS $CONF_M $CONF_STATIC ${CONF_STATIC_EXT:+-static-libstdc++ -static-libgcc}"


## does Fortran need externals for U77 routines?

echo $echo_n "does $CONF_FC need externals for U77 routines... $echo_c" 1>&2

rm -fr $test*

cat > $test.f << _EOF_
	program test
	implicit none
	print *, iargc(), len_trim("Hi")
	end
_EOF_

if $CONF_FC $CONF_FFLAGS -c $test.f > /dev/null 2>&1 ; then
  echo "no" 1>&2
  CONF_U77EXT=0
else
  echo "yes" 1>&2
  CONF_U77EXT=1
fi


## does Fortran append underscores to symbols?

echo $echo_n "does $CONF_FC append underscores... $echo_c" 1>&2

rm -fr $test*

cat > $test.f << _EOF_
	subroutine uscore
	end
_EOF_

cat > $test-c.c << _EOF_
int main() {
  void uscore_();
  uscore_();
  return 0;
}
_EOF_

$CONF_FC $CONF_FFLAGS -c $test.f > /dev/null 2>&1

if $CONF_CC $CONF_CFLAGS -o $test-c $test-c.c $test.o $CONF_LDFLAGS > /dev/null 2>&1 ; then
  echo "yes" 1>&2
else
  echo "no" 1>&2
  CONF_CFLAGS="$CONF_CFLAGS -DNOUNDERSCORE"
fi


# check for the necessary libraries

CONF_CT="`findlib CutTools libcts.a \
  $CT ../Cuttools* ../../Cuttools* ../../../Cuttools* $HOME/Cuttools* \
  /usr/local/Cuttools* /usr/Cuttools* /usr/local /usr`" && \
  CONF_STDLIBS="$CONF_STDLIBS -L\$(CT) -lcts"

CONF_SAMURAI="`findlib Samurai libsamurai.a \
  $SAMURAI ../samurai* ../../samurai* ../../../samurai* $HOME/samurai* \
  /usr/local/samurai* /usr/samurai* /usr/local /usr`" && \
  CONF_STDLIBS="$CONF_STDLIBS -L\$(SAMURAI) -lsamurai -lavh_olo"

CONF_LT="`findlib LoopTools libooptools${CONF_QUAD:+-quad}.a \
  $LT ../LoopTools* ../../LoopTools* ../../../LoopTools* $HOME/LoopTools* \
  /usr/local/LoopTools* /usr/LoopTools* /usr/local /usr`" && \
  CONF_STDLIBS="$CONF_STDLIBS -L\$(LT) -looptools${CONF_QUAD:+-quad}"

libpath="`findlib FeynHiggs libFH.a \
  $FH ../FeynHiggs* ../../FeynHiggs* ../../../FeynHiggs* $HOME/FeynHiggs* \
  /usr/local/FeynHiggs* /usr/FeynHiggs* /usr/local /usr`" && \
  CONF_STDLIBS="$CONF_STDLIBS -L$libpath -lFH"

libpath="`findlib LHAPDF libLHAPDF.a \
  $LHAPDF ../lhapdf* ../../lhapdf* ../../../lhapdf* $HOME/lhapdf* \
  /usr/local/lhapdf* /usr/lhapdf* /usr/local /usr`" && \
  CONF_STDLIBS="$CONF_STDLIBS -L$libpath -Wl,-rpath,$libpath -lLHAPDF"


echo "creating makefile" 1>&2

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

SRC = $CONF_SRC
PREFIX = $CONF_PREFIX
LIBDIRSUFFIX = $CONF_LIBDIRSUFFIX

EXE = $CONF_EXE
DEF = $CONF_DEF

LT = $CONF_LT
CT = $CONF_CT
SAMURAI = $CONF_SAMURAI
STDLIBS = $CONF_STDLIBS
LDFLAGS = $CONF_LDFLAGS

FC = $CONF_FC
FFLAGS = $CONF_FFLAGS \$(DEF)U77EXT=$CONF_U77EXT ${CONF_DEBUG:+\$(DEF)DEBUG}

CC = $CONF_CC
CFLAGS = $CONF_CFLAGS

CXX = $CONF_CXX
CXXFLAGS = $CONF_CXXFLAGS

MCFLAGS = ${CONF_STATIC:+-st} ${CONF_STATIC_EXT:+-st} ${CONF_BITS:+-b$CONF_BITS}

# --- end defs by configure ---


_EOF_

if test "$CONF_MAKEARGS" = 0 ; then
  echo "" 1>&2
  echo "now you must run $CONF_MAKE" 1>&2
  echo "" 1>&2
else
  $CONF_MAKE $CONF_MAKEARGS
fi

exit 0

