####################################################################
#                                                                  #
#  The Why3 Verification Platform   /   The Why3 Development Team  #
#  Copyright 2010-2022 --  Inria - CNRS - Paris-Saclay University  #
#                                                                  #
#  This software is distributed under the terms of the GNU Lesser  #
#  General Public License version 2.1, with the special exception  #
#  on linking described in file LICENSE.                           #
#                                                                  #
####################################################################

AC_INIT([Why3], [1.5.1])

# verbosemake

AC_ARG_ENABLE(verbose-make,
    AS_HELP_STRING([--enable-verbose-make], [verbose makefile recipes]),,
    enable_verbose_make=no)

# LOCAL_CONF

AC_ARG_ENABLE(local,
    AS_HELP_STRING([--enable-local], [use Why3 in the build directory (no installation)]),,
    enable_local=no)

# RELOCATABLE INSTALLATION

AC_ARG_ENABLE(relocation,
    AS_HELP_STRING([--enable-relocation], [allow for later relocation of Why3 installation]),,
    enable_relocation=no)

# NATIVE

AC_ARG_ENABLE(native-code,
    AS_HELP_STRING([--disable-native-code], [use only the byte-code compiler]),,
    enable_native_code=yes)

# WHY3LIB

AC_ARG_ENABLE(why3-lib,
    AS_HELP_STRING([--disable-why3-lib], [use an already installed Why3]),,
    enable_why3_lib=yes)

# Zarith

AC_ARG_ENABLE(zarith,
    AS_HELP_STRING([--disable-zarith], [use Nums instead of Zarith for computations]),,
    enable_zarith=yes)

# ocamlfind

AC_ARG_ENABLE(ocamlfind,
    AS_HELP_STRING([--disable-ocamlfind], [do not use Ocamlfind]),,
    enable_ocamlfind=yes)

# camlzip

AC_ARG_ENABLE(zip,
    AS_HELP_STRING([--disable-zip], [do not use LZ compression to store session files]),,
    enable_zip=yes)

# infer

AC_ARG_ENABLE(infer,
    AS_HELP_STRING([--enable-infer], [use apron and fixpoint to infer loop invariants]),,
    enable_infer=no)
# js_of_ocaml

AC_ARG_ENABLE(js_of_ocaml,
    AS_HELP_STRING([--disable-js-of-ocaml], [do not use js-of-ocaml]),,
    enable_js_of_ocaml=yes)

# re

AC_ARG_ENABLE(re,
    AS_HELP_STRING([--disable-re], [use Str instead of Re for regular expressions]),,
    enable_re=yes)

# pp_sexp

AC_ARG_ENABLE(pp-sexp,
    AS_HELP_STRING([--disable-pp-sexp], [disable S-expression output for why3pp]),,
    enable_pp_sexp=yes)

# IDE

AC_ARG_ENABLE(ide,
    AS_HELP_STRING([--disable-ide], [do not build Why3 IDE]),,
    enable_ide=yes)

AC_ARG_ENABLE(web_ide,
    AS_HELP_STRING([--disable-web-ide], [do not build Why3 Web IDE]),,
    enable_web_ide=yes)

# Coq libraries

AC_ARG_ENABLE(coq-libs,
    AS_HELP_STRING([--disable-coq-libs], [do not build Coq realizations]),,
    enable_coq_libs=yes)

# PVS libraries

AC_ARG_ENABLE(pvs-libs,
    AS_HELP_STRING([--disable-pvs-libs], [do not build PVS realizations]),,
    enable_pvs_libs=yes)

# Isabelle libraries

AC_ARG_ENABLE(isabelle-libs,
    AS_HELP_STRING([--disable-isabelle-libs], [do not build Isabelle realizations]),,
    enable_isabelle_libs=yes)

# MLMPFR

AC_ARG_ENABLE(mpfr,
    AS_HELP_STRING([--disable-mpfr], [disable support for MPFR]),,
    enable_mpfr=yes)

# hypothesis selection

AC_ARG_ENABLE(hypothesis-selection,
    AS_HELP_STRING([--disable-hypothesis-selection], [do not support hypothesis selection]),,
    enable_hypothesis_selection=yes)

# stackify

AC_ARG_ENABLE(stackify,
    AS_HELP_STRING([--disable-stackify], [disable structure reconstruction algorithm for MLCFG]),,
    enable_stackify=yes)

# documentation

AC_ARG_ENABLE(doc,
    AS_HELP_STRING([--disable-doc], [do not build documentation]),,
    enable_doc=yes)

AC_ARG_ENABLE(html-pdf,
    AS_HELP_STRING([--disable-pdf-doc], [do not build PDF documentation]),,
    enable_pdf_doc=yes)

# Experimental Jessie3 Frama-C plugin, disabled by default

AC_ARG_ENABLE(frama-c,
    AS_HELP_STRING([--enable-frama-c], [enable Frama-C plugin]),,
    [enable_frama_c=no
     reason_frama_c=" (disabled by default)"])

# profiling

AC_ARG_ENABLE(profiling,
    AS_HELP_STRING([--enable-profiling], [enable profiling]),,
    enable_profiling=no)

AC_ARG_ENABLE(statmemprof,
    AS_HELP_STRING([--enable-statmemprof], [enable statistical memory profiling]),,
    [enable_statmemprof=no
     reason_statmemprof=" (disabled by default)"])

# Emacs compilation

AC_ARG_ENABLE(emacs-compilation,
    AS_HELP_STRING([--disable-emacs-compilation], [do not compile why3.elc]),,
    enable_emacs_compilation=yes)

# default editor

AC_ARG_VAR(EDITOR, [default editor])

# either relocation or local, not both
if test "$enable_relocation" = yes ; then
if test "$enable_local" = yes ; then
    AC_MSG_ERROR(cannot use --enable-relocation and --enable-local at the same time.)
fi
fi

# Check for arch/OS

AC_MSG_CHECKING(executable suffix)
if uname -s | grep -q CYGWIN ; then
  EXE=.exe
  STRIP='echo "no strip "'
  AC_MSG_RESULT(.exe <Cygwin>)
else
if uname -s | grep -q MINGW ; then
  EXE=.exe
  STRIP=strip
  AC_MSG_RESULT(.exe <MinGW>)
else
  EXE=
  STRIP=strip
  AC_MSG_RESULT(<none>)
fi
fi

AC_PROG_CC
# Add compatibility for C99
AC_PROG_CC_STDC
AC_PROG_MKDIR_P
AC_PROG_INSTALL

AC_DEFUN([AX_VERSION_GE], [AS_VERSION_COMPARE([$1],[$2],[$4],[$3],[$3])])

# Check for Ocaml compilers

# we first look for ocamlc in the path; if not present, we fail
AC_CHECK_PROG(OCAMLC,ocamlc,ocamlc,no)
if test "$OCAMLC" = no ; then
	AC_MSG_ERROR(Cannot find ocamlc.)
fi

# we extract Ocaml version number
OCAMLVERSION=`$OCAMLC -v | sed -n -e 's|.*version *\(.*\)$|\1|p'`
echo "ocaml version is $OCAMLVERSION"

AX_VERSION_GE([$OCAMLVERSION], 4.05.0, [],
  [AC_MSG_ERROR(You need Objective Caml 4.05.0 or higher.)])

AX_VERSION_GE([$OCAMLVERSION], 4.08.0, [new_dynlink=yes], [new_dynlink=no])
AC_SUBST(new_dynlink)

# Ocaml library path
# old way: OCAMLLIB=`$OCAMLC -v | tail -1 | cut -f 4 -d ' ' | tr -d '\\r'`
OCAMLLIB=`$OCAMLC -where | tr -d '\\r'`
echo "ocaml library path is $OCAMLLIB"

# then we look for ocamlopt; if not present, we issue a warning
# if the version is not the same, we also discard it
# we set OCAMLBEST to "opt" or "byte", whether ocamlopt is available or not
AC_CHECK_PROG(OCAMLOPT,ocamlopt,ocamlopt,no)
OCAMLBEST=byte
if test "$OCAMLOPT" = no ; then
	AC_MSG_WARN(Cannot find ocamlopt; bytecode compilation only.)
else
	AC_MSG_CHECKING(ocamlopt version)
	TMPVERSION=`$OCAMLOPT -v | sed -n -e 's|.*version *\(.*\)$|\1|p'`
	if test "$TMPVERSION" != "$OCAMLVERSION" ; then
	    AC_MSG_RESULT(differs from ocamlc; ocamlopt discarded.)
	    OCAMLOPT=no
	else
	    AC_MSG_RESULT(ok)
	    OCAMLBEST=opt
	fi
fi

# checking for native-code
if test "$enable_native_code" != yes || test "$OCAMLBEST" = byte ; then
    enable_native_code=no
    OCAMLBEST=byte
    OCAMLOPT=no
fi

# checking for ocamlc.opt
AC_CHECK_PROG(OCAMLCDOTOPT,ocamlc.opt,ocamlc.opt,no)
if test "$OCAMLCDOTOPT" != no ; then
	AC_MSG_CHECKING(ocamlc.opt version)
	TMPVERSION=`$OCAMLCDOTOPT -v | sed -n -e 's|.*version *\(.*\)$|\1|p'`
	if test "$TMPVERSION" != "$OCAMLVERSION" ; then
	    AC_MSG_RESULT(differs from ocamlc; ocamlc.opt discarded.)
	else
	    AC_MSG_RESULT(ok)
	    OCAMLC=$OCAMLCDOTOPT
	fi
fi

# checking for ocamlopt.opt
if test "$OCAMLOPT" != no ; then
    AC_CHECK_PROG(OCAMLOPTDOTOPT,ocamlopt.opt,ocamlopt.opt,no)
    if test "$OCAMLOPTDOTOPT" != no ; then
	AC_MSG_CHECKING(ocamlc.opt version)
	TMPVER=`$OCAMLOPTDOTOPT -v | sed -n -e 's|.*version *\(.*\)$|\1|p'`
	if test "$TMPVER" != "$OCAMLVERSION" ; then
	    AC_MSG_RESULT(differs from ocamlc; ocamlopt.opt discarded.)
	else
	    AC_MSG_RESULT(ok)
	    OCAMLOPT=$OCAMLOPTDOTOPT
	fi
    fi
fi

# ocamldep, ocamllex and ocamlyacc should also be present in the path
AC_CHECK_PROG(OCAMLDEP,ocamldep,ocamldep,no)
if test "$OCAMLDEP" = no ; then
   AC_MSG_ERROR(Cannot find ocamldep.)
else
   AC_CHECK_PROG(OCAMLDEPDOTOPT,ocamldep.opt,ocamldep.opt,no)
   if test "$OCAMLDEPDOTOPT" != no ; then
      OCAMLDEP=$OCAMLDEPDOTOPT
   fi
fi

AC_CHECK_PROG(OCAMLLEX,ocamllex,ocamllex,no)
if test "$OCAMLLEX" = no ; then
	AC_MSG_ERROR(Cannot find ocamllex.)
else
    AC_CHECK_PROG(OCAMLLEXDOTOPT,ocamllex.opt,ocamllex.opt,no)
    if test "$OCAMLLEXDOTOPT" != no ; then
	OCAMLLEX=$OCAMLLEXDOTOPT
    fi
fi

AC_CHECK_PROG(OCAMLYACC,ocamlyacc,ocamlyacc,no)
if test "$OCAMLYACC" = no ; then
	AC_MSG_ERROR(Cannot find ocamlyacc.)
fi

AC_CHECK_PROG(OCAMLDOC,ocamldoc,ocamldoc,true)
if test "$OCAMLDOC" = true ; then
    AC_MSG_WARN(Cannot find ocamldoc)
else
    AC_CHECK_PROG(OCAMLDOCOPT,ocamldoc.opt,ocamldoc.opt,no)
    if test "$OCAMLDOCOPT" != no ; then
	OCAMLDOC=$OCAMLDOCOPT
    fi
fi

AC_CHECK_PROG(MENHIR,menhir,menhir,no)
if test "$MENHIR" = no ; then
	AC_MSG_ERROR(Cannot find menhir.)
fi

MENHIRVERSION=`$MENHIR --version | sed -n -e 's,.*version *\(.*\)$,\1,p'`
AX_VERSION_GE([$MENHIRVERSION], 20170418, [],
  [AC_MSG_ERROR(You need Menhir 20170418 or higher.)])

if test "$enable_ocamlfind" != yes; then
   OCAMLFIND=no
else
   AC_CHECK_PROG(OCAMLFIND,ocamlfind,ocamlfind,no)
   if test "$OCAMLFIND" = no; then
      enable_ocamlfind=no
      reason_ocamlfind=" (not found)"
   else
      OCAMLFINDLIB=$(ocamlfind printconf stdlib)
      if test "$OCAMLFINDLIB" != "$OCAMLLIB"; then
         OCAMLFIND=no
         enable_ocamlfind=no
         reason_ocamlfind=" (incompatible with OCaml)"
         echo "but your ocamlfind is not compatible with your ocamlc:"
         echo "ocamlfind: $OCAMLFINDLIB, ocamlc: $OCAMLLIB"
      fi
   fi
fi

#if ocamlfind is used it gives the install path for ocaml library
if test "$enable_ocamlfind" = yes; then
   OCAMLINSTALLLIB=$($OCAMLFIND printconf destdir)
else
   OCAMLINSTALLLIB=$OCAMLLIB
fi

if test "$enable_why3_lib" = yes ; then
   WHY3LIB=
else
   AC_MSG_CHECKING([For Why3])
   if test "$enable_ocamlfind" = no; then
      AC_MSG_RESULT([no])
      AC_MSG_ERROR([Cannot use --disable-why3-lib without ocamlfind.])
   fi
   WHY3LIB=why3
   DIR=$($OCAMLFIND query why3)
   if test -n "$DIR"; then
      AC_MSG_RESULT([$DIR])
      WHY3INCLUDE="-I $DIR"
   else
      AC_MSG_RESULT([no])
      AC_MSG_ERROR([Cannot use --disable-why3-lib without an installed Why3.])
   fi
fi

if test "$enable_local" = no; then
   LOCALDIR=''
else
   LOCALDIR="${PWD}"
fi

# ppx
if test "$enable_ocamlfind" = yes; then
  COMPILERLIBS=$($OCAMLFIND query compiler-libs)
  if test -n "$COMPILERLIBS"; then
    echo "ocamlfind found compiler-libs in $COMPILERLIBS"
    enable_ppx=yes
  else
    enable_ppx=no
    reason_ppx=" (compiler-libs not found)"
  fi
else
  enable_ppx=no
fi

# checking for sphinx
if test "$enable_doc" = yes; then
   AC_CHECK_PROG(SPHINX,sphinx-build,sphinx-build,no)
   if test "$SPHINX" = no; then
      enable_doc=no
      enable_pdf_doc=no
      reason_doc=" (sphinx-build not found)"
      AC_MSG_WARN([Cannot find sphinx-build, Documentation disabled.])
   fi
else
   enable_pdf_doc=no
fi

# checking for rubber or latexmk or pdflatex
if test "$enable_pdf_doc" = yes; then
   AC_CHECK_PROGS(LATEX,latexmk rubber pdflatex,no)
   if test "$LATEX" = no; then
      enable_pdf_doc=no
      reason_pdf_doc=" ((rubber|latexmk|pdflatex) not found)"
      AC_MSG_WARN([Cannot find any latex compiler, PDF documentation disabled.])
   fi
fi

# checking for emacs
if test "$enable_emacs_compilation" = yes ; then
   AC_CHECK_PROG(EMACS,emacs,emacs,no)
   if test "$EMACS" = no ; then
      enable_emacs_compilation=no
      AC_MSG_WARN([Cannot find emacs, compilation of why3.elc disabled.])
   fi
fi

# checking for Num
# (ocamlfind cannot be trusted here, since the default installation path is $OCAMLLIB)
found_num=no
if test "$enable_ocamlfind" = yes; then
   DIR=$($OCAMLFIND query num)
   if test -n "$DIR"; then
      echo "ocamlfind found num in $DIR"
      NUMPKG=num
      NUMINCLUDE="-I $DIR"
      found_num=yes
      AC_CHECK_FILE($DIR/nums.cma,,found_num=no)
      AC_CHECK_FILE($DIR/num.cmi,,found_num=no)
   else
      enable_ocamlfind=no
      reason_ocamlfind=" (unable to find num)"
   fi
fi
if test "$found_num" = no; then
   DIR="$OCAMLLIB"
   NUMINCLUDE=
   found_num=yes
   AC_CHECK_FILE($DIR/nums.cma,,found_num=no)
   AC_CHECK_FILE($DIR/num.cmi,,found_num=no)
fi
if test "$found_num" = no; then
   AC_MSG_ERROR([Library Num not found.])
fi

# checking for Zarith
if test "$enable_zarith" = yes; then
   DIR=
   if test "$enable_ocamlfind" = yes; then
      DIR=$(ocamlfind query zarith)
      if test -n "$DIR"; then
         echo "ocamlfind found zarith in $DIR"
         BIGINTINCLUDE="-I $DIR"
      else
         ocamlfind_zarith=no
      fi
   fi
   if test -z "$DIR"; then
      BIGINTINCLUDE="-I +zarith"
      DIR="$OCAMLLIB/zarith"
      AC_CHECK_FILE($DIR/zarith.cma,,enable_zarith=no)
   fi
   AC_CHECK_FILE($DIR/z.cmi,,enable_zarith=no)
   if test "$enable_zarith" = no; then
      AC_MSG_WARN([Lib Zarith not found, using Nums instead.])
      reason_zarith=" (zarith not found)"
   elif test "$ocamlfind_zarith" = no; then
      enable_ocamlfind=no
      reason_ocamlfind=" (unable to find zarith)"
   fi
fi

if test "$enable_zarith" = yes; then
   BIGINTLIB=zarith
   BIGINTPKG=zarith
else
   BIGINTLIB=nums
   BIGINTPKG=num
   BIGINTINCLUDE="$NUMINCLUDE"
fi

# checking for apron and fixpoint
if test "$enable_infer" = yes; then
   if test "$enable_ocamlfind" = yes; then
      # gmp is a dependency of apron
      INFERINCLUDE=$($OCAMLFIND query apron camllib)
   fi
   if test -n "$INFERINCLUDE"; then
      echo "ocamlfind found apron, camllib in $INFERINCLUDE"
      INFERINCLUDE=$($OCAMLFIND query fixpoint)
      if test -n "$INFERINCLUDE"; then
         echo "ocamlfind found fixpoint in $INFERINCLUDE"
         INFERINCLUDE="$($OCAMLFIND query -separator ' ' -i-format apron fixpoint camllib gmp)"
         INFERLIB="apron fixpoint"
         INFERPKG="apron fixpoint apron.boxMPQ apron.octMPQ apron.polkaMPQ"
      else
         enable_infer=no
         AC_MSG_WARN([Lib fixpoint not found, infer will not be built.])
         reason_infer=" (fixpoint not found)"
      fi
   else
      enable_infer=no
      reason_infer=" (apron or camllib not found)"
      AC_MSG_WARN([Lib apron or camllib not found, infer will not be built.])
   fi
else
  reason_infer=" (disabled by default)"
fi


# checking for camlzip
if test "$enable_zip" = yes; then
   DIR=
   if test "$enable_ocamlfind" = yes; then
      DIR=$(ocamlfind query zip)
      if test -n "$DIR"; then
         echo "ocamlfind found camlzip in $DIR"
         ZIPINCLUDE="-I $DIR"
      else
         ocamlfind_zip=no
      fi
   fi
   if test -z "$DIR"; then
      ZIPINCLUDE="-I +zip"
      DIR="$OCAMLLIB/zip"
      AC_CHECK_FILE($DIR/zip.cma,,enable_zip=no)
   fi
   AC_CHECK_FILE($DIR/zip.cmi,,enable_zip=no)
   if test "$enable_zip" = no; then
      AC_MSG_WARN([Lib camlzip not found, sessions files will not be compressed.])
      reason_zip=" (camlzip not found)"
   elif test "$ocamlfind_zip" = no; then
      enable_ocamlfind=no
      reason_ocamlfind=" (unable to find camlzip)"
   fi
fi

if test "$enable_zip" = yes; then
   ZIPLIB=zip
else
   ZIPLIB=
   ZIPINCLUDE=
fi

# checking for menhirlib
found_menhirlib=yes
DIR=
if test "$enable_ocamlfind" = yes; then
   DIR=$($OCAMLFIND query menhirLib)
   if test -n "$DIR"; then
      echo "ocamlfind found menhirLib in $DIR"
      MENHIRINCLUDE="-I $DIR"
   else
      enable_ocamlfind=no
      reason_ocamlfind=" (unable to find menhirLib)"
   fi
fi
if test -z "$DIR"; then
   MENHIRINCLUDE="-I +menhirLib"
   DIR="$OCAMLLIB/menhirLib"
   menhirlib_cmo=
   AC_CHECK_FILE($DIR/menhirLib.cmo,menhirlib_cmo=yes,)
   AC_CHECK_FILE($DIR/menhirLib.cma,menhirlib_cmo=no,)
   if test -z "$menhirlib_cmo"; then found_menhirlib=no; fi
fi
AC_CHECK_FILE($DIR/menhirLib.cmi,,found_menhirlib=no)
if test "$found_menhirlib" = no; then
   AC_MSG_ERROR([Library menhirLib not found.])
fi
AC_SUBST(menhirlib_cmo)

# checking for seq
# (ocamlfind cannot be trusted here, since the default installation path is $OCAMLLIB)
found_seq=no
if test "$enable_ocamlfind" = yes; then
   DIR=$($OCAMLFIND query seq)
   if test -n "$DIR"; then
      echo "ocamlfind found seq in $DIR"
      SEQINCLUDE="-I $DIR"
      SEQLIB=seq
      found_seq=yes
      AC_CHECK_FILE($DIR/seq.cma,,found_seq=no)
      AC_CHECK_FILE($DIR/seq.cmi,,found_seq=no)
   fi
fi
if test "$found_seq" = no; then
   DIR="$OCAMLLIB"
   SEQINCLUDE=
   SEQLIB=
   AC_CHECK_FILE($DIR/stdlib__seq.cmi,found_seq=yes,)
   AC_CHECK_FILE($DIR/stdlib__Seq.cmi,found_seq=yes,)
fi
if test "$found_seq" = no; then
   AC_MSG_WARN([Library seq not found.])
   if test "$enable_re" = yes; then
      enable_re=no
      reason_re=" (seq not found)"
   fi
fi

# checking for re
if test "$enable_re" = yes; then
   found_re=yes
   DIR=
   if test "$enable_ocamlfind" = yes; then
      DIR=$(ocamlfind query re)
      if test -n "$DIR"; then
         echo "ocamlfind found re in $DIR"
         REINCLUDE="-I $DIR"
      else
         ocamlfind_re=no
      fi
   fi
   if test -z "$DIR"; then
      REINCLUDE="-I +re"
      DIR="$OCAMLLIB/re"
      AC_CHECK_FILE($DIR/re.cmx,,found_re=no)
   fi
   AC_CHECK_FILE($DIR/re.cmi,,found_re=no)
   if test "$found_re" = no; then
      AC_MSG_WARN([Library re not found.])
      enable_re=no
   elif test "$ocamlfind_re" = no; then
      enable_ocamlfind=no
      reason_ocamlfind=" (unable to find re)"
   fi
fi

if test "$enable_re" = no; then
   REINCLUDE=
   RELIB=str
else
   RELIB=re
fi

# checking for lablgtk3
if test "$enable_ide" != yes ; then
   reason_ide=" (disabled by user)"
fi
if test "$enable_ocamlfind" != yes; then
   enable_ide=no
   reason_ide=" (ocamlfind not available)"
fi

if test "$enable_ide" = yes; then
   DIR=$($OCAMLFIND query lablgtk3)
   if test -n "$DIR"; then
      echo "ocamlfind found lablgtk3 in $DIR"
      AC_CHECK_FILE($DIR/gtkButton.cmi,,enable_ide=no)
   else
      enable_ide=no
   fi
   if test "$enable_ide" = yes; then
      GTKVERSION=3
      PKGS_SOURCEVIEW="lablgtk3-sourceview3 lablgtk3.sourceview3 lablgtksourceview3"
      reason_ide=" (gtk3)"
   else
      AC_MSG_WARN([Lib lablgtk3 not found, trying lablgtk2.])
      enable_ide=retry
   fi
fi

# checking for lablgtk2
if test "$enable_ide" = retry; then
   enable_ide=yes
   DIR=$($OCAMLFIND query lablgtk2)
   if test -n "$DIR"; then
      echo "ocamlfind found lablgtk2 in $DIR"
      AC_CHECK_FILE($DIR/gtkButton.cmi,,enable_ide=no)
   else
      enable_ide=no
   fi
   if test "$enable_ide" = yes; then
      GTKVERSION=2
      PKGS_SOURCEVIEW="lablgtk2.sourceview2 lablgtksourceview2"
      reason_ide=" (gtk2)"
   else
      AC_MSG_WARN([Lib lablgtk2 not found, IDE disabled.])
      reason_ide=" (lablgtk2/3 not found)"
   fi
fi

# checking for lablgtksourceview
if test "$enable_ide" = yes; then
   for p in $PKGS_SOURCEVIEW; do
      DIR=$($OCAMLFIND query $p)
      if test -n "$DIR"; then
         echo "ocamlfind found $p in $DIR"
         AC_CHECK_FILE($DIR/gSourceView$GTKVERSION.cmi,,p=)
         if test -n "$p"; then
            PKG_SOURCEVIEW=$p
            break
         fi
      fi
   done
   if test -z "$PKG_SOURCEVIEW"; then
      enable_ide=no
      AC_MSG_WARN([Lib lablgtksourceview not found, IDE disabled.])
      reason_ide=" (lablgtksourceview not found)"
   fi
fi

if test "$enable_ide" = yes ; then
   LABLGTKPKG="lablgtk$GTKVERSION $PKG_SOURCEVIEW"
fi

if test "$enable_hypothesis_selection" = yes; then
   DIR=
   if test "$enable_ocamlfind" = yes; then
      DIR=$($OCAMLFIND query ocamlgraph)
      if test -n "$DIR"; then
         echo "ocamlfind found ocamlgraph in $DIR"
         OCAMLGRAPHLIB="$DIR"
      else
         ocamlfind_ocamlgraph=no
      fi
   fi
   if test -z "$DIR"; then
      OCAMLGRAPHLIB="+ocamlgraph"
      DIR="$OCAMLLIB/ocamlgraph"
      AC_CHECK_FILE($DIR/graph.cma,,enable_hypothesis_selection=no)
   fi
   AC_CHECK_FILE($DIR/graph.cmi,,enable_hypothesis_selection=no)
   if test "$enable_hypothesis_selection" = no; then
      reason_hypothesis_selection=" (ocamlgraph not found)"
      AC_MSG_WARN([Lib ocamlgraph not found, hypothesis selection disabled.])
   elif test "$ocamlfind_ocamlgraph" = no; then
      enable_ocamlfind=no
      reason_ocamlfind=" (unable to find ocamlgraph)"
   fi
fi

if test "$enable_hypothesis_selection" = yes; then
   META_OCAMLGRAPH="ocamlgraph"
else
   META_OCAMLGRAPH=
   OCAMLGRAPHLIB=
fi

if test "$enable_stackify" = yes; then
   DIR=
   if test "$enable_ocamlfind" = yes; then
      DIR=$($OCAMLFIND query ocamlgraph)
      if test -n "$DIR"; then
         echo "ocamlfind found ocamlgraph in $DIR"
         OCAMLGRAPHLIB="$DIR"
      else
         ocamlfind_ocamlgraph=no
      fi
   fi
   if test -z "$DIR"; then
      OCAMLGRAPHLIB="+ocamlgraph"
      DIR="$OCAMLLIB/ocamlgraph"
      AC_CHECK_FILE($DIR/graph.cma,,enable_stackify=no)
   fi
   AC_CHECK_FILE($DIR/graph.cmi,,enable_stackify=no)
   if test "$enable_stackify" = no; then
      reason_stackify=" (ocamlgraph not found)"
      AC_MSG_WARN([Lib ocamlgraph not found, stackify disabled.])
   elif test "$ocamlfind_ocamlgraph" = no; then
      enable_ocamlfind=no
      reason_ocamlfind=" (unable to find ocamlgraph)"
   fi
fi

if test "$enable_stackify" = yes; then
   META_OCAMLGRAPH="ocamlgraph"
else
   META_OCAMLGRAPH=
   OCAMLGRAPHLIB=
fi

# checking for js_of_ocaml
if test "$enable_js_of_ocaml" != yes; then
   reason_js_of_ocaml=" (disabled by user)"
elif test "$enable_ocamlfind" != yes; then
   enable_js_of_ocaml=no
   reason_js_of_ocaml=" (ocamlfind not available)"
else
   JSOFOCAML=$($OCAMLFIND query js_of_ocaml)
   if test -z "$JSOFOCAML"; then
      enable_js_of_ocaml=no
      reason_js_of_ocaml=" (js_of_ocaml not found)"
   else
      JSOFOCAMLPPX=$($OCAMLFIND query js_of_ocaml-ppx)
      if test -z "$JSOFOCAMLPPX"; then
         enable_js_of_ocaml=no
         reason_js_of_ocaml=" (js_of_ocaml-ppx not found)"
      else
         JSOFOCAMLPKG="js_of_ocaml js_of_ocaml-ppx"
      fi
   fi
fi

if test "$enable_web_ide" != yes; then
   reason_web_ide=" (disabled by user)"
elif test "$enable_js_of_ocaml" != yes; then
   enable_web_ide=no
   reason_web_ide=" (Javascript support not available)"
fi

# MLMPFR
if test "$enable_mpfr" != yes; then
   reason_mpfr=" (disabled by user)"
elif test "$enable_ocamlfind" != yes; then
   enable_mpfr=no
   reason_mpfr=" (ocamlfind not available)"
elif test "$enable_js_of_ocaml" != no; then
   enable_mpfr=no
   reason_mpfr=" (incompatible with js_of_ocaml) "
else
   DIR=$($OCAMLFIND query mlmpfr)
   if test -n "$DIR"; then
      old_mpfr=no
      echo "ocamlfind found mlmpfr in $DIR"
      # Test that MPFR version is higher than 4.0.0 (because of
      # Faithful constructor incompatibility).
      MPFRVERSION=$($OCAMLFIND query -format "%v" mlmpfr)
      AX_VERSION_GE([$MPFRVERSION], 4.0.0, [], [
         enable_mpfr=no
         reason_mpfr=" (mlmpfr >= 4.0.0 not found)"])
      AC_CHECK_FILE($DIR/mpfr.cmi, [old_mpfr=yes], )
      AC_CHECK_FILE($DIR/mlmpfr.cma,, [
         enable_mpfr=no
         reason_mpfr=" (mlmpfr not found)"])
   else
      reason_mpfr=" (mlmpfr not found)"
      enable_mpfr=no
   fi
fi

if test "$enable_mpfr" = yes; then
   MLMPFR=mlmpfr
fi

# checking for statmemprof
if test "$enable_statmemprof" = yes; then
   if test "$enable_ocamlfind" != yes; then
      enable_statmemprof=no
      reason_statmemprof=" (ocamlfind not available)"
   else
      DIR=$($OCAMLFIND query statmemprof-emacs)
      if test -z "$DIR"; then
         enable_statmemprof=no
         reason_statmemprof=" (statmemprof-emacs not found)"
      fi
      STATMEMPROFPKG=statmemprof-emacs
   fi
fi

# ppx_sexp_conv (only with ocamlfind)
SEXPLIBPPX=""
SEXPLIB=""
if test "$enable_pp_sexp" = yes; then
    if test "$enable_ocamlfind" != yes; then
        enable_pp_sexp=no
        reason_no_pp_sexp=" (requires ocamlfind)"
    elif test "$enable_ppx" != yes; then
        enable_pp_sexp=no
        reason_no_pp_sexp=" (requires ppx)"
    elif ! $OCAMLFIND query ppx_sexp_conv > /dev/null; then
        enable_pp_sexp=no
        reason_no_pp_sexp=" (requires ppx_sexp_conv)"
    elif ! $OCAMLFIND query sexplib > /dev/null; then
        enable_pp_sexp=no
        reason_no_pp_sexp=" (requires sexplib)"
    elif ! $OCAMLFIND query ppx_deriving > /dev/null; then
        enable_pp_sexp=no
        reason_no_pp_sexp=" (requires ppx_deriving)"
    else
        SEXPLIBPPX="ppx_sexp_conv"
        SEXPLIB="sexplib sexplib.num"
        reason_no_pp_sexp=""
    fi
else
    reason_no_pp_sexp=" (disabled)"
fi

# Coq

enable_coq_support=yes
enable_coq_fp_libs=yes

coq_compat_version=

if test "$enable_coq_libs" = no; then
   enable_coq_support=no
   reason_coq_support=" (disabled by user)"
fi

if test "$enable_coq_support" = yes; then
   AC_CHECK_PROG(COQC,coqc,coqc,no)
   if test "$COQC" = no ; then
      enable_coq_support=no
      AC_MSG_WARN(Cannot find coqc.)
      reason_coq_support=" (coqc not found)"
   fi
fi

if test "$enable_coq_support" = yes; then
   COQLIB=`$COQC -where | sed -e 's|\\\|/|g' -e 's| |\\ |g'`
   AC_MSG_CHECKING(Coq version)
   COQVERSION=[`$COQC -v | sed -n -e 's|.*version  *\([^ ]*\).*|\1|p'`]
   AC_MSG_RESULT($COQVERSION)

   case $COQVERSION in
      8.7*)
         coq_compat_version="COQ87"
         enable_coq_fp_libs=no
         ;;
      8.8*)
         coq_compat_version="COQ88"
         enable_coq_fp_libs=no
         ;;
      8.9*)
         coq_compat_version="COQ89"
         enable_coq_fp_libs=no
         ;;
      8.10*)
         coq_compat_version="COQ810"
         enable_coq_fp_libs=no
         ;;
      8.11*)
         coq_compat_version="COQ811"
         ;;
      8.12*)
         coq_compat_version="COQ812"
         ;;
      8.13*)
         coq_compat_version="COQ813"
         ;;
      8.14*)
         coq_compat_version="COQ814"
         ;;
      8.15*)
         coq_compat_version="COQ815"
         ;;
      8.16*)
         coq_compat_version="COQ816"
         ;;
      *)
         enable_coq_support=no
         AC_MSG_WARN(You need Coq 8.7 or later; Coq discarded)
         reason_coq_support=" (need version >= 8.7)"
         ;;
   esac
   if test "$enable_coq_fp_libs" = no; then
      reason_coq_fp_libs= " (Coq < 8.11)"
   fi
fi

if test "$enable_coq_support" = yes; then
   AC_CHECK_PROG(COQDEP,coqdep,coqdep,no)
   if test "$COQDEP" = no; then
      enable_coq_support=no
      AC_MSG_WARN(Cannot find coqdep.)
      reason_coq_support=" (coqdep not found)"
   fi
fi

if test "$enable_coq_support" = no; then
   enable_coq_libs=no
   enable_coq_fp_libs=no
   COQVERSION=
fi

if test "$enable_coq_fp_libs" = yes; then
   AC_MSG_CHECKING([for Flocq])
   AS_IF(
     [ echo "Require Import Flocq.Version BinNat." \
            "Goal (30400 <= Flocq_version)%N. easy. Qed." > conftest.v
       "$COQC" conftest.v > conftest.err ],
     [ AC_MSG_RESULT(yes) ],
     [ AC_MSG_RESULT(no)
       enable_coq_fp_libs=no
       AC_MSG_WARN(Cannot find Flocq.)
       reason_coq_fp_libs=" (Flocq >= 3.4 not found)" ])
   rm -f conftest.v conftest.vo conftest.err
fi

# PVS

if test "$enable_pvs_libs" = no; then
    enable_pvs_support=no
    reason_pvs_support=" (disabled by user)"
else
    AC_CHECK_PROG(PVS,pvs,pvs,no)
    if test "$PVS" = no ; then
        enable_pvs_support=no
        AC_MSG_WARN(Cannot find pvs.)
        reason_pvs_support=" (pvs not found)"
    else
        PVSLIB=`$PVS -where`
        AC_MSG_CHECKING(PVS version)
        PVSVERSION=[`$PVS -version | sed -n -e 's|.*Version *\([^ ]*\)$|\1|p'`]

        case $PVSVERSION in
          6.*|7.*)
	        enable_pvs_support=yes
                AC_MSG_RESULT($PVSVERSION)
                ;;
          *)
                AC_MSG_RESULT($PVSVERSION)
                enable_pvs_support=no
	        AC_MSG_WARN(You need PVS 6.0 or higher; PVS discarded)
                reason_pvs_support=" (need version 6.0 or higher)"
                ;;
        esac
    fi
fi

if test "$enable_pvs_support" = no; then
   enable_pvs_libs=no
   PVSVERSION=
fi

# Isabelle

# Default version used for generation of realization in the case Isabelle is not
# detected or Why3 is compiled with disable-isabelle.
ISABELLEVERSION=2021-1

if test "$enable_isabelle_libs" = no; then
    enable_isabelle_support=no
    reason_isabelle_support=" (disabled by user)"
else
    AC_CHECK_PROG(ISABELLE,isabelle,isabelle,no)
    if test "$ISABELLE" = no ; then
       enable_isabelle_support=no
       AC_MSG_WARN(Cannot find isabelle.)
       reason_isabelle_support=" (isabelle not found)"
    else
        AC_MSG_CHECKING(Isabelle version)
        ISABELLEDETECTEDVERSION=[`$ISABELLE version | sed -n -e 's|Isabelle\([^:]*\).*$|\1|p'`]

        case $ISABELLEDETECTEDVERSION in
          2019*)
	        enable_isabelle_support=yes
                ISABELLEVERSION=2019
                AC_MSG_RESULT($ISABELLEDETECTEDVERSION)
                ;;
          2021-1*)
	        enable_isabelle_support=yes
                ISABELLEVERSION=2021-1
                AC_MSG_RESULT($ISABELLEDETECTEDVERSION)
                ;;
          *)
                AC_MSG_RESULT($ISABELLEDETECTEDVERSION)
                enable_isabelle_support=no
	        AC_MSG_WARN(You need Isabelle 2019 or later; Isabelle discarded)
                reason_isabelle_support=" (need version >= 2019)"
                ;;
        esac
    fi
fi

if test "$enable_isabelle_support" = no; then
   enable_isabelle_libs=no
fi

if test "$enable_pvs_libs" = yes; then
   AC_MSG_CHECKING([for NASA PVS library])
   enable_pvs_libs=no
   reason_pvs_libs=" (no NASA PVS library in PVS_LIBRARY_PATH)"
   for dir in  `echo $PVS_LIBRARY_PATH | tr ':' ' '`; do
       if test -f $dir/nasalib-version; then
          enable_pvs_libs=yes
          reason_pvs_libs=""
       fi
   done
   AC_MSG_RESULT($enable_pvs_libs)
fi

#check frama-c
FRAMAC_SUPPORTED=Sulfur
if test "$enable_frama_c" = yes ; then
   AC_CHECK_PROG(FRAMAC,frama-c,frama-c,no)
   if test "$FRAMAC" = no ; then
        AC_MSG_WARN(Cannot find Frama-C.)
        enable_frama_c="no"
        reason_frama_c=" (frama-c not found)"
   else
      AC_MSG_CHECKING(Frama-C version)
      FRAMAC_VERSION=`$FRAMAC -version | sed -n -e 's|\(Version: \)\?\(.*\)$|\2|p'`
      AC_MSG_RESULT($FRAMAC_VERSION)
      case $FRAMAC_VERSION in
         $FRAMAC_SUPPORTED-*) ;;
         *) AC_MSG_WARN(Version $FRAMAC_SUPPORTED required.)
            enable_frama_c=no
            reason_frama_c=" (version $FRAMAC_SUPPORTED required)"
            ;;
      esac
   fi
fi

if test "$enable_frama_c" = yes; then
   FRAMAC_SHARE=`$FRAMAC -print-path`
   FRAMAC_LIBDIR=`$FRAMAC -print-libpath`
   FRAMAC_INCLUDE="-I $FRAMAC_LIBDIR"
fi

VERSION=$PACKAGE_VERSION

# default editor

if test -z "$EDITOR"; then
   case `uname -s` in
   Darwin)
      EDITOR=open
      ;;
   MINGW*)
      EDITOR="cmd.exe -c start"
      ;;
   *)
      EDITOR=xdg-open
      ;;
   esac
fi

# substitutions to perform
AC_SUBST(VERSION)

AC_SUBST(enable_verbose_make)

AC_SUBST(EXE)
AC_SUBST(STRIP)

AC_SUBST(OCAMLC)
AC_SUBST(OCAMLOPT)
AC_SUBST(OCAMLDEP)
AC_SUBST(OCAMLLEX)
AC_SUBST(OCAMLYACC)
AC_SUBST(OCAMLDOC)
AC_SUBST(OCAMLBEST)
AC_SUBST(OCAMLVERSION)
AC_SUBST(OCAMLLIB)
AC_SUBST(OCAMLINSTALLLIB)
AC_SUBST(OCAMLGRAPHLIB)
AC_SUBST(MENHIR)

AC_SUBST(enable_ocamlfind)
AC_SUBST(OCAMLFIND)

AC_SUBST(enable_profiling)

AC_SUBST(enable_statmemprof)
AC_SUBST(STATMEMPROFPKG)

AC_SUBST(enable_ide)
AC_SUBST(LABLGTKPKG)
AC_SUBST(GTKVERSION)

AC_SUBST(enable_web_ide)
AC_SUBST(enable_js_of_ocaml)
AC_SUBST(JSOFOCAMLPKG)

AC_SUBST(META_OCAMLGRAPH)

AC_SUBST(enable_ppx)
AC_SUBST(enable_pp_sexp)
AC_SUBST(SEXPLIB)
AC_SUBST(SEXPLIBPPX)

AC_SUBST(NUMINCLUDE)
AC_SUBST(MLMPFR)
AC_SUBST(enable_mpfr)
AC_SUBST(old_mpfr)

AC_SUBST(enable_zarith)
AC_SUBST(BIGINTINCLUDE)
AC_SUBST(BIGINTLIB)
AC_SUBST(BIGINTPKG)

AC_SUBST(enable_infer)
AC_SUBST(INFERINCLUDE)
AC_SUBST(INFERLIB)
AC_SUBST(INFERPKG)

AC_SUBST(enable_zip)
AC_SUBST(ZIPINCLUDE)
AC_SUBST(ZIPLIB)

AC_SUBST(MENHIRINCLUDE)

AC_SUBST(SEQINCLUDE)
AC_SUBST(SEQLIB)

AC_SUBST(enable_re)
AC_SUBST(REINCLUDE)
AC_SUBST(RELIB)

AC_SUBST(enable_coq_libs)
AC_SUBST(enable_coq_fp_libs)
AC_SUBST(coq_compat_version)

AC_SUBST(COQC)
AC_SUBST(COQDEP)
AC_SUBST(COQLIB)
AC_SUBST(COQVERSION)

AC_SUBST(enable_pvs_libs)
AC_SUBST(PVS)
AC_SUBST(PVSVERSION)

AC_SUBST(enable_isabelle_libs)
AC_SUBST(ISABELLE)
AC_SUBST(ISABELLEVERSION)

AC_SUBST(enable_hypothesis_selection)
AC_SUBST(enable_stackify)

AC_SUBST(enable_doc)
AC_SUBST(enable_pdf_doc)

AC_SUBST(LATEX)
AC_SUBST(SPHINX)

AC_SUBST(enable_emacs_compilation)
AC_SUBST(EMACS)

AC_SUBST(enable_frama_c)

AC_SUBST(FRAMAC)
AC_SUBST(FRAMAC_VERSION)
AC_SUBST(FRAMAC_SHARE)
AC_SUBST(FRAMAC_LIBDIR)
AC_SUBST(FRAMAC_INCLUDE)

AC_SUBST(enable_local)
AC_SUBST(LOCALDIR)

AC_SUBST(enable_why3_lib)
AC_SUBST(WHY3LIB)
AC_SUBST(WHY3INCLUDE)

AC_SUBST(enable_relocation)

# Finally create the Makefile from Makefile.in
AC_CONFIG_FILES(Makefile)
AC_CONFIG_FILES(src/config.sh)
AC_CONFIG_FILES(lib/why3/META)
AC_CONFIG_FILES(.merlin)
AC_CONFIG_FILES(src/jessie/Makefile)
AC_CONFIG_FILES(src/jessie/.merlin)
AC_CONFIG_FILES(lib/coq/version lib/pvs/version)
AC_CONFIG_COMMANDS([chmod],
chmod a-w Makefile src/jessie/Makefile;
chmod a-w src/config.sh;
chmod a-w lib/why3/META;
chmod a-w .merlin;
chmod a-w src/jessie/Makefile;
chmod a-w src/jessie/.merlin;
chmod a-w lib/coq/version lib/pvs/version;
chmod u+x src/config.sh)

AC_OUTPUT


# Summary

echo
echo "                 Summary"
echo "-----------------------------------------"
echo "Verbose make                : $enable_verbose_make"
echo "OCaml compiler              : yes"
echo "    Version                 : $OCAMLVERSION"
echo "    Library path            : $OCAMLLIB"
echo "    Ocamlfind               : $enable_ocamlfind$reason_ocamlfind"
echo "    Native compilation      : $enable_native_code"
echo "    Profiling               : $enable_profiling"
echo "    Memory profiling        : $enable_statmemprof$reason_statmemprof"
echo "    PPX                     : $enable_ppx$reason_ppx"
echo "    S-expr for why3pp       : $enable_pp_sexp$reason_no_pp_sexp"
echo "    Javascript support      : $enable_js_of_ocaml$reason_js_of_ocaml"
echo "    MPFR support            : $enable_mpfr$reason_mpfr"
echo "    Re support              : $enable_re$reason_re"
echo "Components"
echo "    Why3 library            : $enable_why3_lib"
echo "    GTK IDE                 : $enable_ide$reason_ide"
echo "    Web IDE                 : $enable_web_ide$reason_web_ide"
echo "    GMP arithmetic          : $enable_zarith$reason_zarith"
echo "    Compressed sessions     : $enable_zip$reason_zip"
echo "    Hypothesis selection    : $enable_hypothesis_selection$reason_hypothesis_selection"
echo "    Stackify                : $enable_stackify$reason_stackify"
echo "    Invariant inference(exp): $enable_infer$reason_infer"
echo "    Frama-C support         : $enable_frama_c$reason_frama_c"
if test "$enable_frama_c" = yes ; then
   echo "        Version             : $FRAMAC_VERSION"
   echo "        Share path          : $FRAMAC_SHARE"
   echo "        Library path        : $FRAMAC_LIBDIR"
fi
echo "Documentation               : $enable_doc$reason_doc"
if test "$enable_doc" = yes ; then
   echo "    HTML                    : yes"
   echo "    PDF                     : $enable_pdf_doc$reason_pdf_doc"
fi
echo "Support for interactive proof assistants"
echo "    Coq                     : $enable_coq_support$reason_coq_support"
if test "$enable_coq_support" = yes ; then
   echo "        Version             : $COQVERSION"
   echo "        Library path        : $COQLIB"
   echo "        Realization support : $enable_coq_libs$reason_coq_libs"
   if test "$enable_coq_libs" = yes ; then
      echo "            FP arithmetic   : $enable_coq_fp_libs$reason_coq_fp_libs"
   fi
fi
echo "    PVS                     : $enable_pvs_support$reason_pvs_support"
if test "$enable_pvs_support" = yes ; then
   echo "        Version             : $PVSVERSION"
   echo "        Library path        : $PVSLIB"
   echo "        Realization support : $enable_pvs_libs$reason_pvs_libs"
fi
echo "    Isabelle                : $enable_isabelle_support$reason_isabelle_support"
if test "$enable_isabelle_support" = yes ; then
   echo "        Version             : $ISABELLEVERSION ($ISABELLEDETECTEDVERSION)"
   echo "        Realization support : $enable_isabelle_libs$reason_isabelle_libs"
fi
if test "$enable_local" = yes ; then
   echo "Installable                 : no"
   echo "    OCaml library path      : $OCAMLINSTALLLIB/why3"
else
   echo "Installable                 : yes"
   echo "    Binary path             : $bindir"
   echo "    Library path            : $libdir/why3"
   echo "    Data path               : $datarootdir/why3"
   echo "    OCaml library path      : $OCAMLINSTALLLIB/why3"
   echo "    Relocatable             : $enable_relocation"
fi
