#!/bin/sh
# $LastChangedDate: 2002-09-02 17:02:40 +0200 (Mon, 02 Sep 2002) $ $Rev: 865 $

usage ()
{
  cat <<EOF
USAGE: $0 [-prefix PREFIX] [-help]

PREFIX defaults for /usr/local.
EOF
  exit 1
}

log ()
{
  echo "$*" >> config.log
}

checking ()
{
  log "test $*"
  echo -n "checking $*... "
}

yes ()
{
  log "test ok"
  echo "yes"
}

no ()
{
  log "test failed"
  echo "no"
  return 1
}

warn ()
{
  log "warn: $*"
  echo 1>&2 "*** warning: $*"
}

error ()
{
  log "error: $*"
  echo 1>&2 "*** error: $*"
}

die ()
{
  error "sorry, cannot continue"
  exit 1
}

check_lib ()
{
  checking "for $1() in $2"
  prog="int main(){ $1(); return 0; }"
  cmd="$CC conftest.c $2"
  echo "$prog" > conftest.c
  log "conftest:"
  log "$prog"
  log "running $cmd:"
  if $cmd >> config.log 2>&1 ; then
    rm -f conftest.c a.out
    yes
  else
    rm -f conftest.c a.out
    no
  fi
}

check_cmd ()
{
  checking "$1"
  log "running $2:"
  if eval $2 >> config.log 2> /dev/null ; then
    yes
  else
    no
  fi
}

PREFIX=/usr/local
LIBDIR=$PREFIX/lib/gont
BINDIR=$PREFIX/bin
MANDIR=$PREFIX/share/man
INCLUDEDIR=$PREFIX/include/gont
VERSION=$(cat VERSION)
CC=
KSIC=
GC_LIB=
DEFS=

while test -n "$1" ; do
  case "$1" in
    -prefix )
      PREFIX="$2"
      LIBDIR=$PREFIX/lib/gont
      BINDIR=$PREFIX/bin
      MANDIR=$PREFIX/share/man
      INCLUDEDIR=$PREFIX/include/gont
      shift
      ;;
    -help )
      usage
      exit 0
      ;;
    -ksic )
      KSIC="$2"
      shift
      ;;
    * )
      echo 2>&1 "unknown knob: $1"
      usage
      exit 1
      ;;
  esac
  shift
done

if [ ".$KSIC" = "." ] ; then
  checking "for compiler driver that understands Ksi"
  echo

  cat > conf-test0.ksi <<EOF
!version 0
[unit (func [attr (public)] (void) f [parm (var (int 32) x)] 
(bind (addr (ref x))))]
EOF

  cat > conf-test1.ksi <<EOF
!version 1
[(func [(public)] (void) f [(var (int 32) x)] (bind (addr (ref x))))]
EOF

  cat > conf-test2.ksi <<EOF
!version 1
[(func [(public)] (void) f [(var (int 32) x)] (bind (raddr (ref x))))]
EOF

  for f in /usr/local/bin/gcc /usr/bin/gcc gcc xgcc; do
    pre="rm -f conf-test.s; $f -S"
    post="-o conf-test.s && test -f conf-test.s"
    if check_cmd "if $f supports Ksi version 0" \
    		 "$pre conf-test0.ksi $post" ||
       check_cmd "if $f supports Ksi version 1" \
       		 "$pre conf-test1.ksi $post" ; then
      if check_cmd "if $f is recent enough" \
       		   "$pre conf-test2.ksi $post" ; then
        KSIC=$f
	break
      fi
    fi
  done

  rm -f conf-test[012].ksi conf-test.s
  
  if [ ".$KSIC" = "." ] ; then
    error "can't find suitable Ksi driver"
    die
  fi
fi

CC=$KSIC
echo "using KSIC = $KSIC, CC = $CC"

if check_lib "GC_malloc" "-lgc" ; then
  GC_LIB="-lgc"
elif check_lib "GC_malloc" "-lgc -ldl" ; then
  GC_LIB="-lgc -ldl"
else
  GC_LIB=
  DEFS="$DEFS -DGONT_USE_MALLOC"
  warn "Boehm GC is not to be found."
  warn "Using malloc-and-never-free(tm) memory management :)"
fi

if test -n "$GC_LIB" ; then
  DEFS="$DEFS -DGONT_USE_GC"
  # ok, we have GC, but check if we have GC_malloc_many
  if check_lib "GC_malloc_many" "$GC_LIB" ; then
    DEFS="$DEFS -DGONT_USE_GC_MALLOC_MANY"
  else
    warn "Your Boehm GC doesn't seem to support GC_malloc_many()."
    warn "You might try to recompile it with threading support."
  fi
fi

check_cmd "pkg-config" "pkg-config --version" || die
check_cmd "libxml2" "pkg-config --exists libxml-2.0" || die

echo -n "generating make.config and compiler/config.g... "
cmd=

for f in CC KSIC GC_LIB DEFS PREFIX VERSION {LIB,MAN,BIN,INCLUDE}DIR ; do
  cmd="$cmd; s%@$f@%`eval "echo \\\$$f"`%"
done

sed -e "$cmd" aux/make.config.in > aux/make.config
sed -e "$cmd" compiler/config.g.in > compiler/config.g

echo "done"
