dnl -*-m4-*-
dnl configure.in for ICU
dnl Copyright (c) 1999-2000, International Business Machines Corporation and
dnl others. All Rights Reserved.
dnl Stephen F. Booth

dnl Process this file with autoconf to produce a configure script
AC_INIT(common/unicode/utypes.h)

AC_CONFIG_HEADER(common/icucfg.h)
PACKAGE="icu"
AC_SUBST(PACKAGE)
VERSION="1.6"
AC_SUBST(VERSION)
UNICODE_VERSION="3.0.0"
AC_SUBST(UNICODE_VERSION)

dnl Shouldn't need the AC_SUBST
CPPFLAGS="${CPPFLAGS} -I."
AC_SUBST(CPPFLAGS)

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

dnl Check for the platform make
AC_PATH_PROGS(U_MAKE, gmake, make)
AC_SUBST(U_MAKE)

dnl Determine how strict we want to be when compiling
AC_CHECK_STRICT_COMPILE

dnl Determine the host system and Makefile fragment
AC_CANONICAL_HOST

case "${host}" in
*-*-solaris*)
	if test "$ac_cv_prog_gcc" = no; then
		AC_MSG_CHECKING([if we have a 64-bit (sparcv9) compiler])
		SOL64=`$CXX -xarch=v9 && $CC -xarch=v9 2>&1 |grep -v usage:`
		if test -z "$SOL64"; then
			AC_MSG_RESULT(yes)
			SOL64=yes
		else
			AC_MSG_RESULT(no)
			SOL64=no
		fi
	fi ;;
*)	SOL64=no ;;
esac

ICU_CHECK_MH_FRAG

hpuxcma=false

dnl Checks for libraries and other host specific stuff
dnl On HP/UX, don't link to -lm from a shared lib because it isn't
dnl  PIC (at least on 10.2)
case "${host}" in
	*-*-hpux10*)    hpuxcma=true
			AC_CHECK_LIB(m, floor, LIB_M="-lm") ;;
	*-*-hpux*) 	AC_CHECK_LIB(m, floor, LIB_M="-lm") ;;
	
	*) 		AC_CHECK_LIB(m, floor) 
			LIB_M="" ;;
esac
AC_SUBST(LIB_M)

dnl Enable/disable hpuxcma

if test $hpuxcma = false; then
 AC_ARG_ENABLE(hpuxcma,
	[  --enable-hpuxcma        build ICU with HPUX CMA threads (only ver>=11) [default=no]],
	[case "${enableval}" in
	     yes) hpuxcma=true;;
	     no) hpuxcma=false;;
		*) AC_MSG_ERROR(bad value ${enableval} for --enable-hpuxcma) ;;
		esac], 
	)
fi

dnl Note, we set the conditional outside of IF for non hpux plats
ICU_CONDITIONAL(HPUX_CMA, test "$hpuxcma" = true)

dnl Should this be a nested CASE?
if test $hpuxcma = true; then
  case "${host}" in
	*-*-hpux*)	hpuxcma=true ;;
	*)		AC_MSG_ERROR(--enable-hpuxcma is not valid on this platform ${host}) ;;
  esac
fi

threads=true

dnl Enable/disable threads
AC_ARG_ENABLE(threads,
	[  --enable-threads        build ICU with threads [default=yes]],
	[case "${enableval}" in
		yes) threads=true ;;
		no)  threads=false ;;
		*) AC_MSG_ERROR(bad value ${enableval} for --enable-threads) ;;
		esac], 
	threads=true)
ICU_CONDITIONAL(THREADS, test "$threads" = true)

ICU_USE_THREADS=0

dnl Test for HPUX cma threads first.. 
if test $hpuxcma = true; then
 dnl HPUX cma case
 if test $threads = true; then
  AC_CHECK_LIB(cma, pthread_create)
  if test $ac_cv_lib_cma_pthread_create = yes; then
   ICU_USE_THREADS=1
  fi
 fi
else 
if test $threads = true; then

 dnl special pthread handling 
 dnl AIX uses pthreads instead of pthread, and HP/UX uses cma
 dnl FreeBSD users -pthread
 AC_CHECK_LIB(pthread, pthread_create)

 if test $ac_cv_lib_pthread_pthread_create = yes; then
  ICU_USE_THREADS=1
 else
   dnl For HP 11
   AC_CHECK_LIB(pthread, pthread_mutex_init)
   if test $ac_cv_lib_pthread_pthread_mutex_init = yes; then
     ICU_USE_THREADS=1
   fi
 fi


 if test $ICU_USE_THREADS = 0; then
  AC_CHECK_LIB(pthreads, pthread_create)
  if test $ac_cv_lib_pthreads_pthread_create = yes; then
   ICU_USE_THREADS=1
  fi
 fi

 if test $ICU_USE_THREADS = 0; then
 AC_CHECK_LIB(cma, pthread_create)
  if test $ac_cv_lib_cma_pthread_create = yes; then
   ICU_USE_THREADS=1
  fi
 fi

 dnl If all other thread tests fail, try BSD's -pthread
 if test $ICU_USE_THREADS = 0; then
  AC_PTHREAD_FREEBSD
 fi

 AC_CHECK_FUNC(pthread_mutex_lock)

 if test $ac_cv_func_pthread_mutex_lock = yes; then
   ICU_USE_THREADS=1
 fi

fi
fi

AC_SUBST(ICU_USE_THREADS)

dnl FreeBSD needs a WCS library.
AC_CHECK_LIB(wcs, wcscpy)

# check for dlopen()

HAVE_DLOPEN=0

#add more libs here..
AC_CHECK_LIB(dl, dlopen)

if test $ac_cv_lib_dl_dlopen = yes; then
HAVE_DLOPEN=1
fi

if test $HAVE_DLOPEN = 0; then
	AC_CHECK_LIB(dld, shl_load)
	if test $ac_cv_lib_dld_shl_load = yes; then
		HAVE_DLOPEN=1
		
        fi
fi

dnl added for s/390 DLL loading detection

if test $HAVE_DLOPEN = 0; then
   AC_CHECK_FUNC(dllload)
   if test $ac_cv_func_dllload = yes; then
       HAVE_DLOPEN=1
   fi
fi
AC_SUBST(HAVE_DLOPEN)

dnl Checks for header files
AC_CHECK_HEADERS(inttypes.h)
if test $ac_cv_header_inttypes_h = no; then
U_HAVE_INTTYPES_H=0
else
U_HAVE_INTTYPES_H=1
fi
AC_SUBST(U_HAVE_INTTYPES_H)

if test x$U_IOSTREAM_SOURCE = x
then
    AC_LANG_SAVE
    AC_LANG_CPLUSPLUS
    U_IOSTREAM_SOURCE=0
    AC_CHECK_HEADER(iostream)
    if test $ac_cv_header_iostream = yes
    then
        U_IOSTREAM_SOURCE=199711
    else
        AC_CHECK_HEADER(iostream.h)
        if test $ac_cv_header_iostream_h = yes; then
            AC_MSG_CHECKING([whether ostream is really defined])
            AC_CACHE_VAL(ac_cv_iostream_ok,
                AC_TRY_LINK([#include <iostream.h>],[ostream &testout = cout; testout << "test" << endl;],ac_cv_iostream_ok=yes,ac_cv_iostream_ok=no))
            AC_MSG_RESULT($ac_cv_iostream_ok)
            if test $ac_cv_iostream_ok = yes
            then
                U_IOSTREAM_SOURCE=198506
            fi
        fi
    fi
fi
AC_SUBST(U_IOSTREAM_SOURCE)
AC_LANG_RESTORE

dnl Check for endianness
AC_C_BIGENDIAN(unknown)
if test $ac_cv_c_bigendian = no; then
U_IS_BIG_ENDIAN=0
else
U_IS_BIG_ENDIAN=1
fi
AC_SUBST(U_IS_BIG_ENDIAN)

dnl Do various wchar_t related checks
AC_CHECK_HEADER(wchar.h)
if test "$ac_cv_header_wchar_h" = no
then
    U_HAVE_WCHAR_H=0
else
    AC_DEFINE(HAVE_WCHAR_H)
    U_HAVE_WCHAR_H=1
fi
AC_SUBST(U_HAVE_WCHAR_H)

ac_default_sizeof_wchar_t=4
AC_DO_CHECK_SIZEOF(wchar_t,$ac_default_sizeof_wchar_t,[
#if STDC_HEADERS
#include <stddef.h>
#endif
#if HAVE_WCHAR_H
#include <wchar.h>
#endif])
dnl We could set ac_cv_sizeof_wchar_t to the default if the check returned
dnl 0 (unknown) but we'd rather do it in the headers, so we know we had no
dnl clue at configure time.
U_SIZEOF_WCHAR_T=$ac_cv_sizeof_wchar_t
AC_SUBST(U_SIZEOF_WCHAR_T)

dnl Checks for typedefs
AC_CHECK_TYPE(int8_t,signed char)
AC_CHECK_TYPE(uint8_t,unsigned char)
AC_CHECK_TYPE(int16_t,signed short)
AC_CHECK_TYPE(uint16_t,unsigned short)
AC_CHECK_TYPE(int32_t,signed long)
AC_CHECK_TYPE(uint32_t,unsigned long)
AC_CHECK_TYPE(bool_t,signed char)

if test $ac_cv_type_int8_t = no; then
HAVE_INT8_T=0
else
HAVE_INT8_T=1
fi
AC_SUBST(HAVE_INT8_T)

if test $ac_cv_type_uint8_t = no; then
HAVE_UINT8_T=0
else
HAVE_UINT8_T=1
fi
AC_SUBST(HAVE_UINT8_T)

if test $ac_cv_type_int16_t = no; then
HAVE_INT16_T=0
else
HAVE_INT16_T=1
fi
AC_SUBST(HAVE_INT16_T)

if test $ac_cv_type_uint16_t = no; then
HAVE_UINT16_T=0
else
HAVE_UINT16_T=1
fi
AC_SUBST(HAVE_UINT16_T)

if test $ac_cv_type_int32_t = no; then
HAVE_INT32_T=0
else
HAVE_INT32_T=1
fi
AC_SUBST(HAVE_INT32_T)

if test $ac_cv_type_uint32_t = no; then
HAVE_UINT32_T=0
else
HAVE_UINT32_T=1
fi
AC_SUBST(HAVE_UINT32_T)

if test $ac_cv_type_bool_t = no; then
HAVE_BOOL_T=0
else
HAVE_BOOL_T=1
fi
AC_SUBST(HAVE_BOOL_T)

dnl Enable/disable extras
AC_ARG_ENABLE(extras,
	[  --enable-extras         build ICU extras [default=yes]],
	[case "${enableval}" in
		yes) extras=true ;;
		no)  extras=false ;;
		*) AC_MSG_ERROR(bad value ${enableval} for --enable-extras) ;;
		esac], 
	extras=true)
ICU_CONDITIONAL(EXTRAS, test "$extras" = true)

dnl Enable/disable mapped files [default DLL]
AC_ARG_ENABLE(mapped,
	[  --enable-mapped         try to use memory-mapped files (instead of DLLs) when possible [default=no]],
	[case "${enableval}" in
		yes) mapped=true ;;
		no)  mapped=false ;;
		*) AC_MSG_ERROR(bad value ${enableval} for --enable-mapped) ;;
		esac], 
	mapped=false)

ICU_CONDITIONAL(USE_MAPPED, test "$mapped" = true -o "$HAVE_DLOPEN" = 0)


dnl Enable/disable tests
AC_ARG_ENABLE(tests,
	[  --enable-tests          build ICU tests [default=yes]],
	[case "${enableval}" in
		yes) tests=true ;;
		no)  tests=false ;;
		*) AC_MSG_ERROR(bad value ${enableval} for --enable-tests) ;;
		esac], 
	tests=true)
ICU_CONDITIONAL(TESTS, test "$tests" = true)

dnl Enable/disable samples
AC_ARG_ENABLE(samples,
	[  --enable-samples        build ICU samples [default=yes]  
Additionally, the variable FORCE_LIBS may be set before calling configure. If set, it will REPLACE any automatic list of libraries.],
	[case "${enableval}" in
		yes) samples=true ;;
		no)  samples=false ;;
		*) AC_MSG_ERROR(bad value ${enableval} for --enable-samples) ;;
		esac], 
	samples=true)
ICU_CONDITIONAL(SAMPLES, test "$samples" = true)

dnl Platform-specific Makefile setup
case "${host}" in
	*-*-solaris*) 	platform=U_SOLARIS ;;
	*-*-linux*) 	platform=U_LINUX ;;
	*-*-freebsd*) 	platform=U_LINUX ;;
	*-*-aix*) 	platform=AIX ;;
	*-sequent-*)	platform=PTX ;;
	*-*-hpux*) 	platform=HPUX ;;
	*-*-irix*)      platform=IRIX ;;
	*-*-os390*)	platform=OS390 ;;
	*-*-os400*)	platform=OS400 ;;
	*-apple-darwin*|*-apple-rhapsody*)	platform=U_DARWIN ;;
	*) 		platform=U_UNKNOWN_PLATFORM ;;
esac
AC_SUBST(platform)
host_frag=$icu_cv_host_frag
AC_SUBST_FILE(host_frag)

dnl Handle -rpath options for shared library paths
case "${host}" in
	*-*-solaris*) 	ld_rpath_suf=":" ;;
	*-*-linux*) 	ld_rpath_suf=" " ;;
	*-*-freebsd*) 	ld_rpath_suf=" " ;;
	*-*-aix*) 	ld_rpath_suf="" ;;
	*-sequent-*)	ld_rpath_suf="" ;;
	*-*-hpux*) 	ld_rpath_suf=":" ;;
	*-*-irix*)      ld_rpath_suf=" " ;;
	*-*-os390*)	ld_rpath_suf="" ;;
	*-*-os400*)	ld_rpath_suf=" " ;;
	*) 		ld_rpath_suf="" ;;
esac
AC_SUBST(ld_rpath_suf)

dnl On HP/UX, main() functions compiled in C don't invoke
dnl static constructors in C++ libs.  Hack around that here
dnl by renaming some .c files to .cpp
case "${host}" in
	*-*-hpux*) 	
		for file in samples/date/date \
		  samples/cal/cal test/cintltst/cintltst \
		  tools/makeconv/makeconv tools/genrb/genrb \
		  tools/rbdump/read tools/genccode/genccode \
		  tools/gencmn/gencmn tools/gencnval/gencnval \
		  tools/gennames/gennames tools/gentest/gentest \
                  tools/pkgdata/pkgdata
		do
		  if test -f $file.c; then
		    mv $file.c $file.cpp
                  else
		    echo "# $file.c does not exist or is already renamed [warning]"
		  fi
		done
	;;
esac

if test "${FORCE_LIBS}" != ""; then
   echo " *** Overriding automatically chosen [LIBS=$LIBS], using instead [FORCE_LIBS=${FORCE_LIBS}]"  1>&6
   LIBS=${FORCE_LIBS}
fi

dnl SPECIAL handling for HPUX 10 and also '11 & --enable-hpuxcma=true'
if test $hpuxcma = true; then
	CPPFLAGS="${CPPFLAGS} -D_PTHREADS_DRAFT_4 -DHPUX_CMA"
fi
dnl END special 


if test "$ac_cv_lib_dld_shl_load" = "yes"; then
	CPPFLAGS="${CPPFLAGS} -DICU_USE_SHL_LOAD"
fi

if test -f ./configure.in
then
        # they are normal. Build is in .. (note this is mostly for the top level script)
        DATABUILDDIR=`pwd`/../data/
        RELATIVEDATADIR=../data/
else
        DATABUILDDIR=`pwd`/data/
        RELATIVEDATADIR=data/
fi

AC_SUBST(DATABUILDDIR)
AC_SUBST(RELATIVEDATADIR)

dnl added for s/390 DLL loading detection

if test "$ac_cv_func_dllload" = "yes"; then
    CPPFLAGS="${CPPFLAGS} -DICU_USE_SHL_LOAD"
fi

dnl output the Makefiles
AC_OUTPUT([Makefile \
		common/Makefile config/Makefile.inc i18n/Makefile \
		extra/Makefile extra/ustdio/Makefile \
		tools/Makefile tools/ctestfw/Makefile tools/makeconv/Makefile \
		tools/genrb/Makefile  \
		tools/pkgdata/Makefile tools/pkgdata/icupkg.inc \
		tools/rbdump/Makefile tools/genccode/Makefile tools/gencmn/Makefile tools/gencnval/Makefile tools/gentz/Makefile \
	        tools/gennames/Makefile tools/toolutil/Makefile tools/gentest/Makefile tools/genprops/Makefile \
		test/Makefile test/intltest/Makefile test/cintltst/Makefile \
		test/ieeetest/Makefile \
		samples/Makefile samples/date/Makefile samples/cal/Makefile \
		samples/XMLConverter/Makefile \
		common/unicode/platform.h])


dnl create the data directory
if test -d $DATABUILDDIR
then
    :
else
    echo creating $DATABUILDDIR
    mkdir -p $DATABUILDDIR
fi

if test -d $DATABUILDDIR/../source/test/testdata
then
    :
else
    echo creating $DATABUILDDIR/../source/test/testdata
    mkdir -p $DATABUILDDIR/../source/test/testdata
fi

if test $ICU_USE_THREADS = 0; then
  echo  " *** Note: configuring the ICU without pthread support or testing. If this isn't what you want, then run configure with --enable-threads=yes or check the messages [above] to see why we couldn't find pthread_create()" 1>&6
fi
