Rewrite the termcap/terminfo detection logic in configure.

The new logic is considerably shorter and simpler, and should mean that
terminfo is properly used in preference to termcap on NetBSD.  This also
allows us to include term.h in term.c, where the system definition of
tparm() lives on some systems (NetBSD is one such).

The new logic also means we link against libtinfo in preference to
libncurses, which should mean a little less memory used at runtime and a
fraction faster startup time.


git-svn-id: svn://svn.code.sf.net/p/bitchx/code/trunk@434 13b04d17-f746-0410-82c6-800466cd88b0
This commit is contained in:
Kevin Easton
2013-11-10 04:50:52 +00:00
parent 96f1d64aa0
commit 73c9947324
2 changed files with 28 additions and 55 deletions

View File

@@ -1,5 +1,10 @@
[Changes 1.2c01]
* Rewrite termcap/terminfo detection logic in configure and include term.h
in term.c for the system definition of tparm(). This fixes a crash on
NetBSD x86-64 (reported by jeezy), and should also ensure that terminfo
is used in preference to termcap on NetBSD. (caf)
* Fix output when built against termcap. (caf)
* Fix STATUS_NOTIFY so that it appears in the right window. (caf)

View File

@@ -603,62 +603,30 @@ AC_DEFINE_UNQUOTED(_VERSION_, "$_VERSION_", Define short BitchX version here.)
AC_SUBST(EXTRAS)
AC_SUBST(INSTALL_EXTRAS)
dnl Check for setupterm/tgetent. *DO NOT* check on CYGWIN or EMXOS2 because
dnl Check for setupterm/tgetent. *DO NOT* check on EMXOS2 because
dnl term support is built-in.
if test -z "$CYGWIN" -a -z "$EMXOS2" -a -z "$MINGWIN32"; then
AC_MSG_CHECKING(whether to use use tgetent or setupterm)
AC_ARG_WITH(tgetent,
[ --with-tgetent Use tgetent (termcap) instead of setupterm (ncurses) ],
[ AC_MSG_RESULT(tgetent)
AC_CHECK_LIB(tinfo, tgetent, tinfo=1; LIBS="-ltinfo $LIBS",
AC_CHECK_LIB(mytinfo, tgetent, tinfo=1; LIBS="-lmytinfo $LIBS",
AC_CHECK_LIB(termcap, tgetent, termcap=1; LIBS="-ltermcap $LIBS",
AC_CHECK_LIB(termlib, tgetent, termlib=1; LIBS="-ltermlib $LIBS",
AC_CHECK_LIB(curses, tgetent, curses=1; LIBS="-lcurses $LIBS",
AC_MSG_WARN(cannot find tgetent - trying setupterm)
AC_CHECK_LIB(ncurses, setupterm, ncurses=1; LIBS="-lncurses $LIBS",
AC_CHECK_LIB(curses, setupterm, ncurses=1; LIBS="-lcurses $LIBS",
AC_CHECK_LIB(tinfo, setupterm, tinfo=1; LIBS="-ltinfo $LIBS",
AC_MSG_ERROR(cannot find tgetent or setupterm)))))))))],
[ AC_MSG_RESULT(setupterm)
AC_CHECK_LIB(ncurses, setupterm, ncurses=1; LIBS="-lncurses $LIBS",
AC_CHECK_LIB(curses, setupterm, curses=1; LIBS="-lcurses $LIBS",
AC_CHECK_LIB(tinfo, tgetent, tinfo=1; LIBS="-ltinfo $LIBS",
AC_CHECK_LIB(mytinfo, tgetent, tinfo=1; LIBS="-lmytinfo $LIBS",
AC_CHECK_LIB(tinfo, setupterm, tinfo=1; LIBS="-ltinfo $LIBS",
AC_MSG_WARN(cannot find setupterm - trying tgetent)
AC_CHECK_LIB(termlib, tgetent, termlib=1; LIBS="-ltermlib $LIBS",
AC_CHECK_LIB(termcap, tgetent, termcap=1; LIBS="-ltermcap $LIBS",
AC_CHECK_LIB(curses, tgetent, curses=1; LIBS="-lcurses $LIBS",
AC_MSG_ERROR(cannot find setupterm or tgetent)))))))))])
dnl Check for tputs and tparm.
if test x"$ncurses" = x"1"; then
AC_CHECK_DECLARATION(tparm, tparm, [tparm( | |)], ncurses.h, TPARM_DECLARED)
AC_CHECK_LIB(ncurses, tparm, AC_DEFINE(HAVE_TPARM, 1, Define this if you have the tparm function in an included lib.),)
AC_CHECK_HEADERS(ncurses.h ncurses/termcap.h termcap.h)
AC_CHECK_DECLARATION(tputs, tputs, [tputs( | |)], ncurses/termcap.h, TPUTS_DECLARED)
AC_CHECK_DECLARATION(tputs, tputs, [tputs( | |)], termcap.h, TPUTS_DECLARED)
AC_CHECK_LIB(ncurses, tputs, AC_DEFINE(HAVE_TPUTS, 1, Define this if you have the tputs function in an included lib.),)
fi
if test x"$curses" = x"1"; then
AC_CHECK_HEADERS(curses.h termcap.h)
AC_CHECK_DECLARATION(tparm, tparm, [tparm( | |)], curses.h, TPARM_DECLARED)
AC_CHECK_LIB(curses, tparm, AC_DEFINE(HAVE_TPARM, 1, Define this if you have the tparm function in an included lib.),)
AC_CHECK_DECLARATION(tputs, tputs, [tputs( | |)], curses.h, TPUTS_DECLARED)
AC_CHECK_LIB(curses, tputs, AC_DEFINE(HAVE_TPUTS, 1, Define this if you have the tputs function in an included lib.),)
AC_CHECK_DECLARATION(tputs, tputs, [tputs( | |)], termcap.h, TPUTS_DECLARED)
fi
if test x"$termcap" = x"1"; then
AC_CHECK_HEADERS(termcap.h)
AC_CHECK_DECLARATION(tparm, tparm, [tparm( | |)], termcap.h, TPARM_DECLARED)
AC_CHECK_LIB(termcap, tparm, AC_DEFINE(HAVE_TPARM, 1, Define this if you have the tparm function in an included lib.),)
AC_CHECK_DECLARATION(tputs, tputs, [tputs( | |)], termcap.h, TPUTS_DECLARED)
AC_CHECK_LIB(termcap, tputs, AC_DEFINE(HAVE_TPUTS, 1, Define this if you have the tputs function in an included lib.),)
fi
fi
if test x"$ncurses" = x"1" -o x"$tinfo" = x"1"; then
AC_DEFINE(HAVE_TERMINFO, 1, Define this if you have terminfo support.)
if test -z "$EMXOS2" -a -z "$MINGWIN32"; then
AC_MSG_CHECKING(whether to use use termcap in preference to terminfo)
AC_ARG_WITH(termcap,
[ --with-termcap Use termcap in preference to terminfo],
[ AC_MSG_RESULT(yes)
AC_SEARCH_LIBS([tgetent], [termcap termlib curses], [],
AC_MSG_ERROR([Cannot find termcap.]))],
[ AC_MSG_RESULT(no)
AC_SEARCH_LIBS([setupterm], [tinfo terminfo ncurses curses mytinfo],
AC_DEFINE(HAVE_TERMINFO, 1, [Define this if you have terminfo support.]),
[AC_MSG_WARN([Cannot find terminfo, falling back to termcap.])
AC_SEARCH_LIBS([tgetent], [termcap termlib curses], [],
AC_MSG_ERROR([Cannot find terminfo or termcap - try installing the ncurses-dev / ncurses-devel package.]))])])
AC_CHECK_FUNCS([tparm])
AC_CHECK_HEADERS([ncurses.h curses.h])
AC_CHECK_HEADERS([ncurses/termcap.h termcap.h ncurses/term.h term.h], [], [],
[[#if defined(HAVE_NCURSES_H)
#include <ncurses.h>
#elif defined(HAVE_CURSES_H)
#include <curses.h>
#endif
]])
fi
dnl Check for Tcl.