#!/bin/sh

script_dir=`cd \`dirname $0\`; pwd`

PATH_SEPARATOR=:
CONFDIR=share/configs
MAKEINC=$CONFDIR/Makefile.inc

where_command() {
  if expr "x$1" : '.*/' > /dev/null; then
    [ -x "$1" ] && { echo "$1"; return 0; }
  else
    save_IFS="$IFS"
    IFS=$PATH_SEPARATOR
    for i in $PATH; do
      IFS="$save_IFS"
      [ -x "$i/$1" ] && { echo "$i/$1"; return 0; }
    done
  fi
  return 1
}

search_csc() {
  [ "x$HOST" != xCYGWIN ] && return 0
  WINDIR=`cygpath -au "$WINDIR"`
  DIR_DOTNET=$WINDIR/Microsoft.NET/Framework
  for i in $DIR_DOTNET/*; do
    [ -x "$i/csc.exe" ] && echo "$i/csc.exe"
  done | sort | tail -1
}
      
TOOLPREFIX=

while [ $# -gt 0 ]
do
  case $1 in
  --*=*)
    cfg_option=`expr "x$1" : 'x\([^=]*\)='`
    cfg_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
    ;;
  --*)
    cfg_option=$1
    cfg_optarg=$2
    shift
    ;;
  *)
    echo "Unrecognized option $1"
    exit
    ;;
  esac

  shift

  case $cfg_option in
  --help)
    echo "Usage: $0 [options ...]"
    exit
    ;;
  --mingw-prefix)
    MINGWPREFIX=$cfg_optarg
    ;;
  --bim2bin-cc)
    BIM2BIN_CC=$cfg_optarg
    ;;
  *)
    echo "Unrecognized option $1"
    exit
    ;;
  esac
done

echo -n 'Host type... '
OSTYPE=`uname | cut -d _ -f 1 | tr [:upper:] [:lower:]`
if [ "x$HOST" = x ]; then
  if [ "x$MINGWPREFIX" != x ]; then
    HOST=MINGW
    WINE=wine
  else
    case $OSTYPE in
    cygwin)
      HOST=CYGWIN
      ;;
    darwin)
      HOST=MINGW
      ;;
    *)
      echo 'Unknown OS type.'
      exit 1
      ;;
    esac
  fi
fi
case $HOST in
MINGW)
  echo 'Mingw32'
  TOOLPREFIX=$MINGWPREFIX
  ;;
CYGWIN)
  echo 'Cygwin'
  CSCFLAGS=/o
  EXEEXT=.exe
  ;;
esac

case "$OSTYPE" in
  *linux*)
    BUILD_DEF=-DBUILD_ON_LINUX
esac

export MINGWPREFIX
(cd tool/fat_write && ./configure MONADIR=$script_dir --prefix=$script_dir/local) || exit 1
(cd tool/t5lzma && ./configure) || exit 1

echo "HOSTDEF=-DHOST_$HOST" > $MAKEINC
echo "USER_START_FUNCTION=_user_start" >> $MAKEINC
echo "SYMPREFIX=_" >> $MAKEINC
echo "export MONADIR=$script_dir" >> $MAKEINC
echo "PREFIX=$script_dir/local" >> $MAKEINC
echo '
SHAREDIR=$(MONADIR)/share
PATH:=$(PATH):$(PREFIX)/bin
export PATH
CFLAGS=-nostdinc -UWIN32 -U_WIN32 -Wall -fno-builtin -O2 -DMONA -DDEBUG_BUILD $(HOSTDEF) -DMONASH_DONT_FREE_MEMORY $(ADDCFLAGS)
CXXFLAGS=$(CFLAGS) -fno-threadsafe-statics -fno-exceptions -fno-rtti -fno-strict-aliasing
NFLAGS=-I $(MONADIR)/include/ -I$(MONADIR)/include/monalibc -f win32 -DMONA \' >> $MAKEINC
echo " $BUILD_DEF" >> $MAKEINC

[ x$CSCFLAGS != x ] && echo "CSCFLAGS=$CSCFLAGS" >> $MAKEINC
[ x$EXEEXT != x ] && echo "EXEEXT=$EXEEXT" >> $MAKEINC
[ x$MINGWPREFIX != x ] && echo "MINGWPREFIX=$MINGWPREFIX" >> $MAKEINC

echo -n 'Checking gcc... '
[ "x$CC" = x ] && CC=${TOOLPREFIX}gcc
CC=`which "$CC"`
[ "x$CC" = x ] && { echo 'gcc not found'; exit 1; }
echo "ok"
echo "CC=$CC" >> $MAKEINC

echo -n 'Checking g++... '
[ "x$CXX" = x ] && CXX=${TOOLPREFIX}g++
CXX=`which "$CXX"`
[ "x$CXX" = x ] && { echo 'g++ not found'; exit 1; }
echo "ok"
echo "CXX=$CXX" >> $MAKEINC

echo -n 'Checking ld... '
[ "x$LD" = x ] && LD=${TOOLPREFIX}ld
LD=`which "$LD"`
[ "x$LD" = x ] && { echo 'ld not found'; exit 1; }
echo "ok"
echo "LD=$LD" >> $MAKEINC

echo -n 'Checking ar... '
[ "x$AR" = x ] && AR=${TOOLPREFIX}ar
AR=`which "$AR"`
[ "x$AR" = x ] && { echo 'ar not found'; exit 1; }
echo "ok"
echo "AR=$AR cvru" >> $MAKEINC

echo -n 'Checking ranlib... '
[ "x$RANLIB" = x ] && RANLIB=${TOOLPREFIX}ranlib
RANLIB=`which "$RANLIB"`
[ "x$RANLIB" = x ] && { echo 'ranlib not found'; exit 1; }
echo "ok"
echo "RANLIB=$RANLIB" >> $MAKEINC

echo -n 'Checking strip... '
[ "x$STRIP" = x ] && STRIP=${TOOLPREFIX}strip
STRIP=`which "$STRIP"`
[ "x$STRIP" = x ] && { echo 'strip not found'; exit 1; }
echo "ok"
echo "STRIP=$STRIP" >> $MAKEINC

echo -n 'Checking install... '
[ "x$INSTALL" = x ] && INSTALL=install
INSTALL=`which "$INSTALL"`
[ "x$INSTALL" = x ] && { echo 'ld not found'; exit 1; }
echo "ok"
echo "INSTALL=$INSTALL" >> $MAKEINC

echo -n 'Checking nasm... '
[ "x$NASM" = x ] && NASM=nasm
NASM=`which "$NASM"`
[ "x$NASM" = x ] && { echo 'ld not found'; exit 1; }
echo "ok"
echo "NASM=$NASM" >> $MAKEINC

echo -n 'Checking gosh... '
[ "x$GOSH" = x ] && GOSH=gosh
GOSH=`which "$GOSH"`
if [ "x$GOSH" = x ]
then
  echo 'gosh not found'
else
  echo "ok"
  echo "GOSH=$GOSH" >> $MAKEINC
fi

echo -n 'Checking C# compiler... '
DOTNET_TYPE=dotnet
[ "x$CSC" = x ] && { CSC=`search_csc`; }
[ "x$CSC" = x ] && { CSC=mcs; DOTNET_TYPE=mono; CSC=`which "$CSC"`; }
[ "x$CSC" = x ] && { DOTNET_TYPE=nocsc; }
case $DOTNET_TYPE in
  dotnet)
    echo "ok"
    ;;
  mono)
    MONO=`which mono`
    if [ "x$MONO" = x ] 
    then
      echo 'Mono runtime not found...skip'
      CSC=""
    else
      echo "ok"
    fi
    ;;
  nocsc)
    echo ' not found'
    ;;
esac
(cd core/mosh && make -f Makefile.mona gen)
echo "CSC=$CSC" >> $MAKEINC
echo "NETRT=$MONO" >> $MAKEINC
echo "WINE=$WINE" >> $MAKEINC

echo -n 'Checking C Compiler for bim2bin... '
#if [ x$BIM2BIN_CC == x ]; then
if [ x$BIM2BIN_CC = x ]; then
  echo not specified
#  BIM2BIN_CC=$CC
#  echo "BIM2BIN_CC=$BIM2BIN_CC" >> $MAKEINC
else
  echo $BIM2BIN_CC
  echo "BIM2BIN_CC=$BIM2BIN_CC" >> $MAKEINC
fi
