dnl Process this file with autoconf to produce a configure script.

dnl *****************************************************************
dnl IMPORTANT: Don't forget to add corresponding output for --options
dnl if you add a non-trivial configure option here.
dnl *****************************************************************

dnl this is to determine if the config script is running in the proper place
dnl just give it one file relative to where it should be
AC_INIT([gnugo], [3.8])
AC_CONFIG_SRCDIR([engine/dragon.c])

AM_CONFIG_HEADER(config.h)
AC_PREREQ(2.52)dnl               dnl Minimum Autoconf version required.

AH_TEMPLATE([PACKAGE],
[Define to the name of the distribution.])

AH_TEMPLATE([GNU_PACKAGE],
[The concatenation of the strings "GNU ", and PACKAGE.])

AH_TEMPLATE([VERSION],
[Define to the version of the distribution.])

dnl this defines VERSION and PACKAGE
AM_INIT_AUTOMAKE
GNU_PACKAGE="GNU $PACKAGE"
AC_DEFINE_UNQUOTED(GNU_PACKAGE, "$GNU_PACKAGE")

AM_MAINTAINER_MODE

CFLAGS=""
CPPFLAGS="-fPIC -O0 -g3"

dnl See if user has expressed a preference for use of curses and/or color
dnl These set variables $enable_color and $with_curses to "no" if disabled
dnl "yes" if enabled, or undefined if not specified

AC_ARG_WITH(readline,
 [  --with-readline     try to use GNU Readline for command reading
  --without-readline  do not use GNU Readline (default)])

AC_ARG_WITH(curses,
 [  --with-curses       try to use curses for colored debugging output (default)
  --without-curses    do not use curses for colored debugging output])

AC_ARG_ENABLE(color,
 [  --enable-color              use curses or ansi escape sequences for colored
                                   debug output
  --disable-color             do not try to generated colored debug output])

dnl and look to see if they want to disable the grid optimisation

AC_ARG_ENABLE(grid-opt,
 [  --enable-grid-opt           enable the grid optimisation within the pattern
                                matcher (default)
  --enable-grid-opt=distrust  enable the grid optimisation in non-trusting mode
  --disable-grid-opt          disable the grid optimisation])

default_cache_size=-1
default_level=10
default_semeai_node_limit=500
default_owl_node_limit=1000

AC_ARG_ENABLE(cache-size,
  [  --enable-cache-size=n       reserve n MB RAM for caching (special value -1
                               default, corresponding to 8-11 MB depending on
			       platform)])

AC_ARG_ENABLE(level,
  [  --enable-level=n            n = default level (10 standard)])

AC_ARG_ENABLE(semeai-node-limit,
  [  --enable-semeai-node-limit=n        n = semeai variations (500 standard)])

AC_ARG_ENABLE(level,
  [  --enable-owl-node-limit=n           n = owl node limit (1000 standard)])

AC_ARG_ENABLE(dfa,
 [  --disable-dfa               use old non-dfa pattern matcher],
 [ if test ${enableval} = no; then	
     dfa_c=
   else	
     dfa_c=dfa
   fi] ,
 [ dfa_c=dfa ])

AC_ARG_ENABLE(chinese-rules,
 [  --enable-chinese-rules      use Chinese (area) counting
  --disable-chinese-rules     use Japanese counting (default)])

AC_ARG_ENABLE(resignation-allowed,
 [  --enable-resignation-allowed       resign lost games (default)
  --disable-resignation-allowed      never resign])

AC_ARG_ENABLE(metamachine,
 [  --enable-metamachine               enable metamachine
  --disable-metamachine              don't enable metamachine (default)])

AC_ARG_ENABLE(experimental-break-in,
 [  --enable-experimental-break-in     use the breakin module (default)
  --disable-experimental-break-in    don't use the breakin module])

AC_ARG_ENABLE(experimental-owl-ext,
 [  --enable-experimental-owl-ext      use the experimental GAIN/LOSS codes
  --disable-experimental-owl-ext     use standard owl module (default)])

AC_ARG_ENABLE(cosmic-gnugo,
 [  --enable-cosmic-gnugo              use center-oriented influence code
  --disable-cosmic-gnugo             use standard influence code (default)])

AC_ARG_ENABLE(large-scale,
 [  --enable-large-scale               look for large scale captures
  --disable-large-scale              don't seek large scale captures (default)])

AC_ARG_ENABLE(experimental-connections,
 [  --enable-experimental-connections  use experimental connection analysis 
                                         (default)
  --disable-experimental-connections use standard connection analysis])

AC_ARG_ENABLE(alternate-connections,
 [  --enable-alternate-connections     use alternate experimental connection
                                         analysis
  --disable-alternate-connections    use primary experimental connection 
                                         analysis (default)])

AC_ARG_ENABLE(socket-support,
 [  --disable-socket-support           don't compile GTP over TCP/IP support
  --enable-socket-support            compile TCP/IP support (default)])

AC_PROG_CC

dnl for automake 1.4.x
AC_EXEEXT

dnl add -lm to library list since we use some
dnl math functions such as pow and fabs

AC_SEARCH_LIBS(pow,m)

AC_CACHE_CHECK(
	[for mingw32],
	ac_cv_mingw32,
	AC_TRY_COMPILE(,
		[return __MINGW32__],
		ac_cv_mingw32="yes",
		ac_cv_mingw32="no")
)

if test $ac_cv_mingw32 = yes;then
    LIBS="$LIBS -lwsock32"
    AC_SEARCH_LIBS(vsnprintf, mingwex)
fi

AC_PROG_CPP
AC_PROG_RANLIB

dnl required since we use SUBDIRS in Makefile.am
AC_PROG_MAKE_SET

AC_HEADER_TIME

AC_C_CONST

AC_CHECK_HEADERS(unistd.h sys/time.h sys/times.h)
AC_CHECK_HEADERS(curses.h term.h ncurses/curses.h ncurses/term.h)

if test "$ac_cv_header_curses_h" = "yes";then
   curses_header="curses.h"
elif test "$ac_cv_header_ncurses_curses_h" = "yes";then
   curses_header="ncurses/curses.h"
else
   curses_header="no"
fi

if test "$ac_cv_header_term_h" = "yes";then
   term_header="term.h"
elif test "$ac_cv_header_ncurses_term_h" = "yes";then
   term_header="ncurses/term.h"
else
   term_header="no"
fi

AC_CHECK_SIZEOF(long,,[#include <stdio.h>])

dnl vsnprintf not universally available
dnl usleep not available in Unicos and mingw32
AC_CHECK_FUNCS(vsnprintf gettimeofday usleep times)

dnl if snprintf not available try to use g_snprintf from GLib
if test $ac_cv_func_vsnprintf = no; then
    AC_CHECK_PROG(glibconfig,glib-config,yes,no)
    if test $ac_cv_prog_glibconfig = yes;then
	glib_cflags=`glib-config --cflags`
	glib_libs=`glib-config --libs`
	CPPFLAGS="$CPPFLAGS $glib_cflags"
	LIBS="$LIBS $glib_libs"
	AC_CHECK_FUNCS(g_vsnprintf)
	AC_CHECK_HEADERS(glib.h)
	if test $ac_cv_func_g_vsnprintf = no; then
    	   AC_MSG_WARN([GLib installation problem.
	   Continuing without GLib ])
        fi
    else
    	   AC_MSG_WARN([Neither vsnprintf nor GLib found. GNU Go is
	   compiled but it is safer to get GLib at
	   http://www.gtk.org/])
    fi
fi
 
dnl ------ variadic #define -----------------------

AH_TEMPLATE([HAVE_VARIADIC_DEFINE],
[Define if #define can take a variable number of arguments])

AC_CACHE_CHECK(
	[for variadic cpp define],
	gnugo_cv_cpp_variadic_define,
	AC_TRY_COMPILE(
[#include <stdio.h>
#define zz(fmt,arg...) printf(fmt,##arg)],
		[zz("Hello");zz("%s","Hello");zz("%s%s","Hello","World")],
		gnugo_cv_cpp_variadic_define="yes",
		gnugo_cv_cpp_variadic_define="no")
)
if test "$gnugo_cv_cpp_variadic_define" = "yes";then
      AC_DEFINE(HAVE_VARIADIC_DEFINE)
fi

dnl ------ transparent unions ---------------------

AH_TEMPLATE([HAVE_TRANSPARENT_UNIONS],
[Define if your compiler supports transparent unions])

AC_CACHE_CHECK(
	[whether $CC supports transparent unions],
	gnugo_cv_transparent_unions,
	AC_TRY_COMPILE([],
[[  struct {
    union {
      int x;
      float y;
    }
  } A = { { .y = 0.0 } };
  A.y = 1.0;]],
		gnugo_cv_transparent_unions="yes",
		gnugo_cv_transparent_unions="no")
)

if test "$gnugo_cv_transparent_unions" = "yes"; then
	AC_DEFINE(HAVE_TRANSPARENT_UNIONS)
fi

dnl -------- color debugging support -----------

AH_TEMPLATE([TERMINFO],
[Define to 1 if termcap/terminfo is available.])

AH_TEMPLATE([ANSI_COLOR],
[Define to use ansi escape sequences for color debugging])

tmp_color_result="none"

if test "$with_curses" != no -a "$enable_color" != no ; then
  tmp_color_result="none (curses failed)"

  dnl Do a separate test for curses and termcap
  dnl DJGPP does have pdcurses, but not termcap

  dnl make sure that both curses.h and term.h are available
  dnl FIXME: better to actually figure out here what headers
  dnl are really required
  if test "$term_header" != "no" -a "$curses_header" != "no" ; then

    dnl check for a working termcap library
    AC_SEARCH_LIBS(tparm,ncurses curses pdcurses termcap terminfo termlib)

    if test "$ac_cv_search_tparm" != "no" ; then
      AC_DEFINE(TERMINFO)
    tmp_color_result="curses"
    fi
  fi
fi

if test "$with_curses" = no -a "$enable_color" != no ; then
  dnl we asked for color, but there is no termcap
  AC_DEFINE(ANSI_COLOR)
  tmp_color_result="ANSI color"

fi

AC_MSG_CHECKING(for color support)
AC_MSG_RESULT($tmp_color_result)

dnl -------- readline support -------------------

AH_TEMPLATE([READLINE], [Enable GNU Readline support])

if test "$with_readline" = yes ; then

    dnl check for a working termcap and readline library
    AC_SEARCH_LIBS(readline,termcap readline)

    if test "$ac_cv_search_readline" != "no" ; then
	AC_DEFINE(READLINE,1)
    else
	AC_DEFINE(READLINE,0)
    fi
else
    AC_DEFINE(READLINE,0)
fi

dnl ---------- grid optimisation ------------

AH_TEMPLATE([GRID_OPT],
[Define as 1 to use the grid optimisation, or 2 to run it in self-test mode])

if test "$enable_grid_opt" = "distrust" ; then
  AC_DEFINE(GRID_OPT, 2)
else
  if test "$enable_grid_opt" = "no" ; then
    AC_DEFINE(GRID_OPT, 0)
  else
    AC_DEFINE(GRID_OPT, 1)
  fi
fi


dnl ------------ set cache size ----------

AH_TEMPLATE([DEFAULT_MEMORY],
[Default hash table size in megabytes])

if test "$enable_cache_size" ; then
   AC_DEFINE_UNQUOTED(DEFAULT_MEMORY, $enable_cache_size)
else
   AC_DEFINE_UNQUOTED(DEFAULT_MEMORY, $default_cache_size)
fi


dnl ------------ set default level  ----------

AH_TEMPLATE([DEFAULT_LEVEL],
[Default level (strength). Up to 10 supported])

if test "$enable_level" ; then
   AC_DEFINE_UNQUOTED(DEFAULT_LEVEL, $enable_level)
else
   AC_DEFINE_UNQUOTED(DEFAULT_LEVEL, $default_level)
fi

dnl ------------ set cache size ----------

AH_TEMPLATE([OWL_NODE_LIMIT],
[Owl Node Limit])

if test "$enable_owl_node_limit" ; then
   AC_DEFINE_UNQUOTED(OWL_NODE_LIMIT, $enable_owl_node_limit)
else
   AC_DEFINE_UNQUOTED(OWL_NODE_LIMIT, $default_owl_node_limit)
fi


dnl ------------ set semeai variations  ----------

AH_TEMPLATE([SEMEAI_NODE_LIMIT],
[Semeai Variations. 500 default])

if test "$enable_semeai_node_limit" ; then
   AC_DEFINE_UNQUOTED(SEMEAI_NODE_LIMIT, $enable_semeai_node_limit)
else
   AC_DEFINE_UNQUOTED(SEMEAI_NODE_LIMIT, $default_semeai_node_limit)
fi

dnl ------------ dfa -------------------

AM_CONDITIONAL(DFA_ENABLED, test "$enable_dfa" != "no")

dnl FIXME: Is there a more elegant approach for this?
dnl force owl c files rebuild
rm -f \
       patterns/owl_attackpat.c \
       patterns/owl_defendpat.c \
       patterns/owl_vital_apat.c


dnl ------------ Chinese Rules -------------------

AH_TEMPLATE([CHINESE_RULES],
[Ruleset. Default Japanese])

if test "$enable_chinese_rules" = "yes" ; then
   AC_DEFINE(CHINESE_RULES, 1)
else
   AC_DEFINE(CHINESE_RULES, 0)
fi

dnl ------------ Resignation allowed-------------------

AH_TEMPLATE([RESIGNATION_ALLOWED],
[Allow resignation. Default enabled])

if test "$disable_resignation_allowed" = "yes" ; then
   AC_DEFINE(RESIGNATION_ALLOWED, 0)
else
   AC_DEFINE(RESIGNATION_ALLOWED, 1)
fi

dnl ------------ Oracle enabled-------------------

AH_TEMPLATE([ORACLE],
[Oracle. Default not enabled.])

if test "$enable_metamachine" = "yes" ; then
   AC_DEFINE(ORACLE, 1)
else
   AC_DEFINE(ORACLE, 0)
fi

dnl ------------ Experimental Breakin enabled-------------------

AH_TEMPLATE([USE_BREAK_IN],
[Break-in module. Enabled by default.])

if test "$enable_experimental_break_in" = "no" ; then
   AC_DEFINE(USE_BREAK_IN, 0)
else
   AC_DEFINE(USE_BREAK_IN, 1)
fi

dnl ------------ Owl extensions ------------

AH_TEMPLATE([EXPERIMENTAL_OWL_EXT],
[GAIN/LOSS codes. Disabled by default.])

if test "$enable_experimental_owl_ext" = "yes" ; then
   AC_DEFINE(EXPERIMENTAL_OWL_EXT, 1)
else
   AC_DEFINE(EXPERIMENTAL_OWL_EXT, 0)
fi

dnl ------------ Cosmic Consciousness -------------------

AH_TEMPLATE([COSMIC_GNUGO],
[Center oriented influence. Disabled by default.])

if test "$enable_cosmic_gnugo" = "yes" ; then
   AC_DEFINE(COSMIC_GNUGO, 1)
else
   AC_DEFINE(COSMIC_GNUGO, 0)
fi

dnl ------------ Large Scale -------------------

AH_TEMPLATE([LARGE_SCALE],
[Large Scale Captures. Disabled by default.])

if test "$enable_large_scale" = "yes" ; then
   AC_DEFINE(LARGE_SCALE, 1)
else
   AC_DEFINE(LARGE_SCALE, 0)
fi

dnl ------------ Connections -------------------

AH_TEMPLATE([EXPERIMENTAL_CONNECTIONS],
[Connection module. Default experimental.])

if test "$enable_experimental_connections" = "no" ; then
   AC_DEFINE(EXPERIMENTAL_CONNECTIONS, 0)
else
   AC_DEFINE(EXPERIMENTAL_CONNECTIONS, 1)
fi

dnl ------------ Connections -------------------

AH_TEMPLATE([ALTERNATE_CONNECTIONS],
[Connection module. Default standard.])

if test "$enable_alternate_connections" = "no" ; then
   AC_DEFINE(ALTERNATE_CONNECTIONS, 0)
else
   AC_DEFINE(ALTERNATE_CONNECTIONS, 1)
fi

dnl ------------ Owl Threats -------------------

AH_TEMPLATE([OWL_THREATS],
[Owl Threats. 0 standard.])

if test "$enable_owl_threats" = "yes" ; then
   AC_DEFINE(OWL_THREATS, 1)
else
   AC_DEFINE(OWL_THREATS, 0)
fi

dnl ------------ additional valgrind macros ------

AH_TEMPLATE([USE_VALGRIND],
[Define special valgrind macros.])

if test "$enable_valgrind" = "yes" ; then
   AC_DEFINE(USE_VALGRIND, 1)
else 
   AC_DEFINE(USE_VALGRIND, 0)
fi

dnl  ----------- special-case use of gcc ---------

dnl Not sure if we are supposed to be accessing this variable, but...

AM_CONDITIONAL(GCC_ONLY, test "$ac_compiler_gnu" = "yes")

dnl Now lines in Makefile.am can be prefixed @GCC_ONLY@.

AC_SUBST(GCC_MAJOR_VERSION)
AC_SUBST(GCC_MINOR_VERSION)
AC_SUBST(GNU_GO_WARNINGS)

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

  dnl M4 escaping of brackets
  GCC_MAJOR_VERSION=`echo __GNUC__ | $CC -E -xc - | tail -n 1`
  GCC_MINOR_VERSION=`echo __GNUC_MINOR__ | $CC -E -xc - | tail -n 1`

  GNU_GO_WARNINGS='-Wall -W -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wundef'

  if (test $GCC_MAJOR_VERSION -eq 3 && test $GCC_MINOR_VERSION -ge 4) || test $GCC_MAJOR_VERSION -gt 3; then
    GNU_GO_WARNINGS="$GNU_GO_WARNINGS -Wdeclaration-after-statement"
  fi

else
  GCC_MAJOR_VERSION=0
  GCC_MINOR_VERSION=0
  GNU_GO_WARNINGS=''
fi

dnl FIXME: please add warnings for other compilers!


AH_TEMPLATE([ENABLE_SOCKET_SUPPORT],
[Compile support for GTP communication over TCP/IP channel.])

if test "$enable_socket_support" != "no"; then
  # Check for all required headers, macros, structures and functions
  # at once.
  AC_CACHE_CHECK(
	[whether socket support can be compiled],
	gnugo_cv_sockets_supported,
	AC_TRY_LINK([#if !defined(_WIN32) && !defined(_WIN32_WCE)
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#else	/* on Windows */
#include <winsock.h>
#endif	/* on Windows */],
[[  struct sockaddr_in A;
  struct hostent *H;
  A.sin_family = AF_INET;
  A.sin_addr.s_addr = htonl(INADDR_ANY);
  A.sin_port = htons(0);
  gethostbyname(0);
  socket(PF_INET, SOCK_STREAM, 0);
  connect(0, 0, 0);
  bind(0, 0, 0);
  listen(0, 0);
  accept(0, 0, 0);]],
 	gnugo_cv_sockets_supported="yes",
	gnugo_cv_sockets_supported="no"))

  if test "$gnugo_cv_sockets_supported" = "yes"; then
    AC_DEFINE(ENABLE_SOCKET_SUPPORT)
  else
    if test "$enable_socket_support" = "yes"; then
      AC_MSG_WARN(
[[
*** Socket support was requested but does not pass configure test. ***
*** Proceed only if you know what you are doing.                   ***]])
    AC_DEFINE(ENABLE_SOCKET_SUPPORT)
    fi
  fi
fi

#AM_GNU_GETTEXT
#AC_LINK_FILES($nls_cv_header_libgt, $nls_cv_header_intl)

dnl FIXME:
dnl autoconf 2.50 recommends AC_CONFIG_FILES and AC_OUPUT
dnl This however requires automake 1.4p2 or better

AC_OUTPUT([Makefile interface/Makefile patterns/Makefile sgf/Makefile
utils/Makefile engine/Makefile doc/Makefile regression/Makefile config.vc:config.vcin])
