dnl configure.in: autoconf script for Vim

dnl Process this file with autoconf 2.12 or 2.13 to produce "configure".
dnl Should also work with autoconf 2.54 and later.

AC_INIT(vim.h)
AC_CONFIG_HEADER(auto/config.h:config.h.in)

dnl Being able to run configure means the system is Unix (compatible).
AC_DEFINE(UNIX)
AC_PROG_MAKE_SET

dnl Checks for programs.
AC_PROG_CC	dnl required by almost everything
AC_PROG_CPP	dnl required by header file checks
AC_PROGRAM_EGREP dnl required by AC_EGREP_CPP
AC_ISC_POSIX	dnl required by AC_C_CROSS
AC_PROG_AWK	dnl required for "make html" in ../doc

dnl Don't strip if we don't have it
AC_CHECK_PROG(STRIP, strip, strip, :)

dnl Check for extension of executables
AC_EXEEXT

dnl Check for standard headers.  We don't use this in Vim but other stuff
dnl in autoconf needs it, where it uses STDC_HEADERS.
AC_HEADER_STDC
AC_HEADER_SYS_WAIT

dnl Set default value for CFLAGS if none is defined or it's empty
if test -z "$CFLAGS"; then
  CFLAGS="-O"
  test "$GCC" = yes && CFLAGS="-O2 -fno-strength-reduce -Wall"
fi
if test "$GCC" = yes; then
  dnl method that should work for nearly all versions
  gccversion=`"$CC" -dumpversion`
  if test "x$gccversion" = "x"; then
    dnl old method; fall-back for when -dumpversion doesn't work
    gccversion=`"$CC" --version | sed -e '2,$d' -e 's/darwin.//' -e 's/^[[^0-9]]*\([[0-9]]\.[[0-9.]]*\).*$/\1/g'`
  fi
  dnl version 4.0.1 was reported to cause trouble on Macintosh by Marcin Dalecki
  if test "$gccversion" = "3.0.1" -o "$gccversion" = "3.0.2" -o "$gccversion" = "4.0.1"; then
    echo 'GCC [[34]].0.[[12]] has a bug in the optimizer, disabling "-O#"'
    CFLAGS=`echo "$CFLAGS" | sed 's/-O[[23456789]]/-O/'`
  else
    if test "$gccversion" = "3.1" -o "$gccversion" = "3.2" -o "$gccversion" = "3.2.1" && `echo "$CFLAGS" | grep -v fno-strength-reduce >/dev/null`; then
      echo 'GCC 3.1 and 3.2 have a bug in the optimizer, adding "-fno-strength-reduce"'
      CFLAGS="$CFLAGS -fno-strength-reduce"
    fi
  fi
fi

dnl If configure thinks we are cross compiling, there might be something
dnl wrong with the CC or CFLAGS settings, give a useful warning message
if test "$cross_compiling" = yes; then
  AC_MSG_RESULT([cannot compile a simple program; if not cross compiling check CC and CFLAGS])
fi

dnl gcc-cpp has the wonderful -MM option to produce nicer dependencies.
dnl But gcc 3.1 changed the meaning!  See near the end.
test "$GCC" = yes && CPP_MM=M; AC_SUBST(CPP_MM)

if test -f ./toolcheck; then
  AC_CHECKING(for buggy tools)
  sh ./toolcheck 1>&AC_FD_MSG
fi

OS_EXTRA_SRC=""; OS_EXTRA_OBJ=""

dnl Check for BeOS, which needs an extra source file
AC_MSG_CHECKING(for BeOS)
case `uname` in
    BeOS)	OS_EXTRA_SRC=os_beos.c; OS_EXTRA_OBJ=objects/os_beos.o
		BEOS=yes; AC_MSG_RESULT(yes);;
    *)		BEOS=no; AC_MSG_RESULT(no);;
esac

dnl If QNX is found, assume we don't want to use Xphoton
dnl unless it was specifically asked for (--with-x)
AC_MSG_CHECKING(for QNX)
case `uname` in
    QNX)	OS_EXTRA_SRC=os_qnx.c; OS_EXTRA_OBJ=objects/os_qnx.o
		test -z "$with_x" && with_x=no
		QNX=yes; AC_MSG_RESULT(yes);;
    *)		QNX=no; AC_MSG_RESULT(no);;
esac

dnl Check for Darwin and MacOS X
dnl We do a check for MacOS X in the very beginning because there
dnl are a lot of other things we need to change besides GUI stuff
AC_MSG_CHECKING([for Darwin (Mac OS X)])
if test "`(uname) 2>/dev/null`" = Darwin; then
  AC_MSG_RESULT(yes)

  AC_MSG_CHECKING(--disable-darwin argument)
  AC_ARG_ENABLE(darwin,
	  [  --disable-darwin        Disable Darwin (Mac OS X) support.],
	  , [enable_darwin="yes"])
  if test "$enable_darwin" = "yes"; then
    AC_MSG_RESULT(no)
    AC_MSG_CHECKING(if Darwin files are there)
    if test -f os_macosx.m; then
      AC_MSG_RESULT(yes)
    else
      AC_MSG_RESULT([no, Darwin support disabled])
      enable_darwin=no
    fi
  else
    AC_MSG_RESULT([yes, Darwin support excluded])
  fi

  AC_MSG_CHECKING(--with-mac-arch argument)
  AC_ARG_WITH(mac-arch, [  --with-mac-arch=ARCH    current, intel, ppc or both],
	MACARCH="$withval"; AC_MSG_RESULT($MACARCH),
	MACARCH="current"; AC_MSG_RESULT(defaulting to $MACARCH))

  AC_MSG_CHECKING(--with-developer-dir argument)
  AC_ARG_WITH(developer-dir, [  --with-developer-dir=PATH    use PATH as location for Xcode developer tools],
	DEVELOPER_DIR="$withval"; AC_MSG_RESULT($DEVELOPER_DIR),
        DEVELOPER_DIR=""; AC_MSG_RESULT(not present))
  
  if test "x$DEVELOPER_DIR" = "x"; then
    AC_PATH_PROG(XCODE_SELECT, xcode-select)
    if test "x$XCODE_SELECT" != "x"; then
      AC_MSG_CHECKING(for developer dir using xcode-select)
      DEVELOPER_DIR=`$XCODE_SELECT -print-path`
      AC_MSG_RESULT([$DEVELOPER_DIR])
    else
      DEVELOPER_DIR=/Developer
    fi
  fi

  if test "x$MACARCH" = "xboth"; then
    AC_MSG_CHECKING(for 10.4 universal SDK)
    dnl There is a terrible inconsistency (but we appear to get away with it):
    dnl $CFLAGS uses the 10.4u SDK library for the headers, while $CPPFLAGS
    dnl doesn't, because "gcc -E" doesn't grok it.  That means the configure
    dnl tests using the preprocessor are actually done with the wrong header
    dnl files. $LDFLAGS is set at the end, because configure uses it together
    dnl with $CFLAGS and we can only have one -sysroot argument.
    save_cppflags="$CPPFLAGS"
    save_cflags="$CFLAGS"
    save_ldflags="$LDFLAGS"
    CFLAGS="$CFLAGS -isysroot $DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc"
    AC_TRY_LINK([ ], [ ],
	AC_MSG_RESULT(found, will make universal binary),

	AC_MSG_RESULT(not found)
	CFLAGS="$save_cflags"
	AC_MSG_CHECKING(if Intel architecture is supported)
	CPPFLAGS="$CPPFLAGS -arch i386"
	LDFLAGS="$save_ldflags -arch i386"
	AC_TRY_LINK([ ], [ ],
	    AC_MSG_RESULT(yes); MACARCH="intel",
	    AC_MSG_RESULT(no, using PowerPC)
		MACARCH="ppc"
		CPPFLAGS="$save_cppflags -arch ppc"
		LDFLAGS="$save_ldflags -arch ppc"))
  elif test "x$MACARCH" = "xintel"; then
    CPPFLAGS="$CPPFLAGS -arch intel"
    LDFLAGS="$LDFLAGS -arch intel"
  elif test "x$MACARCH" = "xppc"; then
    CPPFLAGS="$CPPFLAGS -arch ppc"
    LDFLAGS="$LDFLAGS -arch ppc"
  fi

  if test "$enable_darwin" = "yes"; then
    MACOSX=yes
    OS_EXTRA_SRC="os_macosx.m os_mac_conv.c";
    OS_EXTRA_OBJ="objects/os_macosx.o objects/os_mac_conv.o"
    dnl TODO: use -arch i386 on Intel machines
    CPPFLAGS="$CPPFLAGS -DMACOS_X_UNIX -no-cpp-precomp"

    dnl If Carbon is found, assume we don't want X11
    dnl unless it was specifically asked for (--with-x)
    dnl or Motif, Athena or GTK GUI is used.
    AC_CHECK_HEADER(Carbon/Carbon.h, CARBON=yes)
    if test "x$CARBON" = "xyes"; then
      if test -z "$with_x" -a "X$enable_gui" != Xmotif -a "X$enable_gui" != Xathena -a "X$enable_gui" != Xgtk2; then
	with_x=no
      fi
    fi
  fi

  dnl Avoid a bug with -O2 with gcc 4.0.1.  Symptom: malloc() reports double
  dnl free.  This happens in expand_filename(), because the optimizer swaps
  dnl two blocks of code, both using "repl", that can't be swapped.
  if test "$MACARCH" = "intel" -o "$MACARCH" = "both"; then
    CFLAGS=`echo "$CFLAGS" | sed 's/-O[[23456789]]/-Oz/'`
  fi

else
  AC_MSG_RESULT(no)
fi

AC_SUBST(OS_EXTRA_SRC)
AC_SUBST(OS_EXTRA_OBJ)

dnl Add /usr/local/lib to $LDFLAGS and /usr/local/include to CFLAGS.
dnl Only when the directory exists and it wasn't there yet.
dnl For gcc don't do this when it is already in the default search path.
dnl Skip all of this when cross-compiling.
if test "$cross_compiling" = no; then
  AC_MSG_CHECKING(--with-local-dir argument)
  have_local_include=''
  have_local_lib=''
  AC_ARG_WITH([local-dir], [  --with-local-dir=PATH   search PATH instead of /usr/local for local libraries.
  --without-local-dir     do not search /usr/local for local libraries.], [
    local_dir="$withval"
    case "$withval" in
    */*) ;;
    no)
      # avoid adding local dir to LDFLAGS and CPPFLAGS
      have_local_include=yes
      have_local_lib=yes
      ;;
    *) AC_MSG_ERROR(must pass path argument to --with-local-dir) ;;
    esac
	AC_MSG_RESULT($local_dir)
  ], [
    local_dir=/usr/local
    AC_MSG_RESULT(Defaulting to $local_dir)
  ])
  if test "$GCC" = yes -a "$local_dir" != no; then
    echo 'void f(){}' > conftest.c
    dnl -no-cpp-precomp is needed for OS X 10.2 (Ben Fowler)
    have_local_include=`${CC-cc} -no-cpp-precomp -c -v conftest.c 2>&1 | grep "${local_dir}/include"`
    have_local_lib=`${CC-cc} -c -v conftest.c 2>&1 | grep "${local_dir}/lib"`
    rm -f conftest.c conftest.o
  fi
  if test -z "$have_local_lib" -a -d "${local_dir}/lib"; then
    tt=`echo "$LDFLAGS" | sed -e "s+-L${local_dir}/lib ++g" -e "s+-L${local_dir}/lib$++g"`
    if test "$tt" = "$LDFLAGS"; then
      LDFLAGS="$LDFLAGS -L${local_dir}/lib"
    fi
  fi
  if test -z "$have_local_include" -a -d "${local_dir}/include"; then
    tt=`echo "$CPPFLAGS" | sed -e "s+-I${local_dir}/include ++g" -e "s+-I${local_dir}/include$++g"`
    if test "$tt" = "$CPPFLAGS"; then
      CPPFLAGS="$CPPFLAGS -I${local_dir}/include"
    fi
  fi
fi

AC_MSG_CHECKING(--with-vim-name argument)
AC_ARG_WITH(vim-name, [  --with-vim-name=NAME    what to call the Vim executable],
	VIMNAME="$withval"; AC_MSG_RESULT($VIMNAME),
	VIMNAME="vim"; AC_MSG_RESULT(Defaulting to $VIMNAME))
AC_SUBST(VIMNAME)
AC_MSG_CHECKING(--with-ex-name argument)
AC_ARG_WITH(ex-name, [  --with-ex-name=NAME     what to call the Ex executable],
	EXNAME="$withval"; AC_MSG_RESULT($EXNAME),
	EXNAME="ex"; AC_MSG_RESULT(Defaulting to ex))
AC_SUBST(EXNAME)
AC_MSG_CHECKING(--with-view-name argument)
AC_ARG_WITH(view-name, [  --with-view-name=NAME   what to call the View executable],
	VIEWNAME="$withval"; AC_MSG_RESULT($VIEWNAME),
	VIEWNAME="view"; AC_MSG_RESULT(Defaulting to view))
AC_SUBST(VIEWNAME)

AC_MSG_CHECKING(--with-global-runtime argument)
AC_ARG_WITH(global-runtime, [  --with-global-runtime=DIR    global runtime directory in 'runtimepath'],
	AC_MSG_RESULT($withval); AC_DEFINE_UNQUOTED(RUNTIME_GLOBAL, "$withval"),
	AC_MSG_RESULT(no))

AC_MSG_CHECKING(--with-modified-by argument)
AC_ARG_WITH(modified-by, [  --with-modified-by=NAME       name of who modified a release version],
	AC_MSG_RESULT($withval); AC_DEFINE_UNQUOTED(MODIFIED_BY, "$withval"),
	AC_MSG_RESULT(no))

dnl Check for EBCDIC stolen from the LYNX port to z/OS Unix
AC_MSG_CHECKING(if character set is EBCDIC)
AC_TRY_COMPILE([ ],
[ /* TryCompile function for CharSet.
   Treat any failure as ASCII for compatibility with existing art.
   Use compile-time rather than run-time tests for cross-compiler
   tolerance.  */
#if '0'!=240
make an error "Character set is not EBCDIC"
#endif ],
[ # TryCompile action if true
cf_cv_ebcdic=yes ],
[ # TryCompile action if false
cf_cv_ebcdic=no])
# end of TryCompile ])
# end of CacheVal CvEbcdic
AC_MSG_RESULT($cf_cv_ebcdic)
case "$cf_cv_ebcdic" in  #(vi
    yes)	AC_DEFINE(EBCDIC)
		line_break='"\\n"'
		;;
    *)		line_break='"\\012"';;
esac
AC_SUBST(line_break)

if test "$cf_cv_ebcdic" = "yes"; then
dnl If we have EBCDIC we most likley have z/OS Unix, let's test it!
AC_MSG_CHECKING(for z/OS Unix)
case `uname` in
    OS/390)	zOSUnix="yes";
		dnl If using cc the environment variable _CC_CCMODE must be
		dnl set to "1", so that some compiler extensions are enabled.
		dnl If using c89 the environment variable is named _CC_C89MODE.
		dnl Note: compile with c89 never tested.
		if test "$CC" = "cc"; then
		  ccm="$_CC_CCMODE"
		  ccn="CC"
		else
		  if test "$CC" = "c89"; then
		    ccm="$_CC_C89MODE"
		    ccn="C89"
		  else
		    ccm=1
		  fi
		fi
		if test "$ccm" != "1"; then
		  echo ""
		  echo "------------------------------------------"
		  echo " On z/OS Unix, the environment variable"
		  echo " __CC_${ccn}MODE must be set to \"1\"!"
		  echo " Do:"
		  echo "    export _CC_${ccn}MODE=1"
		  echo " and then call configure again."
		  echo "------------------------------------------"
		  exit 1
		fi
		CFLAGS="$CFLAGS -D_ALL_SOURCE -Wc,float\\(IEEE\\)";
                LDFLAGS="$LDFLAGS -Wl,EDIT=NO"
		AC_MSG_RESULT(yes)
		;;
    *)		zOSUnix="no";
		AC_MSG_RESULT(no)
		;;
esac
fi

dnl Set QUOTESED. Needs additional backslashes on zOS
if test "$zOSUnix" = "yes"; then
    QUOTESED="sed -e 's/[[\\\\\"]]/\\\\\\\\&/g' -e 's/\\\\\\\\\"/\"/' -e 's/\\\\\\\\\";\$\$/\";/'"
else
    QUOTESED="sed -e 's/[[\\\\\"]]/\\\\&/g' -e 's/\\\\\"/\"/' -e 's/\\\\\";\$\$/\";/'"
fi
AC_SUBST(QUOTESED)


dnl Link with -lselinux for SELinux stuff; if not found
AC_MSG_CHECKING(--disable-selinux argument)
AC_ARG_ENABLE(selinux,
	[  --disable-selinux	  Don't check for SELinux support.],
	, enable_selinux="yes")
if test "$enable_selinux" = "yes"; then
  AC_MSG_RESULT(no)
  AC_CHECK_LIB(selinux, is_selinux_enabled,
	  [LIBS="$LIBS -lselinux"
	   AC_DEFINE(HAVE_SELINUX)])
else
   AC_MSG_RESULT(yes)
fi

dnl Check user requested features.

AC_MSG_CHECKING(--with-features argument)
AC_ARG_WITH(features, [  --with-features=TYPE    tiny, small, normal, big or huge (default: normal)],
	features="$withval"; AC_MSG_RESULT($features),
	features="normal"; AC_MSG_RESULT(Defaulting to normal))

dovimdiff=""
dogvimdiff=""
case "$features" in
  tiny)		AC_DEFINE(FEAT_TINY) ;;
  small)	AC_DEFINE(FEAT_SMALL) ;;
  normal)	AC_DEFINE(FEAT_NORMAL) dovimdiff="installvimdiff";
			dogvimdiff="installgvimdiff" ;;
  big)		AC_DEFINE(FEAT_BIG) dovimdiff="installvimdiff";
			dogvimdiff="installgvimdiff" ;;
  huge)		AC_DEFINE(FEAT_HUGE) dovimdiff="installvimdiff";
			dogvimdiff="installgvimdiff" ;;
  *)		AC_MSG_RESULT([Sorry, $features is not supported]) ;;
esac

AC_SUBST(dovimdiff)
AC_SUBST(dogvimdiff)

AC_MSG_CHECKING(--with-compiledby argument)
AC_ARG_WITH(compiledby, [  --with-compiledby=NAME  name to show in :version message],
	compiledby="$withval"; AC_MSG_RESULT($withval),
	compiledby=""; AC_MSG_RESULT(no))
AC_SUBST(compiledby)

AC_MSG_CHECKING(--disable-xsmp argument)
AC_ARG_ENABLE(xsmp,
	[  --disable-xsmp          Disable XSMP session management],
	, enable_xsmp="yes")

if test "$enable_xsmp" = "yes"; then
  AC_MSG_RESULT(no)
  AC_MSG_CHECKING(--disable-xsmp-interact argument)
  AC_ARG_ENABLE(xsmp-interact,
	  [  --disable-xsmp-interact Disable XSMP interaction],
	  , enable_xsmp_interact="yes")
  if test "$enable_xsmp_interact" = "yes"; then
    AC_MSG_RESULT(no)
    AC_DEFINE(USE_XSMP_INTERACT)
  else
    AC_MSG_RESULT(yes)
  fi
else
  AC_MSG_RESULT(yes)
fi

dnl Check for Lua feature.
AC_MSG_CHECKING(--enable-luainterp argument)
AC_ARG_ENABLE(luainterp,
	[  --enable-luainterp[=OPTS]     Include Lua interpreter.  [default=no] [OPTS=no/yes/dynamic]], ,
	[enable_luainterp="no"])
AC_MSG_RESULT($enable_luainterp)

if test "$enable_luainterp" = "yes" -o "$enable_luainterp" = "dynamic"; then
  dnl -- find the lua executable
  AC_SUBST(vi_cv_path_lua)

  AC_MSG_CHECKING(--with-lua-prefix argument)
  AC_ARG_WITH(lua_prefix,
	[  --with-lua-prefix=PFX   Prefix where Lua is installed.],
	with_lua_prefix="$withval"; AC_MSG_RESULT($with_lua_prefix),
	with_lua_prefix="";AC_MSG_RESULT(no))

  if test "X$with_lua_prefix" != "X"; then
       vi_cv_path_lua_pfx="$with_lua_prefix"
  else
    AC_MSG_CHECKING(LUA_PREFIX environment var)
    if test "X$LUA_PREFIX" != "X"; then
	AC_MSG_RESULT("$LUA_PREFIX")
	vi_cv_path_lua_pfx="$LUA_PREFIX"
    else
	AC_MSG_RESULT([not set, default to /usr])
	vi_cv_path_lua_pfx="/usr"
    fi
  fi

  LUA_INC=
  if test "X$vi_cv_path_lua_pfx" != "X"; then
    AC_MSG_CHECKING(if lua.h can be found in $vi_cv_path_lua_pfx/include)
    if test -f $vi_cv_path_lua_pfx/include/lua.h; then
      AC_MSG_RESULT(yes)
    else
      AC_MSG_RESULT(no)
      dnl -- try to find Lua executable
      AC_PATH_PROG(vi_cv_path_lua, lua)
      if test "X$vi_cv_path_lua" != "X"; then
        dnl -- find Lua version
        AC_CACHE_CHECK(Lua version, vi_cv_version_lua,
        [ vi_cv_version_lua=`${vi_cv_path_lua} -e "print(_VERSION)" | sed 's/.* //'` ])
        AC_MSG_CHECKING(if lua.h can be found in $vi_cv_path_lua_pfx/include/lua$vi_cv_version_lua)
        if test -f $vi_cv_path_lua_pfx/include/lua$vi_cv_version_lua/lua.h; then
          AC_MSG_RESULT(yes)
          LUA_INC=/lua$vi_cv_version_lua
        else
          AC_MSG_RESULT(no)
          vi_cv_path_lua_pfx=
        fi
      fi
    fi
  fi

  if test "X$vi_cv_path_lua_pfx" != "X"; then
    if test "X$vi_cv_version_lua" != "X"; then
      dnl Test alternate location using version
      LUA_LIBS="-L${vi_cv_path_lua_pfx}/lib -llua$vi_cv_version_lua"
    else
      LUA_LIBS="-L${vi_cv_path_lua_pfx}/lib -llua"
    fi
    LUA_CFLAGS="-I${vi_cv_path_lua_pfx}/include${LUA_INC}"
    LUA_SRC="if_lua.c"
    LUA_OBJ="objects/if_lua.o"
    LUA_PRO="if_lua.pro"
    AC_DEFINE(FEAT_LUA)
    if test "$enable_luainterp" = "dynamic"; then
      dnl Determine the SONAME for the current version, but fallback to
      dnl liblua${vi_cv_version_lua}.so if no SONAME-versioned file is found.
      for i in 0 1 2 3 4 5 6 7 8 9; do
	if test -f "${vi_cv_path_lua_pfx}/lib/liblua${vi_cv_version_lua}.so.$i"; then
	  LUA_SONAME=".$i"
	  break
	fi
      done
      AC_DEFINE(DYNAMIC_LUA)
      LUA_LIBS=""
      LUA_CFLAGS="-DDYNAMIC_LUA_DLL=\\\"liblua${vi_cv_version_lua}.so$LUA_SONAME\\\" $LUA_CFLAGS"
    fi
  fi
  AC_SUBST(LUA_SRC)
  AC_SUBST(LUA_OBJ)
  AC_SUBST(LUA_PRO)
  AC_SUBST(LUA_LIBS)
  AC_SUBST(LUA_CFLAGS)
fi


dnl Check for MzScheme feature.
AC_MSG_CHECKING(--enable-mzschemeinterp argument)
AC_ARG_ENABLE(mzschemeinterp,
	[  --enable-mzschemeinterp   Include MzScheme interpreter.], ,
	[enable_mzschemeinterp="no"])
AC_MSG_RESULT($enable_mzschemeinterp)

if test "$enable_mzschemeinterp" = "yes"; then
  dnl -- find the mzscheme executable
  AC_SUBST(vi_cv_path_mzscheme)

  AC_MSG_CHECKING(--with-plthome argument)
  AC_ARG_WITH(plthome,
	[  --with-plthome=PLTHOME   Use PLTHOME.],
	with_plthome="$withval"; AC_MSG_RESULT($with_plthome),
	with_plthome="";AC_MSG_RESULT("no"))

  if test "X$with_plthome" != "X"; then
       vi_cv_path_mzscheme_pfx="$with_plthome"
  else
    AC_MSG_CHECKING(PLTHOME environment var)
    if test "X$PLTHOME" != "X"; then
	AC_MSG_RESULT("$PLTHOME")
	vi_cv_path_mzscheme_pfx="$PLTHOME"
    else
	AC_MSG_RESULT(not set)
	dnl -- try to find MzScheme executable
	AC_PATH_PROG(vi_cv_path_mzscheme, mzscheme)

	dnl resolve symbolic link, the executable is often elsewhere and there
	dnl are no links for the include files.
	if test "X$vi_cv_path_mzscheme" != "X"; then
	  lsout=`ls -l $vi_cv_path_mzscheme`
	  if echo "$lsout" | grep -e '->' >/dev/null 2>/dev/null; then
	    vi_cv_path_mzscheme=`echo "$lsout" | sed 's/.*-> \(.*\)/\1/'`
	  fi
	fi

	if test "X$vi_cv_path_mzscheme" != "X"; then
	    dnl -- find where MzScheme thinks it was installed
	    AC_CACHE_CHECK(MzScheme install prefix,vi_cv_path_mzscheme_pfx,
	    dnl different versions of MzScheme differ in command line processing
	    dnl use universal approach
	    echo "(display (simplify-path		\
	       (build-path (call-with-values	\
		(lambda () (split-path (find-system-path (quote exec-file)))) \
		(lambda (base name must-be-dir?) base)) (quote up))))" > mzdirs.scm
	    dnl Remove a trailing slash
	    [ vi_cv_path_mzscheme_pfx=`${vi_cv_path_mzscheme} -r mzdirs.scm | \
		sed -e 's+/$++'` ])
	    rm -f mzdirs.scm
	fi
    fi
  fi

  SCHEME_INC=
  if test "X$vi_cv_path_mzscheme_pfx" != "X"; then
    AC_MSG_CHECKING(if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include)
    if test -f $vi_cv_path_mzscheme_pfx/include/scheme.h; then
      SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include
      AC_MSG_RESULT(yes)
    else
      AC_MSG_RESULT(no)
      AC_MSG_CHECKING(if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include/plt)
      if test -f $vi_cv_path_mzscheme_pfx/include/plt/scheme.h; then
	AC_MSG_RESULT(yes)
	SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include/plt
      else
	AC_MSG_RESULT(no)
	AC_MSG_CHECKING(if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include/racket)
	if test -f $vi_cv_path_mzscheme_pfx/include/racket/scheme.h; then
	  AC_MSG_RESULT(yes)
	  SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include/racket
	else
	  AC_MSG_RESULT(no)
	  AC_MSG_CHECKING(if scheme.h can be found in /usr/include/plt/)
	  if test -f /usr/include/plt/scheme.h; then
	    AC_MSG_RESULT(yes)
	    SCHEME_INC=/usr/include/plt
	  else
	    AC_MSG_RESULT(no)
	    AC_MSG_CHECKING(if scheme.h can be found in /usr/include/racket/)
	    if test -f /usr/include/racket/scheme.h; then
	      AC_MSG_RESULT(yes)
	      SCHEME_INC=/usr/include/racket
	    else
	      AC_MSG_RESULT(no)
	      vi_cv_path_mzscheme_pfx=
	    fi
	  fi
	fi
      fi
    fi
  fi

  if test "X$vi_cv_path_mzscheme_pfx" != "X"; then
    if test "x$MACOSX" = "xyes"; then
      MZSCHEME_LIBS="-framework PLT_MzScheme"
    elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a"; then
      MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a"
      MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
    elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libracket3m.a"; then
      MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libracket3m.a"
      MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
    elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libracket.a"; then
      MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libracket.a ${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"
    elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme.a"; then
      MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme.a ${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"
    else
      dnl Using shared objects
      if test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.so"; then
        MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme3m"
	MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
      elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libracket3m.so"; then
        MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lracket3m"
	MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
      elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libracket.so"; then
        MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lracket -lmzgc"
      else
        MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc"
      fi
      if test "$GCC" = yes; then
	dnl Make Vim remember the path to the library.  For when it's not in
	dnl $LD_LIBRARY_PATH.
	MZSCHEME_LIBS="${MZSCHEME_LIBS} -Wl,-rpath -Wl,${vi_cv_path_mzscheme_pfx}/lib"
      elif test "`(uname) 2>/dev/null`" = SunOS &&
			       uname -r | grep '^5' >/dev/null; then
	MZSCHEME_LIBS="${MZSCHEME_LIBS} -R ${vi_cv_path_mzscheme_pfx}/lib"
      fi
    fi
    if test -d $vi_cv_path_mzscheme_pfx/lib/plt/collects; then
      SCHEME_COLLECTS=lib/plt/
    else
      if test -d $vi_cv_path_mzscheme_pfx/lib/racket/collects; then
	SCHEME_COLLECTS=lib/racket/
      fi
    fi
    if test -f "${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects/scheme/base.ss" ; then
      MZSCHEME_EXTRA="mzscheme_base.c"
    else
      if test -f "${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects/scheme/base.rkt" ; then
	MZSCHEME_EXTRA="mzscheme_base.c"
      fi
    fi
    if test "X$MZSCHEME_EXTRA" != "X" ; then
      dnl need to generate bytecode for MzScheme base
      MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -DINCLUDE_MZSCHEME_BASE"
      MZSCHEME_MZC="${vi_cv_path_mzscheme_pfx}/bin/mzc"
    fi
    MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -I${SCHEME_INC} \
      -DMZSCHEME_COLLECTS='\"${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects\"'"
    MZSCHEME_SRC="if_mzsch.c"
    MZSCHEME_OBJ="objects/if_mzsch.o"
    MZSCHEME_PRO="if_mzsch.pro"
    AC_DEFINE(FEAT_MZSCHEME)
  fi
  AC_SUBST(MZSCHEME_SRC)
  AC_SUBST(MZSCHEME_OBJ)
  AC_SUBST(MZSCHEME_PRO)
  AC_SUBST(MZSCHEME_LIBS)
  AC_SUBST(MZSCHEME_CFLAGS)
  AC_SUBST(MZSCHEME_EXTRA)
  AC_SUBST(MZSCHEME_MZC)
fi


AC_MSG_CHECKING(--enable-perlinterp argument)
AC_ARG_ENABLE(perlinterp,
	[  --enable-perlinterp[=OPTS]     Include Perl interpreter.  [default=no] [OPTS=no/yes/dynamic]], ,
	[enable_perlinterp="no"])
AC_MSG_RESULT($enable_perlinterp)
if test "$enable_perlinterp" = "yes" -o "$enable_perlinterp" = "dynamic"; then
  AC_SUBST(vi_cv_path_perl)
  AC_PATH_PROG(vi_cv_path_perl, perl)
  if test "X$vi_cv_path_perl" != "X"; then
    AC_MSG_CHECKING(Perl version)
    if $vi_cv_path_perl -e 'require 5.003_01' >/dev/null 2>/dev/null; then
     eval `$vi_cv_path_perl -V:usethreads`
     eval `$vi_cv_path_perl -V:libperl`
     if test "X$usethreads" = "XUNKNOWN" -o "X$usethreads" = "Xundef"; then
       badthreads=no
     else
       if $vi_cv_path_perl -e 'require 5.6.0' >/dev/null 2>/dev/null; then
	 eval `$vi_cv_path_perl -V:use5005threads`
	 if test "X$use5005threads" = "XUNKNOWN" -o "X$use5005threads" = "Xundef"; then
	   badthreads=no
	 else
	   badthreads=yes
	   AC_MSG_RESULT(>>> Perl > 5.6 with 5.5 threads cannot be used <<<)
	 fi
       else
	 badthreads=yes
	 AC_MSG_RESULT(>>> Perl 5.5 with threads cannot be used <<<)
       fi
     fi
     if test $badthreads = no; then
      AC_MSG_RESULT(OK)
      eval `$vi_cv_path_perl -V:shrpenv`
      if test "X$shrpenv" = "XUNKNOWN"; then # pre 5.003_04
	shrpenv=""
      fi
      vi_cv_perllib=`$vi_cv_path_perl -MConfig -e 'print $Config{privlibexp}'`
      AC_SUBST(vi_cv_perllib)
      dnl Remove "-fno-something", it breaks using cproto.
      perlcppflags=`$vi_cv_path_perl -Mlib=$srcdir -MExtUtils::Embed \
	      -e 'ccflags;perl_inc;print"\n"' | sed -e 's/-fno[[^ ]]*//'`
      dnl Remove "-lc", it breaks on FreeBSD when using "-pthread".
      perllibs=`cd $srcdir; $vi_cv_path_perl -MExtUtils::Embed -e 'ldopts' | \
		sed -e '/Warning/d' -e '/Note (probably harmless)/d' \
			-e 's/-bE:perl.exp//' -e 's/-lc //'`
      dnl Don't add perl lib to $LIBS: if it's not in LD_LIBRARY_PATH
      dnl a test in configure may fail because of that.
      perlldflags=`cd $srcdir; $vi_cv_path_perl -MExtUtils::Embed \
		-e 'ccdlflags' | sed -e 's/-bE:perl.exp//'`

      dnl check that compiling a simple program still works with the flags
      dnl added for Perl.
      AC_MSG_CHECKING([if compile and link flags for Perl are sane])
      cflags_save=$CFLAGS
      libs_save=$LIBS
      ldflags_save=$LDFLAGS
      CFLAGS="$CFLAGS $perlcppflags"
      LIBS="$LIBS $perllibs"
      LDFLAGS="$perlldflags $LDFLAGS"
      AC_TRY_LINK(,[ ],
	     AC_MSG_RESULT(yes); perl_ok=yes,
	     AC_MSG_RESULT(no: PERL DISABLED); perl_ok=no)
      CFLAGS=$cflags_save
      LIBS=$libs_save
      LDFLAGS=$ldflags_save
      if test $perl_ok = yes; then
	if test "X$perlcppflags" != "X"; then
	  dnl remove -pipe and -Wxxx, it confuses cproto
	  PERL_CFLAGS=`echo "$perlcppflags" | sed -e 's/-pipe //' -e 's/-W[[^ ]]*//'`
	fi
	if test "X$perlldflags" != "X"; then
	  LDFLAGS="$perlldflags $LDFLAGS"
	fi
	PERL_LIBS=$perllibs
	PERL_SRC="auto/if_perl.c if_perlsfio.c"
	PERL_OBJ="objects/if_perl.o objects/if_perlsfio.o"
	PERL_PRO="if_perl.pro if_perlsfio.pro"
	AC_DEFINE(FEAT_PERL)
      fi
     fi
    else
      AC_MSG_RESULT(>>> too old; need Perl version 5.003_01 or later <<<)
    fi
  fi

  if test "x$MACOSX" = "xyes"; then
    dnl Mac OS X 10.2 or later
    dir=/System/Library/Perl
    darwindir=$dir/darwin
    if test -d $darwindir; then
      PERL=/usr/bin/perl
    else
      dnl Mac OS X 10.3
      dir=/System/Library/Perl/5.8.1
      darwindir=$dir/darwin-thread-multi-2level
      if test -d $darwindir; then
	PERL=/usr/bin/perl
      fi
    fi
    if test -n "$PERL"; then
      PERL_DIR="$dir"
      PERL_CFLAGS="-DFEAT_PERL -I$darwindir/CORE"
      PERL_OBJ="objects/if_perl.o objects/if_perlsfio.o $darwindir/auto/DynaLoader/DynaLoader.a"
      PERL_LIBS="-L$darwindir/CORE -lperl"
    fi
    dnl Perl on Mac OS X 10.5 adds "-arch" flags but these should only
    dnl be included if requested by passing --with-mac-arch to
    dnl configure, so strip these flags first (if present)
    PERL_LIBS=`echo "$PERL_LIBS" | sed -e 's/-arch\ ppc//' -e 's/-arch\ i386//' -e 's/-arch\ x86_64//'`
    PERL_CFLAGS=`echo "$PERL_CFLAGS" | sed -e 's/-arch\ ppc//' -e 's/-arch\ i386//' -e 's/-arch\ x86_64//'`
  fi
  if test "$enable_perlinterp" = "dynamic"; then
    if test "$perl_ok" = "yes" -a "X$libperl" != "X"; then
      AC_DEFINE(DYNAMIC_PERL)
      PERL_CFLAGS="-DDYNAMIC_PERL_DLL=\\\"$libperl\\\" $PERL_CFLAGS"
    fi
  fi
fi
AC_SUBST(shrpenv)
AC_SUBST(PERL_SRC)
AC_SUBST(PERL_OBJ)
AC_SUBST(PERL_PRO)
AC_SUBST(PERL_CFLAGS)
AC_SUBST(PERL_LIBS)

AC_MSG_CHECKING(--enable-pythoninterp argument)
AC_ARG_ENABLE(pythoninterp,
	[  --enable-pythoninterp[=OPTS]   Include Python interpreter. [default=no] [OPTS=no/yes/dynamic]], ,
	[enable_pythoninterp="no"])
AC_MSG_RESULT($enable_pythoninterp)
if test "$enable_pythoninterp" = "yes" -o "$enable_pythoninterp" = "dynamic"; then
  dnl -- find the python executable
  AC_PATH_PROG(vi_cv_path_python, python)
  if test "X$vi_cv_path_python" != "X"; then

    dnl -- get its version number
    AC_CACHE_CHECK(Python version,vi_cv_var_python_version,
    [[vi_cv_var_python_version=`
	    ${vi_cv_path_python} -c 'import sys; print sys.version[:3]'`
    ]])

    dnl -- it must be at least version 1.4
    AC_MSG_CHECKING(Python is 1.4 or better)
    if ${vi_cv_path_python} -c \
	"import sys; sys.exit(${vi_cv_var_python_version} < 1.4)"
    then
      AC_MSG_RESULT(yep)

      dnl -- find where python thinks it was installed
      AC_CACHE_CHECK(Python's install prefix,vi_cv_path_python_pfx,
      [ vi_cv_path_python_pfx=`
	    ${vi_cv_path_python} -c \
		"import sys; print sys.prefix"` ])

      dnl -- and where it thinks it runs
      AC_CACHE_CHECK(Python's execution prefix,vi_cv_path_python_epfx,
      [ vi_cv_path_python_epfx=`
	    ${vi_cv_path_python} -c \
		"import sys; print sys.exec_prefix"` ])

      dnl -- python's internal library path

      AC_CACHE_VAL(vi_cv_path_pythonpath,
      [ vi_cv_path_pythonpath=`
	    unset PYTHONPATH;
	    ${vi_cv_path_python} -c \
		"import sys, string; print string.join(sys.path,':')"` ])

      dnl -- where the Python implementation library archives are

      AC_ARG_WITH(python-config-dir,
	[  --with-python-config-dir=PATH  Python's config directory],
	[ vi_cv_path_python_conf="${withval}" ] )

      AC_CACHE_CHECK(Python's configuration directory,vi_cv_path_python_conf,
      [
	vi_cv_path_python_conf=
	for path in "${vi_cv_path_python_pfx}" "${vi_cv_path_python_epfx}"; do
	  for subdir in lib64 lib share; do
	    d="${path}/${subdir}/python${vi_cv_var_python_version}/config"
	    if test -d "$d" && test -f "$d/config.c"; then
	      vi_cv_path_python_conf="$d"
	    fi
	  done
	done
      ])

      PYTHON_CONFDIR="${vi_cv_path_python_conf}"

      if test "X$PYTHON_CONFDIR" = "X"; then
	AC_MSG_RESULT([can't find it!])
      else

	dnl -- we need to examine Python's config/Makefile too
	dnl    see what the interpreter is built from
	AC_CACHE_VAL(vi_cv_path_python_plibs,
	[
	    pwd=`pwd`
	    tmp_mkf="$pwd/config-PyMake$$"
	    cat -- "${PYTHON_CONFDIR}/Makefile" - <<'eof' >"${tmp_mkf}"
__:
	@echo "python_BASEMODLIBS='$(BASEMODLIBS)'"
	@echo "python_LIBS='$(LIBS)'"
	@echo "python_SYSLIBS='$(SYSLIBS)'"
	@echo "python_LINKFORSHARED='$(LINKFORSHARED)'"
	@echo "python_INSTSONAME='$(INSTSONAME)'"
eof
	    dnl -- delete the lines from make about Entering/Leaving directory
	    eval "`cd ${PYTHON_CONFDIR} && make -f "${tmp_mkf}" __ | sed '/ directory /d'`"
	    rm -f -- "${tmp_mkf}"
	    if test "x$MACOSX" = "xyes" && ${vi_cv_path_python} -c \
		"import sys; sys.exit(${vi_cv_var_python_version} < 2.3)"; then
	      vi_cv_path_python_plibs="-framework Python"
	    else
	      if test "${vi_cv_var_python_version}" = "1.4"; then
		  vi_cv_path_python_plibs="${PYTHON_CONFDIR}/libModules.a ${PYTHON_CONFDIR}/libPython.a ${PYTHON_CONFDIR}/libObjects.a ${PYTHON_CONFDIR}/libParser.a"
	      else
		  vi_cv_path_python_plibs="-L${PYTHON_CONFDIR} -lpython${vi_cv_var_python_version}"
	      fi
	      vi_cv_path_python_plibs="${vi_cv_path_python_plibs} ${python_BASEMODLIBS} ${python_LIBS} ${python_SYSLIBS} ${python_LINKFORSHARED}"
	      dnl remove -ltermcap, it can conflict with an earlier -lncurses
	      vi_cv_path_python_plibs=`echo $vi_cv_path_python_plibs | sed s/-ltermcap//`
	    fi
	])

	PYTHON_LIBS="${vi_cv_path_python_plibs}"
	if test "${vi_cv_path_python_pfx}" = "${vi_cv_path_python_epfx}"; then
	  PYTHON_CFLAGS="-I${vi_cv_path_python_pfx}/include/python${vi_cv_var_python_version} -DPYTHON_HOME=\\\"${vi_cv_path_python_pfx}\\\""
	else
	  PYTHON_CFLAGS="-I${vi_cv_path_python_pfx}/include/python${vi_cv_var_python_version} -I${vi_cv_path_python_epfx}/include/python${vi_cv_var_python_version} -DPYTHON_HOME=\\\"${vi_cv_path_python_pfx}\\\""
	fi
	PYTHON_SRC="if_python.c"
	dnl For Mac OSX 10.2 config.o is included in the Python library.
	if test "x$MACOSX" = "xyes"; then
	  PYTHON_OBJ="objects/if_python.o"
	else
	  PYTHON_OBJ="objects/if_python.o objects/py_config.o"
	fi
	if test "${vi_cv_var_python_version}" = "1.4"; then
	   PYTHON_OBJ="$PYTHON_OBJ objects/py_getpath.o"
	fi
    PYTHON_GETPATH_CFLAGS="-DPYTHONPATH='\"${vi_cv_path_pythonpath}\"' -DPREFIX='\"${vi_cv_path_python_pfx}\"' -DEXEC_PREFIX='\"${vi_cv_path_python_epfx}\"'"

	dnl On FreeBSD linking with "-pthread" is required to use threads.
	dnl _THREAD_SAFE must be used for compiling then.
	dnl The "-pthread" is added to $LIBS, so that the following check for
	dnl sigaltstack() will look in libc_r (it's there in libc!).
	dnl Otherwise, when using GCC, try adding -pthread to $CFLAGS.  GCC
	dnl will then define target-specific defines, e.g., -D_REENTRANT.
	dnl Don't do this for Mac OSX, -pthread will generate a warning.
	AC_MSG_CHECKING([if -pthread should be used])
	threadsafe_flag=
	thread_lib=
	dnl if test "x$MACOSX" != "xyes"; then
        if test "`(uname) 2>/dev/null`" != Darwin; then
	  test "$GCC" = yes && threadsafe_flag="-pthread"
	  if test "`(uname) 2>/dev/null`" = FreeBSD; then
	    threadsafe_flag="-D_THREAD_SAFE"
	    thread_lib="-pthread"
	  fi
	fi
	libs_save_old=$LIBS
	if test -n "$threadsafe_flag"; then
	  cflags_save=$CFLAGS
	  CFLAGS="$CFLAGS $threadsafe_flag"
	  LIBS="$LIBS $thread_lib"
	  AC_TRY_LINK(,[ ],
	     AC_MSG_RESULT(yes); PYTHON_CFLAGS="$PYTHON_CFLAGS $threadsafe_flag",
	     AC_MSG_RESULT(no); LIBS=$libs_save_old
	     )
	  CFLAGS=$cflags_save
	else
	  AC_MSG_RESULT(no)
	fi

	dnl Check that compiling a simple program still works with the flags
	dnl added for Python.
	AC_MSG_CHECKING([if compile and link flags for Python are sane])
	cflags_save=$CFLAGS
	libs_save=$LIBS
	CFLAGS="$CFLAGS $PYTHON_CFLAGS"
	LIBS="$LIBS $PYTHON_LIBS"
	AC_TRY_LINK(,[ ],
	       AC_MSG_RESULT(yes); python_ok=yes,
	       AC_MSG_RESULT(no: PYTHON DISABLED); python_ok=no)
	CFLAGS=$cflags_save
	LIBS=$libs_save
	if test $python_ok = yes; then
	  AC_DEFINE(FEAT_PYTHON)
	else
	  LIBS=$libs_save_old
	  PYTHON_SRC=
	  PYTHON_OBJ=
	  PYTHON_LIBS=
	  PYTHON_CFLAGS=
	fi

      fi
    else
      AC_MSG_RESULT(too old)
    fi
  fi
fi

AC_SUBST(PYTHON_CONFDIR)
AC_SUBST(PYTHON_LIBS)
AC_SUBST(PYTHON_GETPATH_CFLAGS)
AC_SUBST(PYTHON_CFLAGS)
AC_SUBST(PYTHON_SRC)
AC_SUBST(PYTHON_OBJ)


AC_MSG_CHECKING(--enable-python3interp argument)
AC_ARG_ENABLE(python3interp,
	[  --enable-python3interp[=OPTS]   Include Python3 interpreter. [default=no] [OPTS=no/yes/dynamic]], ,
	[enable_python3interp="no"])
AC_MSG_RESULT($enable_python3interp)
if test "$enable_python3interp" = "yes" -o "$enable_python3interp" = "dynamic"; then
  dnl -- find the python3 executable
  AC_PATH_PROG(vi_cv_path_python3, python3)
  if test "X$vi_cv_path_python3" != "X"; then

    dnl -- get its version number
    AC_CACHE_CHECK(Python version,vi_cv_var_python3_version,
    [[vi_cv_var_python3_version=`
          ${vi_cv_path_python3} -c 'import sys; print(sys.version[:3])'`
    ]])

    dnl -- find where python3 thinks it was installed
    AC_CACHE_CHECK(Python's install prefix,vi_cv_path_python3_pfx,
    [ vi_cv_path_python3_pfx=`
     ${vi_cv_path_python3} -c \
     "import sys; print(sys.prefix)"` ])

    dnl -- and where it thinks it runs
    AC_CACHE_CHECK(Python's execution prefix,vi_cv_path_python3_epfx,
    [ vi_cv_path_python3_epfx=`
     ${vi_cv_path_python3} -c \
     "import sys; print(sys.exec_prefix)"` ])

    dnl -- python3's internal library path

    AC_CACHE_VAL(vi_cv_path_python3path,
    [ vi_cv_path_python3path=`
     unset PYTHONPATH;
     ${vi_cv_path_python3} -c \
     "import sys, string; print(':'.join(sys.path))"` ])

    dnl -- where the Python implementation library archives are

    AC_ARG_WITH(python3-config-dir,
     [  --with-python3-config-dir=PATH  Python's config directory],
     [ vi_cv_path_python3_conf="${withval}" ] )

    AC_CACHE_CHECK(Python's configuration directory,vi_cv_path_python3_conf,
    [
     vi_cv_path_python3_conf=
     for path in "${vi_cv_path_python3_pfx}" "${vi_cv_path_python3_epfx}"; do
       for subdir in lib64 lib share; do
         d="${path}/${subdir}/python${vi_cv_var_python3_version}/config"
         if test -d "$d" && test -f "$d/config.c"; then
           vi_cv_path_python3_conf="$d"
         fi
       done
     done
    ])

    PYTHON3_CONFDIR="${vi_cv_path_python3_conf}"

    if test "X$PYTHON3_CONFDIR" = "X"; then
      AC_MSG_RESULT([can't find it!])
    else

      dnl -- we need to examine Python's config/Makefile too
      dnl    see what the interpreter is built from
      AC_CACHE_VAL(vi_cv_path_python3_plibs,
      [
          pwd=`pwd`
          tmp_mkf="$pwd/config-PyMake$$"
          cat -- "${PYTHON3_CONFDIR}/Makefile" - <<'eof' >"${tmp_mkf}"
__:
	@echo "python3_BASEMODLIBS='$(BASEMODLIBS)'"
	@echo "python3_LIBS='$(LIBS)'"
	@echo "python3_SYSLIBS='$(SYSLIBS)'"
	@echo "python3_LINKFORSHARED='$(LINKFORSHARED)'"
	@echo "python3_INSTSONAME='$(INSTSONAME)'"
eof
          dnl -- delete the lines from make about Entering/Leaving directory
          eval "`cd ${PYTHON3_CONFDIR} && make -f "${tmp_mkf}" __ | sed '/ directory /d'`"
          rm -f -- "${tmp_mkf}"
          vi_cv_path_python3_plibs="-L${PYTHON3_CONFDIR} -lpython${vi_cv_var_python3_version}"
          vi_cv_path_python3_plibs="${vi_cv_path_python3_plibs} ${python3_BASEMODLIBS} ${python3_LIBS} ${python3_SYSLIBS} ${python3_LINKFORSHARED}"
          dnl remove -ltermcap, it can conflict with an earlier -lncurses
          vi_cv_path_python3_plibs=`echo $vi_cv_path_python3_plibs | sed s/-ltermcap//`
          vi_cv_path_python3_plibs=`echo $vi_cv_path_python3_plibs | sed s/-lffi//`
      ])

      PYTHON3_LIBS="${vi_cv_path_python3_plibs}"
      if test "${vi_cv_path_python3_pfx}" = "${vi_cv_path_python3_epfx}"; then
        PYTHON3_CFLAGS="-I${vi_cv_path_python3_pfx}/include/python${vi_cv_var_python3_version} -DPYTHON3_HOME=L\\\"${vi_cv_path_python3_pfx}\\\""
      else
        PYTHON3_CFLAGS="-I${vi_cv_path_python3_pfx}/include/python${vi_cv_var_python3_version} -I${vi_cv_path_python3_epfx}/include/python${vi_cv_var_python3_version} -DPYTHON3_HOME=L\\\"${vi_cv_path_python3_pfx}\\\""
      fi
      PYTHON3_SRC="if_python3.c"
      dnl For Mac OSX 10.2 config.o is included in the Python library.
      if test "x$MACOSX" = "xyes"; then
        PYTHON3_OBJ="objects/if_python3.o"
      else
        PYTHON3_OBJ="objects/if_python3.o objects/py3_config.o"
      fi

      dnl On FreeBSD linking with "-pthread" is required to use threads.
      dnl _THREAD_SAFE must be used for compiling then.
      dnl The "-pthread" is added to $LIBS, so that the following check for
      dnl sigaltstack() will look in libc_r (it's there in libc!).
      dnl Otherwise, when using GCC, try adding -pthread to $CFLAGS.  GCC
      dnl will then define target-specific defines, e.g., -D_REENTRANT.
      dnl Don't do this for Mac OSX, -pthread will generate a warning.
      AC_MSG_CHECKING([if -pthread should be used])
      threadsafe_flag=
      thread_lib=
      dnl if test "x$MACOSX" != "xyes"; then
      if test "`(uname) 2>/dev/null`" != Darwin; then
        test "$GCC" = yes && threadsafe_flag="-pthread"
        if test "`(uname) 2>/dev/null`" = FreeBSD; then
          threadsafe_flag="-D_THREAD_SAFE"
          thread_lib="-pthread"
        fi
      fi
      libs_save_old=$LIBS
      if test -n "$threadsafe_flag"; then
        cflags_save=$CFLAGS
        CFLAGS="$CFLAGS $threadsafe_flag"
        LIBS="$LIBS $thread_lib"
        AC_TRY_LINK(,[ ],
           AC_MSG_RESULT(yes); PYTHON3_CFLAGS="$PYTHON3_CFLAGS $threadsafe_flag",
           AC_MSG_RESULT(no); LIBS=$libs_save_old
           )
        CFLAGS=$cflags_save
      else
        AC_MSG_RESULT(no)
      fi

      dnl check that compiling a simple program still works with the flags
      dnl added for Python.
      AC_MSG_CHECKING([if compile and link flags for Python 3 are sane])
      cflags_save=$CFLAGS
      libs_save=$LIBS
      CFLAGS="$CFLAGS $PYTHON3_CFLAGS"
      LIBS="$LIBS $PYTHON3_LIBS"
      AC_TRY_LINK(,[ ],
             AC_MSG_RESULT(yes); python3_ok=yes,
             AC_MSG_RESULT(no: PYTHON3 DISABLED); python3_ok=no)
      CFLAGS=$cflags_save
      LIBS=$libs_save
      if test "$python3_ok" = yes; then
        AC_DEFINE(FEAT_PYTHON3)
      else
        LIBS=$libs_save_old
        PYTHON3_SRC=
        PYTHON3_OBJ=
        PYTHON3_LIBS=
        PYTHON3_CFLAGS=
      fi
    fi
  fi
fi

AC_SUBST(PYTHON3_CONFDIR)
AC_SUBST(PYTHON3_LIBS)
AC_SUBST(PYTHON3_CFLAGS)
AC_SUBST(PYTHON3_SRC)
AC_SUBST(PYTHON3_OBJ)

dnl if python2.x and python3.x are enabled one can only link in code
dnl with dlopen(), dlsym(), dlclose() 
if test "$python_ok" = yes && test "$python3_ok" = yes; then
  AC_DEFINE(DYNAMIC_PYTHON)
  AC_DEFINE(DYNAMIC_PYTHON3)
  AC_MSG_CHECKING(whether we can do without RTLD_GLOBAL for Python)
  cflags_save=$CFLAGS
  CFLAGS="$CFLAGS $PYTHON_CFLAGS"
  ldflags_save=$LDFLAGS
  LDFLAGS="$LDFLAGS -ldl"
  AC_RUN_IFELSE([
    #include <dlfcn.h>
    /* If this program fails, then RTLD_GLOBAL is needed.
     * RTLD_GLOBAL will be used and then it is not possible to
     * have both python versions enabled in the same vim instance.
     * Only the first pyhton version used will be switched on.
     */

    int no_rtl_global_needed_for(char *python_instsoname, char *prefix)
    {
      int needed = 0;
      void* pylib = dlopen(python_instsoname, RTLD_LAZY);
      if (pylib != 0)
      {
          void (*pfx)(char *home) = dlsym(pylib, "Py_SetPythonHome");
          void (*init)(void) = dlsym(pylib, "Py_Initialize");
          int (*simple)(char*) = dlsym(pylib, "PyRun_SimpleString");
          void (*final)(void) = dlsym(pylib, "Py_Finalize");
          (*pfx)(prefix);
          (*init)();
          needed = (*simple)("import termios") == -1;
          (*final)();
          dlclose(pylib);
      }
      return !needed;
    }

    int main(int argc, char** argv)
    {
      int not_needed = 0;
      if (no_rtl_global_needed_for("${python_INSTSONAME}", "${vi_cv_path_python_pfx}"))
            not_needed = 1;
      return !not_needed;
    }],
    [AC_MSG_RESULT(yes);AC_DEFINE(PY_NO_RTLD_GLOBAL)], [AC_MSG_RESULT(no)])

  CFLAGS=$cflags_save
  LDFLAGS=$ldflags_save

  AC_MSG_CHECKING(whether we can do without RTLD_GLOBAL for Python3)
  cflags_save=$CFLAGS
  CFLAGS="$CFLAGS $PYTHON3_CFLAGS"
  ldflags_save=$LDFLAGS
  LDFLAGS="$LDFLAGS -ldl"
  AC_RUN_IFELSE([
    #include <dlfcn.h>
    #include <wchar.h>
    /* If this program fails, then RTLD_GLOBAL is needed.
     * RTLD_GLOBAL will be used and then it is not possible to
     * have both python versions enabled in the same vim instance.
     * Only the first pyhton version used will be switched on.
     */

    int no_rtl_global_needed_for(char *python_instsoname, wchar_t *prefix)
    {
      int needed = 0;
      void* pylib = dlopen(python_instsoname, RTLD_LAZY);
      if (pylib != 0)
      {
          void (*pfx)(wchar_t *home) = dlsym(pylib, "Py_SetPythonHome");
          void (*init)(void) = dlsym(pylib, "Py_Initialize");
          int (*simple)(char*) = dlsym(pylib, "PyRun_SimpleString");
          void (*final)(void) = dlsym(pylib, "Py_Finalize");
          (*pfx)(prefix);
          (*init)();
          needed = (*simple)("import termios") == -1;
          (*final)();
          dlclose(pylib);
      }
      return !needed;
    }

    int main(int argc, char** argv)
    {
      int not_needed = 0;
      if (no_rtl_global_needed_for("${python3_INSTSONAME}", L"${vi_cv_path_python3_pfx}"))
            not_needed = 1;
      return !not_needed;
    }],
    [AC_MSG_RESULT(yes);AC_DEFINE(PY3_NO_RTLD_GLOBAL)], [AC_MSG_RESULT(no)])

  CFLAGS=$cflags_save
  LDFLAGS=$ldflags_save

  PYTHON_SRC="if_python.c"
  PYTHON_OBJ="objects/if_python.o"
  PYTHON_CFLAGS="$PYTHON_CFLAGS -DDYNAMIC_PYTHON_DLL=\\\"${python_INSTSONAME}\\\""
  PYTHON_LIBS=
  PYTHON3_SRC="if_python3.c"
  PYTHON3_OBJ="objects/if_python3.o"
  PYTHON3_CFLAGS="$PYTHON3_CFLAGS -DDYNAMIC_PYTHON3_DLL=\\\"${python3_INSTSONAME}\\\""
  PYTHON3_LIBS=
elif test "$python_ok" = yes && test "$enable_pythoninterp" = "dynamic"; then
  AC_DEFINE(DYNAMIC_PYTHON)
  PYTHON_SRC="if_python.c"
  PYTHON_OBJ="objects/if_python.o"
  PYTHON_CFLAGS="$PYTHON_CFLAGS -DDYNAMIC_PYTHON_DLL=\\\"${python_INSTSONAME}\\\""
  PYTHON_LIBS=
elif test "$python3_ok" = yes && test "$enable_python3interp" = "dynamic"; then
  AC_DEFINE(DYNAMIC_PYTHON3)
  PYTHON3_SRC="if_python3.c"
  PYTHON3_OBJ="objects/if_python3.o"
  PYTHON3_CFLAGS="$PYTHON3_CFLAGS -DDYNAMIC_PYTHON3_DLL=\\\"${python3_INSTSONAME}\\\""
  PYTHON3_LIBS=
fi

AC_MSG_CHECKING(--enable-tclinterp argument)
AC_ARG_ENABLE(tclinterp,
	[  --enable-tclinterp      Include Tcl interpreter.], ,
	[enable_tclinterp="no"])
AC_MSG_RESULT($enable_tclinterp)

if test "$enable_tclinterp" = "yes"; then

  dnl on FreeBSD tclsh is a silly script, look for tclsh8.[5420]
  AC_MSG_CHECKING(--with-tclsh argument)
  AC_ARG_WITH(tclsh, [  --with-tclsh=PATH       which tclsh to use (default: tclsh8.0)],
	tclsh_name="$withval"; AC_MSG_RESULT($tclsh_name),
	tclsh_name="tclsh8.5"; AC_MSG_RESULT(no))
  AC_PATH_PROG(vi_cv_path_tcl, $tclsh_name)
  AC_SUBST(vi_cv_path_tcl)

  dnl when no specific version specified, also try 8.4, 8.2 and 8.0
  if test "X$vi_cv_path_tcl" = "X" -a $tclsh_name = "tclsh8.5"; then
    tclsh_name="tclsh8.4"
    AC_PATH_PROG(vi_cv_path_tcl, $tclsh_name)
  fi
  if test "X$vi_cv_path_tcl" = "X" -a $tclsh_name = "tclsh8.4"; then
    tclsh_name="tclsh8.2"
    AC_PATH_PROG(vi_cv_path_tcl, $tclsh_name)
  fi
  if test "X$vi_cv_path_tcl" = "X" -a $tclsh_name = "tclsh8.2"; then
    tclsh_name="tclsh8.0"
    AC_PATH_PROG(vi_cv_path_tcl, $tclsh_name)
  fi
  dnl still didn't find it, try without version number
  if test "X$vi_cv_path_tcl" = "X"; then
    tclsh_name="tclsh"
    AC_PATH_PROG(vi_cv_path_tcl, $tclsh_name)
  fi
  if test "X$vi_cv_path_tcl" != "X"; then
    AC_MSG_CHECKING(Tcl version)
    if echo 'exit [[expr [info tclversion] < 8.0]]' | $vi_cv_path_tcl - ; then
      tclver=`echo 'puts [[info tclversion]]' | $vi_cv_path_tcl -`
      AC_MSG_RESULT($tclver - OK);
      tclloc=`echo 'set l [[info library]];set i [[string last lib $l]];incr i -2;puts [[string range $l 0 $i]]' | $vi_cv_path_tcl -`

      AC_MSG_CHECKING(for location of Tcl include)
      if test "x$MACOSX" != "xyes"; then
	tclinc="$tclloc/include $tclloc/include/tcl $tclloc/include/tcl$tclver /usr/local/include /usr/local/include/tcl$tclver /usr/include /usr/include/tcl$tclver"
      else
	dnl For Mac OS X 10.3, use the OS-provided framework location
	tclinc="/System/Library/Frameworks/Tcl.framework/Headers"
      fi
      TCL_INC=
      for try in $tclinc; do
	if test -f "$try/tcl.h"; then
	  AC_MSG_RESULT($try/tcl.h)
	  TCL_INC=$try
	  break
	fi
      done
      if test -z "$TCL_INC"; then
	AC_MSG_RESULT(<not found>)
	SKIP_TCL=YES
      fi
      if test -z "$SKIP_TCL"; then
	AC_MSG_CHECKING(for location of tclConfig.sh script)
	if test "x$MACOSX" != "xyes"; then
	  tclcnf=`echo $tclinc | sed s/include/lib/g`
	  tclcnf="$tclcnf `echo $tclinc | sed s/include/lib64/g`"
	else
	  dnl For Mac OS X 10.3, use the OS-provided framework location
	  tclcnf="/System/Library/Frameworks/Tcl.framework"
	fi
	for try in $tclcnf; do
	  if test -f $try/tclConfig.sh; then
	    AC_MSG_RESULT($try/tclConfig.sh)
	    . $try/tclConfig.sh
	    dnl use eval, because tcl 8.2 includes ${TCL_DBGX}
	    TCL_LIBS=`eval echo "$TCL_LIB_SPEC $TCL_LIBS"`
	    dnl Use $TCL_DEFS for -D_THREAD_SAFE et al.  But only use the
	    dnl "-D_ABC" items.  Watch out for -DFOO=long\ long.
	    TCL_DEFS=`echo $TCL_DEFS | sed -e 's/\\\\ /\\\\X/g' | tr ' ' '\012' | sed -e '/^[[^-]]/d' -e '/^-[[^D]]/d' -e '/-D[[^_]]/d' -e 's/-D_/ -D_/' | tr '\012' ' ' | sed -e 's/\\\\X/\\\\ /g'`
	    break
	  fi
	done
	if test -z "$TCL_LIBS"; then
	  AC_MSG_RESULT(<not found>)
	  AC_MSG_CHECKING(for Tcl library by myself)
	  tcllib=`echo $tclinc | sed s/include/lib/g`
	  tcllib="$tcllib `echo $tclinc | sed s/include/lib64/g`"
	  for ext in .so .a ; do
	    for ver in "" $tclver ; do
	      for try in $tcllib ; do
		trylib=tcl$ver$ext
		if test -f $try/lib$trylib ; then
		  AC_MSG_RESULT($try/lib$trylib)
		  TCL_LIBS="-L$try -ltcl$ver -ldl -lm"
		  if test "`(uname) 2>/dev/null`" = SunOS &&
					 uname -r | grep '^5' >/dev/null; then
		    TCL_LIBS="$TCL_LIBS -R $try"
		  fi
		  break 3
		fi
	      done
	    done
	  done
	  if test -z "$TCL_LIBS"; then
	    AC_MSG_RESULT(<not found>)
	    SKIP_TCL=YES
	  fi
	fi
	if test -z "$SKIP_TCL"; then
	  AC_DEFINE(FEAT_TCL)
	  TCL_SRC=if_tcl.c
	  TCL_OBJ=objects/if_tcl.o
	  TCL_PRO=if_tcl.pro
	  TCL_CFLAGS="-I$TCL_INC $TCL_DEFS"
	fi
      fi
    else
      AC_MSG_RESULT(too old; need Tcl version 8.0 or later)
    fi
  fi
fi
AC_SUBST(TCL_SRC)
AC_SUBST(TCL_OBJ)
AC_SUBST(TCL_PRO)
AC_SUBST(TCL_CFLAGS)
AC_SUBST(TCL_LIBS)

AC_MSG_CHECKING(--enable-rubyinterp argument)
AC_ARG_ENABLE(rubyinterp,
	[  --enable-rubyinterp[=OPTS]     Include Ruby interpreter.  [default=no] [OPTS=no/yes/dynamic]], ,
	[enable_rubyinterp="no"])
AC_MSG_RESULT($enable_rubyinterp)
if test "$enable_rubyinterp" = "yes" -o "$enable_rubyinterp" = "dynamic"; then
  AC_MSG_CHECKING(--with-ruby-command argument)
  AC_SUBST(vi_cv_path_ruby)
  AC_ARG_WITH(ruby-command, [  --with-ruby-command=RUBY  name of the Ruby command (default: ruby)],
	RUBY_CMD="$withval"; vi_cv_path_ruby="$withval"; AC_MSG_RESULT($RUBY_CMD),
	RUBY_CMD="ruby"; AC_MSG_RESULT(defaulting to $RUBY_CMD))
  AC_PATH_PROG(vi_cv_path_ruby, $RUBY_CMD)
  if test "X$vi_cv_path_ruby" != "X"; then
    AC_MSG_CHECKING(Ruby version)
    if $vi_cv_path_ruby -e '(VERSION rescue RUBY_VERSION) >= "1.6.0" or exit 1' >/dev/null 2>/dev/null; then
      AC_MSG_RESULT(OK)
      AC_MSG_CHECKING(Ruby header files)
      rubyhdrdir=`$vi_cv_path_ruby -r mkmf -e 'print Config::CONFIG[["rubyhdrdir"]] || Config::CONFIG[["archdir"]] || $hdrdir' 2>/dev/null`
      if test "X$rubyhdrdir" != "X"; then
	AC_MSG_RESULT($rubyhdrdir)
	RUBY_CFLAGS="-I$rubyhdrdir"
        rubyarch=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG[["arch"]]'`
        if test -d "$rubyhdrdir/$rubyarch"; then
          RUBY_CFLAGS="$RUBY_CFLAGS -I$rubyhdrdir/$rubyarch"
        fi
        rubyversion=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG[["ruby_version"]].gsub(/\./, "")[[0,2]]'`
        RUBY_CFLAGS="$RUBY_CFLAGS -DRUBY_VERSION=$rubyversion"
	rubylibs=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG[["LIBS"]]'`
	if test "X$rubylibs" != "X"; then
	  RUBY_LIBS="$rubylibs"
	fi
	librubyarg=`$vi_cv_path_ruby -r rbconfig -e 'print Config.expand(Config::CONFIG[["LIBRUBYARG"]])'`
	librubya=`$vi_cv_path_ruby -r rbconfig -e 'print Config.expand(Config::CONFIG[["LIBRUBY_A"]])'`
  rubylibdir=`$vi_cv_path_ruby -r rbconfig -e 'print Config.expand(Config::CONFIG[["libdir"]])'`
	if test -f "$rubylibdir/$librubya"; then
	  librubyarg="$librubyarg"
    RUBY_LIBS="$RUBY_LIBS -L$rubylibdir"
  elif test "$librubyarg" = "libruby.a"; then
    dnl required on Mac OS 10.3 where libruby.a doesn't exist
    librubyarg="-lruby"
    RUBY_LIBS="$RUBY_LIBS -L$rubylibdir"
	fi

	if test "X$librubyarg" != "X"; then
	  RUBY_LIBS="$librubyarg $RUBY_LIBS"
	fi
	rubyldflags=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG[["LDFLAGS"]]'`
	if test "X$rubyldflags" != "X"; then
	  dnl Ruby on Mac OS X 10.5 adds "-arch" flags but these should only
	  dnl be included if requested by passing --with-mac-arch to
	  dnl configure, so strip these flags first (if present)
	  rubyldflags=`echo "$rubyldflags" | sed -e 's/-arch\ ppc//' -e 's/-arch\ i386//' -e 's/-arch\ x86_64//'`
	  if test "X$rubyldflags" != "X"; then
	    LDFLAGS="$rubyldflags $LDFLAGS"
	  fi
	fi
	RUBY_SRC="if_ruby.c"
	RUBY_OBJ="objects/if_ruby.o"
	RUBY_PRO="if_ruby.pro"
	AC_DEFINE(FEAT_RUBY)
	if test "$enable_rubyinterp" = "dynamic"; then
	  libruby=`$vi_cv_path_ruby -r rbconfig -e 'printf "lib%s.%s\n", Config::CONFIG[["RUBY_SO_NAME"]], Config::CONFIG[["DLEXT"]]'`
	  AC_DEFINE(DYNAMIC_RUBY)
	  RUBY_CFLAGS="-DDYNAMIC_RUBY_DLL=\\\"$libruby\\\" -DDYNAMIC_RUBY_VER=$rubyversion $RUBY_CFLAGS"
	  RUBY_LIBS=
	fi
      else
	AC_MSG_RESULT(not found; disabling Ruby)
      fi
    else
      AC_MSG_RESULT(too old; need Ruby version 1.6.0 or later)
    fi
  fi
fi
AC_SUBST(RUBY_SRC)
AC_SUBST(RUBY_OBJ)
AC_SUBST(RUBY_PRO)
AC_SUBST(RUBY_CFLAGS)
AC_SUBST(RUBY_LIBS)

AC_MSG_CHECKING(--enable-cscope argument)
AC_ARG_ENABLE(cscope,
	[  --enable-cscope         Include cscope interface.], ,
	[enable_cscope="no"])
AC_MSG_RESULT($enable_cscope)
if test "$enable_cscope" = "yes"; then
  AC_DEFINE(FEAT_CSCOPE)
fi

AC_MSG_CHECKING(--enable-workshop argument)
AC_ARG_ENABLE(workshop,
	[  --enable-workshop       Include Sun Visual Workshop support.], ,
	[enable_workshop="no"])
AC_MSG_RESULT($enable_workshop)
if test "$enable_workshop" = "yes"; then
  AC_DEFINE(FEAT_SUN_WORKSHOP)
  WORKSHOP_SRC="workshop.c integration.c"
  AC_SUBST(WORKSHOP_SRC)
  WORKSHOP_OBJ="objects/workshop.o objects/integration.o"
  AC_SUBST(WORKSHOP_OBJ)
  if test "${enable_gui-xxx}" = xxx; then
    enable_gui=motif
  fi
fi

AC_MSG_CHECKING(--disable-netbeans argument)
AC_ARG_ENABLE(netbeans,
	[  --disable-netbeans      Disable NetBeans integration support.],
	, [enable_netbeans="yes"])
if test "$enable_netbeans" = "yes"; then
  AC_MSG_RESULT(no)
  dnl On Solaris we need the socket and nsl library.
  AC_CHECK_LIB(socket, socket)
  AC_CHECK_LIB(nsl, gethostbyname)
  AC_MSG_CHECKING(whether compiling netbeans integration is possible)
  AC_TRY_LINK([
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <fcntl.h>
#include <netdb.h>
#include <netinet/in.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
	/* Check bitfields */
	struct nbbuf {
	unsigned int  initDone:1;
	ushort signmaplen;
	};
	    ], [
		/* Check creating a socket. */
		struct sockaddr_in server;
		(void)socket(AF_INET, SOCK_STREAM, 0);
		(void)htons(100);
		(void)gethostbyname("microsoft.com");
		if (errno == ECONNREFUSED)
		  (void)connect(1, (struct sockaddr *)&server, sizeof(server));
	    ],
	AC_MSG_RESULT(yes),
	AC_MSG_RESULT(no); enable_netbeans="no")
else
  AC_MSG_RESULT(yes)
fi
if test "$enable_netbeans" = "yes"; then
  AC_DEFINE(FEAT_NETBEANS_INTG)
  NETBEANS_SRC="netbeans.c"
  AC_SUBST(NETBEANS_SRC)
  NETBEANS_OBJ="objects/netbeans.o"
  AC_SUBST(NETBEANS_OBJ)
fi

AC_MSG_CHECKING(--enable-sniff argument)
AC_ARG_ENABLE(sniff,
	[  --enable-sniff          Include Sniff interface.], ,
	[enable_sniff="no"])
AC_MSG_RESULT($enable_sniff)
if test "$enable_sniff" = "yes"; then
  AC_DEFINE(FEAT_SNIFF)
  SNIFF_SRC="if_sniff.c"
  AC_SUBST(SNIFF_SRC)
  SNIFF_OBJ="objects/if_sniff.o"
  AC_SUBST(SNIFF_OBJ)
fi

AC_MSG_CHECKING(--enable-multibyte argument)
AC_ARG_ENABLE(multibyte,
	[  --enable-multibyte      Include multibyte editing support.], ,
	[enable_multibyte="no"])
AC_MSG_RESULT($enable_multibyte)
if test "$enable_multibyte" = "yes"; then
  AC_DEFINE(FEAT_MBYTE)
fi

AC_MSG_CHECKING(--enable-hangulinput argument)
AC_ARG_ENABLE(hangulinput,
	[  --enable-hangulinput    Include Hangul input support.], ,
	[enable_hangulinput="no"])
AC_MSG_RESULT($enable_hangulinput)

AC_MSG_CHECKING(--enable-xim argument)
AC_ARG_ENABLE(xim,
	[  --enable-xim            Include XIM input support.],
	AC_MSG_RESULT($enable_xim),
	[enable_xim="auto"; AC_MSG_RESULT(defaulting to auto)])

AC_MSG_CHECKING(--enable-fontset argument)
AC_ARG_ENABLE(fontset,
	[  --enable-fontset        Include X fontset output support.], ,
	[enable_fontset="no"])
AC_MSG_RESULT($enable_fontset)
dnl defining FEAT_XFONTSET is delayed, so that it can be disabled for no GUI

test -z "$with_x" && with_x=yes
test "${enable_gui-yes}" != no -a "x$MACOSX" != "xyes" -a "x$QNX" != "xyes" && with_x=yes
if test "$with_x" = no; then
  AC_MSG_RESULT(defaulting to: don't HAVE_X11)
else
  dnl Do this check early, so that its failure can override user requests.

  AC_PATH_PROG(xmkmfpath, xmkmf)

  AC_PATH_XTRA

  dnl On z/OS Unix the X libraries are DLLs. To use them the code must
  dnl be compiled with a special option.
  dnl Also add SM, ICE and Xmu to X_EXTRA_LIBS.
  if test "$zOSUnix" = "yes"; then
    CFLAGS="$CFLAGS -W c,dll"
    LDFLAGS="$LDFLAGS -W l,dll"
    X_EXTRA_LIBS="$X_EXTRA_LIBS -lSM -lICE -lXmu"
  fi

  dnl On my HPUX system the X include dir is found, but the lib dir not.
  dnl This is a desparate try to fix this.

  if test -d "$x_includes" && test ! -d "$x_libraries"; then
    x_libraries=`echo "$x_includes" | sed s/include/lib/`
    AC_MSG_RESULT(Corrected X libraries to $x_libraries)
    X_LIBS="$X_LIBS -L$x_libraries"
    if test "`(uname) 2>/dev/null`" = SunOS &&
					 uname -r | grep '^5' >/dev/null; then
      X_LIBS="$X_LIBS -R $x_libraries"
    fi
  fi

  if test -d "$x_libraries" && test ! -d "$x_includes"; then
    x_includes=`echo "$x_libraries" | sed s/lib/include/`
    AC_MSG_RESULT(Corrected X includes to $x_includes)
    X_CFLAGS="$X_CFLAGS -I$x_includes"
  fi

  dnl Remove "-I/usr/include " from X_CFLAGS, should not be needed.
  X_CFLAGS="`echo $X_CFLAGS\  | sed 's%-I/usr/include %%'`"
  dnl Remove "-L/usr/lib " from X_LIBS, should not be needed.
  X_LIBS="`echo $X_LIBS\  | sed 's%-L/usr/lib %%'`"
  dnl Same for "-R/usr/lib ".
  X_LIBS="`echo $X_LIBS\  | sed -e 's%-R/usr/lib %%' -e 's%-R /usr/lib %%'`"


  dnl Check if the X11 header files are correctly installed. On some systems
  dnl Xlib.h includes files that don't exist.  On some systems X11/Intrinsic.h
  dnl is missing.
  AC_MSG_CHECKING(if X11 header files can be found)
  cflags_save=$CFLAGS
  CFLAGS="$CFLAGS $X_CFLAGS"
  AC_TRY_COMPILE([#include <X11/Xlib.h>
#include <X11/Intrinsic.h>], ,
	AC_MSG_RESULT(yes),
	AC_MSG_RESULT(no); no_x=yes)
  CFLAGS=$cflags_save

  if test "${no_x-no}" = yes; then
    with_x=no
  else
    AC_DEFINE(HAVE_X11)
    X_LIB="-lXt -lX11";
    AC_SUBST(X_LIB)

    ac_save_LDFLAGS="$LDFLAGS"
    LDFLAGS="-L$x_libraries $LDFLAGS"

    dnl Check for -lXdmcp (needed on SunOS 4.1.4)
    dnl For HP-UX 10.20 it must be before -lSM -lICE
    AC_CHECK_LIB(Xdmcp, _XdmcpAuthDoIt, [X_EXTRA_LIBS="$X_EXTRA_LIBS -lXdmcp"],,
		[-lXt $X_PRE_LIBS -lX11 $X_EXTRA_LIBS -lXdmcp])

    dnl Some systems need -lnsl -lsocket when testing for ICE.
    dnl The check above doesn't do this, try here (again).  Also needed to get
    dnl them after Xdmcp.  link.sh will remove them when not needed.
    dnl Check for other function than above to avoid the cached value
    AC_CHECK_LIB(ICE, IceOpenConnection,
		  [X_EXTRA_LIBS="$X_EXTRA_LIBS -lSM -lICE"],, [$X_EXTRA_LIBS])

    dnl Check for -lXpm (needed for some versions of Motif)
    LDFLAGS="$X_LIBS $ac_save_LDFLAGS"
    AC_CHECK_LIB(Xpm, XpmCreatePixmapFromData, [X_PRE_LIBS="$X_PRE_LIBS -lXpm"],,
		[-lXt $X_PRE_LIBS -lXpm -lX11 $X_EXTRA_LIBS])

    dnl Check that the X11 header files don't use implicit declarations
    AC_MSG_CHECKING(if X11 header files implicitly declare return values)
    cflags_save=$CFLAGS
    CFLAGS="$CFLAGS $X_CFLAGS -Werror"
    AC_TRY_COMPILE([#include <X11/Xlib.h>], ,
	AC_MSG_RESULT(no),
	CFLAGS="$CFLAGS -Wno-implicit-int"
	AC_TRY_COMPILE([#include <X11/Xlib.h>], ,
	    AC_MSG_RESULT(yes); cflags_save="$cflags_save -Wno-implicit-int",
	    AC_MSG_RESULT(test failed)
	)
    )
    CFLAGS=$cflags_save

    LDFLAGS="$ac_save_LDFLAGS"

    AC_MSG_CHECKING(size of wchar_t is 2 bytes)
    AC_CACHE_VAL(ac_cv_small_wchar_t,
	[AC_TRY_RUN([
#include <X11/Xlib.h>
#if STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
#endif
		main()
		{
		  if (sizeof(wchar_t) <= 2)
		    exit(1);
		  exit(0);
		}],
		ac_cv_small_wchar_t="no",
		ac_cv_small_wchar_t="yes",
		AC_MSG_ERROR(failed to compile test program))])
    AC_MSG_RESULT($ac_cv_small_wchar_t)
    if test "x$ac_cv_small_wchar_t" = "xyes" ; then
      AC_DEFINE(SMALL_WCHAR_T)
    fi

  fi
fi

test "x$with_x" = xno -a "x$MACOSX" != "xyes" -a "x$QNX" != "xyes" && enable_gui=no

AC_MSG_CHECKING(--enable-gui argument)
AC_ARG_ENABLE(gui,
 [  --enable-gui[=OPTS]     X11 GUI [default=auto] [OPTS=auto/no/gtk2/gnome2/motif/athena/neXtaw/photon/carbon]], , enable_gui="auto")

dnl Canonicalize the --enable-gui= argument so that it can be easily compared.
dnl Do not use character classes for portability with old tools.
enable_gui_canon=`echo "_$enable_gui" | \
	sed 's/[[ _+-]]//g;y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`

dnl Skip everything by default.
SKIP_GTK2=YES
SKIP_GNOME=YES
SKIP_MOTIF=YES
SKIP_ATHENA=YES
SKIP_NEXTAW=YES
SKIP_PHOTON=YES
SKIP_CARBON=YES
GUITYPE=NONE

if test "x$QNX" = "xyes" -a "x$with_x" = "xno" ; then
  SKIP_PHOTON=
  case "$enable_gui_canon" in
    no)		AC_MSG_RESULT(no GUI support)
		SKIP_PHOTON=YES ;;
    yes|"")	AC_MSG_RESULT(yes - automatic GUI support) ;;
    auto)	AC_MSG_RESULT(auto - automatic GUI support) ;;
    photon)	AC_MSG_RESULT(Photon GUI support) ;;
    *)		AC_MSG_RESULT([Sorry, $enable_gui GUI is not supported])
		SKIP_PHOTON=YES ;;
  esac

elif test "x$MACOSX" = "xyes" -a "x$with_x" = "xno" ; then
  SKIP_CARBON=
  case "$enable_gui_canon" in
    no)		AC_MSG_RESULT(no GUI support)
		SKIP_CARBON=YES ;;
    yes|"")	AC_MSG_RESULT(yes - automatic GUI support) ;;
    auto)	AC_MSG_RESULT(auto - Carbon GUI is outdated - disable GUI support)
		SKIP_CARBON=YES ;;
    carbon)	AC_MSG_RESULT(Carbon GUI support) ;;
    *)		AC_MSG_RESULT([Sorry, $enable_gui GUI is not supported])
		SKIP_CARBON=YES ;;
  esac

else

  case "$enable_gui_canon" in
    no|none)	AC_MSG_RESULT(no GUI support) ;;
    yes|""|auto)	AC_MSG_RESULT(yes/auto - automatic GUI support)
		SKIP_GTK2=
		SKIP_GNOME=
		SKIP_MOTIF=
		SKIP_ATHENA=
		SKIP_NEXTAW=
		SKIP_CARBON=;;
    gtk2)	AC_MSG_RESULT(GTK+ 2.x GUI support)
		SKIP_GTK2=;;
    gnome2)	AC_MSG_RESULT(GNOME 2.x GUI support)
		SKIP_GNOME=
		SKIP_GTK2=;;
    motif)	AC_MSG_RESULT(Motif GUI support)
		SKIP_MOTIF=;;
    athena)	AC_MSG_RESULT(Athena GUI support)
		SKIP_ATHENA=;;
    nextaw)	AC_MSG_RESULT(neXtaw GUI support)
		SKIP_NEXTAW=;;
    *)		AC_MSG_RESULT([Sorry, $enable_gui GUI is not supported]) ;;
  esac

fi

if test "x$SKIP_GTK2" != "xYES" -a "$enable_gui_canon" != "gtk2" \
				-a "$enable_gui_canon" != "gnome2"; then
  AC_MSG_CHECKING(whether or not to look for GTK+ 2)
  AC_ARG_ENABLE(gtk2-check,
	[  --enable-gtk2-check     If auto-select GUI, check for GTK+ 2 [default=yes]],
	, enable_gtk2_check="yes")
  AC_MSG_RESULT($enable_gtk2_check)
  if test "x$enable_gtk2_check" = "xno"; then
    SKIP_GTK2=YES
    SKIP_GNOME=YES
  fi
fi

if test "x$SKIP_GNOME" != "xYES" -a "$enable_gui_canon" != "gnome2"; then
  AC_MSG_CHECKING(whether or not to look for GNOME)
  AC_ARG_ENABLE(gnome-check,
	[  --enable-gnome-check    If GTK GUI, check for GNOME [default=no]],
	, enable_gnome_check="no")
  AC_MSG_RESULT($enable_gnome_check)
  if test "x$enable_gnome_check" = "xno"; then
    SKIP_GNOME=YES
  fi
fi

if test "x$SKIP_MOTIF" != "xYES" -a "$enable_gui_canon" != "motif"; then
  AC_MSG_CHECKING(whether or not to look for Motif)
  AC_ARG_ENABLE(motif-check,
	[  --enable-motif-check    If auto-select GUI, check for Motif [default=yes]],
	, enable_motif_check="yes")
  AC_MSG_RESULT($enable_motif_check)
  if test "x$enable_motif_check" = "xno"; then
    SKIP_MOTIF=YES
  fi
fi

if test "x$SKIP_ATHENA" != "xYES" -a "$enable_gui_canon" != "athena"; then
  AC_MSG_CHECKING(whether or not to look for Athena)
  AC_ARG_ENABLE(athena-check,
	[  --enable-athena-check   If auto-select GUI, check for Athena [default=yes]],
	, enable_athena_check="yes")
  AC_MSG_RESULT($enable_athena_check)
  if test "x$enable_athena_check" = "xno"; then
    SKIP_ATHENA=YES
  fi
fi

if test "x$SKIP_NEXTAW" != "xYES" -a "$enable_gui_canon" != "nextaw"; then
  AC_MSG_CHECKING(whether or not to look for neXtaw)
  AC_ARG_ENABLE(nextaw-check,
	[  --enable-nextaw-check   If auto-select GUI, check for neXtaw [default=yes]],
	, enable_nextaw_check="yes")
  AC_MSG_RESULT($enable_nextaw_check);
  if test "x$enable_nextaw_check" = "xno"; then
    SKIP_NEXTAW=YES
  fi
fi

if test "x$SKIP_CARBON" != "xYES" -a "$enable_gui_canon" != "carbon"; then
  AC_MSG_CHECKING(whether or not to look for Carbon)
  AC_ARG_ENABLE(carbon-check,
	[  --enable-carbon-check   If auto-select GUI, check for Carbon [default=yes]],
	, enable_carbon_check="yes")
  AC_MSG_RESULT($enable_carbon_check);
  if test "x$enable_carbon_check" = "xno"; then
    SKIP_CARBON=YES
  fi
fi


if test "x$MACOSX" = "xyes" -a -z "$SKIP_CARBON" -a "x$CARBON" = "xyes"; then
  AC_MSG_CHECKING(for Carbon GUI)
  dnl already did the check, just give the message
  AC_MSG_RESULT(yes);
  GUITYPE=CARBONGUI
  if test "$VIMNAME" = "vim"; then
    VIMNAME=Vim
  fi

  if test "x$MACARCH" = "xboth"; then
    CPPFLAGS="$CPPFLAGS -I$DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk/Developer/Headers/FlatCarbon"
  else
    CPPFLAGS="$CPPFLAGS -I$DEVELOPER_DIR/Headers/FlatCarbon"
  fi

  dnl Default install directory is not /usr/local
  if test x$prefix = xNONE; then
    prefix=/Applications
  fi

  dnl Sorry for the hard coded default
  datadir='${prefix}/Vim.app/Contents/Resources'

  dnl skip everything else
  SKIP_GTK2=YES;
  SKIP_GNOME=YES;
  SKIP_MOTIF=YES;
  SKIP_ATHENA=YES;
  SKIP_NEXTAW=YES;
  SKIP_PHOTON=YES;
  SKIP_CARBON=YES
fi

dnl define an autoconf function to check for a specified version of GTK, and
dnl try to compile/link a GTK program.
dnl
dnl AM_PATH_GTK([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
dnl Test for GTK, and define GTK_CFLAGS, GTK_LIBDIR and GTK_LIBS
dnl
AC_DEFUN(AM_PATH_GTK,
[
  if test "X$GTK_CONFIG" != "Xno" -o "X$PKG_CONFIG" != "Xno"; then
  {
    min_gtk_version=ifelse([$1], ,2.2.0,$1)
    AC_MSG_CHECKING(for GTK - version >= $min_gtk_version)
    no_gtk=""
    if (test "X$SKIP_GTK2" != "XYES" -a "X$PKG_CONFIG" != "Xno") \
	  && $PKG_CONFIG --exists gtk+-2.0; then
    {
      dnl We should be using PKG_CHECK_MODULES() instead of this hack.
      dnl But I guess the dependency on pkgconfig.m4 is not wanted or
      dnl something like that.
      GTK_CFLAGS=`$PKG_CONFIG --cflags gtk+-2.0`
      GTK_LIBDIR=`$PKG_CONFIG --libs-only-L gtk+-2.0`
      GTK_LIBS=`$PKG_CONFIG --libs gtk+-2.0`
      gtk_major_version=`$PKG_CONFIG --modversion gtk+-2.0 | \
	     sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'`
      gtk_minor_version=`$PKG_CONFIG --modversion gtk+-2.0 | \
	     sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'`
      gtk_micro_version=`$PKG_CONFIG --modversion gtk+-2.0 | \
	     sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'`
    }
    else
      no_gtk=yes
    fi

    if test "x$enable_gtktest" = "xyes" -a "x$no_gtk" = "x"; then
    {
      ac_save_CFLAGS="$CFLAGS"
      ac_save_LIBS="$LIBS"
      CFLAGS="$CFLAGS $GTK_CFLAGS"
      LIBS="$LIBS $GTK_LIBS"

      dnl
      dnl Now check if the installed GTK is sufficiently new.
      dnl
      rm -f conf.gtktest
      AC_TRY_RUN([
#include <gtk/gtk.h>
#include <stdio.h>
#if STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
#endif

int
main ()
{
int major, minor, micro;
char *tmp_version;

system ("touch conf.gtktest");

/* HP/UX 9 (%@#!) writes to sscanf strings */
tmp_version = g_strdup("$min_gtk_version");
if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
   printf("%s, bad version string\n", "$min_gtk_version");
   exit(1);
 }

if ((gtk_major_version > major) ||
    ((gtk_major_version == major) && (gtk_minor_version > minor)) ||
    ((gtk_major_version == major) && (gtk_minor_version == minor) &&
				     (gtk_micro_version >= micro)))
{
    return 0;
}
return 1;
}
],, no_gtk=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
      CFLAGS="$ac_save_CFLAGS"
      LIBS="$ac_save_LIBS"
    }
    fi
    if test "x$no_gtk" = x ; then
      if test "x$enable_gtktest" = "xyes"; then
	AC_MSG_RESULT(yes; found version $gtk_major_version.$gtk_minor_version.$gtk_micro_version)
      else
	AC_MSG_RESULT(found version $gtk_major_version.$gtk_minor_version.$gtk_micro_version)
      fi
      ifelse([$2], , :, [$2])
    else
    {
      AC_MSG_RESULT(no)
      GTK_CFLAGS=""
      GTK_LIBS=""
      ifelse([$3], , :, [$3])
    }
    fi
  }
  else
    GTK_CFLAGS=""
    GTK_LIBS=""
    ifelse([$3], , :, [$3])
  fi
  AC_SUBST(GTK_CFLAGS)
  AC_SUBST(GTK_LIBS)
  rm -f conf.gtktest
])

dnl ---------------------------------------------------------------------------
dnl gnome
dnl ---------------------------------------------------------------------------
AC_DEFUN([GNOME_INIT_HOOK],
[
  AC_SUBST(GNOME_LIBS)
  AC_SUBST(GNOME_LIBDIR)
  AC_SUBST(GNOME_INCLUDEDIR)

  AC_ARG_WITH(gnome-includes,
    [  --with-gnome-includes=DIR Specify location of GNOME headers],
    [CFLAGS="$CFLAGS -I$withval"]
  )

  AC_ARG_WITH(gnome-libs,
    [  --with-gnome-libs=DIR   Specify location of GNOME libs],
    [LDFLAGS="$LDFLAGS -L$withval" gnome_prefix=$withval]
  )

  AC_ARG_WITH(gnome,
    [  --with-gnome            Specify prefix for GNOME files],
    if test x$withval = xyes; then
      want_gnome=yes
      ifelse([$1], [], :, [$1])
    else
      if test "x$withval" = xno; then
	want_gnome=no
      else
	want_gnome=yes
	LDFLAGS="$LDFLAGS -L$withval/lib"
	CFLAGS="$CFLAGS -I$withval/include"
	gnome_prefix=$withval/lib
      fi
    fi,
    want_gnome=yes)

  if test "x$want_gnome" = xyes; then
  {
    AC_MSG_CHECKING(for libgnomeui-2.0)
    if $PKG_CONFIG --exists libgnomeui-2.0; then
      AC_MSG_RESULT(yes)
      GNOME_LIBS=`$PKG_CONFIG --libs-only-l libgnomeui-2.0`
      GNOME_LIBDIR=`$PKG_CONFIG --libs-only-L libgnomeui-2.0`
      GNOME_INCLUDEDIR=`$PKG_CONFIG --cflags libgnomeui-2.0`

      dnl On FreeBSD we need -pthread but pkg-config doesn't include it.
      dnl This might not be the right way but it works for me...
      AC_MSG_CHECKING(for FreeBSD)
      if test "`(uname) 2>/dev/null`" = FreeBSD; then
	AC_MSG_RESULT(yes, adding -pthread)
	GNOME_INCLUDEDIR="$GNOME_INCLUDEDIR -D_THREAD_SAFE"
	GNOME_LIBS="$GNOME_LIBS -pthread"
      else
	AC_MSG_RESULT(no)
      fi
      $1
    else
      AC_MSG_RESULT(not found)
      if test "x$2" = xfail; then
	AC_MSG_ERROR(Could not find libgnomeui-2.0 via pkg-config)
      fi
    fi
  }
  fi
])

AC_DEFUN([GNOME_INIT],[
	GNOME_INIT_HOOK([],fail)
])


dnl ---------------------------------------------------------------------------
dnl Check for GTK2.  If it fails, then continue on for Motif as before...
dnl ---------------------------------------------------------------------------
if test -z "$SKIP_GTK2"; then

  AC_MSG_CHECKING(--disable-gtktest argument)
  AC_ARG_ENABLE(gtktest, [  --disable-gtktest       Do not try to compile and run a test GTK program],
	, enable_gtktest=yes)
  if test "x$enable_gtktest" = "xyes" ; then
    AC_MSG_RESULT(gtk test enabled)
  else
    AC_MSG_RESULT(gtk test disabled)
  fi

  if test "X$PKG_CONFIG" = "X"; then
    AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
  fi

  if test "x$PKG_CONFIG" != "xno"; then
    dnl First try finding version 2.2.0 or later.  The 2.0.x series has
    dnl problems (bold fonts, --remote doesn't work).
    AM_PATH_GTK(2.2.0,
		[GUI_LIB_LOC="$GTK_LIBDIR"
		 GTK_LIBNAME="$GTK_LIBS"
		GUI_INC_LOC="$GTK_CFLAGS"], )
    if test "x$GTK_CFLAGS" != "x"; then
      SKIP_ATHENA=YES
      SKIP_NEXTAW=YES
      SKIP_MOTIF=YES
      GUITYPE=GTK
      AC_SUBST(GTK_LIBNAME)
    fi
  fi
  if test "x$GUITYPE" = "xGTK"; then
    if test "$gtk_minor_version" = 1 -a "0$gtk_micro_version" -ge 1 \
	|| test "0$gtk_minor_version" -ge 2; then
      AC_DEFINE(HAVE_GTK_MULTIHEAD)
    fi
    dnl
    dnl if GTK exists, then check for GNOME.
    dnl
    if test -z "$SKIP_GNOME"; then
    {
      GNOME_INIT_HOOK([have_gnome=yes])
      if test "x$have_gnome" = xyes ; then
	AC_DEFINE(FEAT_GUI_GNOME)
	GUI_INC_LOC="$GUI_INC_LOC $GNOME_INCLUDEDIR"
	GTK_LIBNAME="$GTK_LIBNAME $GNOME_LIBDIR $GNOME_LIBS"
      fi
    }
    fi
  fi
fi

dnl Check for Motif include files location.
dnl The LAST one found is used, this makes the highest version to be used,
dnl e.g. when Motif1.2 and Motif2.0 are both present.

if test -z "$SKIP_MOTIF"; then
  gui_XXX="/usr/XXX/Motif* /usr/Motif*/XXX /usr/XXX /usr/shlib /usr/X11*/XXX /usr/XXX/X11* /usr/dt/XXX /local/Motif*/XXX /local/XXX/Motif* /usr/local/Motif*/XXX /usr/local/XXX/Motif* /usr/local/XXX /usr/local/X11*/XXX /usr/local/LessTif/Motif*/XXX $MOTIFHOME/XXX"
  dnl Remove "-I" from before $GUI_INC_LOC if it's there
  GUI_INC_LOC="`echo $GUI_INC_LOC|sed 's%-I%%g'`"

  AC_MSG_CHECKING(for location of Motif GUI includes)
  gui_includes="`echo $x_includes|sed 's%/[^/][^/]*$%%'` `echo "$gui_XXX" | sed s/XXX/include/g` $GUI_INC_LOC"
  GUI_INC_LOC=
  for try in $gui_includes; do
    if test -f "$try/Xm/Xm.h"; then
      GUI_INC_LOC=$try
    fi
  done
  if test -n "$GUI_INC_LOC"; then
    if test "$GUI_INC_LOC" = /usr/include; then
      GUI_INC_LOC=
      AC_MSG_RESULT(in default path)
    else
      AC_MSG_RESULT($GUI_INC_LOC)
    fi
  else
    AC_MSG_RESULT(<not found>)
    SKIP_MOTIF=YES
  fi
fi

dnl Check for Motif library files location.  In the same order as the include
dnl files, to avoid a mixup if several versions are present

if test -z "$SKIP_MOTIF"; then
  AC_MSG_CHECKING(--with-motif-lib argument)
  AC_ARG_WITH(motif-lib,
  [  --with-motif-lib=STRING   Library for Motif ],
  [ MOTIF_LIBNAME="${withval}" ] )

  if test -n "$MOTIF_LIBNAME"; then
    AC_MSG_RESULT($MOTIF_LIBNAME)
    GUI_LIB_LOC=
  else
    AC_MSG_RESULT(no)

    dnl Remove "-L" from before $GUI_LIB_LOC if it's there
    GUI_LIB_LOC="`echo $GUI_LIB_LOC|sed 's%-L%%g'`"

    AC_MSG_CHECKING(for location of Motif GUI libs)
    gui_libs="`echo $x_libraries|sed 's%/[^/][^/]*$%%'` `echo "$gui_XXX" | sed s/XXX/lib/g` `echo "$GUI_INC_LOC" | sed s/include/lib/` $GUI_LIB_LOC"
    GUI_LIB_LOC=
    for try in $gui_libs; do
      for libtry in "$try"/libXm.a "$try"/libXm.so* "$try"/libXm.sl "$try"/libXm.dylib; do
	if test -f "$libtry"; then
	  GUI_LIB_LOC=$try
	fi
      done
    done
    if test -n "$GUI_LIB_LOC"; then
      dnl Remove /usr/lib, it causes trouble on some systems
      if test "$GUI_LIB_LOC" = /usr/lib; then
	GUI_LIB_LOC=
	AC_MSG_RESULT(in default path)
      else
	if test -n "$GUI_LIB_LOC"; then
	  AC_MSG_RESULT($GUI_LIB_LOC)
	  if test "`(uname) 2>/dev/null`" = SunOS &&
					 uname -r | grep '^5' >/dev/null; then
	    GUI_LIB_LOC="$GUI_LIB_LOC -R $GUI_LIB_LOC"
	  fi
	fi
      fi
      MOTIF_LIBNAME=-lXm
    else
      AC_MSG_RESULT(<not found>)
      SKIP_MOTIF=YES
    fi
  fi
fi

if test -z "$SKIP_MOTIF"; then
  SKIP_ATHENA=YES
  SKIP_NEXTAW=YES
  GUITYPE=MOTIF
  AC_SUBST(MOTIF_LIBNAME)
fi

dnl Check if the Athena files can be found

GUI_X_LIBS=

if test -z "$SKIP_ATHENA"; then
  AC_MSG_CHECKING(if Athena header files can be found)
  cflags_save=$CFLAGS
  CFLAGS="$CFLAGS $X_CFLAGS"
  AC_TRY_COMPILE([
#include <X11/Intrinsic.h>
#include <X11/Xaw/Paned.h>], ,
	AC_MSG_RESULT(yes),
	AC_MSG_RESULT(no); SKIP_ATHENA=YES )
  CFLAGS=$cflags_save
fi

if test -z "$SKIP_ATHENA"; then
  GUITYPE=ATHENA
fi

if test -z "$SKIP_NEXTAW"; then
  AC_MSG_CHECKING(if neXtaw header files can be found)
  cflags_save=$CFLAGS
  CFLAGS="$CFLAGS $X_CFLAGS"
  AC_TRY_COMPILE([
#include <X11/Intrinsic.h>
#include <X11/neXtaw/Paned.h>], ,
	AC_MSG_RESULT(yes),
	AC_MSG_RESULT(no); SKIP_NEXTAW=YES )
  CFLAGS=$cflags_save
fi

if test -z "$SKIP_NEXTAW"; then
  GUITYPE=NEXTAW
fi

if test -z "$SKIP_ATHENA" -o -z "$SKIP_NEXTAW" -o -z "$SKIP_MOTIF"; then
  dnl Prepend -I and -L to $GUI_INC_LOC and $GUI_LIB_LOC if not empty
  dnl Avoid adding it when it twice
  if test -n "$GUI_INC_LOC"; then
    GUI_INC_LOC=-I"`echo $GUI_INC_LOC|sed 's%-I%%'`"
  fi
  if test -n "$GUI_LIB_LOC"; then
    GUI_LIB_LOC=-L"`echo $GUI_LIB_LOC|sed 's%-L%%'`"
  fi

  dnl Check for -lXext and then for -lXmu
  ldflags_save=$LDFLAGS
  LDFLAGS="$X_LIBS $LDFLAGS"
  AC_CHECK_LIB(Xext, XShapeQueryExtension, [GUI_X_LIBS="-lXext"],,
		[-lXt $X_PRE_LIBS -lX11 $X_EXTRA_LIBS])
  dnl For Solaris we need -lw and -ldl before linking with -lXmu works.
  AC_CHECK_LIB(w, wslen, [X_EXTRA_LIBS="$X_EXTRA_LIBS -lw"],,
		[$GUI_X_LIBS -lXt $X_PRE_LIBS -lX11 $X_EXTRA_LIBS])
  AC_CHECK_LIB(dl, dlsym, [X_EXTRA_LIBS="$X_EXTRA_LIBS -ldl"],,
		[$GUI_X_LIBS -lXt $X_PRE_LIBS -lX11 $X_EXTRA_LIBS])
  AC_CHECK_LIB(Xmu, XmuCreateStippledPixmap, [GUI_X_LIBS="-lXmu $GUI_X_LIBS"],,
		[$GUI_X_LIBS -lXt $X_PRE_LIBS -lX11 $X_EXTRA_LIBS])
  if test -z "$SKIP_MOTIF"; then
    AC_CHECK_LIB(Xp, XpEndJob, [GUI_X_LIBS="-lXp $GUI_X_LIBS"],,
		[$GUI_X_LIBS -lXm -lXt $X_PRE_LIBS -lX11 $X_EXTRA_LIBS])
  fi
  LDFLAGS=$ldflags_save

  dnl Execute xmkmf to figure out if -DNARROWPROTO is needed.
  AC_MSG_CHECKING(for extra X11 defines)
  NARROW_PROTO=
  rm -fr conftestdir
  if mkdir conftestdir; then
    cd conftestdir
    cat > Imakefile <<'EOF'
acfindx:
	@echo 'NARROW_PROTO="${PROTO_DEFINES}"'
EOF
    if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then
      eval `${MAKE-make} acfindx 2>/dev/null | grep -v make`
    fi
    cd ..
    rm -fr conftestdir
  fi
  if test -z "$NARROW_PROTO"; then
    AC_MSG_RESULT(no)
  else
    AC_MSG_RESULT($NARROW_PROTO)
  fi
  AC_SUBST(NARROW_PROTO)
fi

dnl Look for XSMP support - but don't necessarily restrict it to X11 GUIs
dnl use the X11 include path
if test "$enable_xsmp" = "yes"; then
  cppflags_save=$CPPFLAGS
  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
  AC_CHECK_HEADERS(X11/SM/SMlib.h)
  CPPFLAGS=$cppflags_save
fi


if test -z "$SKIP_ATHENA" -o -z "$SKIP_NEXTAW" -o -z "$SKIP_MOTIF" -o -z "$SKIP_GTK2"; then
  dnl Check for X11/xpm.h and X11/Sunkeysym.h with the GUI include path
  cppflags_save=$CPPFLAGS
  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
  AC_CHECK_HEADERS(X11/xpm.h X11/Sunkeysym.h)

  dnl automatically disable XIM when XIMtext isn't in X11/Xlib.h
  if test ! "$enable_xim" = "no"; then
    AC_MSG_CHECKING(for XIMText in X11/Xlib.h)
    AC_EGREP_CPP(XIMText, [#include <X11/Xlib.h>],
		  AC_MSG_RESULT(yes),
		  AC_MSG_RESULT(no; xim has been disabled); enable_xim = "no")
  fi
  CPPFLAGS=$cppflags_save

  dnl automatically enable XIM when hangul input isn't enabled
  if test "$enable_xim" = "auto" -a "$enable_hangulinput" != "yes" \
		-a "x$GUITYPE" != "xNONE" ; then
    AC_MSG_RESULT(X GUI selected; xim has been enabled)
    enable_xim="yes"
  fi
fi

if test -z "$SKIP_ATHENA" -o -z "$SKIP_NEXTAW" -o -z "$SKIP_MOTIF"; then
  cppflags_save=$CPPFLAGS
  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
dnl Xmu/Editres.h may exist but can only be used after including Intrinsic.h
  AC_MSG_CHECKING([for X11/Xmu/Editres.h])
  AC_TRY_COMPILE([
#include <X11/Intrinsic.h>
#include <X11/Xmu/Editres.h>],
		      [int i; i = 0;],
	      AC_MSG_RESULT(yes)
		      AC_DEFINE(HAVE_X11_XMU_EDITRES_H),
	      AC_MSG_RESULT(no))
  CPPFLAGS=$cppflags_save
fi

dnl Only use the Xm directory when compiling Motif, don't use it for Athena
if test -z "$SKIP_MOTIF"; then
  cppflags_save=$CPPFLAGS
  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
  AC_CHECK_HEADERS(Xm/Xm.h Xm/XpmP.h Xm/JoinSideT.h Xm/TraitP.h Xm/Manager.h \
		   Xm/UnhighlightT.h Xm/Notebook.h)

  if test $ac_cv_header_Xm_XpmP_h = yes; then
    dnl Solaris uses XpmAttributes_21, very annoying.
    AC_MSG_CHECKING([for XpmAttributes_21 in Xm/XpmP.h])
    AC_TRY_COMPILE([#include <Xm/XpmP.h>], [XpmAttributes_21 attr;],
	AC_MSG_RESULT(yes); AC_DEFINE(XPMATTRIBUTES_TYPE, XpmAttributes_21),
	AC_MSG_RESULT(no); AC_DEFINE(XPMATTRIBUTES_TYPE, XpmAttributes)
	)
  else
    AC_DEFINE(XPMATTRIBUTES_TYPE, XpmAttributes)
  fi
  CPPFLAGS=$cppflags_save
fi

if test "x$GUITYPE" = "xNONE" -a "$enable_xim" = "yes"; then
  AC_MSG_RESULT(no GUI selected; xim has been disabled)
  enable_xim="no"
fi
if test "x$GUITYPE" = "xNONE" -a "$enable_fontset" = "yes"; then
  AC_MSG_RESULT(no GUI selected; fontset has been disabled)
  enable_fontset="no"
fi
if test "x$GUITYPE:$enable_fontset" = "xGTK:yes"; then
  AC_MSG_RESULT(GTK+ 2 GUI selected; fontset has been disabled)
  enable_fontset="no"
fi

if test -z "$SKIP_PHOTON"; then
  GUITYPE=PHOTONGUI
fi

AC_SUBST(GUI_INC_LOC)
AC_SUBST(GUI_LIB_LOC)
AC_SUBST(GUITYPE)
AC_SUBST(GUI_X_LIBS)

if test "$enable_workshop" = "yes" -a -n "$SKIP_MOTIF"; then
  AC_MSG_ERROR([cannot use workshop without Motif])
fi

dnl defining FEAT_XIM and FEAT_XFONTSET is delayed, so that they can be disabled
if test "$enable_xim" = "yes"; then
  AC_DEFINE(FEAT_XIM)
fi
if test "$enable_fontset" = "yes"; then
  AC_DEFINE(FEAT_XFONTSET)
fi


dnl ---------------------------------------------------------------------------
dnl end of GUI-checking
dnl ---------------------------------------------------------------------------


dnl Only really enable hangul input when GUI and XFONTSET are available
if test "$enable_hangulinput" = "yes"; then
  if test "x$GUITYPE" = "xNONE"; then
    AC_MSG_RESULT(no GUI selected; hangul input has been disabled)
    enable_hangulinput=no
  else
    AC_DEFINE(FEAT_HANGULIN)
    HANGULIN_SRC=hangulin.c
    AC_SUBST(HANGULIN_SRC)
    HANGULIN_OBJ=objects/hangulin.o
    AC_SUBST(HANGULIN_OBJ)
  fi
fi

dnl Checks for libraries and include files.

AC_CACHE_CHECK([whether toupper is broken], [vim_cv_toupper_broken],
  [
    AC_RUN_IFELSE([[
#include "confdefs.h"
#include <ctype.h>
#if STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
#endif
main() { exit(toupper('A') == 'A' && tolower('z') == 'z'); }
  ]],[
    vim_cv_toupper_broken=yes
  ],[
    vim_cv_toupper_broken=no
  ],[
    AC_MSG_ERROR(cross-compiling: please set 'vim_cv_toupper_broken')
  ])])

if test "x$vim_cv_toupper_broken" = "xyes" ; then
  AC_DEFINE(BROKEN_TOUPPER)
fi

AC_MSG_CHECKING(whether __DATE__ and __TIME__ work)
AC_TRY_COMPILE([#include <stdio.h>], [printf("(" __DATE__ " " __TIME__ ")");],
	AC_MSG_RESULT(yes); AC_DEFINE(HAVE_DATE_TIME),
	AC_MSG_RESULT(no))

AC_MSG_CHECKING(whether __attribute__((unused)) is allowed)
AC_TRY_COMPILE([#include <stdio.h>], [int x __attribute__((unused));],
	AC_MSG_RESULT(yes); AC_DEFINE(HAVE_ATTRIBUTE_UNUSED),
	AC_MSG_RESULT(no))

dnl Checks for header files.
AC_CHECK_HEADER(elf.h, HAS_ELF=1)
dnl AC_CHECK_HEADER(dwarf.h, SVR4=1)
if test "$HAS_ELF" = 1; then
  AC_CHECK_LIB(elf, main)
fi

AC_HEADER_DIRENT

dnl If sys/wait.h is not found it might still exist but not be POSIX
dnl compliant. In that case we define HAVE_UNION_WAIT (for NeXT)
if test $ac_cv_header_sys_wait_h = no; then
  AC_MSG_CHECKING([for sys/wait.h that defines union wait])
  AC_TRY_COMPILE([#include <sys/wait.h>],
			[union wait xx, yy; xx = yy],
		AC_MSG_RESULT(yes)
			AC_DEFINE(HAVE_SYS_WAIT_H)
			AC_DEFINE(HAVE_UNION_WAIT),
		AC_MSG_RESULT(no))
fi

AC_CHECK_HEADERS(stdarg.h stdint.h stdlib.h string.h \
	sys/select.h sys/utsname.h termcap.h fcntl.h \
	sgtty.h sys/ioctl.h sys/time.h sys/types.h \
	termio.h iconv.h inttypes.h langinfo.h math.h \
	unistd.h stropts.h errno.h sys/resource.h \
	sys/systeminfo.h locale.h sys/stream.h termios.h \
	libc.h sys/statfs.h poll.h sys/poll.h pwd.h \
	utime.h sys/param.h libintl.h libgen.h \
	util/debug.h util/msg18n.h frame.h sys/acl.h \
	sys/access.h sys/sysinfo.h wchar.h wctype.h)

dnl sys/ptem.h depends on sys/stream.h on Solaris
AC_CHECK_HEADERS(sys/ptem.h, [], [],
[#if defined HAVE_SYS_STREAM_H
#  include <sys/stream.h>
#endif])

dnl sys/sysctl.h depends on sys/param.h on OpenBSD
AC_CHECK_HEADERS(sys/sysctl.h, [], [],
[#if defined HAVE_SYS_PARAM_H
#  include <sys/param.h>
#endif])


dnl pthread_np.h may exist but can only be used after including pthread.h
AC_MSG_CHECKING([for pthread_np.h])
AC_TRY_COMPILE([
#include <pthread.h>
#include <pthread_np.h>],
		      [int i; i = 0;],
	      AC_MSG_RESULT(yes)
		      AC_DEFINE(HAVE_PTHREAD_NP_H),
	      AC_MSG_RESULT(no))

AC_CHECK_HEADERS(strings.h)
if test "x$MACOSX" = "xyes"; then
  dnl The strings.h file on OS/X contains a warning and nothing useful.
  AC_DEFINE(NO_STRINGS_WITH_STRING_H)
else

dnl Check if strings.h and string.h can both be included when defined.
AC_MSG_CHECKING([if strings.h can be included after string.h])
cppflags_save=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
AC_TRY_COMPILE([
#if defined(_AIX) && !defined(_AIX51) && !defined(_NO_PROTO)
# define _NO_PROTO	/* like in os_unix.h, causes conflict for AIX (Winn) */
			/* but don't do it on AIX 5.1 (Uribarri) */
#endif
#ifdef HAVE_XM_XM_H
# include <Xm/Xm.h>	/* This breaks it for HP-UX 11 (Squassabia) */
#endif
#ifdef HAVE_STRING_H
# include <string.h>
#endif
#if defined(HAVE_STRINGS_H)
# include <strings.h>
#endif
		], [int i; i = 0;],
		AC_MSG_RESULT(yes),
		AC_DEFINE(NO_STRINGS_WITH_STRING_H)
		AC_MSG_RESULT(no))
CPPFLAGS=$cppflags_save
fi

dnl Checks for typedefs, structures, and compiler characteristics.
AC_PROG_GCC_TRADITIONAL
AC_C_CONST
AC_C_VOLATILE
AC_TYPE_MODE_T
AC_TYPE_OFF_T
AC_TYPE_PID_T
AC_TYPE_SIZE_T
AC_TYPE_UID_T
AC_TYPE_UINT32_T

AC_HEADER_TIME
AC_CHECK_TYPE(ino_t, long)
AC_CHECK_TYPE(dev_t, unsigned)
AC_C_BIGENDIAN(,,,)

AC_MSG_CHECKING(for rlim_t)
if eval "test \"`echo '$''{'ac_cv_type_rlim_t'+set}'`\" = set"; then
  AC_MSG_RESULT([(cached) $ac_cv_type_rlim_t])
else
  AC_EGREP_CPP(dnl
changequote(<<,>>)dnl
<<(^|[^a-zA-Z_0-9])rlim_t[^a-zA-Z_0-9]>>dnl
changequote([,]),
  [
#include <sys/types.h>
#if STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
#endif
#ifdef HAVE_SYS_RESOURCE_H
# include <sys/resource.h>
#endif
	  ], ac_cv_type_rlim_t=yes, ac_cv_type_rlim_t=no)
	  AC_MSG_RESULT($ac_cv_type_rlim_t)
fi
if test $ac_cv_type_rlim_t = no; then
  cat >> confdefs.h <<\EOF
#define rlim_t unsigned long
EOF
fi

AC_MSG_CHECKING(for stack_t)
if eval "test \"`echo '$''{'ac_cv_type_stack_t'+set}'`\" = set"; then
  AC_MSG_RESULT([(cached) $ac_cv_type_stack_t])
else
  AC_EGREP_CPP(stack_t,
  [
#include <sys/types.h>
#if STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
#endif
#include <signal.h>
	  ], ac_cv_type_stack_t=yes, ac_cv_type_stack_t=no)
	  AC_MSG_RESULT($ac_cv_type_stack_t)
fi
if test $ac_cv_type_stack_t = no; then
  cat >> confdefs.h <<\EOF
#define stack_t struct sigaltstack
EOF
fi

dnl BSDI uses ss_base while others use ss_sp for the stack pointer.
AC_MSG_CHECKING(whether stack_t has an ss_base field)
AC_TRY_COMPILE([
#include <sys/types.h>
#if STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
#endif
#include <signal.h>
#include "confdefs.h"
			], [stack_t sigstk; sigstk.ss_base = 0; ],
	AC_MSG_RESULT(yes); AC_DEFINE(HAVE_SS_BASE),
	AC_MSG_RESULT(no))

olibs="$LIBS"
AC_MSG_CHECKING(--with-tlib argument)
AC_ARG_WITH(tlib, [  --with-tlib=library     terminal library to be used ],)
if test -n "$with_tlib"; then
  AC_MSG_RESULT($with_tlib)
  LIBS="$LIBS -l$with_tlib"
  AC_MSG_CHECKING(for linking with $with_tlib library)
  AC_TRY_LINK([], [], AC_MSG_RESULT(OK), AC_MSG_ERROR(FAILED))
  dnl Need to check for tgetent() below.
  olibs="$LIBS"
else
  AC_MSG_RESULT([empty: automatic terminal library selection])
  dnl  On HP-UX 10.10 termcap or termlib should be used instead of
  dnl  curses, because curses is much slower.
  dnl  Newer versions of ncurses are preferred over anything, except
  dnl  when tinfo has been split off, it contains all we need.
  dnl  Older versions of ncurses have bugs, get a new one!
  dnl  Digital Unix (OSF1) should use curses (Ronald Schild).
  dnl  On SCO Openserver should prefer termlib (Roger Cornelius).
  case "`uname -s 2>/dev/null`" in
	OSF1|SCO_SV)	tlibs="tinfo ncurses curses termlib termcap";;
	*)	tlibs="tinfo ncurses termlib termcap curses";;
  esac
  for libname in $tlibs; do
    AC_CHECK_LIB(${libname}, tgetent,,)
    if test "x$olibs" != "x$LIBS"; then
      dnl It's possible that a library is found but it doesn't work
      dnl e.g., shared library that cannot be found
      dnl compile and run a test program to be sure
      AC_TRY_RUN([
#ifdef HAVE_TERMCAP_H
# include <termcap.h>
#endif
#if STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
#endif
main() {char *s; s=(char *)tgoto("%p1%d", 0, 1); exit(0); }],
			  res="OK", res="FAIL", res="FAIL")
      if test "$res" = "OK"; then
	break
      fi
      AC_MSG_RESULT($libname library is not usable)
      LIBS="$olibs"
    fi
  done
  if test "x$olibs" = "x$LIBS"; then
    AC_MSG_RESULT(no terminal library found)
  fi
fi

if test "x$olibs" = "x$LIBS"; then
  AC_MSG_CHECKING([for tgetent()])
  AC_TRY_LINK([],
      [char s[10000]; int res = tgetent(s, "thisterminaldoesnotexist");],
	AC_MSG_RESULT(yes),
	AC_MSG_ERROR([NOT FOUND!
      You need to install a terminal library; for example ncurses.
      Or specify the name of the library with --with-tlib.]))
fi

AC_CACHE_CHECK([whether we talk terminfo], [vim_cv_terminfo],
  [
    AC_RUN_IFELSE([[
#include "confdefs.h"
#ifdef HAVE_TERMCAP_H
# include <termcap.h>
#endif
#ifdef HAVE_STRING_H
# include <string.h>
#endif
#if STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
#endif
main()
{char *s; s=(char *)tgoto("%p1%d", 0, 1); exit(!strcmp(s==0 ? "" : s, "1")); }
    ]],[
      vim_cv_terminfo=no
    ],[
      vim_cv_terminfo=yes
    ],[
      AC_MSG_ERROR(cross-compiling: please set 'vim_cv_terminfo')
    ])
  ])

if test "x$vim_cv_terminfo" = "xyes" ; then
  AC_DEFINE(TERMINFO)
fi

if test "x$olibs" != "x$LIBS"; then
  AC_CACHE_CHECK([what tgetent() returns for an unknown terminal], [vim_cv_tgent],
    [
      AC_RUN_IFELSE([[
#include "confdefs.h"
#ifdef HAVE_TERMCAP_H
# include <termcap.h>
#endif
#if STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
#endif
main()
{char s[10000]; int res = tgetent(s, "thisterminaldoesnotexist"); exit(res != 0); }
      ]],[
	vim_cv_tgent=zero
      ],[
	vim_cv_tgent=non-zero
      ],[
	AC_MSG_ERROR(failed to compile test program.)
      ])
    ])
  
  if test "x$vim_cv_tgent" = "xzero" ; then
    AC_DEFINE(TGETENT_ZERO_ERR, 0)
  fi
fi

AC_MSG_CHECKING(whether termcap.h contains ospeed)
AC_TRY_LINK([
#ifdef HAVE_TERMCAP_H
# include <termcap.h>
#endif
			], [ospeed = 20000],
	AC_MSG_RESULT(yes); AC_DEFINE(HAVE_OSPEED),
	[AC_MSG_RESULT(no)
	AC_MSG_CHECKING(whether ospeed can be extern)
	AC_TRY_LINK([
#ifdef HAVE_TERMCAP_H
# include <termcap.h>
#endif
extern short ospeed;
			], [ospeed = 20000],
		AC_MSG_RESULT(yes); AC_DEFINE(OSPEED_EXTERN),
		AC_MSG_RESULT(no))]
	)

AC_MSG_CHECKING([whether termcap.h contains UP, BC and PC])
AC_TRY_LINK([
#ifdef HAVE_TERMCAP_H
# include <termcap.h>
#endif
			], [if (UP == 0 && BC == 0) PC = 1],
	AC_MSG_RESULT(yes); AC_DEFINE(HAVE_UP_BC_PC),
	[AC_MSG_RESULT(no)
	AC_MSG_CHECKING([whether UP, BC and PC can be extern])
	AC_TRY_LINK([
#ifdef HAVE_TERMCAP_H
# include <termcap.h>
#endif
extern char *UP, *BC, PC;
			], [if (UP == 0 && BC == 0) PC = 1],
		AC_MSG_RESULT(yes); AC_DEFINE(UP_BC_PC_EXTERN),
		AC_MSG_RESULT(no))]
	)

AC_MSG_CHECKING(whether tputs() uses outfuntype)
AC_TRY_COMPILE([
#ifdef HAVE_TERMCAP_H
# include <termcap.h>
#endif
			], [extern int xx(); tputs("test", 1, (outfuntype)xx)],
	AC_MSG_RESULT(yes); AC_DEFINE(HAVE_OUTFUNTYPE),
	AC_MSG_RESULT(no))

dnl On some SCO machines sys/select redefines struct timeval
AC_MSG_CHECKING([whether sys/select.h and sys/time.h may both be included])
AC_TRY_COMPILE([
#include <sys/types.h>
#include <sys/time.h>
#include <sys/select.h>], ,
	  AC_MSG_RESULT(yes)
			AC_DEFINE(SYS_SELECT_WITH_SYS_TIME),
	  AC_MSG_RESULT(no))

dnl AC_DECL_SYS_SIGLIST

dnl Checks for pty.c (copied from screen) ==========================
AC_MSG_CHECKING(for /dev/ptc)
if test -r /dev/ptc; then
  AC_DEFINE(HAVE_DEV_PTC)
  AC_MSG_RESULT(yes)
else
  AC_MSG_RESULT(no)
fi

AC_MSG_CHECKING(for SVR4 ptys)
if test -c /dev/ptmx ; then
  AC_TRY_LINK([], [ptsname(0);grantpt(0);unlockpt(0);],
	AC_MSG_RESULT(yes); AC_DEFINE(HAVE_SVR4_PTYS),
	AC_MSG_RESULT(no))
else
  AC_MSG_RESULT(no)
fi

AC_MSG_CHECKING(for ptyranges)
if test -d /dev/ptym ; then
  pdir='/dev/ptym'
else
  pdir='/dev'
fi
dnl SCO uses ptyp%d
AC_EGREP_CPP(yes,
[#ifdef M_UNIX
   yes;
#endif
	], ptys=`echo /dev/ptyp??`, ptys=`echo $pdir/pty??`)
dnl if test -c /dev/ptyp19; then
dnl ptys=`echo /dev/ptyp??`
dnl else
dnl ptys=`echo $pdir/pty??`
dnl fi
if test "$ptys" != "$pdir/pty??" ; then
  p0=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\).$/\1/g' | sort -u | tr -d '\012'`
  p1=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\)$/\1/g'  | sort -u | tr -d '\012'`
  AC_DEFINE_UNQUOTED(PTYRANGE0,"$p0")
  AC_DEFINE_UNQUOTED(PTYRANGE1,"$p1")
  AC_MSG_RESULT([$p0 / $p1])
else
  AC_MSG_RESULT([don't know])
fi

dnl    ****  pty mode/group handling ****
dnl
dnl support provided by Luke Mewburn <lm@rmit.edu.au>, 931222
rm -f conftest_grp
AC_CACHE_CHECK([default tty permissions/group], [vim_cv_tty_group],
  [
    AC_RUN_IFELSE([[
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <sys/stat.h>
#include <stdio.h>
main()
{
  struct stat sb;
  char *x,*ttyname();
  int om, m;
  FILE *fp;

  if (!(x = ttyname(0))) exit(1);
  if (stat(x, &sb)) exit(1);
  om = sb.st_mode;
  if (om & 002) exit(0);
  m = system("mesg y");
  if (m == -1 || m == 127) exit(1);
  if (stat(x, &sb)) exit(1);
  m = sb.st_mode;
  if (chmod(x, om)) exit(1);
  if (m & 002) exit(0);
  if (sb.st_gid == getgid()) exit(1);
  if (!(fp=fopen("conftest_grp", "w")))
    exit(1);
  fprintf(fp, "%d\n", sb.st_gid);
  fclose(fp);
  exit(0);
}
    ]],[
      if test -f conftest_grp; then
	vim_cv_tty_group=`cat conftest_grp`
	if test "x$vim_cv_tty_mode" = "x" ; then
	  vim_cv_tty_mode=0620
	fi
	AC_MSG_RESULT([pty mode: $vim_cv_tty_mode, group: $vim_cv_tty_group])
      else
	vim_cv_tty_group=world
	AC_MSG_RESULT([ptys are world accessible])
      fi
    ],[
      vim_cv_tty_group=world
      AC_MSG_RESULT([can't determine - assume ptys are world accessible])
    ],[
      AC_MSG_ERROR(cross-compiling: please set 'vim_cv_tty_group' and 'vim_cv_tty_mode')
    ])
  ])
rm -f conftest_grp

if test "x$vim_cv_tty_group" != "xworld" ; then
  AC_DEFINE_UNQUOTED(PTYGROUP,$vim_cv_tty_group)
  if test "x$vim_cv_tty_mode" = "x" ; then
    AC_MSG_ERROR([It seems you're cross compiling and have 'vim_cv_tty_group' set, please also set the environment variable 'vim_cv_tty_mode' to the correct mode (propably 0620)])
  else
    AC_DEFINE(PTYMODE, 0620)
  fi
fi

dnl Checks for library functions. ===================================

AC_TYPE_SIGNAL

dnl find out what to use at the end of a signal function
if test $ac_cv_type_signal = void; then
  AC_DEFINE(SIGRETURN, [return])
else
  AC_DEFINE(SIGRETURN, [return 0])
fi

dnl check if struct sigcontext is defined (used for SGI only)
AC_MSG_CHECKING(for struct sigcontext)
AC_TRY_COMPILE([
#include <signal.h>
test_sig()
{
    struct sigcontext *scont;
    scont = (struct sigcontext *)0;
    return 1;
} ], ,
	  AC_MSG_RESULT(yes)
		AC_DEFINE(HAVE_SIGCONTEXT),
	  AC_MSG_RESULT(no))

dnl tricky stuff: try to find out if getcwd() is implemented with
dnl system("sh -c pwd")
AC_CACHE_CHECK([getcwd implementation is broken], [vim_cv_getcwd_broken],
  [
    AC_RUN_IFELSE([[
#include "confdefs.h"
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
char *dagger[] = { "IFS=pwd", 0 };
main()
{
  char buffer[500];
  extern char **environ;
  environ = dagger;
  return getcwd(buffer, 500) ? 0 : 1;
}
    ]],[
      vim_cv_getcwd_broken=no
    ],[
      vim_cv_getcwd_broken=yes
    ],[
      AC_MSG_ERROR(cross-compiling: please set 'vim_cv_getcwd_broken')
    ])
  ])

if test "x$vim_cv_getcwd_broken" = "xyes" ; then
  AC_DEFINE(BAD_GETCWD)
fi

dnl Check for functions in one big call, to reduce the size of configure.
dnl Can only be used for functions that do not require any include.
AC_CHECK_FUNCS(bcmp fchdir fchown fsync getcwd getpseudotty \
	getpwnam getpwuid getrlimit gettimeofday getwd lstat memcmp \
	memset mkdtemp nanosleep opendir putenv qsort readlink select setenv \
	setpgid setsid sigaltstack sigstack sigset sigsetjmp sigaction \
	sigvec strcasecmp strerror strftime stricmp strncasecmp \
	strnicmp strpbrk strtol tgetent towlower towupper iswupper \
	usleep utime utimes)
AC_FUNC_FSEEKO

dnl define _LARGE_FILES, _FILE_OFFSET_BITS and _LARGEFILE_SOURCE when
dnl appropriate, so that off_t is 64 bits when needed.
AC_SYS_LARGEFILE

dnl fstatfs() can take 2 to 4 arguments, try to use st_blksize if possible
AC_MSG_CHECKING(for st_blksize)
AC_TRY_COMPILE(
[#include <sys/types.h>
#include <sys/stat.h>],
[	struct stat st;
	int n;

	stat("/", &st);
	n = (int)st.st_blksize;],
	AC_MSG_RESULT(yes); AC_DEFINE(HAVE_ST_BLKSIZE),
	AC_MSG_RESULT(no))

AC_CACHE_CHECK([whether stat() ignores a trailing slash], [vim_cv_stat_ignores_slash],
  [
    AC_RUN_IFELSE([[
#include "confdefs.h"
#if STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
#endif
#include <sys/types.h>
#include <sys/stat.h>
main() {struct stat st;  exit(stat("configure/", &st) != 0); }
    ]],[
      vim_cv_stat_ignores_slash=yes
    ],[
      vim_cv_stat_ignores_slash=no
    ],[
      AC_MSG_ERROR(cross-compiling: please set 'vim_cv_stat_ignores_slash')
    ])
  ])

if test "x$vim_cv_stat_ignores_slash" = "xyes" ; then
  AC_DEFINE(STAT_IGNORES_SLASH)
fi
  
dnl Link with iconv for charset translation, if not found without library.
dnl check for iconv() requires including iconv.h
dnl Add "-liconv" when possible; Solaris has iconv but use GNU iconv when it
dnl has been installed.
AC_MSG_CHECKING(for iconv_open())
save_LIBS="$LIBS"
LIBS="$LIBS -liconv"
AC_TRY_LINK([
#ifdef HAVE_ICONV_H
# include <iconv.h>
#endif
    ], [iconv_open("fr", "to");],
    AC_MSG_RESULT(yes; with -liconv); AC_DEFINE(HAVE_ICONV),
    LIBS="$save_LIBS"
    AC_TRY_LINK([
#ifdef HAVE_ICONV_H
# include <iconv.h>
#endif
	], [iconv_open("fr", "to");],
	AC_MSG_RESULT(yes); AC_DEFINE(HAVE_ICONV),
	AC_MSG_RESULT(no)))


AC_MSG_CHECKING(for nl_langinfo(CODESET))
AC_TRY_LINK([
#ifdef HAVE_LANGINFO_H
# include <langinfo.h>
#endif
], [char *cs = nl_langinfo(CODESET);],
	AC_MSG_RESULT(yes); AC_DEFINE(HAVE_NL_LANGINFO_CODESET),
	AC_MSG_RESULT(no))

dnl Need various functions for floating point support.  Only enable
dnl floating point when they are all present.
AC_CHECK_LIB(m, strtod)
AC_MSG_CHECKING([for strtod() and other floating point functions])
AC_TRY_LINK([
#ifdef HAVE_MATH_H
# include <math.h>
#endif
#if STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
#endif
], [char *s; double d;
    d = strtod("1.1", &s);
    d = fabs(1.11);
    d = ceil(1.11);
    d = floor(1.11);
    d = log10(1.11);
    d = pow(1.11, 2.22);
    d = sqrt(1.11);
    d = sin(1.11);
    d = cos(1.11);
    d = atan(1.11);
    ],
	AC_MSG_RESULT(yes); AC_DEFINE(HAVE_FLOAT_FUNCS),
	AC_MSG_RESULT(no))

dnl Link with -lposix1e for ACL stuff; if not found, try -lacl for SGI
dnl when -lacl works, also try to use -lattr (required for Debian).
AC_MSG_CHECKING(--disable-acl argument)
AC_ARG_ENABLE(acl,
	[  --disable-acl           Don't check for ACL support.],
	, [enable_acl="yes"])
if test "$enable_acl" = "yes"; then
AC_MSG_RESULT(no)
AC_CHECK_LIB(posix1e, acl_get_file, [LIBS="$LIBS -lposix1e"],
	AC_CHECK_LIB(acl, acl_get_file, [LIBS="$LIBS -lacl"
		  AC_CHECK_LIB(attr, fgetxattr, LIBS="$LIBS -lattr",,)],,),)

AC_MSG_CHECKING(for POSIX ACL support)
AC_TRY_LINK([
#include <sys/types.h>
#ifdef HAVE_SYS_ACL_H
# include <sys/acl.h>
#endif
acl_t acl;], [acl = acl_get_file("foo", ACL_TYPE_ACCESS);
	acl_set_file("foo", ACL_TYPE_ACCESS, acl);
	acl_free(acl);],
	AC_MSG_RESULT(yes); AC_DEFINE(HAVE_POSIX_ACL),
	AC_MSG_RESULT(no))

AC_MSG_CHECKING(for Solaris ACL support)
AC_TRY_LINK([
#ifdef HAVE_SYS_ACL_H
# include <sys/acl.h>
#endif], [acl("foo", GETACLCNT, 0, NULL);
	],
	AC_MSG_RESULT(yes); AC_DEFINE(HAVE_SOLARIS_ACL),
	AC_MSG_RESULT(no))

AC_MSG_CHECKING(for AIX ACL support)
AC_TRY_LINK([
#if STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
#endif
#ifdef HAVE_SYS_ACL_H
# include <sys/acl.h>
#endif
#ifdef HAVE_SYS_ACCESS_H
# include <sys/access.h>
#endif
#define _ALL_SOURCE

#include <sys/stat.h>

int aclsize;
struct acl *aclent;], [aclsize = sizeof(struct acl);
	aclent = (void *)malloc(aclsize);
	statacl("foo", STX_NORMAL, aclent, aclsize);
	],
	AC_MSG_RESULT(yes); AC_DEFINE(HAVE_AIX_ACL),
	AC_MSG_RESULT(no))
else
  AC_MSG_RESULT(yes)
fi

AC_MSG_CHECKING(--disable-gpm argument)
AC_ARG_ENABLE(gpm,
	[  --disable-gpm           Don't use gpm (Linux mouse daemon).], ,
	[enable_gpm="yes"])

if test "$enable_gpm" = "yes"; then
  AC_MSG_RESULT(no)
  dnl Checking if gpm support can be compiled
  AC_CACHE_CHECK([for gpm], vi_cv_have_gpm,
	[olibs="$LIBS" ; LIBS="-lgpm"]
	AC_TRY_LINK(
	    [#include <gpm.h>
	    #include <linux/keyboard.h>],
	    [Gpm_GetLibVersion(NULL);],
	    dnl Configure defines HAVE_GPM, if it is defined feature.h defines
	    dnl FEAT_MOUSE_GPM if mouse support is included
	    [vi_cv_have_gpm=yes],
	    [vi_cv_have_gpm=no])
	[LIBS="$olibs"]
    )
  if test $vi_cv_have_gpm = yes; then
    LIBS="$LIBS -lgpm"
    AC_DEFINE(HAVE_GPM)
  fi
else
  AC_MSG_RESULT(yes)
fi

AC_MSG_CHECKING(--disable-sysmouse argument)
AC_ARG_ENABLE(sysmouse,
	[  --disable-sysmouse    Don't use sysmouse (mouse in *BSD console).], ,
	[enable_sysmouse="yes"])

if test "$enable_sysmouse" = "yes"; then
  AC_MSG_RESULT(no)
  dnl Checking if sysmouse support can be compiled
  dnl Configure defines HAVE_SYSMOUSE, if it is defined feature.h
  dnl defines FEAT_SYSMOUSE if mouse support is included
  AC_CACHE_CHECK([for sysmouse], vi_cv_have_sysmouse,
	AC_TRY_LINK(
	    [#include <sys/consio.h>
	     #include <signal.h>
	     #include <sys/fbio.h>],
	    [struct mouse_info   mouse;
	     mouse.operation = MOUSE_MODE;
	     mouse.operation = MOUSE_SHOW;
	     mouse.u.mode.mode = 0;
	     mouse.u.mode.signal = SIGUSR2;],
	    [vi_cv_have_sysmouse=yes],
	    [vi_cv_have_sysmouse=no])
    )
  if test $vi_cv_have_sysmouse = yes; then
    AC_DEFINE(HAVE_SYSMOUSE)
  fi
else
  AC_MSG_RESULT(yes)
fi

dnl make sure the FD_CLOEXEC flag for fcntl()'s F_SETFD command is known
AC_MSG_CHECKING(for FD_CLOEXEC)
AC_TRY_COMPILE(
[#if HAVE_FCNTL_H
# include <fcntl.h>
#endif],
[	int flag = FD_CLOEXEC;],
	AC_MSG_RESULT(yes); AC_DEFINE(HAVE_FD_CLOEXEC),
	AC_MSG_RESULT(not usable))

dnl rename needs to be checked separately to work on Nextstep with cc
AC_MSG_CHECKING(for rename)
AC_TRY_LINK([#include <stdio.h>], [rename("this", "that")],
	AC_MSG_RESULT(yes); AC_DEFINE(HAVE_RENAME),
	AC_MSG_RESULT(no))

dnl sysctl() may exist but not the arguments we use
AC_MSG_CHECKING(for sysctl)
AC_TRY_COMPILE(
[#include <sys/types.h>
#include <sys/sysctl.h>],
[	int mib[2], r;
	size_t len;

	mib[0] = CTL_HW;
	mib[1] = HW_USERMEM;
	len = sizeof(r);
	(void)sysctl(mib, 2, &r, &len, (void *)0, (size_t)0);
	],
	AC_MSG_RESULT(yes); AC_DEFINE(HAVE_SYSCTL),
	AC_MSG_RESULT(not usable))

dnl sysinfo() may exist but not be Linux compatible
AC_MSG_CHECKING(for sysinfo)
AC_TRY_COMPILE(
[#include <sys/types.h>
#include <sys/sysinfo.h>],
[	struct sysinfo sinfo;
	int t;

	(void)sysinfo(&sinfo);
	t = sinfo.totalram;
	],
	AC_MSG_RESULT(yes); AC_DEFINE(HAVE_SYSINFO),
	AC_MSG_RESULT(not usable))

dnl struct sysinfo may have the mem_unit field or not
AC_MSG_CHECKING(for sysinfo.mem_unit)
AC_TRY_COMPILE(
[#include <sys/types.h>
#include <sys/sysinfo.h>],
[	struct sysinfo sinfo;
 	sinfo.mem_unit = 1;
	],
	AC_MSG_RESULT(yes); AC_DEFINE(HAVE_SYSINFO_MEM_UNIT),
	AC_MSG_RESULT(no))

dnl sysconf() may exist but not support what we want to use
AC_MSG_CHECKING(for sysconf)
AC_TRY_COMPILE(
[#include <unistd.h>],
[	(void)sysconf(_SC_PAGESIZE);
	(void)sysconf(_SC_PHYS_PAGES);
	],
	AC_MSG_RESULT(yes); AC_DEFINE(HAVE_SYSCONF),
	AC_MSG_RESULT(not usable))

AC_CHECK_SIZEOF([int])
AC_CHECK_SIZEOF([long])
AC_CHECK_SIZEOF([time_t])
AC_CHECK_SIZEOF([off_t])

dnl Make sure that uint32_t is really 32 bits unsigned.
AC_MSG_CHECKING([uint32_t is 32 bits])
AC_TRY_RUN([
#ifdef HAVE_STDINT_H
# include <stdint.h>
#endif
#ifdef HAVE_INTTYPES_H
# include <inttypes.h>
#endif
main() {
  uint32_t nr1 = (uint32_t)-1;
  uint32_t nr2 = (uint32_t)0xffffffffUL;
  if (sizeof(uint32_t) != 4 || nr1 != 0xffffffffUL || nr2 + 1 != 0) exit(1);
  exit(0);
}],
AC_MSG_RESULT(ok),
AC_MSG_ERROR([WRONG!  uint32_t not defined correctly.]),
AC_MSG_ERROR([could not compile program using uint32_t.]))

dnl Check for memmove() before bcopy(), makes memmove() be used when both are
dnl present, fixes problem with incompatibility between Solaris 2.4 and 2.5.

[bcopy_test_prog='
#include "confdefs.h"
#ifdef HAVE_STRING_H
# include <string.h>
#endif
#if STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
#endif
main() {
  char buf[10];
  strcpy(buf, "abcdefghi");
  mch_memmove(buf, buf + 2, 3);
  if (strncmp(buf, "ababcf", 6))
    exit(1);
  strcpy(buf, "abcdefghi");
  mch_memmove(buf + 2, buf, 3);
  if (strncmp(buf, "cdedef", 6))
    exit(1);
  exit(0); /* libc version works properly.  */
}']

AC_CACHE_CHECK([whether memmove handles overlaps],[vim_cv_memmove_handles_overlap],
  [
    AC_RUN_IFELSE([[#define mch_memmove(s,d,l) memmove(d,s,l) $bcopy_test_prog]],
      [
	vim_cv_memmove_handles_overlap=yes
      ],[
	vim_cv_memmove_handles_overlap=no
      ],[
	AC_MSG_ERROR(cross-compiling: please set 'vim_cv_memmove_handles_overlap')
      ])
  ])

if test "x$vim_cv_memmove_handles_overlap" = "xyes" ; then
  AC_DEFINE(USEMEMMOVE)
else
  AC_CACHE_CHECK([whether bcopy handles overlaps],[vim_cv_bcopy_handles_overlap],
    [
      AC_RUN_IFELSE([[#define mch_bcopy(s,d,l) bcopy(d,s,l) $bcopy_test_prog]],
      [
	vim_cv_bcopy_handles_overlap=yes
      ],[
	vim_cv_bcopy_handles_overlap=no
      ],[
	AC_MSG_ERROR(cross-compiling: please set 'vim_cv_bcopy_handles_overlap')
      ])
    ])

  if test "x$vim_cv_bcopy_handles_overlap" = "xyes" ; then
    AC_DEFINE(USEBCOPY)
  else
    AC_CACHE_CHECK([whether memcpy handles overlaps],[vim_cv_memcpy_handles_overlap],
      [
	AC_RUN_IFELSE([[#define mch_memcpy(s,d,l) memcpy(d,s,l) $bcopy_test_prog]],
	  [
	    vim_cv_memcpy_handles_overlap=yes
	  ],[
	    vim_cv_memcpy_handles_overlap=no
	  ],[
	    AC_MSG_ERROR(cross-compiling: please set 'vim_cv_memcpy_handles_overlap')
	  ])
      ])

    if test "x$vim_cv_memcpy_handles_overlap" = "xyes" ; then
      AC_DEFINE(USEMEMCPY)
    fi
  fi
fi


dnl Check for multibyte locale functions
dnl Find out if _Xsetlocale() is supported by libX11.
dnl Check if X_LOCALE should be defined.

if test "$enable_multibyte" = "yes"; then
  cflags_save=$CFLAGS
  ldflags_save=$LDFLAGS
  if test "x$x_includes" != "xNONE" ; then
    CFLAGS="$CFLAGS -I$x_includes"
    LDFLAGS="$X_LIBS $LDFLAGS -lX11"
    AC_MSG_CHECKING(whether X_LOCALE needed)
    AC_TRY_COMPILE([#include <X11/Xlocale.h>],,
	AC_TRY_LINK_FUNC([_Xsetlocale], [AC_MSG_RESULT(yes)
		AC_DEFINE(X_LOCALE)], AC_MSG_RESULT(no)),
	AC_MSG_RESULT(no))
  fi
  CFLAGS=$cflags_save
  LDFLAGS=$ldflags_save
fi

dnl Link with xpg4, it is said to make Korean locale working
AC_CHECK_LIB(xpg4, _xpg4_setrunelocale, [LIBS="$LIBS -lxpg4"],,)

dnl Check how we can run ctags.  Default to "ctags" when nothing works.
dnl Use --version to detect Exuberant ctags (preferred)
dnl       Add --fields=+S to get function signatures for omni completion.
dnl -t for typedefs (many ctags have this)
dnl -s for static functions (Elvis ctags only?)
dnl -v for variables. Dangerous, most ctags take this for 'vgrind style'.
dnl -i+m to test for older Exuberant ctags
AC_MSG_CHECKING(how to create tags)
test -f tags && mv tags tags.save
if (eval ctags --version /dev/null | grep Exuberant) < /dev/null 1>&AC_FD_CC 2>&1; then
  TAGPRG="ctags -I INIT+ --fields=+S"
elif (eval exctags --version /dev/null | grep Exuberant) < /dev/null 1>&AC_FD_CC 2>&1; then
  TAGPRG="exctags -I INIT+ --fields=+S"
elif (eval exuberant-ctags --version /dev/null | grep Exuberant) < /dev/null 1>&AC_FD_CC 2>&1; then
  TAGPRG="exuberant-ctags -I INIT+ --fields=+S"
else
  TAGPRG="ctags"
  (eval etags	   /dev/null) < /dev/null 1>&AC_FD_CC 2>&1 && TAGPRG="etags"
  (eval etags -c   /dev/null) < /dev/null 1>&AC_FD_CC 2>&1 && TAGPRG="etags -c"
  (eval ctags	   /dev/null) < /dev/null 1>&AC_FD_CC 2>&1 && TAGPRG="ctags"
  (eval ctags -t   /dev/null) < /dev/null 1>&AC_FD_CC 2>&1 && TAGPRG="ctags -t"
  (eval ctags -ts  /dev/null) < /dev/null 1>&AC_FD_CC 2>&1 && TAGPRG="ctags -ts"
  (eval ctags -tvs /dev/null) < /dev/null 1>&AC_FD_CC 2>&1 && TAGPRG="ctags -tvs"
  (eval ctags -i+m /dev/null) < /dev/null 1>&AC_FD_CC 2>&1 && TAGPRG="ctags -i+m"
fi
test -f tags.save && mv tags.save tags
AC_MSG_RESULT($TAGPRG) AC_SUBST(TAGPRG)

dnl Check how we can run man with a section number
AC_MSG_CHECKING(how to run man with a section nr)
MANDEF="man"
(eval MANPAGER=cat PAGER=cat man -s 2 read) < /dev/null > /dev/null 2>&AC_FD_CC && MANDEF="man -s"
AC_MSG_RESULT($MANDEF)
if test "$MANDEF" = "man -s"; then
  AC_DEFINE(USEMAN_S)
fi

dnl Check if gettext() is working and if it needs -lintl
AC_MSG_CHECKING(--disable-nls argument)
AC_ARG_ENABLE(nls,
	[  --disable-nls           Don't support NLS (gettext()).], ,
	[enable_nls="yes"])

if test "$enable_nls" = "yes"; then
  AC_MSG_RESULT(no)

  INSTALL_LANGS=install-languages
  AC_SUBST(INSTALL_LANGS)
  INSTALL_TOOL_LANGS=install-tool-languages
  AC_SUBST(INSTALL_TOOL_LANGS)

  AC_CHECK_PROG(MSGFMT, msgfmt, msgfmt, )
  AC_MSG_CHECKING([for NLS])
  if test -f po/Makefile; then
    have_gettext="no"
    if test -n "$MSGFMT"; then
      AC_TRY_LINK(
	[#include <libintl.h>],
	[gettext("Test");],
	AC_MSG_RESULT([gettext() works]); have_gettext="yes",
	  olibs=$LIBS
	  LIBS="$LIBS -lintl"
	  AC_TRY_LINK(
	      [#include <libintl.h>],
	      [gettext("Test");],
	      AC_MSG_RESULT([gettext() works with -lintl]); have_gettext="yes",
	      AC_MSG_RESULT([gettext() doesn't work]);
	      LIBS=$olibs))
    else
      AC_MSG_RESULT([msgfmt not found - disabled]);
    fi
    if test $have_gettext = "yes"; then
      AC_DEFINE(HAVE_GETTEXT)
      MAKEMO=yes
      AC_SUBST(MAKEMO)
      dnl this was added in GNU gettext 0.10.36
      AC_CHECK_FUNCS(bind_textdomain_codeset)
      dnl _nl_msg_cat_cntr is required for GNU gettext
      AC_MSG_CHECKING([for _nl_msg_cat_cntr])
      AC_TRY_LINK(
		[#include <libintl.h>
		extern int _nl_msg_cat_cntr;],
		[++_nl_msg_cat_cntr;],
		AC_MSG_RESULT([yes]); AC_DEFINE(HAVE_NL_MSG_CAT_CNTR),
		AC_MSG_RESULT([no]))
    fi
  else
    AC_MSG_RESULT([no "po/Makefile" - disabled]);
  fi
else
  AC_MSG_RESULT(yes)
fi

dnl Check for dynamic linking loader
AC_CHECK_HEADER(dlfcn.h, DLL=dlfcn.h, [AC_CHECK_HEADER(dl.h, DLL=dl.h)])
if test x${DLL} = xdlfcn.h; then
  AC_DEFINE(HAVE_DLFCN_H, 1, [ Define if we have dlfcn.h. ])
  AC_MSG_CHECKING([for dlopen()])
  AC_TRY_LINK(,[
		extern void* dlopen();
		dlopen();
      ],
      AC_MSG_RESULT(yes);
	      AC_DEFINE(HAVE_DLOPEN, 1, [ Define if we have dlopen() ]),
      AC_MSG_RESULT(no);
	      AC_MSG_CHECKING([for dlopen() in -ldl])
	      olibs=$LIBS
	      LIBS="$LIBS -ldl"
	      AC_TRY_LINK(,[
				extern void* dlopen();
				dlopen();
		 ],
		 AC_MSG_RESULT(yes);
			  AC_DEFINE(HAVE_DLOPEN, 1, [ Define if we have dlopen() ]),
		 AC_MSG_RESULT(no);
			  LIBS=$olibs))
  dnl ReliantUNIX has dlopen() in libc but everything else in libdl
  dnl ick :-)
  AC_MSG_CHECKING([for dlsym()])
  AC_TRY_LINK(,[
		extern void* dlsym();
		dlsym();
      ],
      AC_MSG_RESULT(yes);
	      AC_DEFINE(HAVE_DLSYM, 1, [ Define if we have dlsym() ]),
      AC_MSG_RESULT(no);
	      AC_MSG_CHECKING([for dlsym() in -ldl])
	      olibs=$LIBS
	      LIBS="$LIBS -ldl"
	      AC_TRY_LINK(,[
				extern void* dlsym();
				dlsym();
		 ],
		 AC_MSG_RESULT(yes);
			  AC_DEFINE(HAVE_DLSYM, 1, [ Define if we have dlsym() ]),
		 AC_MSG_RESULT(no);
			  LIBS=$olibs))
elif test x${DLL} = xdl.h; then
  AC_DEFINE(HAVE_DL_H, 1, [ Define if we have dl.h. ])
  AC_MSG_CHECKING([for shl_load()])
  AC_TRY_LINK(,[
		extern void* shl_load();
		shl_load();
     ],
     AC_MSG_RESULT(yes);
	  AC_DEFINE(HAVE_SHL_LOAD, 1, [ Define if we have shl_load() ]),
     AC_MSG_RESULT(no);
	  AC_MSG_CHECKING([for shl_load() in -ldld])
	  olibs=$LIBS
	  LIBS="$LIBS -ldld"
	  AC_TRY_LINK(,[
			extern void* shl_load();
			shl_load();
	     ],
	     AC_MSG_RESULT(yes);
		  AC_DEFINE(HAVE_SHL_LOAD, 1, [ Define if we have shl_load() ]),
	     AC_MSG_RESULT(no);
		  LIBS=$olibs))
fi
AC_CHECK_HEADERS(setjmp.h)

if test "x$MACOSX" = "xyes" -a -n "$PERL"; then
  dnl -ldl must come after DynaLoader.a
  if echo $LIBS | grep -e '-ldl' >/dev/null; then
    LIBS=`echo $LIBS | sed s/-ldl//`
    PERL_LIBS="$PERL_LIBS -ldl"
  fi
fi

if test "x$MACOSX" = "xyes"; then
  AC_MSG_CHECKING(whether we need -framework Cocoa)
  dnl Cocoa is needed with FEAT_CLIPBOARD or FEAT_MBYTE (the former is
  dnl disabled during tiny build)
  if test "x$features" != "xtiny" || test "x$enable_multibyte" = "xyes"; then
    LIBS=$"$LIBS -framework Cocoa"
    AC_MSG_RESULT(yes)
  else
    AC_MSG_RESULT(no)
  fi
fi
if test "x$MACARCH" = "xboth" && test "x$GUITYPE" = "xCARBONGUI"; then
  LDFLAGS="$LDFLAGS -isysroot $DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc"
fi

dnl gcc 3.1 changed the meaning of -MM.  The only solution appears to be to
dnl use "-isystem" instead of "-I" for all non-Vim include dirs.
dnl But only when making dependencies, cproto and lint don't take "-isystem".
dnl Mac gcc returns "powerpc-apple-darwin8-gcc-4.0.1 (GCC)...", need to allow
dnl the number before the version number.
DEPEND_CFLAGS_FILTER=
if test "$GCC" = yes; then
  AC_MSG_CHECKING(for GCC 3 or later)
  gccmajor=`echo "$gccversion" | sed -e 's/^\([[1-9]]\)\..*$/\1/g'`
  if test "$gccmajor" -gt "2"; then
    DEPEND_CFLAGS_FILTER="| sed 's+-I */+-isystem /+g'"
    AC_MSG_RESULT(yes)
  else
    AC_MSG_RESULT(no)
  fi
  dnl -D_FORTIFY_SOURCE=2 crashes Vim on strcpy(buf, "000") when buf is
  dnl declared as char x[1] but actually longer.  Introduced in gcc 4.0.
  dnl Also remove duplicate _FORTIFY_SOURCE arguments.
  AC_MSG_CHECKING(whether we need -D_FORTIFY_SOURCE=1)
  if test "$gccmajor" -gt "3"; then
    CFLAGS=`echo "$CFLAGS" | sed -e 's/-Wp,-D_FORTIFY_SOURCE=.//g' -e 's/-D_FORTIFY_SOURCE=.//g' -e 's/$/ -D_FORTIFY_SOURCE=1/'`
    AC_MSG_RESULT(yes)
  else
    AC_MSG_RESULT(no)
  fi
fi
AC_SUBST(DEPEND_CFLAGS_FILTER)

dnl link.sh tries to avoid overlinking in a hackish way.
dnl At least GNU ld supports --as-needed which provides the same functionality
dnl at linker level. Let's use it.
AC_MSG_CHECKING(linker --as-needed support)
LINK_AS_NEEDED=
# Check if linker supports --as-needed and --no-as-needed options
if $CC -Wl,--help 2>/dev/null | grep as-needed > /dev/null; then
  LDFLAGS="$LDFLAGS -Wl,--as-needed"
  LINK_AS_NEEDED=yes
fi
if test "$LINK_AS_NEEDED" = yes; then
  AC_MSG_RESULT(yes)
else
  AC_MSG_RESULT(no)
fi
AC_SUBST(LINK_AS_NEEDED)

dnl write output files
AC_OUTPUT(auto/config.mk:config.mk.in)

dnl vim: set sw=2 tw=78 fo+=l:
