AC_REVISION([$Id: configure.in,v 1.29.2.28 2003/09/03 15:34:16 keichwa Exp $])
dnl
dnl  Process this file with autoconf to produce a configure script.
dnl
dnl  Copyright (C) 1998 Cees A. de Groot
dnl

dnl
dnl  Credits: this autoconf script was largely "inspired" <g> by the
dnl  autoconf script around SP made by Henry Thompson.
dnl

dnl Initialization.
AC_INIT
AC_CONFIG_SRCDIR([pubtext])
AM_INIT_AUTOMAKE(OpenSP, 1.5.1, no-define)
AM_MAINTAINER_MODE
AC_PREREQ(2.53)
AM_CONFIG_HEADER(config.h)
AM_SANITY_CHECK

dnl Autoheader definitions

AH_TEMPLATE([HAVE_CATGETS],[Define if you have the gettext() function])
AH_TEMPLATE([SGML_CATALOG_FILES_DEFAULT],[set this to the default catalog files list])
AH_TEMPLATE([SGML_SEARCH_PATH_DEFAULT],[set this to the default SGML search path])
AH_TEMPLATE([ SP_DECLARE_H_ERRNO],[define this if h_errno should be declared extern int])
AH_TEMPLATE([DECLARE_MEMMOVE],[define this if memmove  should be declared extern "C"])
AH_TEMPLATE([DECLARE_STRERROR],[define this if strerror should be declared extern "C"])
AH_TEMPLATE([SP_HAVE_SOCKET],[define this if sockets are available])
AH_TEMPLATE([sig_atomic_t],[define this appropriately if the type sig_atomic_t is not available])
AH_TEMPLATE([SP_NEW_H_MISSING],[define this if your system misses new.h])
AH_TEMPLATE([SP_SET_NEW_HANDLER_EXTERN_C],[define this if  set_new_handler() has to be declared extern "C"])
AC_DEFINE(SP_MULTI_BYTE,[1],[define this to build a multi-byte version])
AH_TEMPLATE([SP_DEFINE_TEMPLATES],[define this to include template definitions in the headers])
AH_TEMPLATE([SP_MANUAL_INST],[define this to compile explicit template instantiations])
AH_TEMPLATE([SP_FANCY_NEW_HANDLER],[define this if the new handler takes size_t and returns int.])
AH_TEMPLATE([PATH_SEPARATOR],[set this to the path separator])
AH_TEMPLATE([DEFAULT_ERROR_LIMIT],[if this is not set it defaults to 200 ])
AH_TEMPLATE([SP_USE_OWN_ASSERT],[define this if you can't or don't want to use the builtin assert() macro])
AH_TEMPLATE([SP_LINE_TERM1],[set this to the first line term character])
AH_TEMPLATE([SP_LINE_TERM2],[set this to the second line term character])

dnl These are really windows only

AH_TEMPLATE([SP_MUTEX_WIN32],[define this to use win32 mutex mechanisms])
AH_TEMPLATE([SP_HAVE_SETMODE],[define this if _setmode is supported])
AH_TEMPLATE([SP_NO_MESSAGE_TEXT],[define this to not compile message texts in])
AH_TEMPLATE([SP_USE_DLL],[define this to build a dll])
AH_TEMPLATE([SP_DLLEXPORT],[define this to build a dll])
AH_TEMPLATE([SP_DLLIMPORT],[define this tobuild a dll])
AH_TEMPLATE([SP_WIDE_SYSTEM],[define this if the OS provides wide character interfaces])
AH_TEMPLATE([SP_PCH],[define this to enable precompiled header support])
AH_TEMPLATE([SP_LOCALE_DIR],[the location we install our messages])

AH_TEMPLATE([SIZEOF_WCHAR_T],[size of wchar_t])

AH_BOTTOM([
#ifdef HAVE_UNISTD_H
#define SP_INCLUDE_UNISTD_H
#endif

#ifdef HAVE_IO_H
#undef SP_INCLUDE_IO_H
#endif

#ifdef HAVE_OSFCN_H
#undef SP_INCLUDE_OSFCN_H
#endif

#ifndef SP_MSDOS_FILENAMES
#define SP_POSIX_FILENAMES
#endif

#ifdef HAVE_ST_BLKSIZE
#define SP_STAT_BLKSIZE
#endif

#ifdef HAVE_BOOL
#ifndef SP_HAVE_BOOL
#define SP_HAVE_BOOL
#endif
#endif /* HAVE_BOOL */

#ifdef HAVE_TYPENAME
#define SP_HAVE_TYPENAME
#endif /* HAVE_TYPENAME */

#if (SIZEOF_BOOL == 1)
#define SP_SIZEOF_BOOL_1
#endif

#if (SIZEOF_WCHAR_T == SIZEOF_UNSIGNED_SHORT)
#define SP_WCHAR_T_USHORT
#endif

#ifdef SP_HAVE_SETMODE
#ifndef SP_LINE_TERM1
#define SP_LINE_TERM1 '\r'
#define SP_LINE_TERM2 '\n'
#endif
#endif /* not SP_HAVE_SETMODE */

#ifndef SP_LINE_TERM1
#define SP_LINE_TERM1 '\n'
#endif

#ifndef HAVE_NEW_FOR_SCOPING
// This simulates the new ANSI "for" scope rules
#define for if (0); else for
#endif /* HAVE_NEW_FOR_SCOPING */

#ifndef SP_HAVE_TYPENAME
#define typename /* as nothing */
#endif

#ifndef SP_DLLEXPORT
#define SP_DLLEXPORT /* as nothing */
#endif

#ifndef SP_DLLIMPORT
#define SP_DLLIMPORT /* as nothing */
#endif

#ifdef SP_USE_DLL

#ifdef BUILD_LIBSP
#define SP_API SP_DLLEXPORT
#else
#define SP_API SP_DLLIMPORT
#endif

#else /* not SP_USE_DLL */

#define SP_API /* as nothing */

#endif /* not SP_USE_DLL */

#ifdef SP_WIDE_SYSTEM
#ifndef SP_MULTI_BYTE
#define SP_MULTI_BYTE
#endif
#endif

#ifdef HAVE_NAMESPACES
#define SP_NAMESPACE OpenSP
#endif /* HAVE_NAMESPACES */

#ifdef SP_NAMESPACE
#define SP_NAMESPACE_SCOPE SP_NAMESPACE::
#else
#define SP_NAMESPACE_SCOPE
#endif /* SP_NAMESPACE */

#ifdef HAVE_DYNAMIC_CAST
#define SP_HAVE_RTTI
#endif /* HAVE_DYNAMIC_CAST */

#ifdef HAVE_PATHNAME_STYLE_DOS
#define SP_MSDOS_FILENAMES
#else
#define SP_POSIX_FILENAMES
#endif /* HAVE_PATHNAME_STYLE_DOS */

#ifdef HAVE_INSTANTIATIONS
#ifndef SP_ANSI_CLASS_INST
#define SP_ANSI_CLASS_INST
#endif
#endif /* HAVE_INSTANTIATIONS */

#ifdef HAVE_SETLOCALE
#ifndef SP_HAVE_LOCALE
#define SP_HAVE_LOCALE
#endif
#endif /* HAVE_SETLOCALE */

#if defined(HAVE_GETTEXT) && defined(ENABLE_NLS)
#ifndef SP_HAVE_GETTEXT
#define SP_HAVE_GETTEXT
#endif
#endif /* HAVE_GETTEXT && ENABLE_NLS */

#ifdef WORDS_BIGENDIAN
#define SP_BIG_ENDIAN
#endif /* WORDS_BIGENDIAN */

#ifdef HAVE_LIBTHREADS
#define SP_MUTEX_MACH
#endif /* HAVE_LIBTHREADS */

#ifdef HAVE_LIBPTHREAD
#define SP_MUTEX_PTHREADS
#endif /* HAVE_LIBPTHREAD */

#ifdef HAVE_PLACEMENT_OPERATOR_DELETE
#define SP_HAVE_PLACEMENT_OPERATOR_DELETE
#endif /* HAVE_PLACEMENT_OPERATOR_DELETE */

#ifndef HAVE_PLACEMENT_OPERATOR_NEW
#define SP_DECLARE_PLACEMENT_OPERATOR_NEW
#endif /* HAVE_PLACEMENT_OPERATOR_NEW */

#ifndef HAVE_NAMESPACE_STD
#define SP_NO_STD_NAMESPACE
#endif /* HAVE_NAMESPACE_STD */

#if defined(HAVE_NEW) && defined(HAVE_CASSERT)
#define SP_ANSI_LIB 1
#endif /* HAVE_NEW && HAVE_CASSERT */

#ifndef HAVE_MUTABLE
#define mutable
#endif /* HAVE_MUTABLE */
])

dnl Since config.h gets included by user programs, we use special names
dnl for PACKAGE and VERSION.
AC_DEFINE_UNQUOTED(SP_PACKAGE, "$PACKAGE", [Package name])
AC_DEFINE_UNQUOTED(SP_VERSION, "$VERSION", [Package version])

dnl libosp current:revision:age
SP_LIBOSP_CUR=4
dnl AC_DEFINE_UNQUOTED(SP_LIBOSP_CUR, "$SP_LIBOSP_CUR", [libosp current])
AC_SUBST(SP_LIBOSP_CUR)
AC_SUBST(SP_LIBOSP_REV, 0)
AC_SUBST(SP_LIBOSP_AGE, 0)

dnl Check for programs.
AC_PROG_CC
AC_PROG_CPP
AC_PROG_CXX
AC_PROG_CXXCPP
AC_PROG_INSTALL
AC_PROG_LN_S
AC_PROG_MAKE_SET
AC_PATH_PROGS(PERL, perl, perl)
AM_PROG_LIBTOOL

dnl Checks for libraries.
AC_CHECK_LIB(pthread,pthread_create,,AC_CHECK_LIB(threads,cthread_fork))

ALL_LINGUAS="de fr ja sv"
AM_GNU_GETTEXT
AC_CHECK_HEADERS(locale.h)
AC_DEFINE_DIR(SP_LOCALE_DIR, datadir/locale, [location of message catalogs])
SP_MESSAGE_DOMAIN="sp$SP_LIBOSP_CUR"
AC_DEFINE_UNQUOTED(SP_MESSAGE_DOMAIN, "$SP_MESSAGE_DOMAIN", [message domain])
AC_SUBST(SP_MESSAGE_DOMAIN)

dnl Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS(limits.h unistd.h io.h osfcn.h)
AC_LANG([C++])
AC_CHECK_HEADERS(new cassert)

dnl Checks for typedefs, structures, and compiler characteristics.
AC_C_BIGENDIAN
AC_TYPE_SIZE_T
AC_DIAGNOSE([obsolete],[AC_DIAGNOSE([obsolete],[AC_STRUCT_ST_BLKSIZE:
        your code should no longer depend upon `HAVE_ST_BLKSIZE', but
        `HAVE_STRUCT_STAT_ST_BLKSIZE'.  Remove this warning and
        the `AC_DEFINE' when you adjust the code.])
AC_CHECK_MEMBERS([struct stat.st_blksize],[AC_DEFINE(HAVE_ST_BLKSIZE, 1,
                            [Define to 1 if your `struct stat' has
                             `st_blksize'.  Deprecated, use
                             `HAVE_STRUCT_STAT_ST_BLKSIZE' instead.])])
:
        your code should no longer depend upon `HAVE_ST_BLKSIZE', but
        `HAVE_STRUCT_STAT_ST_BLKSIZE'.  Remove this warning and
        the `AC_DEFINE' when you adjust the code.])
AC_CHECK_MEMBERS([struct stat.st_blksize],[AC_DEFINE(HAVE_ST_BLKSIZE, 1,
                            [Define if your `struct stat' has
                             `st_blksize'.  Deprecated, use
                             `HAVE_STRUCT_STAT_ST_BLKSIZE' instead.])])

AC_CACHE_CHECK(for sig_atomic_t in signal.h,
    ac_cv_have_sig_atomic_t,
    AC_TRY_LINK([#include <signal.h>],sig_atomic_t x;,
	ac_cv_have_sig_atomic_t=yes,
	ac_cv_have_sig_atomic_t=no))
if test "$ac_cv_have_sig_atomic_t" = "no"
then
    AC_CHECK_TYPE(sig_atomic_t,int)
fi
AC_CHECK_SIZEOF(size_t)
AC_CHECK_SIZEOF(unsigned int)
AC_CHECK_SIZEOF(unsigned short)
AC_CHECK_SIZEOF(wchar_t,,[
  #include <stdio.h>
  #include <wchar.h>])
AC_CXX_BOOL
if test "$ac_cv_cxx_bool" = yes; then
  AC_CHECK_SIZEOF(bool)
fi
AC_CXX_MUTABLE
AC_CXX_TYPENAME
AC_CXX_NEW_FOR_SCOPING
AC_CXX_PLACEMENT_OPERATOR_DELETE
AC_CXX_DYNAMIC_CAST
AC_CXX_NAMESPACES
AC_CXX_EXPLICIT_INSTANTIATIONS
AC_CACHE_CHECK(for placement operator new,
ac_cv_cxx_placement_operator_new,
[AC_TRY_COMPILE([#include <stddef.h>
#ifdef HAVE_NEW
#include <new>
#else
#include <new.h>
#endif
class A {
public:
  A() {};
};
A* foo()
{
  void *x;
  A *bar = new (x) A;
  return bar;
};],,
   ac_cv_cxx_placement_operator_new=yes,
   ac_cv_cxx_placement_operator_new=no)
])
if test "$ac_cv_cxx_placement_operator_new" = yes; then
  AC_DEFINE(HAVE_PLACEMENT_OPERATOR_NEW,1,
            [define if placement operator new is declared])
fi
AC_CACHE_CHECK(whether the C++ compiler supports the std namespace,
ac_cv_cxx_namespace_std,
[AC_TRY_COMPILE([
#ifdef HAVE_NEW
#include <new>
#else
#include <new.h>
#endif],[
std::set_new_handler(0);],
   ac_cv_cxx_namespace_std=yes,
   ac_cv_cxx_namespace_std=no)
])
if test "$ac_cv_cxx_namespace_std" = yes; then
  AC_DEFINE(HAVE_NAMESPACE_STD,1,
            [define if the C++ compiler supports the std namespace])
fi
if test "$GXX"; then
dnl FIXME these need tests for non-GNU compilers
  AC_CACHE_CHECK(whether GNU C++ supports automatic template instantiation,
	         ac_cv_c_gnu_automatic_templates,
                  [AC_EGREP_CPP(yes,[
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 8)
  yes
#endif
	            ],
                    ac_cv_c_gnu_automatic_templates=yes,
                    ac_cv_c_gnu_automatic_templates=no)
                  ])
  if test "$ac_cv_c_gnu_automatic_templates" = yes; then
    AC_DEFINE(SP_DEFINE_TEMPLATES,1,
              [define this to include template definitions in the headers])
  else
    AC_DEFINE(SP_MANUAL_INST,1,
              [define this to compile explicit template instantiations])
    CXXFLAGS="$CXXFLAGS -fno-implicit-templates"
  fi
  AC_CACHE_CHECK(whether GNU C++ links with libg++ if we include new.h,
	         ac_cv_cxx_gnu_avoid_new_h,
                 [AC_EGREP_CPP(yes,[
#if (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
  yes
#endif
	            ],
	            ac_cv_cxx_gnu_avoid_new_h=yes,
	            ac_cv_cxx_gnu_avoid_new_h=no)
                  ])
  if test "$ac_cv_cxx_gnu_avoid_new_h" = yes; then
    AC_DEFINE(SP_NEW_H_MISSING,1,
              [define this if your system misses new.h])
    AC_CACHE_CHECK(whether to declare set_new_handler extern "C",
                    ac_cv_cxx_new_handler_extern_c,
                    [AC_TRY_LINK([
typedef void (*new_handler)();
new_handler set_new_handler(new_handler);],[
set_new_handler(0);],
                      ac_cv_cxx_new_handler_extern_c=no,
                      ac_cv_cxx_new_handler_extern_c=yes)
                     ])
    if test "$ac_cv_cxx_new_handler_extern_c" = yes; then
      AC_DEFINE(SP_SET_NEW_HANDLER_EXTERN_C,1,
                [define this if  set_new_handler() has to be declared extern "C"])
    fi
  fi
fi
AC_CACHE_CHECK(whether new_handler accepts size_t and returns int,
ac_cv_cxx_fancy_new_handler,
[AC_TRY_COMPILE([
#include <stddef.h>
#include <new.h>
int oom(size_t) { }],[set_new_handler(oom);],
   ac_cv_cxx_fancy_new_handler=yes,
   ac_cv_cxx_fancy_new_handler=no)
 ])
if test "$ac_cv_cxx_fancy_new_handler" = yes; then
  AC_DEFINE(SP_FANCY_NEW_HANDLER,1,
            [define this if the new handler takes size_t and returns int])
fi

dnl Checks for library functions.
AC_REPLACE_FUNCS(memmove memcmp strerror strtoul)
AC_CHECK_FUNCS(setlocale)

dnl Checks for system services.
ACX_CHECK_PATHNAME_STYLE_DOS

AC_MSG_CHECKING(whether to include support for http)
AC_ARG_ENABLE(http,
[  --enable-http           include support for http],
    if test $enableval
    then
        AC_MSG_RESULT(yes)
	AC_DEFINE(SP_HAVE_SOCKET,1,
                  [define this if sockets are available])
	AC_CHECK_LIB(nsl,main,LIBS="$LIBS -lnsl")
	AC_CHECK_LIB(socket,main,LIBS="$LIBS -lsocket")
	AC_MSG_CHECKING(h_errno in netdb.h)
	AC_EGREP_HEADER(h_errno,netdb.h,
	    AC_MSG_RESULT(yes),
	    AC_DEFINE(SP_DECLARE_H_ERRNO,1,
                      [define this if h_errno should be declared extern int])
	    AC_MSG_RESULT(no))
    else
        AC_MSG_RESULT(no)
    fi,
    AC_MSG_RESULT(no))
AC_MSG_CHECKING(for default catalog)
AC_ARG_ENABLE(default-catalog,
[  --enable-default-catalog=pathlist
                          provide one or more default catalog files or
                          sysids, e.g. /usr/local/lib/sgml/catalog],
              if test $enableval
               then
                AC_MSG_RESULT($enableval)
                AC_DEFINE_UNQUOTED(SGML_CATALOG_FILES_DEFAULT,"$enableval",
                              [set this to the default catalog files list])
               else
                AC_MSG_RESULT(none)
              fi,
              AC_MSG_RESULT(none))
AC_MSG_CHECKING(for default search path)
AC_ARG_ENABLE(default-search-path,
[  --enable-default-search-path=pathlist
                          provide a default value for SGML_SEARCH_PATH],
    if test $enableval
    then
        AC_MSG_RESULT($enableval)
	AC_DEFINE_UNQUOTED(SGML_SEARCH_PATH_DEFAULT,"$enableval",
                       [set this to the default SGML search path])
    else
        AC_MSG_RESULT(none)
    fi,
    AC_MSG_RESULT(none))
AC_MSG_CHECKING(whether to include support for XML Formatted Messages)
AC_ARG_ENABLE(xml-messages,
[  --enable-xml-messages   include support for XML Formatted Messages],
        if test $enableval
           then
              AC_MSG_RESULT(yes)
              AC_DEFINE(SP_XML,1,[set this to enable XML Formatted MEssages])
           else
                AC_MSG_RESULT(no)
         fi,
      AC_MSG_RESULT(no))

dnl Output.
AC_CONFIG_FILES([${PACKAGE}-${VERSION}.spec:spec.in Makefile msggen.pl
	lib/Makefile nsgmls/Makefile spent/Makefile
	spam/Makefile sgmlnorm/Makefile sx/Makefile spcat/Makefile
	include/Makefile include/config.h.old generic/Makefile doc/Makefile
	pubtext/Makefile tests/Makefile unicode/Makefile intl/Makefile po/Makefile.in])
AC_OUTPUT
