dnl Curses detection:
dnl Copyright (c) 2005 by Bas Zoetekouw <bas@debian.org>
dnl This program is free software; you can redistribute it and/or modify
dnl it under the terms of version 2 of the GNU General Public License as
dnl published by the Free Software Foundation.
dnl
dnl This program is distributed in the hope that it will be useful, but
dnl WITHOUT ANY WARRANTY; without even the implied warranty of
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
dnl General Public License for more details.
dnl
dnl You should have received a copy of the GNU General Public License
dnl along with this program; if not, write to the Free Software
dnl Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
dnl
dnl
dnl How to use this?
dnl (-) put a call to AC_CHECK_CURSES in configure.ac (after the call to
dnl AC_PROG_CC, obviously)
dnl (-) AC_CHECK_CURSES will look for a curses library (or look at the
dnl location the user specified on the ./configure command line) , and
dnl checks if it is usable. If it is found, and is usable, the shell
dnl variable $USE_CURSES is set for use in configure.ac, and the
dnl autoheader USE_CURSES will be defined.
dnl (-) the includes and libraries cc options are put into the
dnl $CURSES_INCLUDES and $CURSES_LIBS shell variables and the automake
dnl variables @CURSES_INCLUDES@ and @CURSES_LIBS@. Additional flags
dnl that are needed are put in $CURSES_FLAGS and @CURSES_FLAGS@
dnl First define the headers for config.h.in:
AH_TEMPLATE([USE_CURSES],[
Use Ncurses?
])
AH_TEMPLATE([CURSES_WCHAR],[
Does curses have support for non-iso8859 charsets?
])
AH_TEMPLATE(CURSES_H_NAME, [
Name of the ncurses.h file that should be included
])
AH_TEMPLATE([CURSES_COLORS],[
Defined if curses has support for colors
])
AH_TEMPLATE(CURSES_KEY_END,[
Defined if curses has KEY_END definition
])
AH_TEMPLATE(CURSES_MOUSE,[
Defined if curses has support for mouse events
])
dnl
dnl "main" function. Call this from configure.ac
dnl
AC_DEFUN([AC_CHECK_CURSES],[
CFLAGS=${CFLAGS--O}
curses_location=false
use_curses=true
AC_ARG_WITH(curses,
[ --with-curses=dir Use <dir> as base dir for curses library],
[
if test "x$withval" = "xno"
then
use_curses=false
fi
if test "x$withval" != "xyes"
then
curses_location=$withval
fi
]
)
dnl search for (n)curses.h
if test "x$use_curses" = "xtrue"
then
AC_SEARCH_CURSES_H()
fi
dnl if we found anything, check if it works
if test "x$found_curses_h" = "xtrue"; then
AC_CHECK_CURSES_COMPILE()
else
curses_usable=false
fi
dnl if it works, check for several features and set variables
if test "x$curses_usable" = "xtrue"
then
USE_CURSES=true
dnl use curses
AC_DEFINE(USE_CURSES)
dnl define lib and include dirs
CURSES_INCLUDES=$curses_includes
CURSES_LIBS=$curses_libs
AC_SUBST(CURSES_INCLUDES)
AC_SUBST(CURSES_LIBS)
dnl name of ncurses.h file
AC_DEFINE_UNQUOTED(CURSES_H_NAME, [<$curses_h>])
dnl colors?
AC_CURSES_CHECK_COLORS()
if test "x$curses_colors" = "xtrue"
then
AC_DEFINE(CURSES_COLORS)
CURSES_COLORS=true
else
CURSES_COLORS=false
fi
dnl mouse?
AC_CURSES_CHECK_MOUSE()
if test "x$curses_mouse" = "xtrue"
then
AC_DEFINE(CURSES_MOUSE)
CURSES_MOUSE=true
else
CURSES_MOUSE=false
fi
dnl wchar?
AC_CURSES_CHECK_WIDECHAR()
if test "x$curses_wchar" = "xfalse"
then
CURSES_WCHAR=false
else
AC_DEFINE(CURSES_WCHAR)
CURSES_WCHAR=true
CURSES_FLAGS=$curses_wchar
AC_SUBST(CURSES_FLAGS)
fi
dnl end key?
AC_CURSES_CHECK_ENDKEY()
if test "x$curses_endkey" = "xtrue"
then
AC_DEFINE(CURSES_KEY_END)
CURSES_KEY_END=true
else
CURSES_KEY_END=false
fi
fi
])
dnl
dnl searches for curses in a specific place
dnl Parameters: directory filename curses_LIBS curses_INCLUDES
dnl
AC_DEFUN([AC_SEARCH_CURSES_FILE], [
if test "x$stop_searching" = "xfalse"
then
if test -f $1/$2
then
AC_MSG_RESULT([$1/$2])
curses_h="$2"
curses_libs="$3"
curses_includes="$4"
stop_searching=true
found_curses_h=true
fi
fi
])
dnl
dnl Search for curses.h in several different places
dnl
AC_DEFUN([AC_SEARCH_CURSES_H], [
AC_MSG_CHECKING([location of curses.h file])
stop_searching=false
found_curses_h=false
dnl if a particular location was specified
if test "x$curses_location" != "xfalse"
then
dnl check this particular location
AC_SEARCH_CURSES_FILE($curses_location/include, ncursesw/ncurses.h,
-L$curses_location/lib -lncursesw,
-I$curses_location/include )
AC_SEARCH_CURSES_FILE($curses_location/include, ncursesw.h,
-L$curses_location/lib -lncursesw,
-I$curses_location/include )
AC_SEARCH_CURSES_FILE($curses_location/include, ncurses/ncurses.h,
-L$curses_location/lib -lncurses,
-I$curses_location/include )
AC_SEARCH_CURSES_FILE($curses_location/include, ncurses.h,
-L$curses_location/lib -lncurses,
-I$curses_location/include )
AC_SEARCH_CURSES_FILE($curses_location/include, curses.h,
-L$curses_location/lib -lncurses,
-I$curses_location/include )
else
dnl check lots of default locations
dnl first preference is ncursesw
AC_SEARCH_CURSES_FILE(/usr/local/include, ncursesw/ncurses.h,
-L/usr/local/lib -lncursesw,
-I/usr/local/include )
AC_SEARCH_CURSES_FILE(/usr/local/include/, ncursesw.h,
-L/usr/local/lib -lncursesw,
-I/usr/local/include )
AC_SEARCH_CURSES_FILE(/usr/include, ncursesw/ncurses.h,
-L/usr/lib -lncursesw,
-I/usr/include )
AC_SEARCH_CURSES_FILE(/usr/include/, ncursesw.h,
-L/usr/lib -lncursesw,
-I/usr/include )
dnl after that, look for normal ncurses
AC_SEARCH_CURSES_FILE(/usr/local/include, ncurses.h,
-L/usr/local/lib -lncurses,
-I/usr/local/include )
AC_SEARCH_CURSES_FILE(/usr/local/include, ncurses/ncurses.h,
-L/usr/local/lib -lncurses,
-I/usr/local/include )
AC_SEARCH_CURSES_FILE(/usr/include, ncurses.h,
-L/usr/lib -lncurses,
-I/usr/include )
AC_SEARCH_CURSES_FILE(/usr/include, ncurses/ncurses.h,
-L/usr/lib -lncurses,
-I/usr/include )
dnl after that, look for curses
AC_SEARCH_CURSES_FILE(/usr/local/include, curses.h,
-L/usr/local/lib -lncurses,
-I/usr/local/include )
AC_SEARCH_CURSES_FILE(/usr/local/include, curses/curses.h,
-L/usr/local/lib -lncurses,
-I/usr/local/include )
AC_SEARCH_CURSES_FILE(/usr/include, curses.h,
-L/usr/lib -lncurses,
-I/usr/include )
AC_SEARCH_CURSES_FILE(/usr/include, curses/curses.h,
-L/usr/lib -lncurses,
-I/usr/include )
fi
])
dnl
dnl check if the curses header we found, works
dnl
AC_DEFUN([AC_CHECK_CURSES_COMPILE], [
dnl save CFLAGS and LIBS and set new ones
CFLAGS_OLD=$CFLAGS
CFLAGS="$CFLAGS $curses_includes"
LIBS_OLD=$LIBS
LIBS="$LIBS $curses_libs"
dnl do the compile test
AC_MSG_CHECKING([if curses is usable])
AC_LINK_IFELSE([
AC_LANG_PROGRAM(
[[
#include <$curses_h>
]],
[[
initscr();
printw("Hello World !!!");
refresh();
getch();
endwin();
return 0;
]]
)],
[
curses_usable=true
AC_MSG_RESULT([yes])
],
[
curses_usable=false
AC_MSG_RESULT([no])
]
)
dnl restore variables
CFLAGS=$CFLAGS_OLD
LIBS=$LIBS_OLD
])
dnl
dnl check if this version of curses has support for colors
dnl
AC_DEFUN([AC_CURSES_CHECK_COLORS], [
dnl save and change CFLAGS
CFLAGS_OLD=$CFLAGS
CFLAGS="$CFLAGS $curses_includes"
dnl print nice message
AC_MSG_CHECKING([if ncurses supports colors])
dnl we check for definition of COLOR_YELLOW
AC_EGREP_CPP(
HAVE_COLOR_YELLOW,
[
#include <$curses_h>
#ifdef COLOR_YELLOW
HAVE_COLOR_YELLOW
#endif
],
[
curses_colors=true
AC_MSG_RESULT(yes)
],
[
curses_colors=false
AC_MSG_RESULT(no)
]
)
dnl restore CFLAGS
CFLAGS=$CFLAGS_OLD
])
dnl
dnl check if this version of curses can handle utf8 and friends
dnl
AC_DEFUN([AC_CURSES_CHECK_WIDECHAR], [
dnl save and change CFLAGS
CFLAGS_OLD=$CFLAGS
CFLAGS="$CFLAGS $curses_includes"
dnl print nice message
AC_MSG_CHECKING([if ncurses supports extended chars])
dnl this will contain the define we need
curses_wchar=false
dnl first check with default options
dnl we check for existence of the add_wch() function
AC_COMPILE_IFELSE([
AC_LANG_PROGRAM(
[[ #include <$curses_h> ]],
[[ char *p = (char *) add_wch; ]]
)],
[
dnl if found, set variables and print result
curses_wchar=true
AC_MSG_RESULT([yes])
],
[
dnl if not found, do NOP
true
]
)
dnl not found, now try with -D_XOPEN_SOURCE_EXTENDED
if test "x$curses_wchar" = "xfalse"
then
AC_COMPILE_IFELSE([
AC_LANG_PROGRAM(
[[
#define _XOPEN_SOURCE_EXTENDED
#include <$curses_h>
]],
[[ char *p = (char *) add_wch; ]]
)],
[
dnl if found, set variables and print result
curses_wchar=-D_XOPEN_SOURCE_EXTENDED
AC_MSG_RESULT([yes, with $curses_wchar])
],
[
dnl if not found, do NOP
true
]
)
fi
dnl restore CFLAGS
CFLAGS=$CFLAGS_OLD
dnl print message if not found
if test "x$curses_wchar" = "xfalse"
then
AC_MSG_RESULT([no]);
fi
])
dnl
dnl check if this version of curses has an end key definition
dnl
AC_DEFUN([AC_CURSES_CHECK_ENDKEY], [
dnl save and change CFLAGS
CFLAGS_OLD=$CFLAGS
CFLAGS="$CFLAGS $curses_includes"
dnl print nice message
AC_MSG_CHECKING([if ncurses supports the end key])
dnl we check for definition of HAVE_KEY_END
AC_EGREP_CPP(
HAVE_KEY_END,
[
#include <$curses_h>
#ifdef KEY_END
HAVE_KEY_END
#endif
],
[
curses_endkey=true
AC_MSG_RESULT(yes)
],
[
curses_endkey=false
AC_MSG_RESULT(no)
]
)
dnl restore CFLAGS
CFLAGS=$CFLAGS_OLD
])
dnl
dnl check if this version of curses has support for mouse events
dnl
AC_DEFUN([AC_CURSES_CHECK_MOUSE], [
dnl save and change CFLAGS
CFLAGS_OLD=$CFLAGS
CFLAGS="$CFLAGS $curses_includes"
dnl print nice message
AC_MSG_CHECKING([if ncurses supports mouse events])
dnl we check for definition of BUTTON1_CLICKED
AC_EGREP_CPP(
HAVE_BUTTON1_CLICKED,
[
#include <$curses_h>
#ifdef BUTTON1_CLICKED
HAVE_BUTTON1_CLICKED
#endif
],
[
curses_mouse=true
AC_MSG_RESULT(yes)
],
[
curses_mouse=false
AC_MSG_RESULT(no)
]
)
dnl restore CFLAGS
CFLAGS=$CFLAGS_OLD
])
dnl vim:ts=4:sw=4