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

#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

#
# $Id: configure.ac 744933 2009-02-16 15:13:42Z borisk $
#

AC_PREREQ(2.60)
AC_INIT([xerces-c],[3.0.1])
AC_CONFIG_SRCDIR([src/Makefile.am])
AC_CONFIG_LIBOBJ_DIR([src])
AC_CONFIG_AUX_DIR([config])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_HEADERS([config.h src/xercesc/util/Xerces_autoconf_config.hpp])
AC_CONFIG_FILES([Makefile \
                 src/Makefile \
                 src/xercesc/util/MsgLoaders/ICU/resources/Makefile \
                 src/xercesc/util/MsgLoaders/MsgCatalog/Makefile \
                 tests/Makefile \
                 samples/Makefile \
		 xerces-c.pc])

# Check the target system
AC_CANONICAL_HOST

# Initialize automake
AM_INIT_AUTOMAKE([foreign subdir-objects dist-bzip2 tar-ustar])
AM_MAINTAINER_MODE

# Check if rpath is disabled
AC_MSG_CHECKING(whether to use rpath)
AC_ARG_ENABLE(rpath,
	[AC_HELP_STRING([--disable-rpath],
			[Patches libtool to not use rpath in the libraries produced.])],
	[xerces_cv_rpath="$enable_rpath"], [xerces_cv_rpath="yes"])
AC_MSG_RESULT($xerces_cv_rpath)

# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
# used by "make check"
AC_PROG_SED
#it would be nice to also check for PERL...
#AC_PROG_PERL

#skip detection of Fortran
m4_undefine([AC_PROG_F77])
m4_defun([AC_PROG_F77],[])

AC_PROG_LN_S
AC_LIBTOOL_WIN32_DLL
AC_PROG_LIBTOOL
AM_PROG_CC_C_O

AS_IF([test x$AR = xfalse],
	AC_MSG_ERROR([Cannot find a valid 'ar' tool]))

# Patch libtool to not use rpath if requested.
if test "$xerces_cv_rpath" = "no"; then
 AC_MSG_RESULT([Patching libtool to not use rpath.])
 sed < libtool > libtool-2 \
   's/^hardcode_libdir_flag_spec.*$'/'hardcode_libdir_flag_spec=" -D__LIBTOOL_NO_RPATH__ "/'
 mv libtool-2 libtool
 chmod 755 libtool
fi

# Export information on whether we are building static/shared libraries.
# enable_shared and enable_static are defined by AC_PROG_LIBTOOL.
#
AC_SUBST([BUILD_SHARED], [$enable_shared])
AC_SUBST([BUILD_STATIC], [$enable_static])

# Checks for header files.
AC_HEADER_STDC
AC_HEADER_TIME
AC_CHECK_HEADERS([arpa/inet.h fcntl.h float.h inttypes.h langinfo.h limits.h locale.h \
                  memory.h netdb.h netinet/in.h nl_types.h stddef.h stdint.h stdlib.h \
                  string.h strings.h \
                  sys/param.h sys/socket.h sys/time.h sys/timeb.h \
                  unistd.h wchar.h wctype.h \
                  CoreServices/CoreServices.h \
                  endian.h machine/endian.h \
                 ])

# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STDBOOL
AC_C_CONST
AC_C_INLINE
AC_C_VOLATILE

AC_CHECK_SIZEOF(wchar_t)
AC_CHECK_TYPE(size_t)
AC_CHECK_TYPE(ssize_t)

AC_TYPE_OFF_T
AC_TYPE_SIZE_T

XERCES_INT_TYPES

AC_CXX_HAVE_BOOL
AC_CXX_HAVE_NAMESPACES
AC_CXX_HAVE_STD_NAMESPACE
AC_CXX_HAVE_STD_LIBS
AC_CXX_HAVE_LSTRING

ACX_PTHREAD

# Checks for library functions.
#AC_FUNC_ERROR_AT_LINE
#AC_FUNC_MALLOC
#AC_FUNC_MEMCMP
#AC_FUNC_STRCOLL
#AC_FUNC_STRTOD
AC_CHECK_FUNCS([getcwd pathconf realpath \
		getaddrinfo gethostbyaddr gethostbyname socket \
		clock_gettime ftime gettimeofday \
		memmove memset nl_langinfo setlocale localeconv \
		strcasecmp strncasecmp stricmp strnicmp strchr strdup \
		strrchr strstr strtol strtoul \
		towupper towlower mblen \
        wcsupr wcslwr wcsnicmp wcsicmp \
		])

# The check for mbrlen, wcsrtombs and mbsrtowcs gives a false
# positive on HP-UX, so we use a different snippet to set the
# corresponding macro
AC_MSG_CHECKING([for mbrlen])
AC_COMPILE_IFELSE(  [AC_LANG_PROGRAM([[#include <wchar.h>]],
                                     [[mbstate_t st; mbrlen( "t", 5, &st );]])],
                    [
                      AC_MSG_RESULT([yes])
                      AC_DEFINE_UNQUOTED([HAVE_MBRLEN], 1, [Define to 1 if you have the `mbrlen' function.])
                    ],
                    [
                      AC_MSG_RESULT([no])
                      AC_DEFINE_UNQUOTED([HAVE_MBRLEN], 0, [Define to 1 if you have the `mbrlen' function.])
                    ]
                 )
AC_MSG_CHECKING([for wcsrtombs])
AC_COMPILE_IFELSE(  [AC_LANG_PROGRAM([[#include <wchar.h>]],
                                     [[mbstate_t st; char buffer[2]; wchar_t src[2]; wcsrtombs(buffer, &src, 2, &st);]])],
                    [
                      AC_MSG_RESULT([yes])
                      AC_DEFINE_UNQUOTED([HAVE_WCSRTOMBS], 1, [Define to 1 if you have the `wcsrtombs' function.])
                    ],
                    [
                      AC_MSG_RESULT([no])
                      AC_DEFINE_UNQUOTED([HAVE_WCSRTOMBS], 0, [Define to 1 if you have the `wcsrtombs' function.])
                    ]
                 )
AC_MSG_CHECKING([for mbsrtowcs])
AC_COMPILE_IFELSE(  [AC_LANG_PROGRAM([[#include <wchar.h>]],
                                     [[mbstate_t st; wchar_t buffer[2]; char src[2]; mbsrtowcs(buffer, &src, 2, &st);]])],
                    [
                      AC_MSG_RESULT([yes])
                      AC_DEFINE_UNQUOTED([HAVE_MBSRTOWCS], 1, [Define to 1 if you have the `mbsrtowcs' function.])
                    ],
                    [
                      AC_MSG_RESULT([no])
                      AC_DEFINE_UNQUOTED([HAVE_MBSRTOWCS], 0, [Define to 1 if you have the `mbsrtowcs' function.])
                    ]
                 )


AC_SUBST([SHREXT], [$shrext_cmds])

#
# Orchestrate the replacement of missing functions
#
AC_REPLACE_FUNCS([stricmp strnicmp towlower towupper])

abs_top_srcdir=`cd $srcdir; pwd`
AC_SUBST(abs_top_srcdir)
abs_top_builddir=`pwd`
AC_SUBST(abs_top_builddir)

######################################################
# Look for availability of available packages
######################################################

XERCES_PRETTY_MAKE
XERCES_PATH_DELIMITERS

XERCES_MUTEXMGR_SELECTION
XERCES_NETACCESSOR_SELECTION
XERCES_TRANSCODER_SELECTION
XERCES_MSGLOADER_SELECTION
XERCES_FILEMGR_SELECTION

# Allow the user to specify the pkgconfig directory.
#
AC_ARG_WITH(pkgconfigdir,
	AC_HELP_STRING([--with-pkgconfigdir=DIR],
	[Specify location of pkgconfig dir (default is libdir/pkgconfig)]),
	[pkgconfigdir=${withval}],
	[pkgconfigdir='${libdir}/pkgconfig'])

AC_SUBST([pkgconfigdir])

######################################################
# Define some namespace-protected macros for use in the
# publicly visible XercesConfig.h file.
######################################################

AC_DEFINE([XERCES_AUTOCONF], 1, [Define to true if autoconf is used in this configuration])

AS_IF([test x$ac_cv_header_sys_types_h = xyes],
	AC_DEFINE([XERCES_HAVE_SYS_TYPES_H], 1, [Define to 1 if we have sys/types.h]))
AS_IF([test x$ac_cv_header_inttypes_h = xyes],
	AC_DEFINE([XERCES_HAVE_INTTYPES_H],    1, [Define to 1 if we have inttypes.h]))

case $host in
*-*-msdos* | *-*-mingw32* | *-*-cygwin* | *-*-windows* )
	platform_export="__declspec(dllexport)"
	platform_import="__declspec(dllimport)"
	;;
* )
	platform_export=""
	platform_import=""
	;;
esac

AC_DEFINE_UNQUOTED([XERCES_PLATFORM_EXPORT], [$platform_export], [Define as the platform's export attribute])
AC_DEFINE_UNQUOTED([XERCES_PLATFORM_IMPORT], [$platform_import], [Define as the platform's import attribute])

AS_IF([test ! $ac_cv_cxx_have_bool],
	AC_DEFINE([XERCES_NO_NATIVE_BOOL], 1, [Define if there is no native bool support in this environment]))

AS_IF([test $ac_cv_cxx_have_lstring],
	AC_DEFINE([XERCES_LSTRSUPPORT], 1, [Define if there is support for L"widestring"]))

# check if the Windows API is defined as using wchar_t or unsigned short; if it's wchar_t, we need to map XMLCh to be wchar_t
# (this is safe because on Windows wchar_t is used to store UTF-16 codepoints, while it is not true on Unix)
AC_MSG_CHECKING([whether the Windows SDK is available and using wchar_t as wide string])
AC_COMPILE_IFELSE(  [AC_LANG_PROGRAM([[#include <windows.h>
                                        wchar_t file[] = L"dummy.file";]],
                                     [[DeleteFileW(file);]])],
                    [
                      xerces_cv_type_xmlch=wchar_t
                   	  AC_MSG_RESULT([yes])
                      AC_DEFINE_UNQUOTED([XERCES_INCLUDE_WCHAR_H], 1, [Define to have Xerces_autoconf_config.hpp include wchar.h])
                    ],
	                [
                      xerces_cv_type_xmlch=$xerces_cv_type_u16bit_int
                      AC_MSG_RESULT([no])
                    ]
                 )

AC_DEFINE_UNQUOTED([XERCES_XMLCH_T], [$xerces_cv_type_xmlch], [Define to the 16 bit type used to represent Xerces UTF-16 characters])

AS_IF([test x$ac_cv_type_size_t = xyes],
	AC_DEFINE([XERCES_SIZE_T], [size_t], [Define as the appropriate size_t type]),
	AC_DEFINE([XERCES_SIZE_T], [long], [Define as the appropriate size_t type]))

AS_IF([test x$ac_cv_type_ssize_t = xyes],
	AC_DEFINE([XERCES_SSIZE_T], [ssize_t], [Define as the appropriate ssize_t type]),
	AC_DEFINE([XERCES_SSIZE_T], [unsigned long], [Define as the appropriate ssize_t type]))

AS_IF([test x$ac_cv_cxx_have_namespaces = xyes],
	AC_DEFINE([XERCES_HAS_CPP_NAMESPACE], 1, [Define if namespaces is supported by the compiler]))

AS_IF([test x$ac_cv_cxx_have_std_namespace = xyes],
	AC_DEFINE([XERCES_STD_NAMESPACE], 1, [Define if the std namespace is supported]))

AS_IF([test x$ac_cv_cxx_have_std_libs = xyes],
	AC_DEFINE([XERCES_NEW_IOSTREAMS], 1, [Define if the isstream library can be included as <iostream>]))


AC_OUTPUT

AC_MSG_NOTICE
AC_MSG_NOTICE([Report:])
AC_MSG_NOTICE([  File Manager: $filemgr])
AC_MSG_NOTICE([  Mutex Manager: $mutexmgr])
AC_MSG_NOTICE([  Transcoder: $transcoder])
AC_MSG_NOTICE([  NetAccessor: $netaccessor])
AC_MSG_NOTICE([  Message Loader: $msgloader])
