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.5"
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 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 2>&1`
		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
HAVE_INTTYPES_H=0
else
HAVE_INTTYPES_H=1
fi
AC_SUBST(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=SOLARIS ;;
	*-*-linux*) 	platform=LINUX ;;
	*-*-freebsd*) 	platform=LINUX ;;
	*-*-aix*) 	platform=AIX ;;
	*-*-hpux*) 	platform=HPUX ;;
	*-*-irix*)      platform=IRIX ;;
	*-*-os390*)	platform=OS390 ;;
	*-*-os400*)	platform=OS400 ;;
	*-apple-rhapsody*)	platform=RHAPSODY ;;
	*) 		platform=UNKNOWN ;;
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="" ;;
	*-*-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 tools/gencol/gencol 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
		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 i18n/Makefile \
		extra/Makefile extra/ustdio/Makefile \
		tools/Makefile tools/ctestfw/Makefile tools/makeconv/Makefile \
		tools/genrb/Makefile tools/gencol/Makefile \
		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/translit
then
    :
else
    echo creating $DATABUILDDIR/translit
    mkdir $DATABUILDDIR/translit
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
