dnl Process this file with autoconf to produce a configure script
AC_INIT(src/xalanc/PlatformSupport/PlatformSupportDefinitions.hpp)

dnl Checks for programs
AC_PROG_CC
AC_PROG_CXX
AC_PROG_INSTALL
AC_CHECK_PROG(AUTOCONF, autoconf, autoconf, true)


dnl  Check for gcc problems

if test "$CXX" = "g++" -o "$CXX" = "c++"; then

  AC_MSG_CHECKING([whether -fno-elide-constructors works correctly])

  old_cxxflags=$CXXFLAGS
  CXXFLAGS="$CXXFLAGS -fno-elide-constructors"

  AC_LANG_CPLUSPLUS

  AC_TRY_COMPILE([#include <vector>],
    [], 
    [AC_MSG_RESULT([yes])], 
    CXXFLAGS=$old_cxxflags
    [AC_MSG_RESULT([no])]);

fi

dnl
dnl Do not know how to use this macro, so comment it out.
dnl
dnl special pthread handling (AIX uses pthreads instead of pthread)
dnl AC_CHECK_LIB(pthread, pthread_create)
dnl if test $ac_cv_lib_pthread_pthread_create = no; then
dnl AC_CHECK_LIB(pthreads, pthread_create)
dnl fi
dnl

dnl Determine the host system and Makefile fragment
AC_CANONICAL_HOST

dnl Platform-specific Makefile setup
case "${host}" in
        *-*-solaris*)   platform=SOLARIS ;;
        *-*-linux*)     platform=LINUX ;;
        *-*-freebsd*)   platform=FREEBSD ;;
        *-*-netbsd*)    platform=NETBSD ;;
        *-*-irix*)      platform=IRIX ;;
        *-*-aix*)       platform=AIX ;;
        ia64-hp*)       platform=HPUX ; osver=HPUX11 ; osvariant=IA64;;
        *-*-hp*)        platform=HPUX ;
                        case "${host}" in
                            *-*-hpux11*)  osver=HPUX11;;
                            *-*-hpux10*)  osver=HPUX10;;
                            *)            osver=HPUX11;;
                        esac;;
        *-*-mvs*)       platform=OS390 ;;
        *-*-osf*)       platform=TRU64 ;;
        *-apple-darwin*)       platform=MACOSX ;;
        *-*-os400*)     platform=OS400 ;;
        *-*-OS400*)     platform=OS400 ;;
        *-*-cygwin*)    platform=CYGWIN ;;
        *)              platform=UNKNOWN ;;
esac

dnl Checks for libraries
if test "$platform" != "OS400"; then
	AC_CHECK_LIB(m, floor)
fi

dnl check if mbstowcs is available and can correctly count only
AC_HEADER_STDC
AC_CHECK_FUNCS([mbstowcs],,,)
if test x"$ac_cv_func_mbstowcs" = x"no"; then
	WCSTOMBS="-DXALAN_USE_XERCES_LOCAL_CODEPAGE_TRANSCODERS"
else
AC_MSG_CHECKING(if mbstowcs can count only)
AC_TRY_RUN([
#if STDC_HEADERS
#include <stdlib.h>
#endif

int main(int argc, char *argv[])
{
	wchar_t in[5] = { 0x74, 0x65, 0x73, 0x74, 0x00 };

	if (wcstombs(0, in, 0) == -1) {
		exit(1);
	}

	exit(0);
}], [AC_MSG_RESULT(yes)],
	[WCSTOMBS="-DXALAN_USE_XERCES_LOCAL_CODEPAGE_TRANSCODERS";
	 AC_MSG_RESULT(no)],
	[WCSTOMBS="-DXALAN_USE_XERCES_LOCAL_CODEPAGE_TRANSCODERS";
	 AC_MSG_RESULT(cross-compiling default)])
fi


AC_SUBST(platform)

cxx=${CXX}
AC_SUBST(cxx)

cc=${CC}
AC_SUBST(cc)

AC_SUBST(prefix)
dnl  Not used:
AC_SUBST(osver)

AC_SUBST(osvariant)

cxxflags=${CXXFLAGS}
AC_SUBST(cxxflags)

dnl  Not used:
cppflags=${CPPFLAGS}
AC_SUBST(cppflags)

cflags=${CFLAGS}
AC_SUBST(cflags)

ldflags=${LDFLAGS}
AC_SUBST(ldflags)

libs=${LIBS}
AC_SUBST(libs)

transcoder=${TRANSCODER}
AC_SUBST(transcoder)

xalan_locale_system=${XALAN_LOCALE_SYSTEM}
AC_SUBST(xalan_locale_system)
xalan_locale=${XALAN_LOCALE}
AC_SUBST(xalan_locale)
wcstombs=${WCSTOMBS}
AC_SUBST(wcstombs)

dnl  Not used:
threads=${THREADS}
AC_SUBST(threads)

bitstobuild=${BITSTOBUILD}
AC_SUBST(bitstobuild)

dnl output the Makefiles
if test ! -d src; then
  mkdir src
fi
AC_OUTPUT([Makefile.incl \
	    Makefile \
            src/xalanc/Makefile \
            src/xalanc/Utils/Makefile \
            src/xalanc/Utils/MsgCreator/Makefile \
            src/xalanc/Utils/XalanMsgLib/Makefile \
            samples/Makefile \
            Tests/Makefile])
            
            
