dnl***************************************************************************
dnl Copyright (c) 1998-2014,2015 Free Software Foundation, Inc.              *
dnl                                                                          *
dnl Permission is hereby granted, free of charge, to any person obtaining a  *
dnl copy of this software and associated documentation files (the            *
dnl "Software"), to deal in the Software without restriction, including      *
dnl without limitation the rights to use, copy, modify, merge, publish,      *
dnl distribute, distribute with modifications, sublicense, and/or sell       *
dnl copies of the Software, and to permit persons to whom the Software is    *
dnl furnished to do so, subject to the following conditions:                 *
dnl                                                                          *
dnl The above copyright notice and this permission notice shall be included  *
dnl in all copies or substantial portions of the Software.                   *
dnl                                                                          *
dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
dnl IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
dnl THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
dnl                                                                          *
dnl Except as contained in this notice, the name(s) of the above copyright   *
dnl holders shall not be used in advertising or otherwise to promote the     *
dnl sale, use or other dealings in this Software without prior written       *
dnl authorization.                                                           *
dnl***************************************************************************
dnl
dnl Author: Thomas E. Dickey 1996, etc.
dnl
dnl $Id: configure.in,v 1.124 2015/08/08 20:24:49 tom Exp $
dnl This is a simple configuration-script for the ncurses test programs that
dnl allows the test-directory to be separately configured against a reference
dnl system (i.e., sysvr4 curses)
dnl
dnl If you're configuring ncurses, you shouldn't need to use this script.
dnl It's only for testing purposes.
dnl
dnl See http://invisible-island.net/autoconf/ for additional information.
dnl ---------------------------------------------------------------------------
AC_PREREQ(2.52.20030208)
AC_INIT(ncurses.c)
AC_CONFIG_HEADER(ncurses_cfg.h:ncurses_tst.hin)

CF_INHERIT_SCRIPT(config.guess)
CF_INHERIT_SCRIPT(config.sub)
CF_CHECK_CACHE

AC_ARG_PROGRAM

AC_PROG_MAKE_SET
CF_PROG_CC
AC_PROG_CPP
AC_PROG_AWK
CF_PROG_INSTALL
CF_PROG_LINT
CF_MAKE_TAGS

CF_MATH_LIB(MATH_LIB,pow(sin(x),x))
AC_SUBST(MATH_LIB)

dnl Things that we don't need (or must override) if we're not building ncurses
CF_TOP_BUILDDIR
CC_G_OPT="-g"					AC_SUBST(CC_G_OPT)
CC_SHARED_OPTS=unknown			AC_SUBST(CC_SHARED_OPTS)
CPPFLAGS="$CPPFLAGS"			AC_SUBST(CPPFLAGS)
DFT_DEP_SUFFIX=""				AC_SUBST(DFT_DEP_SUFFIX)
DFT_OBJ_SUBDIR=`pwd|sed -e's:.*/::'`	AC_SUBST(DFT_OBJ_SUBDIR)
DFT_UPR_MODEL="NORMAL"			AC_SUBST(DFT_UPR_MODEL)
LD="ld"							AC_SUBST(LD)
LDFLAGS_SHARED=""				AC_SUBST(LDFLAGS_SHARED)
LDFLAGS_STATIC=""				AC_SUBST(LDFLAGS_STATIC)
LD_MODEL=""						AC_SUBST(LD_MODEL)
LD_SHARED_OPTS=""				AC_SUBST(LD_SHARED_OPTS)
LIBTOOL=""						AC_SUBST(LIBTOOL)
LIBTOOL_OPTS=""					AC_SUBST(LIBTOOL_OPTS)
LIB_CLEAN=""					AC_SUBST(LIB_CLEAN)
LIB_COMPILE=""					AC_SUBST(LIB_COMPILE)
LIB_LINK='${CC}'				AC_SUBST(LIB_LINK)
LINK_TESTS=""					AC_SUBST(LINK_TESTS)
LOCAL_LDFLAGS=""				AC_SUBST(LOCAL_LDFLAGS)
PACKAGE="ncurses-examples"		AC_SUBST(PACKAGE)
PTHREAD="-lm"					AC_SUBST(PTHREAD)
TEST_ARGS=""					AC_SUBST(TEST_ARGS)
TEST_DEPS=""					AC_SUBST(TEST_DEPS)
TEST_LIBS=""					AC_SUBST(TEST_LIBS)
TINFO_LDFLAGS=''				AC_SUBST(TINFO_LDFLAGS)
TINFO_LIBS='$(LIBS_CURSES)'		AC_SUBST(TINFO_LIBS)
cf_cv_abi_version=""			AC_SUBST(cf_cv_abi_version)
cf_cv_rel_version=""			AC_SUBST(cf_cv_rel_version)
includesubdir=""				AC_SUBST(includesubdir)

cf_cv_screen=curses
cf_cv_libtype=

AC_EXEEXT
AC_OBJEXT

CF_GCC_ATTRIBUTES
CF_XOPEN_SOURCE
CF_SIG_ATOMIC_T

dnl ---------------------------------------------------------------------------
CF_HELP_MESSAGE(General Options:)
CF_PKG_CONFIG
CF_DISABLE_ECHO

dnl ---------------------------------------------------------------------------
CF_HELP_MESSAGE(Curses Version-dependent Options:)
CF_NCURSES_WRAP_PREFIX

AC_MSG_CHECKING(if you want to check for wide-character functions)
CF_ARG_DISABLE(widec,
	[  --disable-widec         disable checks for wide-character functions],
	cf_enable_widec=no,
	cf_enable_widec=yes,
	yes)
AC_MSG_RESULT($cf_enable_widec)

dnl ---------------------------------------------------------------------------
CF_HELP_MESSAGE(Curses Version-dependent Options:)
CF_WITH_NCURSES_ETC

case $cf_cv_screen in
(ncurses*)
	cf_cv_libtype=`echo "$cf_cv_screen" | sed -e 's/^ncurses//'`
	;;
(curses|curses_*)
	CF_NETBSD_FORM_H
	CF_NETBSD_MENU_H
	;;
esac

dnl If we've not specified a library, assume we're using sysvr4 libraries
dnl installed conventionally (e.g., SunOS 5.x - solaris).

dnl Autoconf builds up the $LIBS in reverse order

case $cf_cv_screen in
(pdcurses)
	;;
(*)
	# look for curses-related libraries
	CF_CHECK_CURSES_LIB(panel,$cf_cv_libtype,new_panel)
	CF_CHECK_CURSES_LIB(menu,$cf_cv_libtype,menu_driver)
	CF_CHECK_CURSES_LIB(form,$cf_cv_libtype,form_driver)

	# look for curses-related headers
	AC_CHECK_HEADERS( \
		nc_alloc.h \
		nomacros.h \
		form.h \
		menu.h \
		panel.h \
		term_entry.h \
		)
	;;
esac

AC_STDC_HEADERS
AC_HEADER_TIME
AC_CHECK_HEADERS( \
getopt.h \
locale.h \
math.h \
stdarg.h \
sys/ioctl.h \
sys/select.h \
sys/time.h \
termios.h \
unistd.h \
)

CF_GETOPT_HEADER

AC_CHECK_FUNCS( \
getopt \
gettimeofday \
)

if test "x$ac_cv_func_getopt" = xno; then
	AC_MSG_ERROR(getopt is required for building programs)
fi

if test "$cf_enable_widec" = yes; then
AC_CHECK_FUNCS( \
mblen \
mbrlen \
mbrtowc \
mbsrtowcs \
mbstowcs \
mbtowc \
wcsrtombs \
wcstombs \
)
fi

CF_CURSES_FUNCS( \
assume_default_colors \
chgat \
color_set \
filter \
getbegx \
getcurx \
getmaxx \
getnstr \
getparx \
getwin \
mvvline \
mvwvline \
napms \
putwin \
resize_term \
resizeterm \
ripoffline \
scr_dump \
setupterm \
slk_color \
slk_init \
termattrs \
tgetent \
tigetnum \
tigetstr \
typeahead \
use_default_colors \
use_env \
use_extended_names \
use_screen \
use_window \
vid_puts \
vidputs \
vsscanf \
vw_printw \
wchgat \
winsstr \
wresize \
wsyncdown \
)

CF_TPUTS_PROTO
CF_NCURSES_EXT_FUNCS

if test "$cf_enable_widec" = yes
then
	# workaround for systems with ncurses before 20111029, due to change of
	# feature test macro from _XPG5 to _XOPEN_SOURCE
	if test -n "$cf_cv_ncurses_version" && test "x$cf_cv_ncurses_version" != xno
	then
		cf_define_xpg5=no
		AC_MSG_CHECKING(if _XPG5 should be defined to enable wide-characters)

		AC_TRY_COMPILE([
#include <${cf_cv_ncurses_header:-curses.h}>],
			[int x = _XPG5],,
			[cf_save_cppflags="$CPPFLAGS"
			 CPPFLAGS="$CPPFLAGS -D_XPG5"
			 AC_TRY_COMPILE([
#include <${cf_cv_ncurses_header:-curses.h}>],
				[int x = _XPG5],
				[cf_define_xpg5=yes])
			 CPPFLAGS="$cf_save_cppflags"])
		AC_MSG_RESULT($cf_define_xpg5)

		if test "$cf_define_xpg5" = yes
		then
			CPPFLAGS="$CPPFLAGS -D_XPG5"
		fi
	fi

	AC_CACHE_CHECK(for wide-character functions,cf_cv_widechar_funcs,[
	AC_TRY_LINK([
#include <${cf_cv_ncurses_header:-curses.h}>],
	[
		static wchar_t src_wchar[2];
		static cchar_t dst_cchar;
		setcchar(&dst_cchar, src_wchar, A_NORMAL, 0, (void *) 0);
		],
		[cf_cv_widechar_funcs=yes],
		[cf_cv_widechar_funcs=no])
	])
	if test "$cf_cv_widechar_funcs" != no ; then
		AC_DEFINE(USE_WIDEC_SUPPORT,1,[Define to 1 to enable wide-character support in (n)curses])
	else
		AC_DEFINE(USE_WIDEC_SUPPORT,0)
	fi
else
	AC_DEFINE(USE_WIDEC_SUPPORT,0)
fi

AC_CACHE_CHECK(if $cf_cv_screen library uses pthreads,cf_cv_use_pthreads,[
AC_TRY_LINK([
#include <${cf_cv_ncurses_header:-curses.h}>
extern void _nc_init_pthreads(void);
],
[
	initscr();
	_nc_init_pthreads();
	],
	[cf_cv_use_pthreads=yes],
	[cf_cv_use_pthreads=no])
])
test $cf_cv_use_pthreads = yes && AC_DEFINE(USE_PTHREADS)

CF_SYS_TIME_SELECT
CF_FUNC_CURSES_VERSION

CF_CURSES_ACS_MAP
if test "$cf_enable_widec" = yes; then
	CF_CURSES_WACS_MAP
	CF_CURSES_WACS_SYMBOLS
fi

CF_CURSES_CHECK_TYPE(attr_t,long)

if test "$cf_enable_widec" = yes; then
	CF_WCHAR_TYPE(mbstate_t, NCURSES_MBSTATE_T, NCURSES_OK_MBSTATE_T)
	CF_WCHAR_TYPE(wchar_t,   NCURSES_WCHAR_T,   NCURSES_OK_WCHAR_T)
	CF_WCHAR_TYPE(wint_t,    NCURSES_WINT_T,    NCURSES_OK_WINT_T)

	if test "$NCURSES_OK_MBSTATE_T" = 0 ; then
		CF_CURSES_CHECK_TYPE(mbstate_t,long)
	fi

	if test "$NCURSES_OK_WCHAR_T" = 0 ; then
		CF_CURSES_CHECK_TYPE(wchar_t,long)
	fi

	if test "$NCURSES_OK_WINT_T" = 0 ; then
		CF_CURSES_CHECK_TYPE(wint_t,long)
	fi
fi

CF_CURSES_CHECK_DATA(ospeed)
CF_CURSES_CHECK_DATA(boolnames)
CF_CURSES_CHECK_DATA(boolfnames)

dnl ---------------------------------------------------------------------------
CF_HELP_MESSAGE(Testing/development Options:)
CF_ENABLE_WARNINGS
CF_DISABLE_LEAKS
CF_DISABLE_RPATH_HACK

TEST_ARGS="$LIBS"
LIBS=

dnl ---------------------------------------------------------------------------

AC_OUTPUT(Makefile,[
CF_PRG_RULES([$srcdir/mk-test.awk INSTALL=yes ECHO_LINK="$ECHO_LD"], .)
	cat >>Makefile <<TEST_EOF

# These rules are generated so we do not rely on suffix rules, which do not
# work consistently for different make-programs (the '\$(MODEL)/' confuses
# some, and the '\$x' confuses others).
TEST_EOF

LIST=`sed -e 's/[[ 	]].*//' -e '/^[[#@]]/d' $srcdir/modules`
for N in $LIST
do
	cat >>Makefile <<TEST_EOF

\$(MODEL)/$N.o : \$(srcdir)/$N.c \\
	\$(srcdir)/test.priv.h \\
	ncurses_cfg.h
	$SHOW_CC
	$ECHO_CC\$(CC) -c \$(CFLAGS_DEFAULT) \$(srcdir)/$N.c
TEST_EOF
done

if test -f ../config.guess && test -f ../config.sub
then
	cat >>Makefile <<TEST_EOF

# if we used CF_INHERIT for getting these files, we can remove them
distclean::
	rm -f config.guess config.sub
TEST_EOF
fi
],[
AWK="$AWK"
ECHO_CC="$ECHO_CC"
ECHO_LD="$ECHO_LD"
SHOW_CC="$SHOW_LD"
],cat)
