#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_INIT(libantlr3c, 3.4, jimi@temporal-wave.com)
AC_PREREQ(2.60)
AC_COPYRIGHT([
 (The "BSD licence")
 Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
 http://www.temporal-wave.com
 http://www.linkedin.com/in/jimidle
 All rights reserved.

 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions
 are met:
 1. Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.
 2. Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.
 3. The name of the author may not be used to endorse or promote products
    derived from this software without specific prior written permission.

 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
])
AC_CONFIG_SRCDIR(src/antlr3parser.c)


AC_ARG_ENABLE([debuginfo],
		[AS_HELP_STRING([--enable-debuginfo], [Compiles debug info into the library (default --disable-debuginfo)])],
		[], [enable_debuginfo=no])

AC_ARG_ENABLE([64bit],
		[AS_HELP_STRING([--enable-64bit], [Turns on flags that produce 64 bit object code if any are required (default --disable-64bit)])],
		[], [enable_64bit=no])

AC_ARG_ENABLE([abiflags],
		[AS_HELP_STRING([--disable-abiflags], [Does not add ABI flags -m32 or -m64 for older versions of gcc, such as itanium 3.x (default --enable-abiflags=yes)])],
		[], [enable_abiflags=yes])

AC_ARG_ENABLE([antlrdebug],
		[AS_HELP_STRING([--disable-antlrdebug], [Turns off default flags that include the antlr debugger in the runtime. Specify to remove debugger and the socket dependancies (default --enable-antlrdebug)])],
		[], [enable_antlrdebug=yes])

AM_INIT_AUTOMAKE(foreign)
AC_LANG(C)
AC_PROG_CC([xlc aCC gcc cc])
AM_MAINTAINER_MODE
AM_PROG_LIBTOOL

AC_CANONICAL_BUILD
AC_CANONICAL_HOST

OBJECT_MODE=
# Checks for programs.
AC_MSG_CHECKING([compiler flags required for compiling ANTLR with $CC C compiler on host $host])
WARNFLAGS=
case $CC in
xlc*)
 CPPCMNTFLAGS="-qcpluscmt"
 if test x"$enable_64bit" = xyes; then
  CCFLAGS64="-q64 -Wl,-b64"
  OBJECT_MODE="64"
 else
  OBJECT_MODE="32"
 fi
 OPTIMFLAGS="-O2"
 if test x"$enable_debuginfo" = xyes; then
  DEBUGFLAGS="-g"
 fi
 ;;

aCC*)
 CPPCMNTFLAGS=
 if test x"$enable_64bit" = xyes; then
  CCFLAGS64="+DD64"
 fi
 OPTIMFLAGS="-O"
 if test $DEBUGINF = 1; then
  DEBUGFLAGS="-g"
 fi
 ;;

gcc*)
 CPPCMNTFLAGS=
 if test x"$enable_64bit" = xyes; then
  GCCABIFLAGS="-m64"
 else
  GCCABIFLAGS="-m32"
 fi
 if test x"$enable_abiflags" = xyes; then
  CCFLAGS64=$GCCABIFLAGS
 fi
 OPTIMFLAGS="-O2"
 if test x"$enable_debuginfo" = xyes; then
  DEBUGFLAGS="-g"
 fi
 WARNFLAGS=-Wall
 ;;

*)

case $host in
sparc*-*solaris*)
 CPPCMNTFLAGS=
 if test x"$enable_64bit" = xyes; then
  CCFLAGS64="-fast -xtarget=ultra4 -m64 -xarch=sparcvis"
 fi
 OPTIMFLAGS="-O"
 if test x"$enable_debuginfo" = xyes; then
  DEBUGFLAGS='-g'
 fi
 ;;

*)
 CPPCMNTFLAGS=
 CCFLAGS64=
 OPTIMFLAGS="-O"
 if test x"$enable_debuginfo" = xyes; then
  DEBUGFLAGS='-g'
 fi
 ;;
esac

 ;;
esac

CFLAGS="$CCFLAGS64 $CPPCMNTFLAGS $OPTIMFLAGS $DEBUGFLAGS $WARNFLAGS"
AC_MSG_RESULT([$CFLAGS])
AC_SUBST([OBJECT_MODE])

AS_IF([test "x$enable_antlrdebug" = xno], [AC_DEFINE([ANTLR3_NODEBUGGER], [1], [Define if ANTLR debugger not required])], [])
AS_IF([test x"$enable_64bit" = xyes], [AC_DEFINE([ANTLR3_USE_64BIT], [1], [Define if 64 bit mode required])], [])

AC_PROG_INSTALL
AC_PROG_LN_S
AC_PROG_MAKE_SET

# Checks for libraries.

# Checks for header files.
AC_INCLUDES_DEFAULT()
AC_HEADER_RESOLV
AC_CHECK_HEADERS([sys/malloc.h malloc.h], [], [],
[[#ifdef HAVE_SYS_MALLOC_H
#include <sys/malloc.h>
#endif
#ifdef HAVE_MALLOC_H
#include <malloc.h>
#endif
]])
AC_CHECK_HEADERS([stdarg.h], [], [],
[[#ifdef HAVE_STDARG_H
#include <stdarg.h>
#endif
]])

AC_CHECK_HEADERS([sys/stat.h], [], [],
[[#ifdef HAVE_SYS_STAT_H
#include <sys/stat.h>
#endif
]])

AC_CHECK_HEADERS([ctype.h], [], [],
[[#ifdef HAVE_CTYPE_H
#include <ctype.h>
#endif
]])

AC_CHECK_HEADERS([netinet/tcp.h], [], [],
[[#ifdef HAVE_NETINET_TCP_H
#include <netinet/tcp.h>
#endif
]])

AC_CHECK_HEADERS([sys/socket.h socket.h], [], [],
[[#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
#ifdef HAVE_SOCKET_H
#include <socket.h>
#endif
]])

# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_TYPE_SIZE_T
AC_TYPE_INT8_T
AC_TYPE_INT16_T
AC_TYPE_INT32_T
AC_TYPE_INT64_T
AC_TYPE_INTPTR_T
AC_TYPE_UINT8_T
AC_TYPE_UINT16_T
AC_TYPE_UINT32_T
AC_TYPE_UINT64_T
AC_TYPE_UINTPTR_T
AC_C_INLINE


# Checks for library functions.
AC_CHECK_FUNCS([memmove memset strdup accept])

AC_CONFIG_MACRO_DIR([m4])

AC_CONFIG_HEADERS(antlr3config.h)
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
