#!/bin/bash

configure_options="$*"
platform=unix
arch='macosx64'
native='yes'
dotprogram='dot'
dotviewer='graphviz'
vcdviewer='gtkwave'
txtviewer='nano'
install_prefix=''
install_bindir=''
install_libdir=''
install_docdir=''
#install_mandir=''
install_emacsdir=''
gui='yes'
sysc_lib='yes'
vhdl_lib='yes'
doc='yes'
sysc_dir='/usr/local/systemc-2.3.0'
local=''

ocamlversion_min=4.06

# Parse command-line arguments

while : ; do
  case "$1" in
    "") break;;
    -platform|--platform)
        platform=$2; shift;;
    -arch|--arch)
        arch=$2; shift;;
    -prefix|--prefix)
        install_prefix=$2; shift;;
    -bindir|--bindir)
        install_binbdir=$2; shift;;
    -libdir|--libdir)
        install_libdir=$2; shift;;
    -docdir|--docdir)
        install_docdir=$2; shift;;
#    -mandir|--mandir)
#        install_mandir=$2; shift;;
    -emacsdir|--emacsdir)
        install_emacsdir=$2; shift;;
    -byte-only|--byte-only)
        native='no';;
    -no-libs|--no-libs)
        sysc_lib='no'; vhdl_lib='no';;
    -no-gui|--no-gui)
        gui='no';;
    -no-doc|--no-doc)
        doc='no';;
    -dot|--dot)
        dotprogram=$2; shift;;
    -dotviewer|--dotviewer)
        dotviewer=$2; shift;;
    -vcdviewer|--vcdviewer)
        vcdviewer=$2; shift;;
    -txtviewer|--txtviewer)
        txtviewer=$2; shift;;
    -systemcdir|--systemcdir)
        sysc_dir=$2; shift;;
    -local|--local)
        local='yes';;
    -help|--help)
        cat <<EOF
Usage: configure [options]
Options: [defaults in brackets after descriptions]
  --platform NAME         target platform (unix, macos or win32) [default: unix]
  --arch NAME             target architecture (for SystemC) [default: $arch]
  --prefix DIR            install executables, libs and docs in DIR [default: $prefix]
  --bindir DIR            install  executables in DIR [default: $install_bindir]
  --libdir DIR            install libraries in in DIR [default: $install_libdir]
  --docdir DIR            install documentation in DIR [default: $install_docdir]
  --emacsdir DIR          install emacs mode in DIR [default:$install_emacsdir]
  --byte-only             do not build native code executable
  --no-gui                do not build the Qt-based GUI
  --no-libs               do not build the SystemC and GHDL support libraries
  --no-doc                do not build the documentation from sources
  --dot NAME              command for runing dot program [default: $dotprogram]
  --dotviewer NAME        command for displaying .dot files [default: $dotviewer]
  --vcdviewer NAME        command for displaying .vcd files [default: $vcdviewer]
  --txtviewer NAME        command for displaying text files [default: $txtviewer]
  --systemc-dir DIR       location of the SystemC installation [default: $sysc_dir]
  --help                  print this message
EOF
	exit 0;;
    *) echo "Unknown option \"$1\"." 1>&2; exit 2;;
  esac
  shift
done

if [ -n "$install_prefix" ]; then
  install_bindir="$install_prefix/bin"
  install_libdir="$install_prefix/lib"
  install_docdir="$install_prefix/doc"
  install_emacsdir="$install_prefix/share/emacs/site-lisp"
fi


case "$platform" in
  win32)
      if [ -z "$install_bindir" ]; then install_bindir='./build/bin'; fi;
      if [ -z "$install_libdir" ]; then install_libdir='./build/lib'; fi;
      if [ -z "$install_docdir" ]; then install_docdir='./build/doc'; fi;
      if [ -z "$install_emacsdir" ]; then install_emacsdir='./build/share'; fi;;
  *) 
      if [ -z "$install_bindir" ]; then install_bindir=`opam config var bin`; fi;
      if [ -z "$install_libdir" ]; then install_libdir=`opam config var lib`; fi;
      if [ -z "$install_emacsdir" ]; then install_emacsdir=`opam config var share`/emacs/site-lisp; fi;
      if [ -z "$install_docdir" ]; then install_docdir=`opam config var doc`; fi;;
esac

# Generate the config file

if [ -z "$local" ]; then

rootdir=`dirname $0`

cd $rootdir
rm -f config
touch config

# Write options

version=`cat VERSION`
echo "# generated by ./configure $configure_options" >> config
echo "" >> config
echo "PLATFORM=$platform" >> config
echo "$version" >> config
echo "BUILD_NATIVE=$native" >> config
echo "BUILD_GUI=$gui" >> config
echo "BUILD_SYSC_LIB=$sysc_lib" >> config
echo "BUILD_VHDL_LIB=$vhdl_lib" >> config
echo "BUILD_DOC=$doc" >> config
echo "" >> config
echo "# INSTALL PATHS" >> config
echo "INSTALL_BINDIR=$install_bindir" >> config
echo "INSTALL_LIBDIR=$install_libdir" >> config
echo "INSTALL_DOCDIR=$install_docdir" >> config
#echo "INSTALL_MANDIR=$install_mandir" >> config
echo "INSTALL_EMACSDIR=$install_emacsdir" >> config

# Finish generated files

touch ./config-stamp

echo
echo "** Configuration summary **"
echo
echo "Directory where the distribution will be installed:"
echo "        binaries................   $install_bindir"
echo "        library.................   $install_libdir"
echo "        documentation............. $install_docdir"
#echo "        man pages................. $install_mandir"
echo "        emacs mode................ $install_emacsdir"
echo

echo "** Wrote file ./config"

fi

rm -f platform
touch platform

echo "# Platform-specific definitions to be used in automatically generated Makefiles" >> platform
echo "# Generated by ./configure $configure_options" >> platform
echo "# To be adjusted if necessary" >> platform
echo "" >> platform

pwd=`pwd`
if [ -n "$local" ]; then
echo "RFSM=$pwd" >> platform
echo "LIBDIR=$pwd/lib" >> platform
echo "RFSMC=$pwd/src/compiler/rfsmc" >> platform
else
echo "RFSM=$install_prefix" >> platform
echo "LIBDIR=$install_prefix/lib" >> platform
echo "RFSMC=$install_prefix/bin/rfsmc" >> platform
fi
echo "" >> platform
echo "DOT=dot" >> platform
echo "DOTVIEWER=graphviz" >> platform
echo "VCDVIEWER=gtkwave" >> platform
echo "TXTVIEWER=nano" >> platform
echo "" >> platform
echo "CXX=g++" >> platform
echo "LD=g++" >> platform
echo "CXXFLAGS=-Wall -Wno-deprecated -I." >> platform
echo "LDFLAGS=" >> platform
echo "" >> platform
echo "SYSTEMC=$sysc_dir" >> platform
echo "TARGET_ARCH=$arch" >> platform
echo "" >> platform
echo "GHDL=ghdl" >> platform
echo "GHDLOPTS=-fno-color-diagnostics" >> platform

mv platform ./lib/etc

echo "** Wrote file ./lib/etc/platform"
echo "** Configuration completed successfully **"
