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 ;;
        *-*-openbsd*)   platform=OPENBSD ;;
        *-*-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 ;;
        *-*-mingw*)     platform=MINGW ;;
        *)              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])
            
            
