dnl
dnl Configure script for readline library
dnl
dnl report bugs to chet@po.cwru.edu
dnl
dnl Process this file with autoconf to produce a configure script.
AC_REVISION([for Readline 4.3, version 2.45, from autoconf version] AC_ACVERSION)

AC_INIT(readline, 4.3, bug-readline@gnu.org)

dnl make sure we are using a recent autoconf version
AC_PREREQ(2.50)

AC_CONFIG_SRCDIR(readline.h)
AC_CONFIG_AUX_DIR(./support)
AC_CONFIG_HEADERS(config.h)

dnl update the value of RL_READLINE_VERSION in readline.h when this changes
LIBVERSION=4.3

AC_CANONICAL_HOST

dnl configure defaults
opt_curses=no

dnl arguments to configure
AC_ARG_WITH(curses, AC_HELP_STRING([--with-curses], [use the curses library instead of the termcap library]), opt_curses=$withval)

if test "$opt_curses" = "yes"; then
	prefer_curses=yes
fi

dnl option parsing for optional features
opt_static_libs=yes
opt_shared_libs=yes

AC_ARG_ENABLE(shared, AC_HELP_STRING([--enable-shared], [build shared libraries [[default=YES]]]), opt_shared_libs=$enableval)
AC_ARG_ENABLE(static, AC_HELP_STRING([--enable-static], [build static libraries [[default=YES]]]), opt_static_libs=$enableval)

echo ""
echo "Beginning configuration for readline-$LIBVERSION for ${host_cpu}-${host_vendor}-${host_os}"
echo ""

# We want these before the checks, so the checks can modify their values.
test -z "$CFLAGS" && CFLAGS=-g auto_cflags=1

AC_PROG_MAKE_SET
AC_PROG_CC
dnl AC_AIX
AC_MINIX

# If we're using gcc and the user hasn't specified CFLAGS, add -O to CFLAGS.
test -n "$GCC" && test -n "$auto_cflags" && CFLAGS="$CFLAGS -O"

AC_PROG_GCC_TRADITIONAL
AC_PROG_INSTALL
AC_CHECK_PROG(AR, ar, , ar)
dnl Set default for ARFLAGS, since autoconf does not have a macro for it.
dnl This allows people to set it when running configure or make
test -n "$ARFLAGS" || ARFLAGS="cr"
AC_PROG_RANLIB

MAKE_SHELL=/bin/sh
AC_SUBST(MAKE_SHELL)

AC_C_CONST
AC_C_PROTOTYPES
AC_C_CHAR_UNSIGNED

AC_TYPE_SIGNAL

AC_TYPE_SIZE_T
AC_CHECK_TYPE(ssize_t, int)

AC_HEADER_STAT
AC_HEADER_DIRENT

AC_CHECK_FUNCS(lstat memmove putenv select setenv setlocale \
		strcasecmp strpbrk tcgetattr vsnprintf isascii isxdigit)

AC_FUNC_STRCOLL

AC_CHECK_HEADERS(unistd.h stdlib.h varargs.h stdarg.h string.h strings.h \
		limits.h sys/ptem.h sys/pte.h sys/stream.h sys/select.h \
		termcap.h termios.h termio.h sys/file.h locale.h memory.h )

BASH_SYS_SIGNAL_VINTAGE
BASH_SYS_REINSTALL_SIGHANDLERS

BASH_FUNC_POSIX_SETJMP
BASH_FUNC_LSTAT
BASH_FUNC_STRCOLL

BASH_CHECK_GETPW_FUNCS

AC_HEADER_TIOCGWINSZ

BASH_TYPE_SIGHANDLER
BASH_HAVE_TIOCSTAT
BASH_HAVE_FIONREAD
BASH_CHECK_SPEED_T
BASH_STRUCT_WINSIZE
BASH_STRUCT_DIRENT_D_INO
BASH_STRUCT_DIRENT_D_FILENO

dnl yuck
case "$host_os" in
aix*)   prefer_curses=yes ;;
esac
BASH_CHECK_LIB_TERMCAP
if test "$TERMCAP_LIB" = "./lib/termcap/libtermcap.a"; then
	if test "$prefer_curses" = yes; then
		TERMCAP_LIB=-lcurses
	else
		TERMCAP_LIB=-ltermcap	#default
	fi
fi

BASH_CHECK_MULTIBYTE

case "$host_cpu" in
*cray*)	LOCAL_CFLAGS=-DCRAY ;;
*s390*) LOCAL_CFLAGS=-fsigned-char ;;
esac

case "$host_os" in
isc*)	LOCAL_CFLAGS=-Disc386 ;;
esac

# shared library configuration section
#
# Shared object configuration section.  These values are generated by
# ${srcdir}/support/shobj-conf
#
if test -f ${srcdir}/support/shobj-conf; then
        AC_MSG_CHECKING(configuration for building shared libraries)
        eval `${CONFIG_SHELL-/bin/sh} ${srcdir}/support/shobj-conf -C "${CC}" -c ${host_cpu} -o ${host_os} -v ${host_vendor}`
        AC_SUBST(SHOBJ_CC)
        AC_SUBST(SHOBJ_CFLAGS)
        AC_SUBST(SHOBJ_LD)
        AC_SUBST(SHOBJ_LDFLAGS)
	AC_SUBST(SHOBJ_XLDFLAGS)
        AC_SUBST(SHOBJ_LIBS)
        AC_SUBST(SHOBJ_STATUS)
	AC_SUBST(SHLIB_STATUS)
	AC_SUBST(SHLIB_XLDFLAGS)
	AC_SUBST(SHLIB_LIBSUFF)
	AC_SUBST(SHLIB_LIBVERSION)
	AC_SUBST(SHLIB_LIBS)
        AC_MSG_RESULT($SHLIB_STATUS)

	# SHLIB_STATUS is either `supported' or `unsupported'.  If it's
	# `unsupported', turn off any default shared library building
	if test "$SHLIB_STATUS" = 'unsupported'; then
		opt_shared_libs=no
	fi

	# shared library versioning
	# quoted for m4 so I can use character classes
	SHLIB_MAJOR=[`expr "$LIBVERSION" : '\([0-9]\)\..*'`]
	SHLIB_MINOR=[`expr "$LIBVERSION" : '[0-9]\.\([0-9]\).*'`]
	AC_SUBST(SHLIB_MAJOR)
	AC_SUBST(SHLIB_MINOR)
fi

if test "$opt_static_libs" = "yes"; then
	STATIC_TARGET=static
	STATIC_INSTALL_TARGET=install-static
fi
if test "$opt_shared_libs" = "yes"; then
	SHARED_TARGET=shared
	SHARED_INSTALL_TARGET=install-shared
fi

AC_SUBST(STATIC_TARGET)
AC_SUBST(SHARED_TARGET)
AC_SUBST(STATIC_INSTALL_TARGET)
AC_SUBST(SHARED_INSTALL_TARGET)

case "$host_os" in
msdosdjgpp*)	BUILD_DIR=`pwd.exe` ;;	# to prevent //d/path/file
*)		BUILD_DIR=`pwd` ;;
esac

AC_SUBST(BUILD_DIR)

AC_SUBST(CFLAGS)
AC_SUBST(LOCAL_CFLAGS)
AC_SUBST(LOCAL_LDFLAGS)
AC_SUBST(LOCAL_DEFS)

AC_SUBST(AR)
AC_SUBST(ARFLAGS)

AC_SUBST(host_cpu)
AC_SUBST(host_os)

AC_SUBST(LIBVERSION)

AC_SUBST(TERMCAP_LIB)

AC_OUTPUT([Makefile doc/Makefile examples/Makefile shlib/Makefile],
[
# Makefile uses this timestamp file to record whether config.h is up to date.
echo > stamp-h
])
