From 2ca42b2025cceaabd64889aa3b932195e8d5720c Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Thu, 13 Mar 2008 11:10:59 +0000 Subject: 24705: rationalise curses and term headers even more --- ChangeLog | 8 ++ Config/defs.mk.in | 4 + Src/Modules/curses.c | 22 +---- Src/Modules/termcap.c | 8 +- Src/Modules/terminfo.c | 28 ++----- Src/zsh.mdd | 19 ++++- configure.ac | 212 ++++++++++++++++++++++++++++++------------------- 7 files changed, 171 insertions(+), 130 deletions(-) diff --git a/ChangeLog b/ChangeLog index cb323769d..49c76fe05 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-03-13 Peter Stephenson + + * 24705: configure.ac, Config/defs.mk.in, Src/zsh.mdd, + Src/Modules/curses.c, Src/Modules/termcap.c, + Src/Modules/terminfo.c: rationalise curses and term headers + some more and add intermediate generated /Src/zshcurses.h + and /Src/zshterm.h to include the right ones. + 2008-03-12 Clint Adams * 24704: Completion/Unix/Command/_calendar: completion for BSD diff --git a/Config/defs.mk.in b/Config/defs.mk.in index bfa96edf7..5195bf8e0 100644 --- a/Config/defs.mk.in +++ b/Config/defs.mk.in @@ -29,6 +29,10 @@ SHELL = /bin/sh @SET_MAKE@ EXEEXT = @EXEEXT@ +# headers +ZSH_CURSES_H = @ZSH_CURSES_H@ +ZSH_TERM_H = @ZSH_TERM_H@ + # install basename tzsh = @tzsh@ diff --git a/Src/Modules/curses.c b/Src/Modules/curses.c index 0649f5750..df8a9cdc6 100644 --- a/Src/Modules/curses.c +++ b/Src/Modules/curses.c @@ -41,26 +41,8 @@ # undef HAVE_NCURSESW_NCURSES_H #endif -#ifdef ZSH_IGNORE_NCURSES -# ifdef HAVE_CURSES_H -# include -# endif -#else -# ifdef HAVE_NCURSESW_NCURSES_H -# include -# else -# ifdef HAVE_NCURSES_NCURSES_H -# include -# else -# ifdef HAVE_NCURSES_H -# include -# else -# ifdef HAVE_CURSES_H -# include -# endif -# endif -# endif -# endif +#ifdef ZSH_HAVE_CURSES_H +# include "../zshcurses.h" #endif #ifdef HAVE_SETCCHAR diff --git a/Src/Modules/termcap.c b/Src/Modules/termcap.c index 351324a68..776351cf6 100644 --- a/Src/Modules/termcap.c +++ b/Src/Modules/termcap.c @@ -36,7 +36,7 @@ #include "../../config.h" #ifdef HAVE_TGETENT -# if defined(HAVE_CURSES_H) && defined(HAVE_TERM_H) +# if defined(ZSH_HAVE_CURSES_H) && defined(ZSH_HAVE_TERM_H) # define USES_TERM_H 1 # else # ifdef HAVE_TERMCAP_H @@ -54,10 +54,10 @@ # ifdef HAVE_TERMIO_H # include # endif -# ifdef TERM_H_NEEDS_CURSES_H -# include +# ifdef ZSH_HAVE_CURSES_H +# include "../zshcurses.h" # endif -# include +# include "../zshterm.h" # else # ifdef USES_TERMCAP_H # include diff --git a/Src/Modules/terminfo.c b/Src/Modules/terminfo.c index 1038c243e..db9a6c053 100644 --- a/Src/Modules/terminfo.c +++ b/Src/Modules/terminfo.c @@ -30,7 +30,7 @@ #define USES_TERM_H 1 #include "terminfo.mdh" -#if defined(HAVE_TIGETFLAG) && (defined(HAVE_CURSES_H) || defined(HAVE_NCURSES_H) || defined(HAVE_NCURSES_NCURSES_H) || defined(HAVE_NCURSESW_NCURSES_H)) +#if defined(HAVE_TIGETFLAG) && defined(ZSH_HAVE_CURSES_H) # define USE_TERMINFO_MODULE 1 #else # undef USE_TERMINFO_MODULE @@ -49,30 +49,12 @@ # undef offsetof # endif -#ifdef ZSH_IGNORE_NCURSES -# ifdef HAVE_CURSES_H -# include -# endif -#else -# ifdef HAVE_NCURSESW_NCURSES_H -# include -# else -# ifdef HAVE_NCURSES_NCURSES_H -# include -# else -# ifdef HAVE_NCURSES_H -# include -# else -# ifdef HAVE_CURSES_H -# include -# endif -# endif -# endif -# endif +#ifdef ZSH_HAVE_CURSES_H +# include "../zshcurses.h" #endif -# ifdef HAVE_TERM_H -# include +# ifdef ZSH_HAVE_TERM_H +# include "../zshterm.h" # endif /* echoti: output a terminfo capability */ diff --git a/Src/zsh.mdd b/Src/zsh.mdd index 8aef628c5..ab36ec8d7 100644 --- a/Src/zsh.mdd +++ b/Src/zsh.mdd @@ -33,9 +33,26 @@ init.o: bltinmods.list zshpaths.h zshxmods.h init.o params.o parse.o: version.h -version.h: $(sdir_top)/Config/version.mk +# The main shell doesn't currently need zshcurses.h and zshterm.h, +# but make sure these are built with the headers. +# If it did need need them they would be in headers at the top instead. +version.h: $(sdir_top)/Config/version.mk zshcurses.h zshterm.h echo '#define ZSH_VERSION "'$(VERSION)'"' > $@ +zshcurses.h: ../config.h + @if test x$(ZSH_CURSES_H) != x; then \ + echo "#include <$(ZSH_CURSES_H)>" >zshcurses.h; \ + else \ + echo >zshcurses.h; \ + fi + +zshterm.h: ../config.h + @if test x$(ZSH_TERM_H) != x; then \ + echo "#include <$(ZSH_TERM_H)>" >zshterm.h; \ + else \ + echo >zshterm.h; \ + fi + zshpaths.h: Makemod $(CONFIG_INCS) @echo '#define MODULE_DIR "'$(MODDIR)'"' > zshpaths.h.tmp @if test x$(sitescriptdir) != xno; then \ diff --git a/configure.ac b/configure.ac index ea0b51583..88a7d836d 100644 --- a/configure.ac +++ b/configure.ac @@ -685,20 +685,6 @@ if test x$zsh_cv_curses_needs_xopen = xyes; then AC_DEFINE(ZSH_CURSES_NEEDS_XOPEN) fi -AH_TEMPLATE([HAVE_BOOLCODES], -[Define if you have the termcap boolcodes symbol.]) -AH_TEMPLATE([HAVE_NUMCODES], -[Define if you have the termcap numcodes symbol.]) -AH_TEMPLATE([HAVE_STRCODES], -[Define if you have the termcap strcodes symbol.]) -AH_TEMPLATE([HAVE_BOOLNAMES], -[Define if you have the terminfo boolnames symbol.]) -AH_TEMPLATE([HAVE_NUMNAMES], -[Define if you have the terminfo numnames symbol.]) -AH_TEMPLATE([HAVE_STRNAMES], -[Define if you have the terminfo strnames symbol.]) -AH_TEMPLATE([TERM_H_NEEDS_CURSES_H], -[Define if term.h chokes without curses.h.]) dnl Check for tigetflag (terminfo) before tgetent (termcap). dnl That's so that on systems where termcap and [n]curses are dnl both available and both contain termcap functions, while @@ -721,69 +707,18 @@ ac_cv_header_curses_solaris=no)) if test x$ac_cv_header_curses_solaris = xyes; then AC_DEFINE(HAVE_CURSES_H) fi]) -AC_CHECK_HEADERS(term.h, -[AC_MSG_CHECKING(if term.h needs curses.h) -AC_TRY_COMPILE([#include ], [char **test = boolcodes;], boolcodes_with_only_term_h=yes, -boolcodes_with_only_term_h=no) -AC_TRY_COMPILE([#include -#include ], [char **test = boolcodes;], boolcodes_with_curses_h_and_term_h=yes, -boolcodes_with_curses_h_and_term_h=no) -if test "x$boolcodes_with_curses_h_and_term_h" = xyes && test "x$boolcodes_with_only_term_h" = xno; -then -AC_DEFINE(TERM_H_NEEDS_CURSES_H) -AC_MSG_RESULT(yes) -else -AC_MSG_RESULT(no) -fi - -AC_MSG_CHECKING(if boolcodes is available) -AC_TRY_LINK([#ifdef TERM_H_NEEDS_CURSES_H -#include -#endif -#include ], [char **test = boolcodes; printf(*test);], -AC_DEFINE(HAVE_BOOLCODES) boolcodes=yes, boolcodes=no) -AC_MSG_RESULT($boolcodes) -AC_MSG_CHECKING(if numcodes is available) -AC_TRY_LINK([#ifdef TERM_H_NEEDS_CURSES_H -#include -#endif -#include ], [char **test = numcodes; printf(*test);], -AC_DEFINE(HAVE_NUMCODES) numcodes=yes, numcodes=no) -AC_MSG_RESULT($numcodes) -AC_MSG_CHECKING(if strcodes is available) -AC_TRY_LINK([#ifdef TERM_H_NEEDS_CURSES_H -#include -#endif -#include ], [char **test = strcodes; printf(*test);], -AC_DEFINE(HAVE_STRCODES) strcodes=yes, strcodes=no) -AC_MSG_RESULT($strcodes) -AC_MSG_CHECKING(if boolnames is available) -AC_TRY_LINK([#include -#include ], [char **test = boolnames; printf(*test);], -AC_DEFINE(HAVE_BOOLNAMES) boolnames=yes, boolnames=no) -AC_MSG_RESULT($boolnames) -AC_MSG_CHECKING(if numnames is available) -AC_TRY_LINK([#include -#include ], [char **test = numnames; printf(*test);], -AC_DEFINE(HAVE_NUMNAMES) numnames=yes, numnames=no) -AC_MSG_RESULT($numnames) -AC_MSG_CHECKING(if strnames is available) -AC_TRY_LINK([#include -#include ], [char **test = strnames; printf(*test);], -AC_DEFINE(HAVE_STRNAMES) strnames=yes, strnames=no) -AC_MSG_RESULT($strnames) -]) - dnl If our terminal library is not ncurses, don't try including dnl any ncurses headers. -AH_TEMPLATE([ZSH_IGNORE_NCURSES], -[Define to 1 to ignore any ncurses library headers found on the system.]) -case $LIBS in - *-lncurses*) ;; +AC_CACHE_CHECK(if we need to ignore ncurses, zsh_cv_ignore_ncurses, +[case $LIBS in + *-lncurses*) + zsh_cv_ignore_ncurses=no + ;; *) - AC_DEFINE(ZSH_IGNORE_NCURSES) ;; -esac + zsh_cv_ignore_ncurses=yes + ;; +esac]) AC_SEARCH_LIBS(getpwnam, nsl) @@ -1407,20 +1342,42 @@ zsh_cv_path_errno_h="$ERRNO_H" ERRNO_H="$zsh_cv_path_errno_h" AC_SUBST(ERRNO_H)dnl +AC_CACHE_CHECK(location of curses header, zsh_cv_path_curses_header, +[if test x$zsh_cv_ignore_ncurses = xyes; then + if test x$ac_cv_header_curses_h = xyes; then + zsh_cv_path_curses_header=curses.h + else + zsh_cv_path_curses_header=none + fi +elif test x$ac_cv_header_ncursesw_ncurses_h = xyes; then + zsh_cv_path_curses_header=ncursesw/ncurses.h +elif test x$ac_cv_header_ncurses_ncurses_h = xyes; then + zsh_cv_path_curses_header=ncurses/ncurses.h +elif test x$ac_cv_header_ncurses_h = xyes; then + zsh_cv_path_curses_header=ncurses.h +elif test x$ac_cv_header_curses_h = xyes; then + zsh_cv_path_curses_header=curses.h +else + zsh_cv_path_curses_header=none +fi]) +AH_TEMPLATE([ZSH_HAVE_CURSES_H], +[Define to 1 if some variant of a curses header can be included]) +if test x$zsh_cv_path_curses_header != xnone; then + AC_DEFINE(ZSH_HAVE_CURSES_H) + ZSH_CURSES_H=$zsh_cv_path_curses_header +else + ZSH_CURSES_H= +fi +AC_SUBST(ZSH_CURSES_H) + dnl Where are curses key definitions located? Need for keypad() mode. AC_CACHE_CHECK(where curses key definitions are located, zsh_cv_path_curses_keys_h, [dnl This is an identical trick to errno.h, except we use ncurses.h dnl if we can. -if test x$ac_cv_header_ncurses_h = xyes; then - echo "#include " >nametmp.c -elif test x$ac_cv_header_ncurses_ncurses_h = xyes; then - echo "#include " >nametmp.c -elif test x$ac_cv_header_ncursesw_ncurses_h = xyes; then - echo "#include " >nametmp.c -elif test x$ac_cv_header_curses_h = xyes; then - echo "#include " >nametmp.c -else +if test x$zsh_cv_path_curses_header = xnone; then echo >nametmp.c +else + echo "#include <$zsh_cv_path_curses_header>" >nametmp.c fi curses_list="`$CPP nametmp.c | @@ -1446,6 +1403,97 @@ zsh_cv_path_curses_keys_h="$CURSES_KEYS_H" CURSES_KEYS_H="$zsh_cv_path_curses_keys_h" AC_SUBST(CURSES_KEYS_H)dnl +dnl See if there are variants of term.h. For testing each one +dnl we include the most likely variant of the curses header. +AC_CHECK_HEADERS(ncursesw/term.h, +true, true, +[#include ]) +AC_CHECK_HEADERS(ncurses/term.h, +true, true, +[#include ]) +AC_CHECK_HEADERS(term.h, +true, true, +[#include ]) + +dnl See if term.h is bundled along with the curses library we +dnl are using. If this isn't the default system curses, compilation +dnl could barf unless we include from the right subdirectory. +AC_CACHE_CHECK(where term.h is located, zsh_cv_path_term_header, +[case x$zsh_cv_path_curses_header in + xncursesw/*) + if test x$ac_cv_header_ncursesw_term_h = xyes; then + zsh_cv_path_term_header=ncursesw/term.h + fi + ;; + xncurses/*) + if test x$ac_cv_header_ncurses_term_h = xyes; then + zsh_cv_path_term_header=ncurses/term.h + fi + ;; +esac +if test x$zsh_cv_path_term_header = x; then + if test x$ac_cv_header_term_h = xyes; then + zsh_cv_path_term_header=term.h + else + zsh_cv_path_term_header=none + fi +fi]) + +AH_TEMPLATE([ZSH_HAVE_TERM_H], +[Define to 1 if some variant of term.h can be included]) +AH_TEMPLATE([HAVE_BOOLCODES], +[Define if you have the termcap boolcodes symbol.]) +AH_TEMPLATE([HAVE_NUMCODES], +[Define if you have the termcap numcodes symbol.]) +AH_TEMPLATE([HAVE_STRCODES], +[Define if you have the termcap strcodes symbol.]) +AH_TEMPLATE([HAVE_BOOLNAMES], +[Define if you have the terminfo boolnames symbol.]) +AH_TEMPLATE([HAVE_NUMNAMES], +[Define if you have the terminfo numnames symbol.]) +AH_TEMPLATE([HAVE_STRNAMES], +[Define if you have the terminfo strnames symbol.]) + +if test x$zsh_cv_path_term_header != xnone; then + AC_DEFINE(ZSH_HAVE_TERM_H) + ZSH_TERM_H=$zsh_cv_path_term_header + if test x$zsh_cv_path_curses_header != xnone; then + term_includes="#include <$zsh_cv_path_curses_header> +#include <$zsh_cv_path_term_header>" + else + term_includes="#include <$zsh_cv_path_term_header>" + fi + + AC_MSG_CHECKING(if boolcodes is available) + AC_TRY_LINK($term_includes, [char **test = boolcodes; printf(*test);], + AC_DEFINE(HAVE_BOOLCODES) boolcodes=yes, boolcodes=no) + AC_MSG_RESULT($boolcodes) + AC_MSG_CHECKING(if numcodes is available) + AC_TRY_LINK($term_includes, [char **test = numcodes; printf(*test);], + AC_DEFINE(HAVE_NUMCODES) numcodes=yes, numcodes=no) + AC_MSG_RESULT($numcodes) + AC_MSG_CHECKING(if strcodes is available) + AC_TRY_LINK($term_includes, [char **test = strcodes; printf(*test);], + AC_DEFINE(HAVE_STRCODES) strcodes=yes, strcodes=no) + AC_MSG_RESULT($strcodes) + AC_MSG_CHECKING(if boolnames is available) + AC_TRY_LINK($term_includes, [char **test = boolnames; printf(*test);], + AC_DEFINE(HAVE_BOOLNAMES) boolnames=yes, boolnames=no) + AC_MSG_RESULT($boolnames) + AC_MSG_CHECKING(if numnames is available) + AC_TRY_LINK($term_includes, [char **test = numnames; printf(*test);], + AC_DEFINE(HAVE_NUMNAMES) numnames=yes, numnames=no) + AC_MSG_RESULT($numnames) + AC_MSG_CHECKING(if strnames is available) + AC_TRY_LINK($term_includes, [char **test = strnames; printf(*test);], + AC_DEFINE(HAVE_STRNAMES) strnames=yes, strnames=no) + AC_MSG_RESULT($strnames) +else + ZSH_TERM_H= +fi +AC_SUBST(ZSH_TERM_H) + + dnl ----------------------------------------------------- dnl Look for the file containing the RLIMIT_* definitions dnl ----------------------------------------------------- -- cgit 1.4.1