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 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 is probably something
dnl wrong with the CC or CFLAGS settings, give an understandable error message
if test "$cross_compiling" = yes; then
  AC_MSG_ERROR([cannot compile a simple program, check CC and CFLAGS
  (cross compiling doesn't work)])
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.c; 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))

  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/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_SCR="os_macosx.c 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"
    if test "x$MACARCH" = "xboth"; then
      CPPFLAGS="$CPPFLAGS -I/Developer/SDKs/MacOSX10.4u.sdk/Developer/Headers/FlatCarbon"
    else
      CPPFLAGS="$CPPFLAGS -I/Developer/Headers/FlatCarbon"
    fi

    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" != Xgtk -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.
have_local_include=''
have_local_lib=''
if test "$GCC" = yes; 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 '/usr/local/include'`
  have_local_lib=`${CC-cc} -c -v conftest.c 2>&1 | grep '/usr/local/lib'`
  rm -f conftest.c conftest.o
fi
if test -z "$have_local_lib" -a -d /usr/local/lib; then
  tt=`echo "$LDFLAGS" | sed -e 's+-L/usr/local/lib ++g' -e 's+-L/usr/local/lib$++g'`
  if test "$tt" = "$LDFLAGS"; then
    LDFLAGS="$LDFLAGS -L/usr/local/lib"
  fi
fi
if test -z "$have_local_include" -a -d /usr/local/include; then
  tt=`echo "$CPPFLAGS" | sed -e 's+-I/usr/local/include ++g' -e 's+-I/usr/local/include$++g'`
  if test "$tt" = "$CPPFLAGS"; then
    CPPFLAGS="$CPPFLAGS -I/usr/local/include"
  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 OS390 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 OS390 Unix, let's test it!
AC_MSG_CHECKING(for OS/390 Unix)
case `uname` in
    OS/390)	OS390Unix="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 OS/390 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"; LDFLAGS="$LDFLAGS -Wl,EDIT=NO"
		AC_MSG_RESULT(yes)
		;;
    *)		OS390Unix="no";
		AC_MSG_RESULT(no)
		;;
esac
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 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,
	    [ vi_cv_path_mzscheme_pfx=`
	    ${vi_cv_path_mzscheme} -evm \
	    "(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))))"` ])
	    dnl Remove a trailing slash.
	    vi_cv_path_mzscheme_pfx=`echo "$vi_cv_path_mzscheme_pfx" | sed 's+/$++'`
	fi
    fi
  fi

  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
      AC_MSG_RESULT("yes")
    else
      AC_MSG_RESULT("no")
      vi_cv_path_mzscheme_pfx=
    fi
  fi

  if test "X$vi_cv_path_mzscheme_pfx" != "X"; then
    if test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"; then
      MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a ${vi_cv_path_mzscheme_pfx}/lib/libmzscheme.a"
    else
      MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzgc -lmzscheme"
      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
    MZSCHEME_CFLAGS="-I${vi_cv_path_mzscheme_pfx}/include   \
      -DMZSCHEME_COLLECTS='\"${vi_cv_path_mzscheme_pfx}/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)
fi


AC_MSG_CHECKING(--enable-perlinterp argument)
AC_ARG_ENABLE(perlinterp,
	[  --enable-perlinterp     Include Perl interpreter.], ,
	[enable_perlinterp="no"])
AC_MSG_RESULT($enable_perlinterp)
if test "$enable_perlinterp" = "yes"; 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`
     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
	  PERL_CFLAGS="$perlcppflags"
	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
  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   Include Python interpreter.], ,
	[enable_pythoninterp="no"])
AC_MSG_RESULT($enable_pythoninterp)
if test "$enable_pythoninterp" = "yes"; 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 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,
	[
	    tmp_mkf="/tmp/Makefile-conf$$"
	    cat ${PYTHON_CONFDIR}/Makefile - <<'eof' >${tmp_mkf}
__:
	@echo "python_MODLIBS='$(MODLIBS)'"
	@echo "python_LIBS='$(LIBS)'"
	@echo "python_SYSLIBS='$(SYSLIBS)'"
	@echo "python_LINKFORSHARED='$(LINKFORSHARED)'"
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_MODLIBS} ${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}"
	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}"
	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=
	if test "x$MACOSX" != "xyes"; 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-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.[420]
  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.4"; 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.2 and 8.0
  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/include"
      else
	dnl For Mac OS X 10.3, use the OS-provided framework location
	tclinc="/System/Library/Frameworks/Tcl.framework/Headers"
      fi
      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`
	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]]/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`
	  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     Include Ruby interpreter.], ,
	[enable_rubyinterp="no"])
AC_MSG_RESULT($enable_rubyinterp)
if test "$enable_rubyinterp" = "yes"; then
  AC_SUBST(vi_cv_path_ruby)
  AC_PATH_PROG(vi_cv_path_ruby, ruby)
  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[["archdir"]] || $hdrdir' 2>/dev/null`
      if test "X$rubyhdrdir" != "X"; then
	AC_MSG_RESULT($rubyhdrdir)
	RUBY_CFLAGS="-I$rubyhdrdir"
	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"]])'`
	if test -f "$rubyhdrdir/$librubyarg"; then
	  librubyarg="$rubyhdrdir/$librubyarg"
	else
	  rubylibdir=`$vi_cv_path_ruby -r rbconfig -e 'print Config.expand(Config::CONFIG[["libdir"]])'`
	  if test -f "$rubylibdir/$librubyarg"; then
	    librubyarg="$rubylibdir/$librubyarg"
	  elif test "$librubyarg" = "libruby.a"; then
	    dnl required on Mac OS 10.3 where libruby.a doesn't exist
	    librubyarg="-lruby"
	  else
	    librubyarg=`$vi_cv_path_ruby -r rbconfig -e "print '$librubyarg'.gsub(/-L\./, %'-L#{Config.expand(Config::CONFIG[\"libdir\"])}')"`
	  fi
	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
	  LDFLAGS="$rubyldflags $LDFLAGS"
	fi
	RUBY_SRC="if_ruby.c"
	RUBY_OBJ="objects/if_ruby.o"
	RUBY_PRO="if_ruby.pro"
	AC_DEFINE(FEAT_RUBY)
      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)])
dnl defining FEAT_XIM is delayed, so that it can be disabled for older GTK

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 OS390Unix 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 "$OS390Unix" = "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
  AC_MSG_CHECKING(if X11 header files can be found)
  cflags_save=$CFLAGS
  CFLAGS="$CFLAGS $X_CFLAGS"
  AC_TRY_COMPILE([#include <X11/Xlib.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"

  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/gtk/gtk2/gnome/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_GTK=YES
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 - automatic GUI support) ;;
    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_GTK=
		SKIP_GTK2=
		SKIP_GNOME=
		SKIP_MOTIF=
		SKIP_ATHENA=
		SKIP_NEXTAW=
		SKIP_CARBON=;;
    gtk)	AC_MSG_RESULT(GTK+ 1.x GUI support)
		SKIP_GTK=;;
    gtk2)	AC_MSG_RESULT(GTK+ 2.x GUI support)
		SKIP_GTK=
		SKIP_GTK2=;;
    gnome)	AC_MSG_RESULT(GNOME 1.x GUI support)
		SKIP_GNOME=
		SKIP_GTK=;;
    gnome2)	AC_MSG_RESULT(GNOME 2.x GUI support)
		SKIP_GNOME=
		SKIP_GTK=
		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_GTK" != "xYES" -a "$enable_gui_canon" != "gtk" -a "$enable_gui_canon" != "gtk2"; then
  AC_MSG_CHECKING(whether or not to look for GTK)
  AC_ARG_ENABLE(gtk-check,
	[  --enable-gtk-check      If auto-select GUI, check for GTK [default=yes]],
	, enable_gtk_check="yes")
  AC_MSG_RESULT($enable_gtk_check)
  if test "x$enable_gtk_check" = "xno"; then
    SKIP_GTK=YES
    SKIP_GNOME=YES
  fi
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 GTK 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
  fi
fi

if test "x$SKIP_GNOME" != "xYES" -a "$enable_gui_canon" != "gnome" \
				 -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

  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_GTK=YES;
  SKIP_GTK2=YES;
  SKIP_GNOME=YES;
  SKIP_MOTIF=YES;
  SKIP_ATHENA=YES;
  SKIP_NEXTAW=YES;
  SKIP_PHOTON=YES;
  SKIP_CARBON=YES
fi

dnl
dnl Get the cflags and libraries from the gtk-config script
dnl

dnl define an autoconf function to check for a specified version of GTK, and
dnl try to compile/link a GTK program.  this gets used once for GTK 1.1.16.
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], ,0.99.7,$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/'`
    }
    elif test "X$GTK_CONFIG" != "Xno"; then
    {
      GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags`
      GTK_LIBDIR=
      GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs`
      gtk_major_version=`$GTK_CONFIG $gtk_config_args --version | \
	     sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'`
      gtk_minor_version=`$GTK_CONFIG $gtk_config_args --version | \
	     sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'`
      gtk_micro_version=`$GTK_CONFIG $gtk_config_args --version | \
	     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. (Also sanity
      dnl checks the results of gtk-config to some extent
      dnl
      rm -f conf.gtktest
      AC_TRY_RUN([
#include <gtk/gtk.h>
#include <stdio.h>

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 -a "0$gtk_major_version" -ge 2; 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
  }
  elif test "x$want_gnome" = xyes; then
  {
    AC_PATH_PROG(GNOME_CONFIG,gnome-config,no)
    if test "$GNOME_CONFIG" = "no"; then
      no_gnome_config="yes"
    else
      AC_MSG_CHECKING(if $GNOME_CONFIG works)
      if $GNOME_CONFIG --libs-only-l gnome >/dev/null 2>&1; then
	AC_MSG_RESULT(yes)
	GNOME_LIBS="`$GNOME_CONFIG --libs-only-l gnome gnomeui`"
	GNOME_LIBDIR="`$GNOME_CONFIG --libs-only-L gnorba gnomeui`"
	GNOME_INCLUDEDIR="`$GNOME_CONFIG --cflags gnorba gnomeui`"
	$1
      else
	AC_MSG_RESULT(no)
	no_gnome_config="yes"
      fi
    fi

    if test x$exec_prefix = xNONE; then
      if test x$prefix = xNONE; then
	gnome_prefix=$ac_default_prefix/lib
      else
	gnome_prefix=$prefix/lib
      fi
    else
      gnome_prefix=`eval echo \`echo $libdir\``
    fi

    if test "$no_gnome_config" = "yes"; then
      AC_MSG_CHECKING(for gnomeConf.sh file in $gnome_prefix)
      if test -f $gnome_prefix/gnomeConf.sh; then
	AC_MSG_RESULT(found)
	echo "loading gnome configuration from" \
	  "$gnome_prefix/gnomeConf.sh"
	. $gnome_prefix/gnomeConf.sh
	$1
      else
	AC_MSG_RESULT(not found)
	if test x$2 = xfail; then
	  AC_MSG_ERROR(Could not find the gnomeConf.sh file that is generated by gnome-libs install)
	fi
      fi
    fi
  }
  fi
])

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


dnl ---------------------------------------------------------------------------
dnl Check for GTK.  First checks for gtk-config, cause it needs that to get the
dnl correct compiler flags.  Then checks for GTK 1.1.16.  If that fails, then
dnl it checks for 1.0.6.  If both fail, then continue on for Motif as before...
dnl ---------------------------------------------------------------------------
if test -z "$SKIP_GTK"; then

  AC_MSG_CHECKING(--with-gtk-prefix argument)
  AC_ARG_WITH(gtk-prefix,[  --with-gtk-prefix=PFX   Prefix where GTK is installed (optional)],
	gtk_config_prefix="$withval"; AC_MSG_RESULT($gtk_config_prefix),
	gtk_config_prefix=""; AC_MSG_RESULT(no))

  AC_MSG_CHECKING(--with-gtk-exec-prefix argument)
  AC_ARG_WITH(gtk-exec-prefix,[  --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)],
	gtk_config_exec_prefix="$withval"; AC_MSG_RESULT($gtk_config_prefix),
	gtk_config_exec_prefix=""; AC_MSG_RESULT(no))

  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$gtk_config_prefix" != "x" ; then
    gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix"
    GTK_CONFIG=$gtk_config_prefix/bin/gtk-config
  fi
  if test "x$gtk_config_exec_prefix" != "x" ; then
    gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix"
    GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config
  fi
  if test "X$GTK_CONFIG" = "X"; then
    AC_PATH_PROG(GTK_CONFIG, gtk-config, no)
    if test "X$GTK_CONFIG" = "Xno"; then
      dnl Some distributions call it gtk12-config, annoying!
      AC_PATH_PROG(GTK12_CONFIG, gtk12-config, no)
      GTK_CONFIG="$GTK12_CONFIG"
    fi
  else
    AC_MSG_RESULT(Using GTK configuration program $GTK_CONFIG)
  fi
  if test "X$PKG_CONFIG" = "X"; then
    AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
  fi

  if test "x$GTK_CONFIG:$PKG_CONFIG" != "xno:no"; 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).
    if test "X$SKIP_GTK2" != "XYES"; then
      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

    dnl If there is no 2.2.0 or later try the 1.x.x series.  We require at
    dnl least GTK 1.1.16.  1.0.6 doesn't work.  1.1.1 to 1.1.15
    dnl were test versions.
    if test "x$GUITYPE" != "xGTK"; then
      SKIP_GTK2=YES
      AM_PATH_GTK(1.1.16,
		  [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
  fi
  dnl Give a warning if GTK is older than 1.2.3
  if test "x$GUITYPE" = "xGTK"; then
    if test "$gtk_major_version" = 1 -a "0$gtk_minor_version" -lt 2 \
	 -o "$gtk_major_version" = 1 -a "$gtk_minor_version" = 2 -a "0$gtk_micro_version" -lt 3; then
      AC_MSG_RESULT(this GTK version is old; version 1.2.3 or later is recommended)
    else
    {
      if test "0$gtk_major_version" -ge 2; then
	AC_DEFINE(HAVE_GTK2)
	if test "$gtk_minor_version" = 1 -a "0$gtk_micro_version" -ge 1 \
		|| test "0$gtk_minor_version" -ge 2 \
		|| test "0$gtk_major_version" -gt 2; then
	  AC_DEFINE(HAVE_GTK_MULTIHEAD)
	fi
      fi
      dnl
      dnl if GTK exists, and it's not the 1.0.x series, 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
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_GTK"; 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" -a "0$gtk_major_version" -ge 2; 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_MSG_CHECKING(quality of toupper)
AC_TRY_RUN([#include <ctype.h>
main() { exit(toupper('A') == 'A' && tolower('z') == 'z'); }],
	AC_DEFINE(BROKEN_TOUPPER) AC_MSG_RESULT(bad),
	AC_MSG_RESULT(good), AC_MSG_ERROR(failed to compile test program))

AC_MSG_CHECKING(whether __DATE__ and __TIME__ work)
AC_TRY_COMPILE(, [printf("(" __DATE__ " " __TIME__ ")");],
	AC_MSG_RESULT(yes); AC_DEFINE(HAVE_DATE_TIME),
	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 check for standard headers, we don't use this in Vim but other stuff
dnl in autoconf needs it
AC_HEADER_STDC
AC_HEADER_SYS_WAIT

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 stdlib.h string.h sys/select.h sys/utsname.h \
	termcap.h fcntl.h sgtty.h sys/ioctl.h sys/time.h termio.h \
	iconv.h langinfo.h unistd.h stropts.h errno.h \
	sys/resource.h sys/systeminfo.h locale.h \
	sys/stream.h sys/ptem.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/sysctl.h sys/sysinfo.h wchar.h wctype.h)

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_TYPE_MODE_T
AC_TYPE_OFF_T
AC_TYPE_PID_T
AC_TYPE_SIZE_T
AC_TYPE_UID_T
AC_HEADER_TIME
AC_CHECK_TYPE(ino_t, long)
AC_CHECK_TYPE(dev_t, unsigned)

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.
  dnl  Older versions of ncurses have bugs, get a new one!
  dnl  Digital Unix (OSF1) should use curses (Ronald Schild).
  case "`uname -s 2>/dev/null`" in
	OSF1)	tlibs="ncurses curses termlib termcap";;
	*)	tlibs="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
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_MSG_CHECKING(whether we talk terminfo)
AC_TRY_RUN([
#ifdef HAVE_TERMCAP_H
# include <termcap.h>
#endif
main()
{char *s; s=(char *)tgoto("%p1%d", 0, 1); exit(!strcmp(s==0 ? "" : s, "1")); }],
	  AC_MSG_RESULT([no -- we are in termcap land]),
	  AC_MSG_RESULT([yes -- terminfo spoken here]); AC_DEFINE(TERMINFO),
	  AC_MSG_ERROR(failed to compile test program.))

if test "x$olibs" != "x$LIBS"; then
  AC_MSG_CHECKING(what tgetent() returns for an unknown terminal)
  AC_TRY_RUN([
#ifdef HAVE_TERMCAP_H
# include <termcap.h>
#endif
main()
{char s[10000]; int res = tgetent(s, "thisterminaldoesnotexist"); exit(res != 0); }],
	  AC_MSG_RESULT(zero); AC_DEFINE(TGETENT_ZERO_ERR, 0),
	  AC_MSG_RESULT(non-zero),
	  AC_MSG_ERROR(failed to compile test program.))
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
AC_MSG_CHECKING(default tty permissions/group)
rm -f conftest_grp
AC_TRY_RUN([
#include <sys/types.h>
#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
	ptygrp=`cat conftest_grp`
	AC_MSG_RESULT([pty mode: 0620, group: $ptygrp])
	AC_DEFINE(PTYMODE, 0620)
	AC_DEFINE_UNQUOTED(PTYGROUP,$ptygrp)
    else
	AC_MSG_RESULT([ptys are world accessable])
    fi
],
    AC_MSG_RESULT([can't determine - assume ptys are world accessable]),
    AC_MSG_ERROR(failed to compile test program))
rm -f conftest_grp

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_MSG_CHECKING(getcwd implementation)
AC_TRY_RUN([
char *dagger[] = { "IFS=pwd", 0 };
main()
{
  char buffer[500];
  extern char **environ;
  environ = dagger;
  return getcwd(buffer, 500) ? 0 : 1;
}],
	AC_MSG_RESULT(it is usable),
	AC_MSG_RESULT(it stinks)
		AC_DEFINE(BAD_GETCWD),
	AC_MSG_ERROR(failed to compile test program))

dnl Check for functions in one big call, to reduce the size of configure
AC_CHECK_FUNCS(bcmp fchdir fchown fseeko fsync ftello getcwd getpseudotty \
	getpwnam getpwuid getrlimit gettimeofday getwd lstat memcmp \
	memset 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)

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_MSG_CHECKING(whether stat() ignores a trailing slash)
AC_TRY_RUN(
[#include <sys/types.h>
#include <sys/stat.h>
main() {struct stat st;  exit(stat("configure/", &st) != 0); }],
	AC_MSG_RESULT(yes); AC_DEFINE(STAT_IGNORES_SLASH),
	AC_MSG_RESULT(no), AC_MSG_ERROR(failed to compile test program))

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 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([
#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

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 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))

dnl Our own version of AC_CHECK_SIZEOF(int); fixes a bug when sizeof() can't
dnl be printed with "%d", and avoids a warning for cross-compiling.

AC_MSG_CHECKING(size of int)
AC_CACHE_VAL(ac_cv_sizeof_int,
	[AC_TRY_RUN([#include <stdio.h>
		main()
		{
		  FILE *f=fopen("conftestval", "w");
		  if (!f) exit(1);
		  fprintf(f, "%d\n", (int)sizeof(int));
		  exit(0);
		}],
	    ac_cv_sizeof_int=`cat conftestval`,
	    ac_cv_sizeof_int=0,
	    AC_MSG_ERROR(failed to compile test program))])
AC_MSG_RESULT($ac_cv_sizeof_int)
AC_DEFINE_UNQUOTED(SIZEOF_INT, $ac_cv_sizeof_int)

AC_MSG_CHECKING(whether memmove/bcopy/memcpy handle overlaps)
[bcopy_test_prog='
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.  */
}']

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.

AC_TRY_RUN([#define mch_memmove(s,d,l) memmove(d,s,l) $bcopy_test_prog],
    AC_DEFINE(USEMEMMOVE) AC_MSG_RESULT(memmove does),
    AC_TRY_RUN([#define mch_memmove(s,d,l) bcopy(d,s,l) $bcopy_test_prog],
	AC_DEFINE(USEBCOPY) AC_MSG_RESULT(bcopy does),
	AC_TRY_RUN([#define mch_memmove(s,d,l) memcpy(d,s,l) $bcopy_test_prog],
	    AC_DEFINE(USEMEMCPY) AC_MSG_RESULT(memcpy does), AC_MSG_RESULT(no),
	    AC_MSG_ERROR(failed to compile test program)),
	AC_MSG_ERROR(failed to compile test program)),
    AC_MSG_ERROR(failed to compile test program))

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 -n "$x_includes" ; 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
dnl --version for 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"
else
  (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 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" && test "x$CARBON" = "xyes" \
	&& test "x$GUITYPE" != "xCARBONGUI"; then
  AC_MSG_CHECKING(whether we need -framework Carbon)
  dnl check for MACOSX without Carbon GUI, but with FEAT_MBYTE
  if test "x$enable_multibyte" = "xyes" || test "x$features" == "xbig" \
	|| test "x$features" = "xhuge"; then
    LIBS="$LIBS -framework Carbon"
    AC_MSG_RESULT(yes)
  else
    AC_MSG_RESULT(no)
  fi
fi
if test "x$MACARCH" = "xboth"; then
  LDFLAGS="$LDFLAGS -isysroot /Developer/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.
AC_MSG_CHECKING(for GCC 3 or later)
DEPEND_CFLAGS_FILTER=
if test "$GCC" = yes; then
  gccmajor=`echo "$gccversion" | sed -e 's/^\([[1-9]]\)\..*$/\1/g'`
  if test "$gccmajor" -gt "2"; then
    DEPEND_CFLAGS_FILTER="| sed 's+-I */+-isystem /+g'"
  fi
fi
if test "$DEPEND_CFLAGS_FILTER" = ""; then
  AC_MSG_RESULT(no)
else
  AC_MSG_RESULT(yes)
fi
AC_SUBST(DEPEND_CFLAGS_FILTER)

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

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