dnl Process this file with autoconf to produce a configure script.
dnl The macros which aren't shipped with the autotools are stored in the
dnl Tools/config directory in .m4 files.

AC_INIT([swig],[3.0.4],[http://www.swig.org])

dnl NB: When this requirement is increased to 2.60 or later, AC_PROG_SED
dnl     definition below can be removed
AC_PREREQ(2.58)

AC_CONFIG_SRCDIR([Source/Swig/swig.h])
AC_CONFIG_AUX_DIR([Tools/config])
AC_CONFIG_HEADERS([Source/Include/swigconfig.h])
AC_CANONICAL_HOST
AM_INIT_AUTOMAKE

dnl Some extra defines for the config file
AH_BOTTOM([
/* Default language */
#define SWIG_LANG               "-tcl"

/* Deal with attempt by Microsoft to deprecate C standard runtime functions */
#if defined(_MSC_VER)
# define _CRT_SECURE_NO_DEPRECATE
#endif
])

dnl Check for programs that a user requires to build SWIG
AC_PROG_CC
AC_PROG_CXX
AC_EXEEXT
AC_OBJEXT
AM_PROG_CC_C_O  # Needed for subdir-objects in AUTOMAKE_OPTIONS

AC_COMPILE_WARNINGS # Increase warning levels

AC_DEFINE_UNQUOTED(SWIG_CXX, ["$CXX"], [Compiler that built SWIG])
AC_DEFINE_UNQUOTED(SWIG_PLATFORM, ["$host"], [Platform that SWIG is built for])

dnl Checks for header files.
AC_HEADER_STDC

dnl Checks for types.
AC_LANG_PUSH([C++])
AC_CHECK_TYPES([bool])
AC_LANG_POP([C++])

dnl Look for popen
AC_ARG_WITH(popen, AS_HELP_STRING([--without-popen], [Disable popen]), with_popen="$withval")
if test x"${with_popen}" = xno ; then
AC_MSG_NOTICE([Disabling popen])
else
AC_CHECK_FUNC(popen, AC_DEFINE(HAVE_POPEN, 1, [Define if popen is available]), AC_MSG_NOTICE([Disabling popen]))
fi

dnl PCRE

dnl AX_PATH_GENERIC() relies on AC_PROG_SED() but it is defined only in
dnl autoconf 2.60 so trivially predefine it ourselves for the older versions
m4_ifdef([AC_PROG_SED],, [AC_DEFUN([AC_PROG_SED], [AC_PATH_PROG([SED], sed)])])

AC_ARG_WITH([pcre],
  [AS_HELP_STRING([--without-pcre],
                  [Disable support for regular expressions using PCRE])],
  [],
  [with_pcre=yes])

AC_MSG_CHECKING([whether to enable PCRE support])
AC_MSG_RESULT([$with_pcre])

dnl To make configuring easier, check for a locally built PCRE using the Tools/pcre-build.sh script
if test x"${with_pcre}" = xyes ; then
  AC_MSG_CHECKING([whether to use local PCRE])
  local_pcre_config=no
  if test -z $PCRE_CONFIG; then
    if test -f `pwd`/pcre/pcre-swig-install/bin/pcre-config; then
      PCRE_CONFIG=`pwd`/pcre/pcre-swig-install/bin/pcre-config
      local_pcre_config=$PCRE_CONFIG
    fi
  fi
  AC_MSG_RESULT([$local_pcre_config])
fi
AS_IF([test "x$with_pcre" != xno],
  [AX_PATH_GENERIC([pcre],
    [], dnl Minimal version of PCRE we need -- accept any
    [], dnl custom sed script for version parsing is not needed
    [AC_DEFINE([HAVE_PCRE], [1], [Define if you have PCRE library])
     LIBS="$LIBS $PCRE_LIBS"
     CPPFLAGS="$CPPFLAGS $PCRE_CFLAGS"
    ],
    [AC_MSG_FAILURE([
        Cannot find pcre-config script from PCRE (Perl Compatible Regular Expressions)
        library package. This dependency is needed for configure to complete,
        Either:
        - Install the PCRE developer package on your system (preferred approach).
        - Download the PCRE source tarball, build and install on your system
          as you would for any package built from source distribution.
        - Use the Tools/pcre-build.sh script to build PCRE just for SWIG to statically
          link against. Run 'Tools/pcre-build.sh --help' for instructions.
          (quite easy and does not require privileges to install PCRE on your system)
        - Use configure --without-pcre to disable regular expressions support in SWIG
          (not recommended).])
    ])
  ])


dnl CCache
AC_ARG_ENABLE([ccache], AS_HELP_STRING([--disable-ccache], [disable building and installation of ccache-swig executable (default enabled)]), [enable_ccache=$enableval], [enable_ccache=yes])
AC_MSG_CHECKING([whether to enable ccache-swig])
AC_MSG_RESULT([$enable_ccache])

if test "$enable_ccache" = yes; then
  AC_CONFIG_SUBDIRS(CCache)
  ENABLE_CCACHE=1
fi
AC_SUBST(ENABLE_CCACHE)


echo ""
echo "Checking packages required for SWIG developers."
echo "Note : None of the following packages are required for users to compile and install SWIG from the distributed tarball"
echo ""

AC_PROG_YACC
AC_PROG_RANLIB
AC_CHECK_PROGS(AR, ar aal, ar)
AC_SUBST(AR)
AC_CHECK_PROGS(YODL2MAN, yodl2man)
AC_CHECK_PROGS(YODL2HTML, yodl2html)

if test -n "$YODL2MAN"; then
  AC_MSG_CHECKING([yodl2man version >= 2.02])
  [yodl_version=`$YODL2MAN --version 2>&1 | grep 'yodl version' | sed 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.*[0-9]*\).*/\1/g'`]
  AX_COMPARE_VERSION([$yodl_version],[ge],[2.02], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no - $yodl_version found])])
fi

if test -n "$YODL2HTML"; then
  AC_MSG_CHECKING([yodl2html version >= 2.02])
  [yodl_version=`$YODL2HTML --version 2>&1 | grep 'yodl version' | sed 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/g'`]
  AX_COMPARE_VERSION([$yodl_version],[ge],[2.02], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no - $yodl_version found])])
fi

echo ""
echo "Checking for installed target languages and other information in order to compile and run"
echo "the examples and test-suite invoked by 'make check'."
echo "Note : None of the following packages are required for users to compile and install SWIG from the distributed tarball"
echo ""

dnl Some test cases require Boost
AX_BOOST_BASE(,,,)
AC_SUBST(BOOST_CPPFLAGS)

dnl How to specify include directories that may be system directories.
# -I should not be used on system directories (GCC)
if test "$GCC" = yes; then
    ISYSTEM="-isystem "
else
    ISYSTEM="-I"
fi
AC_MSG_NOTICE(ISYSTEM: $ISYSTEM)

dnl Info for building shared libraries ... in order to run the examples

# SO is the extension of shared libraries (including the dot!)
AC_MSG_CHECKING(SO)
if test -z "$SO"
then
	case $host in
	*-*-hp*) SO=.sl;;
	*-*-darwin*) SO=.bundle;;
	*-*-cygwin* | *-*-mingw*) SO=.dll;;
	*) SO=.so;;
	esac
fi
AC_MSG_RESULT($SO)

# LDSHARED is the ld *command* used to create shared library
# -- "ld" on SunOS 4.x.x, "ld -G" on SunOS 5.x, "ld -shared" on IRIX 5
# (Shared libraries in this instance are shared modules to be loaded into
# Python, as opposed to building Python itself as a shared library.)
AC_MSG_CHECKING(LDSHARED)
if test -z "$LDSHARED"
then
	case $host in
	*-*-aix*) LDSHARED="\$(srcdir)/ld_so_aix \$(CC)";;
	*-*-cygwin* | *-*-mingw*)
            if test "$GCC" = yes; then
                LDSHARED="$CC -shared"
            else
                if test "cl" = $CC ;  then
                    # Microsoft Visual C++ (MSVC)
                    LDSHARED="$CC -nologo -LD"
                else
                    # Unknown compiler try gcc approach
                    LDSHARED="$CC -shared"
                fi
            fi ;;
	*-*-irix5*) LDSHARED="ld -shared";;
	*-*-irix6*) LDSHARED="ld ${SGI_ABI} -shared -all";;
	*-*-sunos4*) LDSHARED="ld";;
	*-*-solaris*) LDSHARED="ld -G";;
	*-*-hp*) LDSHARED="ld -b";;
	*-*-osf*) LDSHARED="ld -shared -expect_unresolved \"*\"";;
	*-sequent-sysv4) LDSHARED="ld -G";;
	*-*-next*)
		if test "$ns_dyld"
		then LDSHARED='$(CC) $(LDFLAGS) -bundle -prebind'
		else LDSHARED='$(CC) $(CFLAGS) -nostdlib -r'
		fi
                if test "$with_next_framework" ; then
		    LDSHARED="$LDSHARED \$(LDLIBRARY)"
		fi ;;
	*-*-linux*) LDSHARED="gcc -shared";;
	*-*-dgux*) LDSHARED="ld -G";;
	*-*-freebsd3*) LDSHARED="gcc -shared";;
	*-*-freebsd* | *-*-openbsd*) LDSHARED="ld -Bshareable";;
	*-*-netbsd*)
		if [[ "`$CC -dM -E - </dev/null | grep __ELF__`" != "" ]]
		then
			LDSHARED="cc -shared"
		else
			LDSHARED="ld -Bshareable"
		fi;;
	*-sco-sysv*) LDSHARED="cc -G -KPIC -Ki486 -belf -Wl,-Bexport";;
	*-*-darwin*) LDSHARED="cc -bundle -undefined suppress -flat_namespace";;
	*)	LDSHARED="ld";;
	esac
fi
AC_MSG_RESULT($LDSHARED)
# CXXSHARED is the ld *command* used to create C++ shared library
# -- "ld" on SunOS 4.x.x, "ld -G" on SunOS 5.x, "ld -shared" on IRIX 5
# (Shared libraries in this instance are shared modules to be loaded into
# Python, as opposed to building Python itself as a shared library.)
AC_MSG_CHECKING(CXXSHARED)
if test -z "$CXXSHARED"
then
	CXXSHARED="$LDSHARED"
fi
AC_MSG_RESULT($CXXSHARED)

#
AC_MSG_CHECKING(TRYLINKINGWITHCXX)
if test -z "$TRYLINKINGWITHCXX"
then
	case $host in
	*-*-solaris*) if test "$GCC" = yes
             then TRYLINKINGWITHCXX="CXXSHARED= $CXX -Wl,-G"
             else TRYLINKINGWITHCXX="CXXSHARED= $CXX -G -L/opt/SUNWspro/lib -lCrun -lCstd"
             fi;;
        *-*-hp*) TRYLINKINGWITHCXX="CXXSHARED= $CXX +z ";;
        *-*-darwin*) TRYLINKINGWITHCXX="CXXSHARED= $CXX -bundle -undefined suppress -flat_namespace";;
        *-*-cygwin* | *-*-mingw*)
            if test "$GCC" = yes; then
                TRYLINKINGWITHCXX="CXXSHARED= $CXX -shared "
            else
                if test "cl" = $CXX ;  then
                    # Microsoft Visual C++ (MSVC)
                    TRYLINKINGWITHCXX="CXXSHARED= $CXX -nologo -LD"
                else
                    TRYLINKINGWITHCXX="#unknown Windows compiler"
                fi
            fi ;;
        *)       TRYLINKINGWITHCXX="CXXSHARED= $CXX -shared ";;
        esac
fi
AC_MSG_RESULT($TRYLINKINGWITHCXX)
# CCSHARED are the C *flags* used to create objects to go into a shared
# library (module) -- this is only needed for a few systems
AC_MSG_CHECKING(CCSHARED)
if test -z "$CCSHARED"
then
	case $host in
	*-*-hp*) if test "$GCC" = yes
		 then CCSHARED="-fpic"
		 else CCSHARED="+z"
		 fi;;
	*-*-linux*) CCSHARED="-fpic";;
	*-*-freebsd* | *-*-openbsd*) CCSHARED="-fpic";;
	*-*-netbsd*) CCSHARED="-fPIC";;
	*-sco-sysv*) CCSHARED="-KPIC -dy -Bdynamic";;
	*-*-irix6*)  case $CC in
		   *gcc*) CCSHARED="-shared";;
		   *) CCSHARED="";;
		   esac;;
	esac
fi
AC_MSG_RESULT($CCSHARED)

# RPATH is the path used to look for shared library files.
AC_MSG_CHECKING(RPATH)
if test -z "$RPATH"
then
	case $host in
	*-*-solaris*) RPATH='-R. -R$(exec_prefix)/lib';;
        *-*-irix*) RPATH='-rpath .:$(exec_prefix)/lib';;
	*-*-linux*) RPATH='-Xlinker -rpath $(exec_prefix)/lib -Xlinker -rpath .';;
	*)	RPATH='';;
	esac
fi
AC_MSG_RESULT($RPATH)

# LINKFORSHARED are the flags passed to the $(CC) command that links
# the a few executables -- this is only needed for a few systems

AC_MSG_CHECKING(LINKFORSHARED)
if test -z "$LINKFORSHARED"
then
	case $host in
	*-*-aix*)	LINKFORSHARED='-Wl,-bE:$(srcdir)/python.exp -lld';;
	*-*-hp*)
	    LINKFORSHARED="-Wl,-E -Wl,+s -Wl,+b\$(BINLIBDEST)/lib-dynload";;
	*-*-linux*) LINKFORSHARED="-Xlinker -export-dynamic";;
	*-*-next*) LINKFORSHARED="-u libsys_s";;
	*-sco-sysv*) LINKFORSHARED="-Bdynamic -dy -Wl,-Bexport";;
	*-*-irix6*) LINKFORSHARED="-all";;
	esac
fi
AC_MSG_RESULT($LINKFORSHARED)

# Optional CFLAGS used to silence/enhance compiler warnings on some platforms.
AC_MSG_CHECKING(PLATCFLAGS)
case $host in
  *-*-solaris*) if test "$GCC" = yes
    then PLATCFLAGS=
    else PLATCFLAGS=
      #    else PLATCFLAGS="-errtags=yes" # Need more work as C examples use ld for linking
    fi;;
  *) PLATCFLAGS=
esac
AC_MSG_RESULT($PLATCFLAGS)

# Add switch if necessary to enable C++11 support - just for tests
AC_ARG_ENABLE([cpp11-testing], AS_HELP_STRING([--enable-cpp11-testing], [enable C++11 testing if supported by compiler (default disabled)]), [enable_cpp11_testing=$enableval], [enable_cpp11_testing=no])
AC_MSG_CHECKING([whether to enable C++11 testing])
AC_MSG_RESULT([$enable_cpp11_testing])

PLATCXXFLAGS="$PLATCFLAGS"
if test x"$enable_cpp11_testing" = xyes; then 
  AC_LANG_PUSH([C++])
  CXXFLAGS_SAVED=$CXXFLAGS
  AX_CXX_COMPILE_STDCXX_11([noext], [nostop])
  CXXFLAGS=$CXXFLAGS_SAVED
  AC_LANG_POP([C++])
  if test x"$CXX11FLAGS" != x; then
    PLATCXXFLAGS="$CXX11FLAGS $PLATCXXFLAGS"
  fi
  AC_MSG_CHECKING([for C++11 enabled compiler])
  if test x"$HAVE_CXX11_COMPILER" = x; then
    AC_MSG_RESULT([no])
  else
    AC_MSG_RESULT([$HAVE_CXX11_COMPILER])
  fi
fi

# On darwin 10.7,10.8,10.9 using clang++, need to ensure using
# libc++ for tests and examples to run under mono. May affect 
# other language targets as well - problem is an OSX incompatibility
# between libraries depending on libstdc++ and libc++.
CLANGXX=
$CXX -v 2>&1 | grep -i clang >/dev/null && CLANGXX=yes
case $host in
  *-*-darwin11* | *-*-darwin12* |*-*-darwin13*  ) if test "$CLANGXX" = "yes";
    then PLATCXXFLAGS="$PLATCXXFLAGS -stdlib=libc++"
    fi;;
  *) ;;
esac

# Set info about shared libraries.
AC_SUBST(SO)
AC_SUBST(LDSHARED)
AC_SUBST(CCSHARED)
AC_SUBST(CXXSHARED)
AC_SUBST(TRYLINKINGWITHCXX)
AC_SUBST(RPATH)
AC_SUBST(PLATCFLAGS)
AC_SUBST(PLATCXXFLAGS)
AC_SUBST(HAVE_CXX11_COMPILER)
AC_SUBST(LINKFORSHARED)

# This variation is needed on OS-X because there is no (apparent) consistency in shared library naming.
# Sometimes .bundle works, but sometimes .so is needed.  It depends on the target language

AC_SUBST(PYTHON_SO)
case $host in
   *-*-mingw*) PYTHON_SO=.pyd;;
   *-*-darwin*) PYTHON_SO=.so;;
   *) PYTHON_SO=$SO;;
esac

AC_SUBST(TCL_SO)
case $host in
   *-*-darwin*) TCL_SO=.dylib;;
   *) TCL_SO=$SO;;
esac

AC_SUBST(GUILE_SO)
case $host in
   *-*-darwin*) GUILE_SO=.so;;
   *) GUILE_SO=$SO;;
esac

AC_SUBST(PHP_SO)
case $host in
   *-*-darwin*) PHP_SO=.so;;
   *) PHP_SO=$SO;;
esac

AC_SUBST(MZSCHEME_SO)
case $host in
   *) MZSCHEME_SO=.so;;
esac

AC_SUBST(LUA_SO)
case $host in
   *-*-darwin*) LUA_SO=.so;;
   *) LUA_SO=$SO;;
esac

# Check for specific libraries.   Used for SWIG examples
AC_CHECK_LIB(dl, dlopen)	# Dynamic linking for SunOS/Solaris and SYSV
AC_CHECK_LIB(dld, shl_load)	# Dynamic linking for HP-UX

dnl The following three libraries (nsl,inet,socket) are needed on Sequent,
dnl and must be checked for in this order since each library depends on the
dnl preceding one.
dnl
dnl Most SVR4 platforms will need -lsocket and -lnsl.  However on SGI IRIX 5,
dnl these exist but are broken, so we use AC_SEARCH_LIBS which will only try
dnl the library if the function isn't already available without it.
AC_SEARCH_LIBS(t_open, nsl) # SVR4
AC_SEARCH_LIBS(gethostbyname, inet) # Sequent
AC_SEARCH_LIBS(socket, socket) # SVR4 sockets

AC_CHECK_LIB(swill, swill_init, [SWIGLIBS="-lswill $LIBS" SWILL="-DSWIG_SWILL"])
AC_SUBST(SWIGLIBS)
AC_SUBST(SWILL)

# check for --with-libm=...
AC_SUBST(LIBM)
LIBM=-lm
AC_ARG_WITH(libm, [  --with-libm=STRING      math library], [
if test "$withval" != yes
then LIBM=$withval
else AC_MSG_ERROR([proper usage is --with-libm=STRING])
fi])
AC_CHECK_LIB(ieee, main, [LIBM="-lieee $LIBM"])
AC_CHECK_LIB(crypt,crypt, [LIBCRYPT="-lcrypt"])
AC_SUBST(LIBCRYPT)

# check for --with-libc=...
AC_SUBST(LIBC)
AC_ARG_WITH(libc, [  --with-libc=STRING      C library], [
if test "$withval" != yes
then LIBC=$withval
else AC_MSG_ERROR([proper usage is --with-libc=STRING])
fi])

#--------------------------------------------------------------------
# Target languages
#--------------------------------------------------------------------

AC_ARG_WITH(alllang, AS_HELP_STRING([--without-alllang], [Disable all languages]), with_alllang="$withval")

AC_CHECK_PROGS(PKGCONFIG, [pkg-config])

#--------------------------------------------------------------------
# Look for Tcl
#--------------------------------------------------------------------

TCLINCLUDE=
TCLLIB=
TCLPACKAGE=

AC_ARG_WITH(tclconfig, AS_HELP_STRING([--without-tcl], [Disable Tcl])
AS_HELP_STRING([--with-tclconfig=path], [Set location of tclConfig.sh]), [with_tclconfig="$withval"], [with_tclconfig=])
AC_ARG_WITH(tcl,
 [  --with-tcl=path         Set location of Tcl package],[
	TCLPACKAGE="$withval"], [TCLPACKAGE=yes])
AC_ARG_WITH(tclincl,[  --with-tclincl=path     Set location of Tcl include directory],[
	TCLINCLUDE="$ISYSTEM$withval"], [TCLINCLUDE=])
AC_ARG_WITH(tcllib,[  --with-tcllib=path      Set location of Tcl library directory],[
	TCLLIB="-L$withval"], [TCLLIB=])

# First, check for "--without-tcl" or "--with-tcl=no".
if test x"${TCLPACKAGE}" = xno -o x"${with_alllang}" = xno; then
AC_MSG_NOTICE([Disabling Tcl])
else
AC_MSG_CHECKING([for Tcl configuration])
# First check to see if --with-tclconfig was specified.
if test x"${with_tclconfig}" != x ; then
   if test -f "${with_tclconfig}/tclConfig.sh" ; then
      TCLCONFIG=`(cd ${with_tclconfig}; pwd)`
   else
      AC_MSG_ERROR([${with_tcl} directory does not contain tclConfig.sh])
   fi
fi
# check in a few common install locations
if test x"${TCLCONFIG}" = x ; then
    for i in `ls -d -r /usr/lib*/ 2>/dev/null` \
	     `ls -d -r /usr/lib*/tcl*/ 2>/dev/null` \
	     `ls -d -r /usr/local/lib*/ 2>/dev/null` \
	     `ls -d -r /usr/local/lib*/tcl*/ 2>/dev/null` ; do
	if test -f $i"tclConfig.sh" ; then
	    TCLCONFIG=`(cd $i; pwd)`
	    break
	fi
    done
fi
if test x"${TCLCONFIG}" = x ; then
    AC_MSG_RESULT(no)
else
    AC_MSG_RESULT(found $TCLCONFIG/tclConfig.sh)
    . $TCLCONFIG/tclConfig.sh
    if test -z "$TCLINCLUDE"; then
        TCLINCLUDE=`echo $TCL_INCLUDE_SPEC | sed "s/-I/$ISYSTEM/"`
    fi
    if test -z "$TCLLIB"; then
        TCLLIB=$TCL_LIB_SPEC
    fi
fi

if test -z "$TCLINCLUDE"; then
   if test "x$TCLPACKAGE" != xyes; then
	TCLINCLUDE="$ISYSTEM$TCLPACKAGE/include"
   fi
fi

if test -z "$TCLLIB"; then
   if test "x$TCLPACKAGE" != xyes; then
	TCLLIB="-L$TCLPACKAGE/lib -ltcl"
   fi
fi

AC_MSG_CHECKING(for Tcl header files)
if test -z "$TCLINCLUDE"; then
AC_TRY_CPP([#include <tcl.h>], , TCLINCLUDE="")
if test -z "$TCLINCLUDE"; then
	dirs="/usr/local/include /usr/include /opt/local/include"
	for i in $dirs ; do
		if test -r $i/tcl.h; then
			AC_MSG_RESULT($i)
			TCLINCLUDE="$ISYSTEM$i"
			break
		fi
	done
fi
if test -z "$TCLINCLUDE"; then
    	AC_MSG_RESULT(not found)
fi
else
        AC_MSG_RESULT($TCLINCLUDE)
fi

AC_MSG_CHECKING(for Tcl library)
if test -z "$TCLLIB"; then
dirs="/usr/local/lib /usr/lib /opt/local/lib"
for i in $dirs ; do
	if test -r $i/libtcl.a; then
	    AC_MSG_RESULT($i)
	    TCLLIB="-L$i -ltcl"
	    break
	fi
done
if test -z "$TCLLIB"; then
	AC_MSG_RESULT(not found)
fi
else
AC_MSG_RESULT($TCLLIB)
fi

# Cygwin (Windows) needs the library for dynamic linking
case $host in
*-*-cygwin* | *-*-mingw*) TCLDYNAMICLINKING="$TCLLIB";;
*)TCLDYNAMICLINKING="";;
esac

case $host in
*-*-darwin*)
    TCLLDSHARED='$(CC) -dynamiclib -undefined suppress -flat_namespace'
    TCLCXXSHARED='$(CXX) -dynamiclib -undefined suppress -flat_namespace'
    ;;
*)
    TCLLDSHARED='$(LDSHARED)'
    TCLCXXSHARED='$(CXXSHARED)'
    ;;
esac

fi

AC_SUBST(TCLINCLUDE)
AC_SUBST(TCLLIB)
AC_SUBST(TCLDYNAMICLINKING)
AC_SUBST(TCLLDSHARED)
AC_SUBST(TCLCXXSHARED)

#----------------------------------------------------------------
# Look for Python
#----------------------------------------------------------------

PYINCLUDE=
PYLIB=
PYPACKAGE=

AC_ARG_WITH(python, AS_HELP_STRING([--without-python], [Disable Python])
AS_HELP_STRING([--with-python=path], [Set location of Python executable]),[ PYBIN="$withval"], [PYBIN=yes])

# First, check for "--without-python" or "--with-python=no".
if test x"${PYBIN}" = xno -o x"${with_alllang}" = xno ; then
  AC_MSG_NOTICE([Disabling Python])
else
  # First figure out the name of the Python executable
  if test "x$PYBIN" = xyes; then
    AC_CHECK_PROGS(PYTHON, [python python2.8 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 python1.6 python1.5 python1.4])
  else
    PYTHON="$PYBIN"
  fi

  if test -n "$PYTHON"; then
    AC_MSG_CHECKING(for Python prefix)
    PYPREFIX=`($PYTHON -c "import sys; print sys.prefix") 2>/dev/null`
    AC_MSG_RESULT($PYPREFIX)
    AC_MSG_CHECKING(for Python exec-prefix)
    PYEPREFIX=`($PYTHON -c "import sys; print sys.exec_prefix") 2>/dev/null`
    AC_MSG_RESULT($PYEPREFIX)


    # Note: I could not think of a standard way to get the version string from different versions.
    # This trick pulls it out of the file location for a standard library file.

    AC_MSG_CHECKING(for Python version)

    # Need to do this hack since autoconf replaces __file__ with the name of the configure file
    filehack="file__"
    PYVERSION=`($PYTHON -c "import string,operator,os.path; print operator.getitem(os.path.split(operator.getitem(os.path.split(string.__$filehack),0)),1)")`
    AC_MSG_RESULT($PYVERSION)

    # Find the directory for libraries this is necessary to deal with
    # platforms that can have apps built for multiple archs: e.g. x86_64
    AC_MSG_CHECKING(for Python lib dir)
    PYLIBDIR=`($PYTHON -c "import sys; print sys.lib") 2>/dev/null`
    if test -z "$PYLIBDIR"; then
      # Fedora patch Python to add sys.lib, for other distros we assume "lib".
      PYLIBDIR="lib"
    fi
    AC_MSG_RESULT($PYLIBDIR)

    # Set the include directory

    AC_MSG_CHECKING(for Python header files)
    if test -r $PYPREFIX/include/$PYVERSION/Python.h; then
      PYINCLUDE="-I$PYPREFIX/include/$PYVERSION -I$PYEPREFIX/$PYLIBDIR/$PYVERSION/config"
    fi
    if test -z "$PYINCLUDE"; then
      if test -r $PYPREFIX/include/Py/Python.h; then
        PYINCLUDE="-I$PYPREFIX/include/Py -I$PYEPREFIX/$PYLIBDIR/python/lib"
      fi
    fi
    AC_MSG_RESULT($PYINCLUDE)

    # Set the library directory blindly.   This probably won't work with older versions
    AC_MSG_CHECKING(for Python library)
    dirs="$PYVERSION/config $PYVERSION/$PYLIBDIR python/$PYLIBDIR"
    for i in $dirs; do
      if test -d $PYEPREFIX/$PYLIBDIR/$i; then
        PYLIB="$PYEPREFIX/$PYLIBDIR/$i"
        break
      fi
    done
    if test -z "$PYLIB"; then
      AC_MSG_RESULT(Not found)
    else
      AC_MSG_RESULT($PYLIB)
    fi

    PYLINK="-l$PYVERSION"
  fi

  # Cygwin (Windows) needs the library for dynamic linking
  case $host in
  *-*-cygwin* | *-*-mingw*)
    PYTHONDYNAMICLINKING="-L$PYLIB $PYLINK"
    DEFS="-DUSE_DL_IMPORT $DEFS"
    ;;
  *)PYTHONDYNAMICLINKING="";;
  esac
fi

AC_SUBST(PYINCLUDE)
AC_SUBST(PYLIB)
AC_SUBST(PYLINK)
AC_SUBST(PYTHONDYNAMICLINKING)


#----------------------------------------------------------------
# Look for Python 3.x
#----------------------------------------------------------------

# mostly copy & pasted from "Look for Python" section,
# did some trim, fix and rename

PY3INCLUDE=
PY3LIB=
PY3PACKAGE=

AC_ARG_WITH(python3, AS_HELP_STRING([--without-python3], [Disable Python 3.x support])
AS_HELP_STRING([--with-python3=path], [Set location of Python 3.x executable]),[ PY3BIN="$withval"], [PY3BIN=yes])

# First, check for "--without-python3" or "--with-python3=no".
if test x"${PY3BIN}" = xno -o x"${with_alllang}" = xno ; then
  AC_MSG_NOTICE([Disabling Python 3.x support])
else
  if test "x$PY3BIN" = xyes; then
    for py_ver in 3 3.6 3.5 3.4 3.3 3.2 3.1 3.0; do
      AC_CHECK_PROGS(PYTHON3, [python$py_ver])
      if test -n "$PYTHON3"; then
        AC_CHECK_PROGS(PY3CONFIG, [$PYTHON3-config])
        if test -n "$PY3CONFIG"; then
          break
        fi
      fi
    done
  else
    PYTHON3="$PY3BIN"
    AC_CHECK_PROGS(PY3CONFIG, [$PYTHON3-config])
  fi


  if test -n "$PYTHON3" -a -n "$PY3CONFIG"; then
    AC_MSG_CHECKING([for Python 3.x prefix])
    PY3PREFIX=`($PY3CONFIG --prefix) 2>/dev/null`
    AC_MSG_RESULT($PY3PREFIX)
    AC_MSG_CHECKING(for Python 3.x exec-prefix)
    PY3EPREFIX=`($PY3CONFIG --exec-prefix) 2>/dev/null`
    AC_MSG_RESULT($PY3EPREFIX)

    # Note: I could not think of a standard way to get the version string from different versions.
    # This trick pulls it out of the file location for a standard library file.

    AC_MSG_CHECKING([for Python 3.x version])

    # Need to do this hack since autoconf replaces __file__ with the name of the configure file
    filehack="file__"
    PY3VERSION=`($PYTHON3 -c "import string,operator,os.path; print(operator.getitem(os.path.split(operator.getitem(os.path.split(string.__$filehack),0)),1))")`
    AC_MSG_RESULT($PY3VERSION)

    # Find the directory for libraries this is necessary to deal with
    # platforms that can have apps built for multiple archs: e.g. x86_64
    AC_MSG_CHECKING([for Python 3.x lib dir])
    PY3LIBDIR=`($PYTHON3 -c "import sys; print(sys.lib)") 2>/dev/null`
    if test -z "$PY3LIBDIR"; then
      # some dists don't have sys.lib  so the best we can do is assume lib
      PY3LIBDIR="lib"
    fi
    AC_MSG_RESULT($PY3LIBDIR)

    # Set the include directory

    AC_MSG_CHECKING([for Python 3.x header files])
    PY3INCLUDE=`($PY3CONFIG --includes) 2>/dev/null`
    AC_MSG_RESULT($PY3INCLUDE)

    # Set the library directory blindly.   This probably won't work with older versions
    AC_MSG_CHECKING([for Python 3.x library])
    dirs="$PY3VERSION/config $PY3VERSION/$PY3LIBDIR python/$PY3LIBDIR"
    for i in $dirs; do
      if test -d $PY3EPREFIX/$PY3LIBDIR/$i; then
        PY3LIB="$PY3EPREFIX/$PY3LIBDIR/$i"
        break
      fi
    done
    if test -z "$PY3LIB"; then
      AC_MSG_RESULT([Not found])
    else
      AC_MSG_RESULT($PY3LIB)
    fi

    PY3LINK="-l$PY3VERSION"
  fi

  # Cygwin (Windows) needs the library for dynamic linking
  case $host in
  *-*-cygwin* | *-*-mingw*)
    PYTHON3DYNAMICLINKING="-L$PYLIB $PY3LINK"
    DEFS="-DUSE_DL_IMPORT $DEFS"
    ;;
  *)PYTHON3DYNAMICLINKING="";;
  esac
fi

AC_SUBST(PY3INCLUDE)
AC_SUBST(PY3LIB)
AC_SUBST(PY3LINK)
AC_SUBST(PYTHON3DYNAMICLINKING)
AC_CHECK_PROGS(PEP8, pep8)

#----------------------------------------------------------------
# Look for Perl5
#----------------------------------------------------------------

PERLBIN=

AC_ARG_WITH(perl5, AS_HELP_STRING([--without-perl5], [Disable Perl5])
AS_HELP_STRING([--with-perl5=path], [Set location of Perl5 executable]),[ PERLBIN="$withval"], [PERLBIN=yes])

# First, check for "--without-perl5" or "--with-perl5=no".
if test x"${PERLBIN}" = xno -o x"${with_alllang}" = xno ; then
AC_MSG_NOTICE([Disabling Perl5])
PERL=
else

# First figure out what the name of Perl5 is

if test "x$PERLBIN" = xyes; then
AC_CHECK_PROGS(PERL, perl perl5.6.1 perl5.6.0 perl5.004 perl5.003 perl5.002 perl5.001 perl5 perl)
else
PERL="$PERLBIN"
fi


# This could probably be simplified as for all platforms and all versions of Perl the following apparently should be run to get the compilation options:
# perl -MExtUtils::Embed -e ccopts
AC_MSG_CHECKING(for Perl5 header files)
if test -n "$PERL"; then
	PERL5DIR=`($PERL -MConfig -le 'print $Config{archlibexp}') 2>/dev/null`
	if test -n "$PERL5DIR" ; then
		dirs="$PERL5DIR $PERL5DIR/CORE"
		PERL5EXT=none
		for i in $dirs; do
			if test -r $i/perl.h; then
				AC_MSG_RESULT($i)
				PERL5EXT="$i"
				break
			fi
		done
		if test "$PERL5EXT" = none; then
			PERL5EXT="$PERL5DIR/CORE"
			AC_MSG_RESULT(could not locate perl.h...using $PERL5EXT)
		fi

		AC_MSG_CHECKING(for Perl5 library)
		PERL5LIB=`($PERL -e 'use Config; $_=$Config{libperl}; s/^lib//; s/$Config{_a}$//; s/\.$Config{so}.*//; print $_, "\n"') 2>/dev/null`
		if test -z "$PERL5LIB" ; then
			AC_MSG_RESULT(not found)
		else
			AC_MSG_RESULT($PERL5LIB)
		fi
    AC_MSG_CHECKING(for Perl5 ccflags)
 		PERL5CCFLAGS=`($PERL -e 'use Config; print $Config{ccflags}, "\n"' | sed "s/-Wdeclaration-after-statement//" | sed "s/-I/$ISYSTEM/") 2>/dev/null`
 		if test -z "$PERL5CCFLAGS" ; then
 			AC_MSG_RESULT(not found)
 		else
 			AC_MSG_RESULT($PERL5CCFLAGS)
 		fi
    AC_MSG_CHECKING(for Perl5 ccdlflags)
    PERL5CCDLFLAGS=`($PERL -e 'use Config; print $Config{ccdlflags}, "\n"') 2>/dev/null`
    if test -z "$PERL5CCDLFLAGS" ; then
      AC_MSG_RESULT(not found)
      else
      AC_MSG_RESULT($PERL5CCDLFLAGS)
    fi
    AC_MSG_CHECKING(for Perl5 cccdlflags)
    PERL5CCCDLFLAGS=`($PERL -e 'use Config; print $Config{cccdlflags}, "\n"') 2>/dev/null`
    if test -z "$PERL5CCCDLFLAGS" ; then
      AC_MSG_RESULT(not found)
      else
      AC_MSG_RESULT($PERL5CCCDLFLAGS)
    fi
    AC_MSG_CHECKING(for Perl5 ldflags)
    PERL5LDFLAGS=`($PERL -e 'use Config; print $Config{ldflags}, "\n"') 2>/dev/null`
    if test -z "$PERL5LDFLAGS" ; then
      AC_MSG_RESULT(not found)
      else
      AC_MSG_RESULT($PERL5LDFLAGS)
    fi
    AC_MSG_CHECKING(for Perl5 Test::More module) # For test-suite
    PERL5TESTMORE=`($PERL -e 'use Test::More; print "good";') 2>/dev/null`
    if test -z "$PERL5TESTMORE" ; then
      AC_MSG_RESULT(not found)
      else
      AC_MSG_RESULT(found)
    fi
	else
		AC_MSG_RESULT(unable to determine perl5 configuration)
		PERL5EXT=$PERL5DIR
	fi
else
       	AC_MSG_RESULT(could not figure out how to run perl5)
fi

# Cygwin (Windows) needs the library for dynamic linking
case $host in
*-*-cygwin* | *-*-mingw*) PERL5DYNAMICLINKING="-L$PERL5EXT -l$PERL5LIB";;
*)PERL5DYNAMICLINKING="";;
esac
fi

AC_SUBST(PERL)
AC_SUBST(PERL5EXT)
AC_SUBST(PERL5DYNAMICLINKING)
AC_SUBST(PERL5LIB)
AC_SUBST(PERL5CCFLAGS)
AC_SUBST(PERL5CCDLFLAGS)
AC_SUBST(PERL5CCCDLFLAGS)
AC_SUBST(PERL5LDFLAGS)

#----------------------------------------------------------------
# Look for Octave
#----------------------------------------------------------------

OCTAVEBIN=
OCTAVE_SO=.oct

AC_ARG_WITH(octave, AS_HELP_STRING([--without-octave], [Disable Octave])
AS_HELP_STRING([--with-octave=path], [Set location of Octave executable]),[OCTAVEBIN="$withval"], [OCTAVEBIN=yes])

# First, check for "--without-octave" or "--with-octave=no".
if test x"${OCTAVEBIN}" = xno -o x"${with_alllang}" = xno ; then
   AC_MSG_NOTICE([Disabling Octave])
   OCTAVE=

# First figure out what the name of Octave is
elif test "x$OCTAVEBIN" = xyes; then
   AC_PATH_PROG(OCTAVE, [octave])

else
   OCTAVE="$OCTAVEBIN"
fi

if test -n "$OCTAVE"; then
   AC_MSG_CHECKING([for mkoctfile])
   mkoctfile="`dirname ${OCTAVE}`/mkoctfile"
   AS_IF([test -x "${mkoctfile}"],[
      AC_MSG_RESULT([${mkoctfile}])
   ],[
      AC_MSG_RESULT([not found, disabling Octave])
      OCTAVE=
   ])
fi
if test -n "$OCTAVE"; then
   AC_MSG_CHECKING([for Octave preprocessor flags])
   OCTAVE_CPPFLAGS=
   for var in CPPFLAGS INCFLAGS ALL_CXXFLAGS; do
      for flag in `env - ${mkoctfile} -p ${var}`; do
         case ${flag} in
            -D*|-I*) OCTAVE_CPPFLAGS="${OCTAVE_CPPFLAGS} ${flag}";;
            *) ;;
         esac
      done
   done
   AC_MSG_RESULT([$OCTAVE_CPPFLAGS])
   AC_MSG_CHECKING([for Octave compiler flags])
   OCTAVE_CXXFLAGS=
   for var in ALL_CXXFLAGS; do
      for flag in `env - ${mkoctfile} -p ${var}`; do
         case ${flag} in
            -g*|-W*) OCTAVE_CXXFLAGS="${OCTAVE_CXXFLAGS} ${flag}";;
            *) ;;
         esac
      done
   done
   save_CXXFLAGS="${CXXFLAGS}"
   CXXFLAGS="-Werror -O0"
   AC_COMPILE_IFELSE([
      AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT],[])
   ],[
      OCTAVE_CXXFLAGS="${OCTAVE_CXXFLAGS} -O0"
   ])
   CXXFLAGS="${save_CXXFLAGS}"
   AC_MSG_RESULT([$OCTAVE_CXXFLAGS])
   AC_MSG_CHECKING([for Octave linker flags])
   OCTAVE_LDFLAGS=
   for var in RDYNAMIC_FLAG LFLAGS RLD_FLAG OCTAVE_LIBS LIBS; do
     OCTAVE_LDFLAGS="${OCTAVE_LDFLAGS} "`env - ${mkoctfile} -p ${var}`
   done
   AC_MSG_RESULT([$OCTAVE_LDFLAGS])
   for octave_opt in --silent --norc --no-history --no-window-system; do
      AC_MSG_CHECKING([if Octave option '${octave_opt}' is supported])
      octave_out=`${OCTAVE} ${octave_opt} /dev/null 2>&1 | sed -n '1p' | sed -n '/unrecognized/p'`
      AS_IF([test "x${octave_out}" = x],[
         AC_MSG_RESULT([yes])
         OCTAVE="${OCTAVE} ${octave_opt}"
      ],[
         AC_MSG_RESULT([no])
      ])
   done
fi

AC_SUBST(OCTAVE)
AC_SUBST(OCTAVE_SO)
AC_SUBST(OCTAVE_CPPFLAGS)
AC_SUBST(OCTAVE_CXXFLAGS)
AC_SUBST(OCTAVE_LDFLAGS)

#----------------------------------------------------------------
# Look for java
#----------------------------------------------------------------

AC_ARG_WITH(java, AS_HELP_STRING([--without-java], [Disable Java])
AS_HELP_STRING([--with-java=path], [Set location of java executable]),[JAVABIN="$withval"], [JAVABIN=yes])
AC_ARG_WITH(javac, [  --with-javac=path       Set location of javac executable],[JAVACBIN="$withval"], [JAVACBIN=])

# First, check for "--without-java" or "--with-java=no".
if test x"${JAVABIN}" = xno -o x"${with_alllang}" = xno ; then
AC_MSG_NOTICE([Disabling Java])
JAVA=
else

if test "x$JAVABIN" = xyes; then
  AC_CHECK_PROGS(JAVA, java kaffe guavac)
else
  JAVA="$JAVABIN"
fi

if test -z "$JAVACBIN"; then
  AC_CHECK_PROGS(JAVAC, javac)
else
  JAVAC="$JAVACBIN"
fi

AC_MSG_CHECKING(for java include file jni.h)
AC_ARG_WITH(javaincl, [  --with-javaincl=path    Set location of Java include directory], [JAVAINCDIR="$withval"], [JAVAINCDIR=])

if test -z "$JAVAINCDIR" ; then
  JAVAINCDIR="/usr/j2sdk*/include /usr/local/j2sdk*/include /usr/jdk*/include /usr/local/jdk*/include /opt/j2sdk*/include /opt/jdk*/include /usr/java/include /usr/java/j2sdk*/include /usr/java/jdk*/include /usr/local/java/include /opt/java/include /usr/include/java /usr/local/include/java /usr/lib/java/include /usr/lib/jvm/java*/include /usr/lib64/jvm/java*/include /usr/include/kaffe /usr/local/include/kaffe /usr/include"

  # Add in default installation directory on Windows for Cygwin
  case $host in
  *-*-cygwin* | *-*-mingw*) JAVAINCDIR="c:/Program*Files/Java/jdk*/include d:/Program*Files/Java/jdk*/include c:/j2sdk*/include d:/j2sdk*/include c:/jdk*/include d:/jdk*/include $JAVAINCDIR";;
  *-*-darwin*) JAVAINCDIR="/System/Library/Frameworks/JavaVM.framework/Headers $JAVAINCDIR";;
  *);;
  esac
fi

JAVAINC=""
for d in $JAVAINCDIR ; do
  if test -r "$d/jni.h" ; then
    AC_MSG_RESULT($d)
    JAVAINCDIR=$d
    JAVAINC=-I\"$d\"
    break
  fi
done

if test "$JAVAINC" = "" ; then
  AC_MSG_RESULT(not found)
else
  # now look for <arch>/jni_md.h
  AC_MSG_CHECKING(for java include file jni_md.h)
  JAVAMDDIR=`find "$JAVAINCDIR" -follow -name jni_md.h -print`
  if test "$JAVAMDDIR" = "" ; then
    AC_MSG_RESULT(not found)
  else
    JAVAMDDIR=`dirname "$JAVAMDDIR" | tail -1`
    JAVAINC="${JAVAINC} -I\"$JAVAMDDIR\""
    AC_MSG_RESULT($JAVAMDDIR)
  fi
fi

# java.exe on Cygwin requires the Windows standard (Pascal) calling convention as it is a normal Windows executable and not a Cygwin built executable
case $host in
*-*-cygwin* | *-*-mingw*)
    if test "$GCC" = yes; then
        JAVADYNAMICLINKING=" -mno-cygwin -mthreads -Wl,--add-stdcall-alias"
        JAVACFLAGS="-mno-cygwin -mthreads"
    else
        JAVADYNAMICLINKING=""
        JAVACFLAGS=""
    fi ;;
*-*-darwin*)
        JAVADYNAMICLINKING="-dynamiclib -framework JavaVM"
        JAVACFLAGS=""
        ;;
*)
        JAVADYNAMICLINKING=""
        JAVACFLAGS=""
        ;;
esac

# Java on Windows platforms including Cygwin doesn't use libname.dll, rather name.dll when loading dlls
case $host in
*-*-cygwin* | *-*-mingw*) JAVALIBRARYPREFIX="";;
*)JAVALIBRARYPREFIX="lib";;
esac

# Java on Mac OS X tweaks
case $host in
*-*-darwin*)
    JAVASO=".jnilib"
    JAVALDSHARED='$(CC)'
    JAVACXXSHARED='$(CXX)'
    ;;
*)
    JAVASO=$SO
    JAVALDSHARED='$(LDSHARED)'
    JAVACXXSHARED='$(CXXSHARED)'
    ;;
esac
fi

AC_SUBST(JAVA)
AC_SUBST(JAVAC)
AC_SUBST(JAVAINC)
AC_SUBST(JAVADYNAMICLINKING)
AC_SUBST(JAVALIBRARYPREFIX)
AC_SUBST(JAVASO)
AC_SUBST(JAVALDSHARED)
AC_SUBST(JAVACXXSHARED)
AC_SUBST(JAVACFLAGS)

#----------------------------------------------------------------
# Look for Javascript
#----------------------------------------------------------------
AC_ARG_WITH(javascript, AS_HELP_STRING([--without-javascript], [Disable Javascript]), [with_javascript="$withval"], [with_javascript=yes])

# First, check for "--without-javascript" or "--with-javascript=no".
if test x"${with_javascript}" = xno -o x"${with_alllang}" = xno ; then
  AC_MSG_NOTICE([Disabling Javascript])
  JAVASCRIPT=
else
  JAVASCRIPT=1

  #----------------------------------------------------------------
  # General Javascript settings shared by JSC and V8
  #----------------------------------------------------------------

  case $host in
  *-*-darwin*)
    JSSO=".dylib"
    # HACK: didn't manage to get dynamic module loading working with a g++ compiled interpreter
    JSINTERPRETERCXX='c++'
    JSINTERPRETERLINKFLAGS='-g -Wl,-search_paths_first -Wl,-headerpad_max_install_names'
    ;;
  *)
    JSSO=$SO
    JSINTERPRETERCXX='$(CXX)'
    JSINTERPRETERLINKFLAGS='-ldl'
    ;;
  esac

  #----------------------------------------------------------------
  # Look for Node.js which is the default Javascript engine
  #----------------------------------------------------------------

  AC_CHECK_PROGS(NODEJS, node)

  if test -n "$NODEJS"; then
    # node-gyp is needed to run the test-suite/examples
    AC_CHECK_PROGS(NODEGYP, node-gyp)
    if test -z "$NODEGYP"; then
      NODEJS=
    fi
  fi

  #----------------------------------------------------------------
  # Look for JavascriptCore (Webkit) settings (JSCOREINCDIR, JSCOREDYNAMICLINKING)
  #----------------------------------------------------------------

  # check for include files
  AC_MSG_CHECKING(for JavaScriptCore/JavaScript.h)
  AC_ARG_WITH(jscoreinc, [  --with-jscinc=path    Set location of Javascript include directory], [JSCOREINCDIR="$withval"], [JSCOREINCDIR=])

  JSCOREVERSION=

  if test -z "$JSCOREINCDIR"; then
    JSCOREINCDIR="/usr/include/ /usr/local/include/"

    # Add in default directory for JavaScriptCore headers for Linux and MacOSX
    case $host in
    *-*-linux*)
      JSCOREINCDIR="/usr/include/webkit-1.0/ /usr/include/webkitgtk-1.0/ /usr/local/include/webkit-1.0/JavaScriptCore/ $JSCOREINCDIR"
      ;;
    *-*-darwin*)
      JSCOREINCDIR="/System/Library/Frameworks/JavaScriptCore.framework/Headers/ $JSCOREINCDIR"
      ;;
    *)
      ;;
    esac
  fi

  for d in $JSCOREINCDIR ; do
    if test -r "$d/JavaScriptCore/JavaScript.h" || test -r "$d/JavaScript.h" ; then
      AC_MSG_RESULT($d)
      JSCOREINCDIR=$d
      JSCOREINC=-I\"$d\"
      break
    fi
  done

  if test "$JSCOREINC" = "" ; then
    AC_MSG_RESULT(not found)
  fi

  # check for JavaScriptCore/Webkit libraries
  AC_ARG_WITH(jscorelib,[  --with-jsclib =path      Set location of the JavaScriptCore/Webkit library directory],[JSCORELIB="-L$withval"], [JSCORELIB=])

  if test -z "$JSCORELIB" -a -n "$PKGCONFIG"; then
    AC_MSG_CHECKING(for JavaScriptCore/Webkit library)
    if pkg-config javascriptcoregtk-1.0; then
      JSCORELIB=`$PKGCONFIG --libs javascriptcoregtk-1.0`
      JSCOREVERSION=`$PKGCONFIG --modversion javascriptcoregtk-1.0`
    fi
    if test -z "$JSCORELIB"; then
      AC_MSG_RESULT(not found)
      JSCENABLED=
    else
      AC_MSG_RESULT([$JSCORELIB])
      JSCOREDYNAMICLINKING="$JSCORELIB"
      JSCENABLED=1
    fi
  fi

  #----------------------------------------------------------------
  # Look for V8 settings (JSV8INCDIR, JSV8DYNAMICLINKING)
  #----------------------------------------------------------------

  # check for include files
  AC_MSG_CHECKING(for V8 Javascript v8.h)
  AC_ARG_WITH(jsv8inc, [  --with-jsv8inc=path    Set location of Javascript v8 include directory], [JSV8INCDIR="$withval"])

  # if not include dir is specified we try to find
  if test -z "$JSV8INCDIR"; then
    # Add in default directory for JavaScriptCore headers for Linux and MacOSX
    case $host in
    *-*-linux*)
      JSV8INCDIR="/usr/include /usr/local/include/ $JSV8INCDIR"
      ;;
    *-*-darwin*)
      JSV8INCDIR="$JSV8INCDIR"
      ;;
    *)
      ;;
    esac
  fi

  for d in $JSV8INCDIR ; do
    if test -r "$d/v8.h" ; then
      JSV8INCDIR=$d
      JSV8INC=-I\"$d\"
      break
    fi
  done

  if test "$JSV8INC" = "" ; then
    AC_MSG_RESULT(not found)
  else
    AC_MSG_RESULT($JSV8INCDIR)
  fi

  # check for V8 library
  AC_MSG_CHECKING(for V8 Javascript library)
  AC_ARG_WITH(jsv8lib,[  --with-jsv8lib=path      Set location of V8 Javascript library directory],[JSV8LIBDIR="$withval"], [JSV8LIB=])

  v8libdirs="$JSV8LIBDIR /usr/lib64/ /usr/local/lib64/ /usr/lib/ /usr/local/lib/"
  for d in $v8libdirs ; do
    if test -r $d/libv8$JSSO; then
      JSV8LIBDIR=$d
      JSV8LIB="-L$d -lv8"
      break
    fi
  done

  if test "$JSV8LIB" = "" ; then
    AC_MSG_RESULT(not found)
    JSV8ENABLED=
  else
    AC_MSG_RESULT($JSV8LIBDIR)
    JSV8ENABLED=1
  fi


  # linking options
  case $host in
  *-*-darwin*)
    JSV8DYNAMICLINKING="$JSV8LIB"
    ;;
  *-*-linux*)
    JSV8DYNAMICLINKING="$JSV8LIB"
    ;;
  *)
    JSV8DYNAMICLINKING=""
    ;;
  esac

fi

AC_SUBST(JSINTERPRETERCXX)
AC_SUBST(JSINTERPRETERLINKFLAGS)

AC_SUBST(JSCOREINC)
AC_SUBST(JSCOREDYNAMICLINKING)
AC_SUBST(JSCOREVERSION)
AC_SUBST(JSV8INC)
AC_SUBST(JSV8DYNAMICLINKING)

AC_SUBST(JSCENABLED)
AC_SUBST(JSV8ENABLED)

AC_SUBST(NODEJS)
AC_SUBST(NODEGYP)

#----------------------------------------------------------------
# Look for gcj
#----------------------------------------------------------------

AC_ARG_WITH(gcj, AS_HELP_STRING([--without-gcj], [Disable GCJ])
AS_HELP_STRING([--with-gcj=path], [Set location of gcj executable]),[GCJBIN="$withval"], [GCJBIN=yes])
AC_ARG_WITH(gcjh, [  --with-gcjh=path        Set location of gcjh executable],[GCJHBIN="$withval"], [GCJHBIN=])

# First, check for "--without-gcj" or "--with-gcj=no".
if test x"${GCJBIN}" = xno -o x"${with_alllang}" = xno ; then
  AC_MSG_NOTICE([Disabling GCJ])
else
  if test "x$GCJBIN" = xyes; then
    AC_CHECK_PROGS(GCJ, gcj)
  else
    GCJ="$GCJBIN"
  fi

  if test -z "$GCJCBIN"; then
    AC_CHECK_PROGS(GCJH, gcjh)
  else
    GCJH="$GCJHBIN"
  fi
fi

AC_SUBST(GCJ)
AC_SUBST(GCJH)

#----------------------------------------------------------------
# Look for Android
#----------------------------------------------------------------

AC_ARG_WITH(android, AS_HELP_STRING([--without-android], [Disable Android])
AS_HELP_STRING([--with-android=path], [Set location of android executable]),[ANDROIDBIN="$withval"], [ANDROIDBIN=yes])
AC_ARG_WITH(adb, [  --with-adb=path       Set location of adb executable - Android Debug Bridge],[ADBBIN="$withval"], [ADBBIN=])
AC_ARG_WITH(ant, [  --with-ant=path       Set location of ant executable for Android],[ANTBIN="$withval"], [ANTBIN=])
AC_ARG_WITH(ndk-build, [  --with-ndk-build=path       Set location of Android ndk-build executable],[NDKBUILDBIN="$withval"], [NDKBUILDBIN=])

# First, check for "--without-android" or "--with-android=no".
if test x"${ANDROIDBIN}" = xno -o x"${with_alllang}" = xno ; then
  AC_MSG_NOTICE([Disabling Android])
  ANDROID=
else
  if test "x$ANDROIDBIN" = xyes; then
    AC_CHECK_PROGS(ANDROID, android)
  else
    ANDROID="$ANDROIDBIN"
  fi

  if test -z "$ADBBIN"; then
    AC_CHECK_PROGS(ADB, adb)
  else
    ADB="$ADBBIN"
  fi

  if test -z "$ANTBIN"; then
    AC_CHECK_PROGS(ANT, ant)
  else
    ANT="$ANTBIN"
  fi

  if test -z "$NDKBUILDBIN"; then
    AC_CHECK_PROGS(NDKBUILD, ndk-build)
  else
    NDKBUILD="$NDKBUILDBIN"
  fi
fi

AC_SUBST(ANDROID)
AC_SUBST(ADB)
AC_SUBST(ANT)
AC_SUBST(NDKBUILD)

#----------------------------------------------------------------
# Look for Guile
#----------------------------------------------------------------

GUILE=
GUILE_CFLAGS=
GUILE_LIBS=

AC_ARG_WITH(guile-config, AS_HELP_STRING([--without-guile], [Disable Guile])
	AS_HELP_STRING([--with-guile-config=path], [Set location of guile-config]),[ GUILE_CONFIG="$withval"], [GUILE_CONFIG=])
AC_ARG_WITH(guile,[  --with-guile=path       Set location of Guile executable],[
	GUILE="$withval"], [GUILE=yes])
AC_ARG_WITH(guile-cflags,[  --with-guile-cflags=cflags   Set cflags required to compile against Guile],[
	GUILE_CFLAGS="$withval"])
AC_ARG_WITH(guile-libs,[  --with-guile-libs=ldflags    Set ldflags needed to link with Guile],[
	GUILE_LIBS="$withval"])

# First, check for "--without-guile" or "--with-guile=no".
if test x"${GUILE}" = xno -o x"${with_alllang}" = xno ; then
  AC_MSG_NOTICE([Disabling Guile])
else
  if test -z "$GUILE_CONFIG" ; then
    AC_PATH_PROG(GUILE_CONFIG, guile-config)
  fi
  if test -n "$GUILE_CONFIG" ; then
    if test x"$GUILE" = xyes; then
      AC_MSG_CHECKING([for guile bindir])
      guile_bindir="`$GUILE_CONFIG info bindir`"
      AC_MSG_RESULT([$guile_bindir])
      GUILE=$guile_bindir/guile
      if ! test -f "$GUILE" ; then
	GUILE=
        AC_PATH_PROG(GUILE, guile)
      fi
    fi

    if test -f "$GUILE" ; then
      AC_MSG_CHECKING([for guile version])
      guile_version=`$GUILE -c '(display (effective-version))'`
      AC_MSG_RESULT([$guile_version])
      AC_MSG_CHECKING([for guile version >= 1.8])
      guile_good_version=`$GUILE -c '(if (>= (string->number (effective-version)) 1.8) (display "yes") (display "no"))'`
      AC_MSG_RESULT([$guile_good_version])
      if test x"$guile_good_version" != xyes ; then
        GUILE=
      fi
    fi

    if test -z "$GUILE_CFLAGS" ; then
      AC_MSG_CHECKING([for guile compile flags])
      GUILE_CFLAGS="`$GUILE_CONFIG compile`" # Note that this can sometimes be empty
      AC_MSG_RESULT([$GUILE_CFLAGS])
    fi

    if test -z "$GUILE_LIBS" ; then
      AC_MSG_CHECKING([for guile link flags])
      GUILE_LIBS="`$GUILE_CONFIG link`"
      AC_MSG_RESULT([$GUILE_LIBS])
    fi
  fi
fi

AC_SUBST(GUILE)
AC_SUBST(GUILE_CFLAGS)
AC_SUBST(GUILE_LIBS)

#----------------------------------------------------------------
# Look for MzScheme
#----------------------------------------------------------------

AC_ARG_WITH(mzscheme, AS_HELP_STRING([--without-mzscheme], [Disable MzScheme])
AS_HELP_STRING([--with-mzscheme=path], [Set location of MzScheme executable]),[ MZSCHEMEBIN="$withval"], [MZSCHEMEBIN=yes])
AC_ARG_WITH(mzc, AS_HELP_STRING([--with-mzc=path], [Set location of MzScheme's mzc]), [ MZCBIN="$withval"], [MZCBIN=])

# First, check for "--without-mzscheme" or "--with-mzscheme=no".
if test x"${MZSCHEMEBIN}" = xno -o x"${with_alllang}" = xno ; then
  AC_MSG_NOTICE([Disabling MzScheme])
  MZC=
else
  if test "x$MZSCHEMEBIN" = xyes; then
     AC_PATH_PROG(MZSCHEME, mzscheme)
  else
     MZSCHEME="$MZSCHEMEBIN"
  fi

  if test -z "$MZCBIN"; then
     AC_PATH_PROG(MZC, mzc)
  fi

  if test -n "$MZSCHEME"; then
    AC_MSG_CHECKING(for MzScheme dynext object)
    MZDYNOBJ=`$MZSCHEME --eval '(begin (require dynext/link) (with-handlers (((lambda args #t) (lambda args #f))) (for-each (lambda (x) (printf "~a" x)) (expand-for-link-variant (current-standard-link-libraries)))))' 2>/dev/null`
    if test -f "$MZDYNOBJ"; then
      :
    else
      # older versions (3.72 approx and earlier)
      MZDYNOBJ=`$MZSCHEME --mute-banner --version --eval '(begin (require (lib "link.ss" "dynext")) (with-handlers (((lambda args #t) (lambda args #f))) (for-each (lambda (x) (display x) (display " ")) ((current-make-standard-link-libraries)))) (with-handlers (((lambda args #t) (lambda args #f))) (for-each (lambda (x) (display x)) (expand-for-link-variant (current-standard-link-libraries)))))' 2>/dev/null`
    fi
    if test -f "$MZDYNOBJ"; then
      AC_MSG_RESULT($MZDYNOBJ)
    else
      AC_MSG_RESULT(not found)
      MZDYNOBJ=""
    fi
  fi
fi
AC_SUBST(MZDYNOBJ)

#----------------------------------------------------------------
# Look for Ruby
#----------------------------------------------------------------

RUBYBIN=

AC_ARG_WITH(ruby, AS_HELP_STRING([--without-ruby], [Disable Ruby])
AS_HELP_STRING([--with-ruby=path], [Set location of Ruby executable]),[ RUBYBIN="$withval"], [RUBYBIN=yes])

# First, check for "--without-ruby" or "--with-ruby=no".
RUBYSO=$SO
if test x"${RUBYBIN}" = xno -o x"${with_alllang}" = xno ; then
AC_MSG_NOTICE([Disabling Ruby])
RUBY=
else

# First figure out what the name of Ruby is

if test "x$RUBYBIN" = xyes; then
	AC_CHECK_PROGS(RUBY, ruby)
else
	RUBY="$RUBYBIN"
fi

AC_MSG_CHECKING(for Ruby header files)
if test -n "$RUBY"; then
        # Try Ruby1.9+ first
        RUBYDIR=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["rubyhdrdir"]] || $rubyhdrdir') 2>/dev/null`
	if test x"$RUBYDIR" = x"" || test x"$RUBYDIR" = x"nil"; then
		RUBYDIR=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["archdir"]] || $archdir') 2>/dev/null`
        else
                RUBYARCH=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["arch"]] || $arch') 2>/dev/null`
        fi
	if test x"$RUBYDIR" != x""; then
		dirs="$RUBYDIR"
		RUBYINCLUDE=
		for i in $dirs; do
			if test -r $i/ruby.h; then
				if test x"$RUBYARCH" = x""; then
					RUBYINCLUDE="-I$i"
				else
					RUBYINCLUDE="-I$i -I$i/$RUBYARCH"
				fi
				AC_MSG_RESULT($RUBYINCLUDE)
				break
			fi
		done
		if test x"$RUBYINCLUDE" = x""; then
			AC_MSG_RESULT(could not locate ruby.h)
		fi

		# Find library and path for linking.
		AC_MSG_CHECKING(for Ruby library)
		RUBYLIB=""
		rb_libdir=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["libdir"]]') 2>/dev/null`
		rb_bindir=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["bindir"]]') 2>/dev/null`
		dirs="$dirs $rb_libdir $rb_bindir"

        rb_libruby=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["LIBRUBY_A"]]') 2>/dev/null`
        RUBYLINK=`($RUBY -rrbconfig -e '
            c = RbConfig::CONFIG
            if c.has_key? "LIBRUBYARG_STATIC" # 1.8.x
                if c[["LIBRUBY"]] == c[["LIBRUBY_A"]]
                    link = c[["LIBRUBYARG_STATIC"]]
                else
                    link = c[["LIBRUBYARG_SHARED"]]
                end
            else # 1.6.x
                link = "-l" + c[["RUBY_INSTALL_NAME"]]
            end

            # Get the target Ruby was built for
            target = c[["target"]]

            if target == "i386-pc-mswin32"
              # Need to change msvcrt-ruby*.lib to -lmsvcrt-ruby*
              ext = File.extname(link)
              # Get index that counts backwards from end of string
              index = -1 - ext.size
              # Strip off the extension
              link = link.slice(0..index)
              puts "-l#{link}"
            else
              puts link
            end') 2>/dev/null`

		if test "$rb_libruby" != ""; then
			for i in $dirs; do
				if (test -r $i/$rb_libruby;) then
					RUBYLIB="$i"
					break
				fi
			done
		fi
		if test "$RUBYLIB" = ""; then
			RUBYLIB="$RUBYDIR"
			AC_MSG_RESULT(not found... using $RUBYDIR)
		else
			AC_MSG_RESULT($RUBYLINK in $RUBYLIB)
		fi
	else
		AC_MSG_RESULT(unable to determine ruby configuration)
	fi

	case $host in
		*-*-mingw*) ;; # do nothing, the default windows libraries are already included
		*) RUBYLINK="$RUBYLINK `($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["LIBS"]]') 2>/dev/null`";;
	esac

	RUBYCCDLFLAGS=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["CCDLFLAGS"]]') 2>/dev/null`
	RUBYSO=.`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["DLEXT"]]') 2>/dev/null`
else
	AC_MSG_RESULT(could not figure out how to run ruby)
fi

case $host in
*-*-cygwin* | *-*-mingw*)	RUBYDYNAMICLINKING="-L$RUBYLIB $RUBYLINK";;
*)		RUBYDYNAMICLINKING="";;
esac
fi

AC_SUBST(RUBYINCLUDE)
AC_SUBST(RUBYLIB)
AC_SUBST(RUBYLINK)
AC_SUBST(RUBYCCDLFLAGS)
AC_SUBST(RUBYSO)
AC_SUBST(RUBYDYNAMICLINKING)

#-------------------------------------------------------------------------
# Look for PHP
#-------------------------------------------------------------------------

PHPBIN=

AC_ARG_WITH(php, AS_HELP_STRING([--without-php], [Disable PHP])
AS_HELP_STRING([--with-php=path], [Set location of PHP executable]),[ PHPBIN="$withval"], [PHPBIN=yes])

# First, check for "--without-php" or "--with-php=no".
if test x"${PHPBIN}" = xno -o x"${with_alllang}" = xno ; then
    AC_MSG_NOTICE([Disabling PHP])
    PHP=
else

    if test "x$PHPBIN" = xyes; then
      AC_CHECK_PROGS(PHP, [php5 php])
    else
      PHP=$PHPBIN
    fi

    AC_MSG_CHECKING(for PHP header files)
    dnl /usr/bin/php5 -> /usr/bin/php-config5
    case $PHP in
      *5)
	PHPCONFIG=`echo "$PHP"|sed 's/5$/-config5/'` ;;
      *)
	PHPCONFIG=$PHP-config ;;
    esac
    php_version=`$PHPCONFIG --version 2>/dev/null`
    case $php_version in
    5*)
	PHPINC=`$PHPCONFIG --includes 2>/dev/null`
	if test -n "$PHPINC"; then
	  AC_MSG_RESULT($PHPINC)
	else
	  AC_MSG_RESULT(not found)
	fi
	;;
    *)
	AC_MSG_RESULT([found PHP $version, but only PHP 5 is supported]) ;;
    esac
fi
AC_SUBST(PHP)
AC_SUBST(PHPINC)

#----------------------------------------------------------------
# Look for ocaml
#----------------------------------------------------------------

AC_ARG_WITH(ocaml, AS_HELP_STRING([--without-ocaml], [Disable OCaml])
AS_HELP_STRING([--with-ocaml=path], [Set location of ocaml executable]),[ OCAMLBIN="$withval"], [OCAMLBIN=yes])
AC_ARG_WITH(ocamlc,[  --with-ocamlc=path      Set location of ocamlc executable],[ OCAMLC="$withval"], [OCAMLC=])
AC_ARG_WITH(ocamldlgen,[  --with-ocamldlgen=path  Set location of ocamldlgen],[ OCAMLDLGEN="$withval" ], [OCAMLDLGEN=])
AC_ARG_WITH(ocamlfind,[  --with-ocamlfind=path   Set location of ocamlfind],[OCAMLFIND="$withval"],[OCAMLFIND=])
AC_ARG_WITH(ocamlmktop,[  --with-ocamlmktop=path  Set location of ocamlmktop executable],[ OCAMLMKTOP="$withval"], [OCAMLMKTOP=])

# First, check for "--without-ocaml" or "--with-ocaml=no".
if test x"${OCAMLBIN}" = xno -o x"${with_alllang}" = xno ; then
    AC_MSG_NOTICE([Disabling OCaml])
    OCAMLBIN=
else

    AC_MSG_CHECKING(for Ocaml DL load generator)
    if test -z "$OCAMLDLGEN"; then
	AC_CHECK_PROGS(OCAMLDLGEN, ocamldlgen, :)
    fi

    AC_MSG_CHECKING(for Ocaml package tool)
	if test -z "$OCAMLFIND"; then
	AC_CHECK_PROGS(OCAMLFIND, ocamlfind, :)
    fi

    AC_MSG_CHECKING(for Ocaml compiler)
	if test -z "$OCAMLC"; then
	AC_CHECK_PROGS(OCAMLC, ocamlc, :)
    fi

    AC_MSG_CHECKING(for Ocaml interpreter)
	if test "x$OCAMLBIN" = xyes; then
	AC_CHECK_PROGS(OCAMLBIN, ocaml, :)
    fi

    AC_MSG_CHECKING(for Ocaml toplevel creator)
    if test -z "$OCAMLMKTOP"; then
	AC_CHECK_PROGS(OCAMLMKTOP, ocamlmktop, :)
    fi

    OCAMLLOC=loc
    if test "$OCAMLC" != ":" ; then
	AC_MSG_CHECKING(for Ocaml header files)
	dirs="/usr/lib/ocaml/caml /usr/local/lib/ocaml/caml"
	dir="`$OCAMLC -where 2>/dev/null`"
	if test "$dir"; then
		dirs="$dir/caml $dirs"
	fi
	for i in $dirs; do
		if test -r $i/mlvalues.h; then
			AC_MSG_RESULT($i)
			OCAMLEXT="$i"
			OCAMLINC="-I$OCAMLEXT"
			break
		fi
	done
	if test -z "$OCAMLINC"; then
		AC_MSG_RESULT(not found)
	fi

	AC_MSG_CHECKING(for Ocaml version 3.08.2 or higher)
	OCAMLVER=`$OCAMLC -version | sed -e 's/.*version //g'`
	AC_COMPARE_VERSION([$OCAMLVER],[3.08.2],[:],[:],[OCAMLLOC=_loc])
	AC_MSG_RESULT($OCAMLVER)
    fi
fi # Disabling ocaml

export OCAMLLOC
export OCAMLVER
export OCAMLINC
export OCAMLBIN
export OCAMLC
export OCAMLDLGEN
export OCAMLFIND
export OCAMLMKTOP

AC_SUBST(OCAMLLOC)
AC_SUBST(OCAMLVER)
AC_SUBST(OCAMLINC)
AC_SUBST(OCAMLBIN)
AC_SUBST(OCAMLC)
AC_SUBST(OCAMLDLGEN)
AC_SUBST(OCAMLFIND)
AC_SUBST(OCAMLMKTOP)

#----------------------------------------------------------------
# Look for Pike
#----------------------------------------------------------------

# Identify the name of the Pike executable
# Priority: configure option, automatic search
PIKEBIN=
AC_ARG_WITH(pike, AS_HELP_STRING([--without-pike], [Disable Pike])
AS_HELP_STRING([--with-pike=path], [Set location of Pike executable]),[PIKEBIN="$withval"], [PIKEBIN=yes])

# First, check for "--without-pike" or "--with-pike=no".
if test x"${PIKEBIN}" = xno -o x"${with_alllang}" = xno ; then
    AC_MSG_NOTICE([Disabling Pike])
    PIKEBIN=
else

if test "x$PIKEBIN" = xyes; then
	AC_CHECK_PROGS(PIKE, pike pike7.8 pike7.6 pike7.4 pike7.2)
else
	PIKE="$PIKEBIN"
fi


# Check for pike-config
# Priority: configure option, guessed from $PIKE, search from list
AC_ARG_WITH(pike-config, AS_HELP_STRING([--with-pike-config=path],
  	[Set location of pike-config script]),
  [PIKECONFIG="$withval"], [PIKECONFIG=""])

if test -z "$PIKECONFIG" -a -n "$PIKE"; then
	AC_CHECK_PROGS(PIKECONFIG, $PIKE-config pike-config \
		pike7.6-config pike7.4-config pike7.2-config)
fi

# Check for a --with-pikeincl option to configure
# Priority: configure option, info from $PIKECONFIG, guessed by pike script
AC_ARG_WITH(pikeincl, AS_HELP_STRING([--with-pikeincl=path],
	[Set location of Pike include directory]),
  [PIKEINCLUDE="-I$withval"], [PIKEINCLUDE=])

if test -n "$PIKE"; then
      AC_MSG_CHECKING([for Pike header files])
      if test -z "$PIKEINCLUDE" -a -n "$PIKECONFIG"; then
        PIKEINCLUDE=`$PIKECONFIG --cflags`
      fi
      if test -z "$PIKEINCLUDE" -a -n "$PIKE"; then
        PIKEINCLUDE=`$PIKE -x cflags`
        if test -z "$PIKEINCLUDE"; then
          PIKEPATH=`which $PIKE`
          PIKEINCLUDE=`$PIKE Tools/check-include-path.pike $PIKEPATH`
          PIKEINCLUDE="-I$PIKEINCLUDE"
        fi
      fi

      if test -z "$PIKEINCLUDE"; then
        AC_MSG_RESULT(not found)
      else
        AC_MSG_RESULT($PIKEINCLUDE)
      fi
fi
fi

AC_SUBST(PIKEINCLUDE)
AC_SUBST(PIKECCDLFLAGS)		dnl XXX: where is this used/defined?
AC_SUBST(PIKEDYNAMICLINKING)	dnl XXX: where is this used/defined?

#----------------------------------------------------------------
# Look for CHICKEN
#----------------------------------------------------------------

CHICKEN=
CHICKEN_CONFIG=
CHICKENHOME=
CHICKENOPTS=
CHICKENLIB=


AC_ARG_WITH(chicken, AS_HELP_STRING([--without-chicken], [Disable CHICKEN])
AS_HELP_STRING([--with-chicken=path], [Set location of CHICKEN executable]),[ CHICKENBIN="$withval"], [CHICKENBIN=yes])

# First, check for "--without-chicken" or "--with-chicken=no".
if test x"${CHICKENBIN}" = xno -o x"${with_alllang}" = xno ; then
AC_MSG_NOTICE([Disabling CHICKEN])
else

if test "x$CHICKENBIN" = xyes; then
AC_CHECK_PROGS(CHICKEN, chicken)
else
CHICKEN="$CHICKENBIN"
fi

AC_ARG_WITH(chickencsc,[  --with-chickencsc=path  Set location of csc executable],[ CHICKEN_CSC="$withval"], [CHICKEN_CSC=])

if test -z "$CHICKEN_CSC"; then
  AC_CHECK_PROGS(CHICKEN_CSC, csc)
  # Both the Microsoft C# compiler and chicken have an executable called csc, so check that this csc is really the chicken one
  if test -n "$CHICKEN_CSC" ; then
    AC_MSG_CHECKING(whether csc is the chicken compiler)
    $CHICKEN_CSC -version 2>/dev/null | grep "chicken" > /dev/null || CHICKEN_CSC=""
    if test -z "$CHICKEN_CSC"; then
      AC_MSG_RESULT(no)
    else
      AC_MSG_RESULT(yes)
    fi
  fi
fi

AC_ARG_WITH(chickencsi,[  --with-chickencsi=path  Set location of csi executable],[ CHICKEN_CSI="$withval"], [CHICKEN_CSI=])

if test -z "$CHICKEN_CSI"; then
AC_CHECK_PROGS(CHICKEN_CSI, csi)
fi

if test -n "$CHICKEN_CSC" ; then

  AC_ARG_WITH(chickenopts,[  --with-chickenopts=args Set compiler options for static CHICKEN generated code],[
	CHICKENOPTS="$withval"], [CHICKENOPTS=])
  AC_ARG_WITH(chickensharedlib,[  --with-chickensharedlib=args    Set linker options for shared CHICKEN generated code],[
	CHICKENSHAREDLIB="$withval"], [CHICKENSHAREDLIB=])
  AC_ARG_WITH(chickenlib,[  --with-chickenlib=args  Set linker options for static CHICKEN generated code],[
	CHICKENLIB="$withval"], [CHICKENLIB=])

  AC_MSG_CHECKING(for compiler options for static CHICKEN generated code)
  if test -z "$CHICKENOPTS"; then
        CHICKENOPTS="`$CHICKEN_CSC -cflags`"
  else
        CHICKENOPTS="`$CHICKEN_CSC -cflags` $CHICKENOPTS"
  fi
  if test -z "$CHICKENOPTS"; then
        AC_MSG_RESULT(not found)
  else
        AC_MSG_RESULT($CHICKENOPTS)
  fi

  AC_MSG_CHECKING(for linker options for shared CHICKEN generated code)
  if test -z "$CHICKENSHAREDLIB"; then
        CHICKENSHAREDLIB="`$CHICKEN_CSC -shared -libs`"
  else
        CHICKENSHAREDLIB="`$CHICKEN_CSC -shared -libs` $CHICKENSHAREDLIB"
  fi
  if test -z "$CHICKENSHAREDLIB"; then
  	AC_MSG_RESULT(not found)
  else
        AC_MSG_RESULT($CHICKENSHAREDLIB)
  fi

  AC_MSG_CHECKING(for linker options for static CHICKEN generated code)
  if test -z "$CHICKENLIB"; then
        CHICKENLIB="`$CHICKEN_CSC -libs`"
  else
        CHICKENLIB="`$CHICKEN_CSC -libs` $CHICKENLIB"
  fi
  if test -z "$CHICKENLIB"; then
  	AC_MSG_RESULT(not found)
  else
        AC_MSG_RESULT($CHICKENLIB)
  fi

fi # have CHICKEN_CONFIG
fi # Check for --without-chicken

AC_SUBST(CHICKEN)
AC_SUBST(CHICKEN_CSC)
AC_SUBST(CHICKEN_CSI)
AC_SUBST(CHICKENOPTS)
AC_SUBST(CHICKENLIB)
AC_SUBST(CHICKENSHAREDLIB)

#----------------------------------------------------------------
# Look for C#
#----------------------------------------------------------------

AC_ARG_WITH(csharp, AS_HELP_STRING([--without-csharp], [Disable CSharp]), [with_csharp="$withval"], [with_csharp=yes])
AC_ARG_WITH(cil-interpreter, [  --with-cil-interpreter=path     Set location of CIL interpreter for CSharp],[CSHARPBIN="$withval"], [CSHARPBIN=])
AC_ARG_WITH(csharp-compiler, [  --with-csharp-compiler=path     Set location of CSharp compiler],[CSHARPCOMPILERBIN="$withval"], [CSHARPCOMPILERBIN=])

# First, check for "--without-csharp" or "--with-csharp=no".
if test x"${with_csharp}" = xno -o x"${with_alllang}" = xno ; then
AC_MSG_NOTICE([Disabling CSharp])
CSHARPCOMPILER=
else

if test -z "$CSHARPCOMPILERBIN" ; then
  case $host in
  *-*-cygwin* | *-*-mingw*)
    # prefer Mono gmcs (.NET 2.0) over mcs (.NET 1.1) - note mcs-1.2.3 has major pinvoke bug
    AC_CHECK_PROGS(CSHARPCOMPILER, csc mono-csc gmcs mcs cscc)
    if test -n "$CSHARPCOMPILER" && test "$CSHARPCOMPILER" = "csc" ; then
      AC_MSG_CHECKING(whether csc is the Microsoft CSharp compiler)
      csc 2>/dev/null | grep "C#" > /dev/null || CSHARPCOMPILER=""
      if test -z "$CSHARPCOMPILER" ; then
        AC_MSG_RESULT(no)
        AC_CHECK_PROGS(CSHARPCOMPILER, mono-csc gmcs mcs cscc)
      else
        AC_MSG_RESULT(yes)
      fi
    fi
    ;;
  *)AC_CHECK_PROGS(CSHARPCOMPILER, mono-csc gmcs mcs cscc);;
  esac
else
  CSHARPCOMPILER="$CSHARPCOMPILERBIN"
fi

CSHARPPATHSEPARATOR="/"
CSHARPCYGPATH_W=echo
if test -z "$CSHARPBIN" ; then
  CSHARPCILINTERPRETER=""
  CSHARPCILINTERPRETER_FLAGS=""
  if test "cscc" = "$CSHARPCOMPILER" ; then
    AC_CHECK_PROGS(CSHARPCILINTERPRETER, ilrun)
  else
    if test "mcs" = "$CSHARPCOMPILER"; then
      # Check that mcs is the C# compiler and not the Unix mcs utility by examining the output of 'mcs --version'
      # The Mono compiler should emit: Mono C# compiler version a.b.c.d
      csharp_version_raw=`(mcs --version) 2>/dev/null`
      csharp_version_searched=`(mcs --version | sed -e "/C#/b" -e "/Mono/b" -e d) 2>/dev/null` # return string if contains 'Mono' or 'C#'
      CSHARPCOMPILER=""
      if test -n "$csharp_version_raw" ; then
        if test "$csharp_version_raw" = "$csharp_version_searched" ; then
          CSHARPCOMPILER="mcs"
        fi
      fi
      if test "mcs" != "$CSHARPCOMPILER" ; then
        echo "mcs is not a working Mono C# compiler"
      fi
    fi
    if test "mcs" = "$CSHARPCOMPILER" || test "gmcs" = "$CSHARPCOMPILER" || test "mono-csc" = "$CSHARPCOMPILER"; then
        AC_CHECK_PROGS(CSHARPCILINTERPRETER, mono) # Mono JIT
        CSHARPCILINTERPRETER_FLAGS="--debug"
    else
      if test "csc" = "$CSHARPCOMPILER"; then
          CSHARPPATHSEPARATOR="\\\\"
          CSHARPCYGPATH_W='cygpath -w'
      fi
    fi
  fi
else
  CSHARPCILINTERPRETER="$CSHARPBIN"
fi

# Cygwin requires the Windows standard (Pascal) calling convention as it is a Windows executable and not a Cygwin built executable
case $host in
*-*-cygwin* | *-*-mingw*)
    if test "$GCC" = yes; then
        CSHARPDYNAMICLINKING=" -mno-cygwin -mthreads -Wl,--add-stdcall-alias"
        CSHARPCFLAGS="-mno-cygwin -mthreads"
    else
        CSHARPDYNAMICLINKING=""
        CSHARPCFLAGS=""
    fi ;;
*)
        CSHARPDYNAMICLINKING=""
        CSHARPCFLAGS=""
        ;;
esac

# CSharp on Windows platforms including Cygwin doesn't use libname.dll, rather name.dll when loading dlls
case $host in
*-*-cygwin* | *-*-mingw*) CSHARPLIBRARYPREFIX="";;
*)CSHARPLIBRARYPREFIX="lib";;
esac

# C#/Mono on Mac OS X tweaks
case $host in
*-*-darwin*)
    CSHARPSO=".so"
    ;;
*)
    CSHARPSO=$SO
    ;;
esac
fi

AC_SUBST(CSHARPCILINTERPRETER_FLAGS)
AC_SUBST(CSHARPCILINTERPRETER)
AC_SUBST(CSHARPPATHSEPARATOR)
AC_SUBST(CSHARPCYGPATH_W)
AC_SUBST(CSHARPCOMPILER)
AC_SUBST(CSHARPDYNAMICLINKING)
AC_SUBST(CSHARPLIBRARYPREFIX) # Is this going to be used?
AC_SUBST(CSHARPCFLAGS)
AC_SUBST(CSHARPSO)

#----------------------------------------------------------------
# Look for Lua
#----------------------------------------------------------------

LUABIN=
LUAINCLUDE=
LUALIB=
LUADYNAMICLOADLIB=
LUAFLAGS=
LUALINK=
# note: if LUABIN is empty then lua tests will not be done
# LUABIN will be cleared if certain dependencies cannot be found

AC_ARG_WITH(lua, AS_HELP_STRING([--without-lua], [Disable Lua])
AS_HELP_STRING([--with-lua=path], [Set location of Lua executable]),[ LUABIN="$withval"], [LUABIN=yes])
AC_ARG_WITH(luaincl,[  --with-luaincl=path     Set location of Lua include directory],[
	LUAINCLUDE="$withval"], [LUAINCLUDE=])
AC_ARG_WITH(lualib,[  --with-lualib=path      Set location of Lua library directory],[
	LUALIB="$withval"], [LUALIB=])

# First, check for "--without-lua" or "--with-lua=no".
if test x"${LUABIN}" = xno -o x"${with_alllang}" = xno ; then
AC_MSG_NOTICE([Disabling Lua])
else

# can we find lua?
if test "x$LUABIN" = xyes; then
   # We look for a versioned Lua binary first, as there can be
   # multiple versions of Lua installed on some systems (like Debian).
   # The search order should match the include-file and library search
   # orders below (a Lua shared library built for one version may not
   # work with a Lua binary of a different version).
   AC_PATH_PROGS(LUABIN, [lua5.2 lua5.1 lua])
fi

# check version: we need Lua 5.x
if test "$LUABIN"; then
   AC_MSG_CHECKING(Lua version)
   # if version 5.x
   LUAV5=`$LUABIN -e 'if string.sub(_VERSION,5,5)=="5" then print "1" end'`
   # if not version 5.0
   LUAV51=`$LUABIN -e 'if string.sub(_VERSION,5,7)~="5.0" then print "1" end'`

   if test -z "$LUAV5"; then
     AC_MSG_WARN(Not Lua 5.x, SWIG does not support this version of Lua)
     LUABIN=""
   elif test -z "$LUAV51"; then
     AC_MSG_RESULT(Lua 5.0.x)
   else
     AC_MSG_RESULT(Lua 5.1 or later)
   fi
fi

if test "$LUABIN"; then
   AC_MSG_CHECKING(whether Lua dynamic loading is enabled)
   # using Lua to check Lua
   # lua 5.0 & 5.1 have different fn names
   if test -z "$LUAV51"; then
     LUADYNAMICLOADLIB=`$LUABIN -e '_,_,c=loadlib("no_such_lib","") if c~="absent" then print "1" end'`
   else
     LUADYNAMICLOADLIB=`$LUABIN -e '_,_,c=package.loadlib("no_such_lib","") if c~="absent" then print "1" end'`
   fi

   if test -z "$LUADYNAMICLOADLIB"; then
     AC_MSG_RESULT(no)
   else
     AC_MSG_RESULT(yes)
   fi
fi

# look for the header files & set LUAFLAGS accordingly
# will clear LUABIN if not present
if test -n "$LUAINCLUDE"; then
  AC_CHECK_FILE($LUAINCLUDE/lua.h,[LUAFLAGS="$ISYSTEM$LUAINCLUDE"],[LUABIN=])
else
  LUA_OK="1"
  AC_CHECK_HEADER(lua.h,[LUAFLAGS=""],[LUA_OK=""])
  # if we didn't get it, going to have to look elsewhere (the hard way)
  if test -z "$LUA_OK"; then
    AC_MSG_CHECKING(for lua.h in other locations)
    # note: Debian/Ubuntu seem to like /usr/include/lua5.1/lua.h
    # The ordering of the include directories to search should match
    # the ordering of libraries to search in the library test below.
    inc=/usr/include
    dirs="$inc/lua5.2 $inc/lua5.1 $inc/lua51 $inc/lua5.0 $inc/lua50 /usr/local/include"
    for i in $dirs; do
      #echo "$i"
      if test -r $i/lua.h; then
        AC_MSG_RESULT($i/lua.h)
	LUAFLAGS="$ISYSTEM$i"
	break
      fi
    done
    if test -z "$LUAFLAGS"; then
      AC_MSG_RESULT(not found)
      LUABIN="" # clear the bin
    fi
  fi
fi

# look for the library files & set LUALINK accordingly
# will clear LUABIN if not present
lua_save_LIBS=$LIBS # the code seems to disrupt LIBS, so saving

if test -n "$LUALIB"; then
  AC_CHECK_FILE($LUALIB/liblua.a,[LUALINK="-L$LUALIB -llua"],[LUABIN=])
else
  AC_SEARCH_LIBS(lua_close, [lua lua5.2 lua5.1 lua51 lua5.0 lua50], [LUALINK="-l$ac_lib"],[LUABIN=])
fi

# adding lualib for lua 5.0
if test -z "$LUAV51"; then # extra for lua 5.0
  LUALINK="$LUALINK -llualib"
fi

LIBS=$lua_save_LIBS	# restore LIBS

fi # if not disabled

AC_SUBST(LUADYNAMICLINKING)
AC_SUBST(LUAFLAGS)
AC_SUBST(LUALINK)
AC_SUBST(LUABIN)

#----------------------------------------------------------------
# Look for Allegro Common Lisp
#----------------------------------------------------------------

ALLEGROCLBIN=

AC_ARG_WITH(allegrocl, AS_HELP_STRING([--without-allegrocl], [Disable Allegro CL])
AS_HELP_STRING([--with-allegrocl=path], [Set location of Allegro CL executable (alisp)]),[ ALLEGROCLBIN="$withval"], [ALLEGROCLBIN=yes])

# First, check for "--without-allegrocl" or "--with-allegrocl=no".
if test x"${ALLEGROCLBIN}" = xno -o x"${with_alllang}" = xno ; then
AC_MSG_NOTICE([Disabling Allegro CL])
ALLEGROCLBIN=
else

# can we find allegrocl?
if test "x$ALLEGROCLBIN" = xyes; then
   AC_PATH_PROG(ALLEGROCLBIN, alisp)
fi
fi

AC_SUBST(ALLEGROCLBIN)

#----------------------------------------------------------------
# Look for GNU CLISP
#----------------------------------------------------------------

CLISPBIN=

AC_ARG_WITH(clisp, AS_HELP_STRING([--without-clisp], [Disable CLISP])
AS_HELP_STRING([--with-clisp=path], [Set location of CLISP executable (clisp)]),[ CLISPBIN="$withval"], [CLISPBIN=yes])

# First, check for "--without-clisp" or "--with-clisp=no".
if test x"${CLISPBIN}" = xno -o x"${with_alllang}" = xno ; then
AC_MSG_NOTICE([Disabling CLISP])
CLISPBIN=
else

# can we find clisp?
if test "x$CLISPBIN" = xyes; then
   AC_PATH_PROG(CLISPBIN, clisp)
fi
fi

AC_SUBST(CLISPBIN)

#----------------------------------------------------------------
# Look for GNU R
#----------------------------------------------------------------

RBIN=

AC_ARG_WITH(r, AS_HELP_STRING([--without-r], [Disable R])
AS_HELP_STRING([--with-r=path], [Set location of R executable (r)]),[ RBIN="$withval"], [RBIN=yes])

# First, check for "--without-r" or "--with-r=no".
if test x"${RBIN}" = xno -o x"${with_alllang}" = xno ; then
AC_MSG_NOTICE([Disabling R])
RBIN=
else

# can we find R?
if test "x$RBIN" = xyes; then
   AC_PATH_PROG(RBIN, R)
fi
fi

AC_SUBST(RBIN)

#----------------------------------------------------------------
# Look for Go compilers
#----------------------------------------------------------------

AC_ARG_WITH(go, AS_HELP_STRING([--without-go], [Disable Go])
AS_HELP_STRING([--with-go=path], [Set location of Go compiler]),[GOBIN="$withval"], [GOBIN=yes])

if test x"${GOBIN}" = xno -o x"${with_alllang}" = xno ; then
  AC_MSG_NOTICE([Disabling Go])
  GO=
  GOC=
  GO1=false
  GO12=false
  GO13=false
  GOGCC=false
  GOOPT=
  GOVERSIONOPTION=
else

  if test "x$GOBIN" = xyes; then
    AC_CHECK_PROGS(GO, go 6g 8g gccgo)
  else
    GO="$GOBIN"
  fi

  GOGCC=false
  GO1=false
  GO12=false
  GO13=false
  GOOPT=
  GOVERSIONOPTION=
  if test -n "$GO" ; then
    if $GO --help 2>/dev/null | grep gccgo >/dev/null 2>&1 ; then
      GOGCC=true
      GOVERSIONOPTION=--version
      AC_MSG_CHECKING([whether gccgo version is too old])
      go_version=[`$GO $GOVERSIONOPTION | sed -n '1p' | sed -e 's/^.* \([0-9.]*\) *$/\1/' -e 's/[.]//g'`]
      if test "x$go_version" = x; then
        AC_MSG_RESULT([could not determine gccgo version - disabling Go])
        GO=
      elif test "$go_version" -lt 470; then
        AC_MSG_RESULT([yes - minimum version is 4.7.0])
        GO=
      else
	AC_MSG_RESULT([no])
        if test "$go_version" -lt 480; then
          GOOPT="-intgosize 32"
	else
	  AC_CHECK_SIZEOF([void *], [4])
	  if test "$ac_cv_sizeof_void_p" = "8"; then
	    GOOPT="-intgosize 64"
	  else
	    GOOPT="-intgosize 32"
	  fi
        fi
      fi
    elif test "`echo $GO | sed -e 's|.*/||'`" = "go"; then
      GO1=true
      GOVERSIONOPTION=version
      GOC=$(sh -c "$(go env) && echo \$GOCHAR")c
      go_version=$($GO $GOVERSIONOPTION | sed -e 's/go version //')
      AC_MSG_CHECKING([whether go version is too old])
      case $go_version in
      go1.0* | go1 )
	AC_MSG_RESULT([yes - minimum version is 1.1])
	GO=
	GOOPT="-intgosize 32"
	;;
      *)
	AC_MSG_RESULT([no])
	if test "$GOC" = "6c"; then
          GOOPT="-intgosize 64"
        else
          GOOPT="-intgosize 32"
	fi
	;;
      esac
      case $go_version in
      go1.0* | go1 | go1.1*)
	GOOPT="$GOOPT -use-shlib"
	;;
      go1.2*)
        GO12=true
	;;
      *)
	GO13=true
	;;
      esac
    else
      GOC=`echo $GO | sed -e 's/g/c/'`
      GOVERSIONOPTION=-V
      AC_MSG_CHECKING([whether Go ($GO) version is too old])
      AC_MSG_RESULT([yes - minimum version is 1.1])
      GO=
      dnl Old code retained for now in case we implement an option for it.
      dnl go_version=`$GO $GOVERSIONOPTION 2>/dev/null | sed -e 's/.*version.* \([[0-9]]*\).*/\1/'`
      dnl go_min_version=7077
      dnl if test "$go_version" != "" -a "$go_version" -lt $go_min_version; then
      dnl   AC_MSG_RESULT([yes - minimum version is $go_min_version])
      dnl   GO=
      dnl else
      dnl   AC_MSG_RESULT([no])
      dnl fi
      GOOPT="-intgosize 32"
      GO12=false
      GO13=false
    fi
  fi
fi

AC_SUBST(GOGCC)
AC_SUBST(GO)
AC_SUBST(GOC)
AC_SUBST(GO1)
AC_SUBST(GO12)
AC_SUBST(GO13)
AC_SUBST(GOOPT)
AC_SUBST(GOVERSIONOPTION)

#----------------------------------------------------------------
# Look for D
#----------------------------------------------------------------

AC_ARG_WITH(d, AS_HELP_STRING([--without-d], [Disable D]), [with_d="$withval"], [with_d=yes])
AC_ARG_WITH(d1-compiler, [  --with-d1-compiler=path  Set location of D1/Tango compiler (DMD compatible)],[D1COMPILERBIN="$withval"], [D1COMPILERBIN=])
AC_ARG_WITH(d2-compiler, [  --with-d2-compiler=path  Set location of D2 compiler (DMD compatible)],[D2COMPILERBIN="$withval"], [D2COMPILERBIN=])


# First, check for "--without-d" or "--with-d=no".
if test x"${with_d}" = xno -o x"${with_alllang}" = xno ; then
  AC_MSG_NOTICE([Disabling D])
  D1COMPILER=
  D2COMPILER=
else
  old_ac_ext=$ac_ext
  ac_ext=d

  if test -z "$D1COMPILERBIN" ; then
    AC_CHECK_PROGS(D1COMPILER, dmd ldmd gdmd)

    if test -n "$D1COMPILER" ; then
      AC_MSG_CHECKING(whether the D1/Tango compiler works)
      cat > conftest.$ac_ext <<_ACEOF
import tango.io.Stdout;
void main() {
}
_ACEOF
      rm -f conftest.$ac_objext
      AS_IF(
        [_AC_DO_STDERR($D1COMPILER conftest.$ac_ext) && test ! -s conftest.err && test -s conftest.$ac_objext],
        [AC_MSG_RESULT([yes])],
        [_AC_MSG_LOG_CONFTEST AC_MSG_RESULT([no])
        D1COMPILER=]
      )
      rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    fi
  else
    D1COMPILER="$D1COMPILERBIN"
  fi

  if test -z "$D2COMPILERBIN" ; then
    AC_CHECK_PROGS(D2COMPILER, dmd gdmd)

    if test -n "$D2COMPILER" ; then
      AC_MSG_CHECKING(whether the D2 compiler works)
      cat > conftest.$ac_ext <<_ACEOF
import std.algorithm;
void main() {
}
_ACEOF
      rm -f conftest.$ac_objext
      AS_IF(
        [_AC_DO_STDERR($D2COMPILER conftest.$ac_ext) && test ! -s conftest.err && test -s conftest.$ac_objext],
        [AC_MSG_RESULT([yes])],
        [_AC_MSG_LOG_CONFTEST AC_MSG_RESULT([no])
        D2COMPILER=]
      )
      rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    fi
  else
    D2COMPILER="$D2COMPILERBIN"
  fi

  ac_ext=$old_ac_ext
fi

if test -n "$D1COMPILER"; then
  DDEFAULTVERSION=1
elif test -n "$D2COMPILER"; then
  DDEFAULTVERSION=2
fi

# Do not prefix library file names with "lib" on Windows.
case $host in
*-*-cygwin* | *-*-mingw*) DLIBPREFIX="";;
*)DLIBPREFIX="lib";;
esac

AC_SUBST(D1COMPILER)
AC_SUBST(D2COMPILER)
AC_SUBST(DDEFAULTVERSION)
AC_SUBST(DLIBPREFIX)

#----------------------------------------------------------------
# Determine which languages to use for examples/test-suite
#----------------------------------------------------------------

SKIP_TCL=
if test -z "$TCLINCLUDE" || test -z "$TCLLIB" ; then
    SKIP_TCL="1"
fi
AC_SUBST(SKIP_TCL)


SKIP_PERL5=
if test -z "$PERL" || test -z "$PERL5EXT" || test -z "$PERL5TESTMORE"; then
    SKIP_PERL5="1"
fi
AC_SUBST(SKIP_PERL5)


SKIP_OCTAVE=
if test -z "$OCTAVE" ; then
    SKIP_OCTAVE="1"
fi
AC_SUBST(SKIP_OCTAVE)


SKIP_PYTHON=
if (test -z "$PYINCLUDE") &&
   (test -z "$PY3INCLUDE") ; then
    SKIP_PYTHON="1"
fi
AC_SUBST(SKIP_PYTHON)

SKIP_PYTHON3=
if test -z "$PY3INCLUDE" ; then
    SKIP_PYTHON3="1"
fi
AC_SUBST(SKIP_PYTHON3)

SKIP_JAVA=
if test -z "$JAVA" || test -z "$JAVAC" || test -z "$JAVAINC" ; then
    SKIP_JAVA="1"
fi
AC_SUBST(SKIP_JAVA)

SKIP_JAVASCRIPT=
if test -z "$JAVASCRIPT" || ( test -z "$NODEJS" && test -z "$JSCENABLED" && test -z "$JSV8ENABLED" ) ; then
    SKIP_JAVASCRIPT="1"
fi
AC_SUBST(SKIP_JAVASCRIPT)

SKIP_GUILE=
if test -z "$GUILE" || test -z "$GUILE_LIBS" ; then
    SKIP_GUILE="1"
fi
AC_SUBST(SKIP_GUILE)


SKIP_MZSCHEME=
if test -z "$MZC" || test -z "$MZDYNOBJ" ; then
    SKIP_MZSCHEME="1"
fi
AC_SUBST(SKIP_MZSCHEME)


SKIP_RUBY=
if test -z "$RUBY" || test -z "$RUBYINCLUDE" || test -z "$RUBYLIB" ; then
    SKIP_RUBY="1"
fi
AC_SUBST(SKIP_RUBY)


SKIP_PHP=
if test -z "$PHP" || test -z "$PHPINC" ; then
    SKIP_PHP="1"
fi
AC_SUBST(SKIP_PHP)


SKIP_OCAML=
if test -z "$OCAMLBIN" || test -z "$OCAMLINC" ; then
    SKIP_OCAML="1"
fi
AC_SUBST(SKIP_OCAML)


SKIP_PIKE=
if test -z "$PIKE" || test -z "$PIKEINCLUDE" ; then
    SKIP_PIKE="1"
fi
AC_SUBST(SKIP_PIKE)


SKIP_CHICKEN=
if test -z "$CHICKEN_CSC" || test -z "$CHICKEN"; then
    SKIP_CHICKEN="1"
fi
AC_SUBST(SKIP_CHICKEN)


SKIP_CSHARP=
if test -z "$CSHARPCOMPILER" ; then
    SKIP_CSHARP="1"
else
    if test "cscc" = "$CSHARPCOMPILER" && test -z "$CSHARPCILINTERPRETER" ; then
      SKIP_CSHARP="1"
    fi
fi
AC_SUBST(SKIP_CSHARP)

SKIP_MODULA3="1" # Always skipped!
AC_SUBST(SKIP_MODULA3)

SKIP_LUA=
# we need LUABIN & dynamic loading
if test -z "$LUABIN" || test -z "$LUADYNAMICLOADLIB"; then
    SKIP_LUA="1"
fi
AC_SUBST(SKIP_LUA)

SKIP_ALLEGROCL=
if test -z "$ALLEGROCLBIN" ; then
    SKIP_ALLEGROCL="1"
fi
AC_SUBST(SKIP_ALLEGROCL)

SKIP_CLISP=
if test -z "$CLISPBIN" ; then
    SKIP_CLISP="1"
fi
AC_SUBST(SKIP_CLISP)

SKIP_R=
if test -z "$RBIN" ; then
    SKIP_R="1"
fi
AC_SUBST(SKIP_R)

SKIP_CFFI=
#if test -z "$CFFIBIN" ; then
    SKIP_CFFI="1"
#fi
AC_SUBST(SKIP_CFFI)

SKIP_UFFI=
#if test -z "$UFFIBIN" ; then
    SKIP_UFFI="1"
#fi
AC_SUBST(SKIP_UFFI)

SKIP_GO=
if test -z "$GO" ; then
    SKIP_GO="1"
fi
AC_SUBST(SKIP_GO)

SKIP_D=
if test -z "$DDEFAULTVERSION" ; then
    SKIP_D="1"
fi
AC_SUBST(SKIP_D)

#----------------------------------------------------------------
# Additional language dependencies
#----------------------------------------------------------------
SKIP_GCJ=
if test -z "$GCJ" || test -z "$GCJH" ; then
  SKIP_GCJ="1"
else
  if test "$GCC" != yes; then
    SKIP_GCJ="1"
  fi
fi
AC_SUBST(SKIP_GCJ)


SKIP_ANDROID=
if test -z "$ANDROID" || test -z "$ADB" || test -z "$ANT" || test -z "$NDKBUILD" ; then
    SKIP_ANDROID="1"
fi
AC_SUBST(SKIP_ANDROID)



#----------------------------------------------------------------
# Miscellaneous
#----------------------------------------------------------------


# Root directory
# Translate path for native Windows compilers for use with 'make check'
ROOT_DIR=`pwd`
case $host in
*-*-cygwin* | *-*-mingw*)
  if (cygpath --mixed $ROOT_DIR) >/dev/null 2>/dev/null; then
    ROOT_DIR=`cygpath --mixed $ROOT_DIR`
  fi
  # Extra files generated by some Windows compilers
  EXTRA_CLEAN="*.stackdump *.exp *.lib *.pdb *.ilk"
  ;;
esac

AC_SUBST(ROOT_DIR)
AC_SUBST(EXTRA_CLEAN)
AC_SUBST(ac_aux_dir)

# Configure SWIG_LIB path

AC_ARG_WITH(swiglibdir,[  --with-swiglibdir=DIR   Put SWIG system-independent libraries into DIR.],
  [swig_lib="$withval"], [swig_lib="${datadir}/swig/${PACKAGE_VERSION}"])
AC_SUBST(swig_lib)
AC_DEFINE_DIR(SWIG_LIB, swig_lib, [Directory for SWIG system-independent libraries])

case $build in
        # Windows does not understand unix directories. Convert into a windows directory with drive letter.
        *-*-mingw*) SWIG_LIB_WIN_UNIX=`cmd //c echo $SWIG_LIB | sed -e "s/[ ]*$//"`;; # This echo converts unix to mixed paths. Then zap unexpected trailing space.
        *-*-cygwin*) SWIG_LIB_WIN_UNIX=`cygpath --mixed "$SWIG_LIB"`;;
        *) SWIG_LIB_WIN_UNIX="";;
esac
AC_DEFINE_UNQUOTED(SWIG_LIB_WIN_UNIX, ["$SWIG_LIB_WIN_UNIX"], [Directory for SWIG system-independent libraries (Unix install on native Windows)])

AC_CONFIG_FILES([
    Makefile
    swig.spec
    Examples/Makefile
    Examples/d/example.mk
    Examples/xml/Makefile
    Examples/test-suite/errors/Makefile
    Examples/test-suite/chicken/Makefile
    Examples/test-suite/csharp/Makefile
    Examples/test-suite/d/Makefile
    Examples/test-suite/guile/Makefile
    Examples/test-suite/java/Makefile
    Examples/test-suite/javascript/Makefile
    Examples/test-suite/mzscheme/Makefile
    Examples/test-suite/ocaml/Makefile
    Examples/test-suite/octave/Makefile
    Examples/test-suite/perl5/Makefile
    Examples/test-suite/php/Makefile
    Examples/test-suite/pike/Makefile
    Examples/test-suite/python/Makefile
    Examples/test-suite/ruby/Makefile
    Examples/test-suite/tcl/Makefile
    Examples/test-suite/lua/Makefile
    Examples/test-suite/allegrocl/Makefile
    Examples/test-suite/clisp/Makefile
    Examples/test-suite/cffi/Makefile
    Examples/test-suite/uffi/Makefile
    Examples/test-suite/r/Makefile
    Examples/test-suite/go/Makefile
    Source/Makefile
    Tools/javascript/Makefile
])
AC_CONFIG_FILES([preinst-swig], [chmod +x preinst-swig])
AC_CONFIG_FILES([CCache/ccache_swig_config.h])

#--------------------------------------------------------------------
# Building Examples/ out of source directory
#--------------------------------------------------------------------

# If building out of source tree, replicate Examples/ source tree in
# build directory, and copy over Makefiles from source directory.
# Prefix each Makefile with a header which sets SRCDIR to the relative
# source directory, and provides a rule for updating the Makefile from
# its original source.
AC_CONFIG_COMMANDS([Examples],[
  if test "x${srcdir}" != "x." ; then
    AC_MSG_NOTICE([generating Examples build tree])
    for mkfile in `cd ${srcdir} && find Examples/ -type f -name Makefile`; do
      dir=`dirname ${mkfile}`
      d=${dir}
      reldir="";
      while test "x$d" != "x." ; do
        d=`dirname $d`
        reldir="${reldir}../"
      done
      relsrcdir=${reldir}${srcdir}/
      AS_MKDIR_P([${dir}])
      cat <<EOF >${mkfile}
# DO NOT EDIT: instead edit ${relsrcdir}${mkfile}
# and run (cd ${reldir} && ./config.status) to regenerate
SRCDIR = ${relsrcdir}${dir}/

EOF
      cat ${srcdir}/${mkfile} >>${mkfile}
    done
  fi
])

#--------------------------------------------------------------------

AC_OUTPUT

langs=""
test -n "$SKIP_ALLEGROCL"	|| langs="${langs}allegrocl "
test -n "$SKIP_CFFI"		|| langs="${langs}cffi "
test -n "$SKIP_CHICKEN"		|| langs="${langs}chicken "
test -n "$SKIP_CLISP"		|| langs="${langs}clisp "
test -n "$SKIP_CSHARP"		|| langs="${langs}csharp "
test -n "$SKIP_D"		|| langs="${langs}d "
test -n "$SKIP_GO"		|| langs="${langs}go "
test -n "$SKIP_GUILE"		|| langs="${langs}guile "
test -n "$SKIP_JAVA"		|| langs="${langs}java "
test -n "$SKIP_JAVASCRIPT"	|| langs="${langs}javascript "
test -n "$SKIP_LUA"		|| langs="${langs}lua "
test -n "$SKIP_MODULA3"		|| langs="${langs}modula3 "
test -n "$SKIP_MZSCHEME"	|| langs="${langs}mzscheme "
test -n "$SKIP_OCAML"		|| langs="${langs}ocaml "
test -n "$SKIP_OCTAVE"		|| langs="${langs}octave "
test -n "$SKIP_PERL5"		|| langs="${langs}perl5 "
test -n "$SKIP_PHP"		|| langs="${langs}php "
test -n "$SKIP_PIKE"		|| langs="${langs}pike "
test -n "$SKIP_PYTHON"		|| langs="${langs}python "
test -n "$SKIP_R"		|| langs="${langs}r "
test -n "$SKIP_RUBY"		|| langs="${langs}ruby "
test -n "$SKIP_TCL"		|| langs="${langs}tcl "
test -n "$SKIP_UFFI"		|| langs="${langs}uffi "

echo "
The SWIG test-suite and examples are configured for the following languages:
$langs
"

dnl configure.ac ends here
