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 ;;
        *-*-k*bsd*)     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])
            
            
