#!/bin/sh

##################################
#
#  Configuration script for Coq
# 
##################################

VERSION=8.0pl2
DATE="Jan 2005"

# a local which command for sh
which () {
IFS=":" # set words separator in PATH to be ':' (it allows spaces in dirnames)
for i in $PATH; do
  if test -z "$i"; then i=.; fi 
  if [ -f "$i/$1" ] ; then
	IFS=" "
        echo "$i/$1"
	break
  fi
done
}

bytecamlc=ocamlc
nativecamlc=ocamlopt
camlp4o=camlp4o
coq_debug_flag=
coq_profile_flag=
best_compiler=opt

local=false
bindir_spec=no
libdir_spec=no
mandir_spec=no
emacslib_spec=no
emacs_spec=no
coqdocdir_spec=no
reals_opt=no
reals=all
arch_spec=no
coqide_spec=no

COQTOP=`pwd`


# Parse command-line arguments

while : ; do
  case "$1" in
    "") break;;
    -prefix|--prefix) bindir_spec=yes
                      bindir=$2/bin
                      libdir_spec=yes
		      libdir=$2/lib/coq
                      mandir_spec=yes
		      mandir=$2/man
		      coqdocdir_spec=yes
		      coqdocdir=$2/share/texmf/tex/latex/misc
		      shift;;
    -local|--local) local=true
                    bindir_spec=yes
                    bindir=$COQTOP/bin
                    libdir_spec=yes
		    libdir=$COQTOP
                    mandir_spec=yes
		    mandir=$COQTOP/man
                    emacslib_spec=yes
		    emacslib=$COQTOP/tools/emacs
		    coqdocdir_spec=yes
		    coqdocdir=$COQTOP/tools/coqdoc
		    reals_opt=yes
		    reals=all;;
    -src|--src) COQTOP=$2
	        shift;;
    -bindir|--bindir) bindir_spec=yes
                      bindir=$2
		      shift;;
    -libdir|--libdir) libdir_spec=yes
                      libdir=$2
		      shift;;
    -mandir|--mandir) mandir_spec=yes
                      mandir=$2
		      shift;;
    -emacslib|--emacslib) emacslib_spec=yes
                          emacslib=$2
			  shift;;
    -emacs |--emacs) emacs_spec=yes
		     emacs=$2
		     shift;;
    -coqdocdir|--coqdocdir) coqdocdir_spec=yes
	              coqdocdir=$2
		      shift;;
    -arch|--arch) arch_spec=yes
                  arch=$2
		  shift;;
    -opt|--opt) bytecamlc=ocamlc.opt
                camlp4o=camlp4o  # can't add .opt since dyn load'll be required
                nativecamlc=ocamlopt.opt;;
    -reals|--reals) reals_opt=yes
		    reals=$2
		    shift;;
    -coqide|--coqide) coqide_spec=yes
		      COQIDE=$2
		      shift;;
    -byte-only|-byteonly|--byteonly|--byte-only) best_compiler=byte;;
    -debug|--debug) coq_debug_flag=-g;;
    -profile|--profile) coq_profile_flag=-p;;
     *) echo "Unknown option \"$1\"." 1>&2; exit 2;;
  esac
  shift
done


# compile date
DATEPGM=`which date`
case $DATEPGM in
    "") echo "I can't find the program \"date\" in your path."
        echo "Please give me the current date"
	read COMPILEDATE;;
    *)  COMPILEDATE=`date +"%h %d %Y %H:%M:%S"`;;
esac

# Architecture

case $arch_spec in
    no) if test -x /bin/arch ; then
	    ARCH=`/bin/arch`
	elif test -x /usr/bin/arch ; then
	    ARCH=`/usr/bin/arch`
	elif test -x /usr/ucb/arch ; then
	    ARCH=`/usr/ucb/arch`
	elif test -x /bin/uname && (/bin/uname -s | grep -q -i CYGWIN) ; then
	    ARCH=win32
	    # cygwin returns a name of the form /cygdrive/c/... 
	    # that coqc does not understand; need to transform it
	    COQTOP=`echo $COQTOP | sed -e "s#.*cygdrive.\(.\)#\1:#"`
	elif test -x /usr/bin/uname ; then
	    ARCH=`/usr/bin/uname -s`
	else
	    echo "I can not automatically find the name of your architecture"
	    echo -n\
              "Give me a name, please [win32 for Win95, Win98 or WinNT]: "
	    read ARCH
	fi;;
    yes) ARCH=$arch
esac

# bindir, libdir, mandir, etc.

case $ARCH in
  win32)
	 bindir_def=C:\\coq\\bin
	 libdir_def=C:\\coq\\lib
	 mandir_def=C:\\coq\\man
	 emacslib_def=C:\\coq\\emacs;;
  *)
	 bindir_def=/usr/local/bin
	 libdir_def=/usr/local/lib/coq
	 mandir_def=/usr/local/man
	 emacslib_def=/usr/share/emacs/site-lisp
         coqdocdir_def=/usr/share/texmf/tex/latex/misc;;
esac

emacs_def=emacs

case $bindir_spec in
    no) echo "Where should I install the Coq binaries [$bindir_def] ?"
        read BINDIR
	
	case $BINDIR in
	    "") BINDIR=$bindir_def;;
	    *) true;;
	esac;;
    yes) BINDIR=$bindir;;
esac

case $libdir_spec in
    no) echo "Where should I install the Coq library [$libdir_def] ?"
        read LIBDIR
	
	case $LIBDIR in
	    "") LIBDIR=$libdir_def;;
	    *) true;;
	esac;;
    yes) LIBDIR=$libdir;;
esac

case $mandir_spec in
    no) echo "Where should I install the Coq man pages [$mandir_def] ?"
        read MANDIR
	
	case $MANDIR in
	    "") MANDIR=$mandir_def;;
	    *) true;;
	esac;;
    yes) MANDIR=$mandir;;
esac

case $emacslib_spec in
    no) echo "Where should I install the Coq Emacs mode [$emacslib_def] ?"
        read EMACSLIB
	
	case $EMACSLIB in
	    "") EMACSLIB=$emacslib_def;;
	    *) true;;
	esac;;
    yes) EMACSLIB=$emacslib;;
esac

case $coqdocdir_spec in
    no) echo "Where should I install Coqdoc TeX/LaTeX files [$coqdocdir_def] ?"
        read COQDOCDIR
	
	case $COQDOCDIR in
	    "") COQDOCDIR=$coqdocdir_def;;
	    *) true;;
	esac;;
    yes) COQDOCDIR=$coqdocdir;;
esac

case $reals_opt in
    no) echo "Should I compile the complete theory of real analysis [Y/N, default is Y] ?"
	read reals_ans

	case $reals_ans in
	    "N"|"n"|"No"|"NO"|"no")
		    reals=basic;;
		*) reals=all;;
	esac;;
    yes) true;;
esac

# case $emacs_spec in
#     no) echo "Which Emacs command should I use to compile coq.el [$emacs_def] ?"
#         read EMACS
	
# 	case $EMACS in
# 	    "") EMACS=$emacs_def;;
# 	    *) true;;
# 	esac;;
#     yes) EMACS=$emacs;;
# esac

# OS dependent libraries

case $ARCH in
  sun4*) OS=`uname -r`
	case $OS in
	   5*) OS="Sun Solaris $OS"
	       OSDEPLIBS="-cclib -lunix -cclib -lnsl -cclib -lsocket";;
	   *) OS="Sun OS $OS"
	      OSDEPLIBS="-cclib -lunix"
        esac;;
  alpha) OSDEPLIBS="-cclib -lunix";;
  win32) OS="Win32" 
	 OSDEPLIBS="-cclib -lunix";;
  *) OSDEPLIBS="-cclib -lunix"
esac

# executable extension

case $ARCH in
    win32) EXE=".exe";;
    *) EXE=""
esac

# Objective Caml programs

CAMLC=`which $bytecamlc`
case "$CAMLC" in
	"") echo "$bytecamlc is not present in your path !"
	echo "Give me manually the path to the $bytecamlc executable [/usr/local/bin by default]: "
	read CAMLC
	
	case "$CAMLC" in
		"") CAMLC=/usr/local/bin/$bytecamlc;;
		*/ocamlc|*/ocamlc.opt) true;;
		*/) CAMLC="${CAMLC}"$bytecamlc;;
		*) CAMLC="${CAMLC}"/$bytecamlc;;
	esac
	bytecamlc="$CAMLC"
	nativecamlc=`dirname "$CAMLC"`/$nativecamlc;;
esac

if test ! -f "$CAMLC" ; then
	echo "I can not find the executable '$CAMLC'! (Have you installed it?)"
	echo "Configuration script failed!"
	exit 1
fi

CAMLBIN=`dirname "$CAMLC"`
CAMLVERSION=`"$CAMLC" -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' `

case $CAMLVERSION in
  1.*|2.*|3.00|3.01|3.02|3.03|3.03alpha|3.04|3.05beta|3.05)
	echo "Your version of Objective-Caml is $CAMLVERSION."
	echo "You need Objective-Caml 3.06 or later !"
	echo "Configuration script failed!"
	exit 1;;
  ?*)	echo "You have Objective-Caml $CAMLVERSION. Good!";;
  *) echo "I found the Objective-Caml compiler but cannot find its version number!"
     echo "Is it installed properly ?"
     echo "Configuration script failed!"
     exit 1;;
esac

CAMLTAG=OCAML`echo $CAMLVERSION | sed -e "s/\([1-9]\)\.\([0-9]*\).*/\1\2/g"`

# do we have a native compiler: test of ocamlopt and its version

if [ "$best_compiler" = "opt" ] ; then
  CAMLOPT=`which $nativecamlc`
  case "$CAMLOPT" in
    "") best_compiler=byte
        echo "You have only bytecode compilation.";;
    *) CAMLOPTVERSION=`"$CAMLOPT" -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' `
       if [ "$CAMLOPTVERSION" != "$CAMLVERSION" ] ; then \
         echo "native and bytecode compilers do not have the same version!"; fi
       echo "You have native-code compilation. Good!"
  esac
fi

# For coqmktop

#CAMLLIB=`"$CAMLC" -v | sed -n -e 's|.*directory:* *\(.*\)$|\1|p' `
CAMLLIB=`"$CAMLC" -where`

# Camlp4 (greatly simplified since merged with ocaml)

CAMLP4BIN=${CAMLBIN}

#case $OS in
#  Win32)
    CAMLP4LIB=+camlp4
# ;;
#  *)
#    CAMLP4LIB=${CAMLLIB}/camlp4
#esac

# lablgtk2 and CoqIDE

if [ "$coqide_spec" = "no" ] ; then
if test -x "${CAMLLIB}/lablgtk2" ; then
    if grep -q -w convert_with_fallback "${CAMLLIB}/lablgtk2/glib.mli" ; then
	if test -f "${CAMLLIB}/threads/threads.cmxa" ; then
            echo "LablGtk2 found, native threads: native CoqIde will be available"
	    COQIDE=opt;
        else
            echo "LablGtk2 found, no native threads: bytecode CoqIde will be available"
	    COQIDE=byte
	fi;
    else
        echo "LablGtk2 found but too old: CoqIde will not be available"
        COQIDE=no;
    fi
else
    echo "LablGtk2 not found: CoqIde will not be available"
    COQIDE=no
fi
fi

# Tell on windows if ocaml understands cygwin or windows path formats

#"$CAMLC" -o config/giveostype config/giveostype.ml
#CAMLOSTYPE=`config/giveostype`
#rm config/giveostype

case $ARCH in
    win32)
	# true -> strip : it exists under cygwin !
	STRIPCOMMAND="strip";; 
    *)
    if [ "$coq_profile_flag" = "-p" ] ; then
	STRIPCOMMAND="true"
    else
	STRIPCOMMAND="strip"
    fi
esac

# mktexlsr
#MKTEXLSR=`which mktexlsr`
#case $MKTEXLSR in
#    "") MKTEXLSR=true;;
#esac

# Summary of the configuration

echo ""
echo "  Coq top directory                 : $COQTOP"
echo "  Architecture                      : $ARCH"
if test ! -z "$OS" ; then
  echo "  Operating system                  : $OS"
fi
echo "  OS dependent libraries            : $OSDEPLIBS"
echo "  Objective-Caml/Camlp4 version     : $CAMLVERSION"
echo "  Objective-Caml/Camlp4 binaries in : $CAMLBIN"
echo "  Objective-Caml library in         : $CAMLLIB"
echo "  Camlp4 library in                 : $CAMLP4LIB"
if test "$reals" = "all"; then
echo "  Reals theory                      : All"
else
echo "  Reals theory                      : Basic"
fi
echo "  CoqIde                            : $COQIDE"
echo ""

echo "  Paths for true installation:"
echo "    binaries   will be copied in $BINDIR"
echo "    library    will be copied in $LIBDIR"
echo "    man pages  will be copied in $MANDIR"
echo "    emacs mode will be copied in $EMACSLIB"
echo ""

#####################################################
# Building the $COQTOP/config/coq_config.ml file
#####################################################

# damned backslashes under M$Windows
case $ARCH in
    win32)
	CAMLLIB=`echo $CAMLLIB |sed -e 's|\\\|\\\\\\\|g'`
	BINDIR=`echo $BINDIR |sed -e 's|\\\|\\\\\\\|g'`
	LIBDIR=`echo $LIBDIR |sed -e 's|\\\|\\\\\\\|g'`
  	MANDIR=`echo $MANDIR |sed -e 's|\\\|\\\\\\\|g'`
   	EMACSLIB=`echo $EMACSLIB |sed -e 's|\\\|\\\\\\\|g'`
	;;
esac

mlconfig_file=$COQTOP/config/coq_config.ml
rm -f $mlconfig_file
cat << END_OF_COQ_CONFIG > $mlconfig_file
(* DO NOT EDIT THIS FILE: automatically generated by ../configure *)

let local = $local
let bindir = "$BINDIR" 
let coqlib = "$LIBDIR"
let coqtop = "$COQTOP"
let camllib = "$CAMLLIB"
let camlp4lib = "$CAMLP4LIB"
let best = "$best_compiler"
let arch = "$ARCH"
let osdeplibs = "$OSDEPLIBS"
let version = "$VERSION"
let versionsi = "$VERSIONSI"
let date = "$DATE"
let compile_date = "$COMPILEDATE"
let exec_extension = "$EXE"

END_OF_COQ_CONFIG

# to be sure printf is found on windows when spaces occur in PATH variable
PRINTF=`which printf`

# Subdirectories of theories/ added in coq_config.ml
subdirs () {
    (cd $1; find * -type d ! -name CVS -exec $PRINTF "\"%s\";\n" {} \; | grep -v extraction/test | grep -v correctness >> $mlconfig_file)
}

echo "let theories_dirs = [" >> $mlconfig_file
subdirs theories
echo "]" >> $mlconfig_file

echo "let contrib_dirs = [" >> $mlconfig_file
subdirs contrib
echo "]" >> $mlconfig_file

chmod a-w $mlconfig_file


###############################################
# Building the $COQTOP/config/Makefile file
###############################################

rm -f $COQTOP/config/Makefile

# damned backslashes under M$Windows (bis)
case $ARCH in
    win32)
	BINDIR=`echo $BINDIR |sed -e 's|\\\|\\\\\\\|g'`
	LIBDIR=`echo $LIBDIR |sed -e 's|\\\|\\\\\\\|g'`
  	MANDIR=`echo $MANDIR |sed -e 's|\\\|\\\\\\\|g'`
   	EMACSLIB=`echo $EMACSLIB |sed -e 's|\\\|\\\\\\\|g'`
	;;
esac

sed -e "s|LOCALINSTALLATION|$local|" \
    -e "s|COQTOPDIRECTORY|$COQTOP|" \
    -e "s|COQVERSION|$VERSION|" \
    -e "s|BINDIRDIRECTORY|$BINDIR|" \
    -e "s|COQLIBDIRECTORY|$LIBDIR|" \
    -e "s|MANDIRDIRECTORY|$MANDIR|" \
    -e "s|EMACSLIBDIRECTORY|$EMACSLIB|" \
    -e "s|EMACSCOMMAND|$EMACS|" \
    -e "s|COQDOCDIRECTORY|$COQDOCDIR|" \
    -e "s|MKTEXLSRCOMMAND|$MKTEXLSR|" \
    -e "s|ARCHITECTURE|$ARCH|" \
    -e "s|OSDEPENDENTLIBS|$OSDEPLIBS|" \
    -e "s|OSDEPENDENTP4OPTFLAGS|$OSDEPP4OPTFLAGS|" \
    -e "s|CAMLLIBDIRECTORY|$CAMLLIB|" \
    -e "s|CAMLTAG|$CAMLTAG|" \
    -e "s|CAMLP4BINDIRECTORY|$CAMLP4BIN|" \
    -e "s|CAMLP4LIBDIRECTORY|$CAMLP4LIB|" \
    -e "s|CAMLP4TOOL|$camlp4o|" \
    -e "s|COQDEBUGFLAG|$coq_debug_flag|" \
    -e "s|COQPROFILEFLAG|$coq_profile_flag|" \
    -e "s|BESTCOMPILER|$best_compiler|" \
    -e "s|EXECUTEEXTENSION|$EXE|" \
    -e "s|BYTECAMLC|$bytecamlc|" \
    -e "s|NATIVECAMLC|$nativecamlc|" \
    -e "s|STRIPCOMMAND|$STRIPCOMMAND|" \
    -e "s|REALSOPT|$reals|" \
    -e "s|COQIDEOPT|$COQIDE|" \
      $COQTOP/config/Makefile.template > $COQTOP/config/Makefile

chmod a-w $COQTOP/config/Makefile

##################################################
# Building the $COQTOP/dev/ocamldebug-v7 file
####################################################

if test "$coq_debug_flag" = "-g" ; then
  rm -f $COQTOP/dev/ocamldebug-v7
  if [ "$CAMLP4LIB" = "+camlp4" ] ; then
    CAMLP4LIBFORCAMLDEBUG=$CAMLLIB/camlp4
  else
    CAMLP4LIBFORCAMLDEBUG=$CAMLP4LIB
  fi
  sed -e "s|COQTOPDIRECTORY|$COQTOP|" \
      -e "s|COQLIBDIRECTORY|$LIBDIR|" \
      -e "s|CAMLBINDIRECTORY|$CAMLBIN|" \
      -e "s|CAMLP4LIBDIRECTORY|$CAMLP4LIBFORCAMLDEBUG|" \
      $COQTOP/dev/ocamldebug-v7.template > $COQTOP/dev/ocamldebug-v7
  chmod a-w,a+x $COQTOP/dev/ocamldebug-v7
fi

echo "If anything in the above is wrong, please restart './configure'"
echo
echo "*Warning* To compile the system for a new architecture"
echo "          don't forget to do a 'make archclean' before './configure'."

# $Id: configure,v 1.74.2.7 2005/01/21 17:27:32 herbelin Exp $
