From 5eee0216193ef9e6ca39906aeeb7b7774097a2f7 Mon Sep 17 00:00:00 2001 From: Justin Lecher Date: Sat, 26 Nov 2016 12:55:42 +0100 Subject: [PATCH] Use pkg-config to detect ncurses Update ax_with_curses.m4 to latest version and use pkg-config as primary detection mechanism for ncurses. Latest version of ax_with_curses.m4 supports pkg-config. This is important as libcurses is split into libcurses.so and libtinfo.so on many distros and linking against libcurses.so is not sufficiant. Pkg-config allows proper detection of necessary libs. Signed-off-by: Justin Lecher Also include ax_require_defined.m4 to fix issue with undefined macro: configure:3751: error: possibly undefined macro: AX_REQUIRE_DEFINED If this token and others are legitimate, please use m4_pattern_allow. See the Autoconf documentation. configure:3751: error: possibly undefined macro: PKG_CHECK_EXISTS Signed-off-by: Jonas Fonseca --- config.make.in | 2 +- configure.ac | 2 +- tools/ax_require_defined.m4 | 37 ++++++++++++ tools/ax_with_curses.m4 | 142 ++++++++++++++++++++++++++++++++------------ 4 files changed, 142 insertions(+), 41 deletions(-) create mode 100644 tools/ax_require_defined.m4 diff --git a/config.make.in b/config.make.in index bf41d85..a7c9ce3 100644 --- a/config.make.in +++ b/config.make.in @@ -12,7 +12,7 @@ CC = @CC@ CFLAGS = @CFLAGS@ @COVERAGE_CFLAGS@ CPPFLAGS = @CPPFLAGS@ -DHAVE_CONFIG_H LDFLAGS = @LDFLAGS@ -LDLIBS = @LIBS@ @CURSES_LIB@ +LDLIBS = @LIBS@ @CURSES_LIBS@ ASCIIDOC = @ASCIIDOC@ XMLTO = @XMLTO@ diff --git a/configure.ac b/configure.ac index 0bcfb3f..8b956ba 100644 --- a/configure.ac +++ b/configure.ac @@ -29,7 +29,7 @@ case "$ax_cv_ncursesw" in "no") AC_MSG_WARN([The found ncurses library does not support wide-char.]) AC_MSG_WARN([This means that tig will not correctly render UTF-8.]) esac -AC_SUBST(CURSES_LIB) +AC_SUBST(CURSES_LIBS) AX_LIB_READLINE(6.2) diff --git a/tools/ax_require_defined.m4 b/tools/ax_require_defined.m4 new file mode 100644 index 0000000..cae1111 --- /dev/null +++ b/tools/ax_require_defined.m4 @@ -0,0 +1,37 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_require_defined.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_REQUIRE_DEFINED(MACRO) +# +# DESCRIPTION +# +# AX_REQUIRE_DEFINED is a simple helper for making sure other macros have +# been defined and thus are available for use. This avoids random issues +# where a macro isn't expanded. Instead the configure script emits a +# non-fatal: +# +# ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found +# +# It's like AC_REQUIRE except it doesn't expand the required macro. +# +# Here's an example: +# +# AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG]) +# +# LICENSE +# +# Copyright (c) 2014 Mike Frysinger +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 1 + +AC_DEFUN([AX_REQUIRE_DEFINED], [dnl + m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])]) +])dnl AX_REQUIRE_DEFINED diff --git a/tools/ax_with_curses.m4 b/tools/ax_with_curses.m4 index 33a37ac..9461eef 100644 --- a/tools/ax_with_curses.m4 +++ b/tools/ax_with_curses.m4 @@ -12,7 +12,9 @@ # present, along with the associated header file. The NcursesW # (wide-character) library is searched for first, followed by Ncurses, # then the system-default plain Curses. The first library found is the -# one returned. +# one returned. Finding libraries will first be attempted by using +# pkg-config, and should the pkg-config files not be available, will +# fallback to combinations of known flags itself. # # The following options are understood: --with-ncursesw, --with-ncurses, # --without-ncursesw, --without-ncurses. The "--with" options force the @@ -52,23 +54,29 @@ # # (These preprocessor symbols are discussed later in this document.) # -# The following output variable is defined by this macro; it is precious -# and may be overridden on the ./configure command line: +# The following output variables are defined by this macro; they are +# precious and may be overridden on the ./configure command line: # -# CURSES_LIB - library to add to xxx_LDADD +# CURSES_LIBS - library to add to xxx_LDADD +# CURSES_CFLAGS - include paths to add to xxx_CPPFLAGS # -# The library listed in CURSES_LIB is NOT added to LIBS by default. You -# need to add CURSES_LIB to the appropriate xxx_LDADD line in your -# Makefile.am. For example: +# In previous versions of this macro, the flags CURSES_LIB and +# CURSES_CPPFLAGS were defined. These have been renamed, in keeping with +# AX_WITH_CURSES's close bigger brother, PKG_CHECK_MODULES, which should +# eventually supersede the use of AX_WITH_CURSES. Neither the library +# listed in CURSES_LIBS, nor the flags in CURSES_CFLAGS are added to LIBS, +# respectively CPPFLAGS, by default. You need to add both to the +# appropriate xxx_LDADD/xxx_CPPFLAGS line in your Makefile.am. For +# example: # -# prog_LDADD = @CURSES_LIB@ +# prog_LDADD = @CURSES_LIBS@ +# prog_CPPFLAGS = @CURSES_CFLAGS@ # -# If CURSES_LIB is set on the configure command line (such as by running -# "./configure CURSES_LIB=-lmycurses"), then the only header searched for -# is . The user may use the CPPFLAGS precious variable to -# override the standard #include search path. If the user needs to -# specify an alternative path for a library (such as for a non-standard -# NcurseW), the user should use the LDFLAGS variable. +# If CURSES_LIBS is set on the configure command line (such as by running +# "./configure CURSES_LIBS=-lmycurses"), then the only header searched for +# is . If the user needs to specify an alternative path for a +# library (such as for a non-standard NcurseW), the user should use the +# LDFLAGS variable. # # The following shell variables may be defined by this macro: # @@ -88,7 +96,7 @@ # # AX_WITH_CURSES # if test "x$ax_cv_ncursesw" != xyes && test "x$ax_cv_ncurses" != xyes; then -# AX_MSG_ERROR([requires either NcursesW or Ncurses library]) +# AC_MSG_ERROR([requires either NcursesW or Ncurses library]) # fi # # If any Curses library will do (but one must be present and must support @@ -182,11 +190,66 @@ # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. -#serial 13 +#serial 17 + +# internal function to factorize common code that is used by both ncurses +# and ncursesw +AC_DEFUN([_FIND_CURSES_FLAGS], [ + AC_MSG_CHECKING([for $1 via pkg-config]) + + AX_REQUIRE_DEFINED([PKG_CHECK_EXISTS]) + _PKG_CONFIG([_ax_cv_$1_libs], [libs], [$1]) + _PKG_CONFIG([_ax_cv_$1_cppflags], [cflags], [$1]) + + AS_IF([test "x$pkg_failed" = "xyes" || test "x$pkg_failed" = "xuntried"],[ + AC_MSG_RESULT([no]) + # No suitable .pc file found, have to find flags via fallback + AC_CACHE_CHECK([for $1 via fallback], [ax_cv_$1], [ + AS_ECHO() + pkg_cv__ax_cv_$1_libs="-l$1" + pkg_cv__ax_cv_$1_cppflags="-D_GNU_SOURCE $CURSES_CFLAGS" + LIBS="$ax_saved_LIBS $pkg_cv__ax_cv_$1_libs" + CPPFLAGS="$ax_saved_CPPFLAGS $pkg_cv__ax_cv_$1_cppflags" + + AC_MSG_CHECKING([for initscr() with $pkg_cv__ax_cv_$1_libs]) + AC_LINK_IFELSE([AC_LANG_CALL([], [initscr])], + [ + AC_MSG_RESULT([yes]) + AC_MSG_CHECKING([for nodelay() with $pkg_cv__ax_cv_$1_libs]) + AC_LINK_IFELSE([AC_LANG_CALL([], [nodelay])],[ + ax_cv_$1=yes + ],[ + AC_MSG_RESULT([no]) + m4_if( + [$1],[ncursesw],[pkg_cv__ax_cv_$1_libs="$pkg_cv__ax_cv_$1_libs -ltinfow"], + [$1],[ncurses],[pkg_cv__ax_cv_$1_libs="$pkg_cv__ax_cv_$1_libs -ltinfo"] + ) + LIBS="$ax_saved_LIBS $pkg_cv__ax_cv_$1_libs" + + AC_MSG_CHECKING([for nodelay() with $pkg_cv__ax_cv_$1_libs]) + AC_LINK_IFELSE([AC_LANG_CALL([], [nodelay])],[ + ax_cv_$1=yes + ],[ + ax_cv_$1=no + ]) + ]) + ],[ + ax_cv_$1=no + ]) + ]) + ],[ + AC_MSG_RESULT([yes]) + # Found .pc file, using its information + LIBS="$ax_saved_LIBS $pkg_cv__ax_cv_$1_libs" + CPPFLAGS="$ax_saved_CPPFLAGS $pkg_cv__ax_cv_$1_cppflags" + ax_cv_$1=yes + ]) +]) AU_ALIAS([MP_WITH_CURSES], [AX_WITH_CURSES]) AC_DEFUN([AX_WITH_CURSES], [ - AC_ARG_VAR([CURSES_LIB], [linker library for Curses, e.g. -lcurses]) + AC_ARG_VAR([CURSES_LIBS], [linker library for Curses, e.g. -lcurses]) + AC_ARG_VAR([CURSES_CFLAGS], [preprocessor flags for Curses, e.g. -I/usr/include/ncursesw]) AC_ARG_WITH([ncurses], [AS_HELP_STRING([--with-ncurses], [force the use of Ncurses or NcursesW])], [], [with_ncurses=check]) @@ -195,20 +258,17 @@ AC_DEFUN([AX_WITH_CURSES], [ [], [with_ncursesw=check]) ax_saved_LIBS=$LIBS + ax_saved_CPPFLAGS=$CPPFLAGS + AS_IF([test "x$with_ncurses" = xyes || test "x$with_ncursesw" = xyes], [ax_with_plaincurses=no], [ax_with_plaincurses=check]) ax_cv_curses_which=no # Test for NcursesW + AS_IF([test "x$CURSES_LIBS" = x && test "x$with_ncursesw" != xno], [ + _FIND_CURSES_FLAGS([ncursesw]) - AS_IF([test "x$CURSES_LIB" = x && test "x$with_ncursesw" != xno], [ - LIBS="$ax_saved_LIBS -lncursesw" - - AC_CACHE_CHECK([for NcursesW wide-character library], [ax_cv_ncursesw], [ - AC_LINK_IFELSE([AC_LANG_CALL([], [initscr])], - [ax_cv_ncursesw=yes], [ax_cv_ncursesw=no]) - ]) AS_IF([test "x$ax_cv_ncursesw" = xno && test "x$with_ncursesw" = xyes], [ AC_MSG_ERROR([--with-ncursesw specified but could not find NcursesW library]) ]) @@ -216,7 +276,8 @@ AC_DEFUN([AX_WITH_CURSES], [ AS_IF([test "x$ax_cv_ncursesw" = xyes], [ ax_cv_curses=yes ax_cv_curses_which=ncursesw - CURSES_LIB="-lncursesw" + CURSES_LIBS="$pkg_cv__ax_cv_ncursesw_libs" + CURSES_CFLAGS="$pkg_cv__ax_cv_ncursesw_cppflags" AC_DEFINE([HAVE_NCURSESW], [1], [Define to 1 if the NcursesW library is present]) AC_DEFINE([HAVE_CURSES], [1], [Define to 1 if a SysV or X/Open compatible Curses library is present]) @@ -318,16 +379,13 @@ AC_DEFUN([AX_WITH_CURSES], [ ]) ]) ]) + unset pkg_cv__ax_cv_ncursesw_libs + unset pkg_cv__ax_cv_ncursesw_cppflags # Test for Ncurses + AS_IF([test "x$CURSES_LIBS" = x && test "x$with_ncurses" != xno && test "x$ax_cv_curses_which" = xno], [ + _FIND_CURSES_FLAGS([ncurses]) - AS_IF([test "x$CURSES_LIB" = x && test "x$with_ncurses" != xno && test "x$ax_cv_curses_which" = xno], [ - LIBS="$ax_saved_LIBS -lncurses" - - AC_CACHE_CHECK([for Ncurses library], [ax_cv_ncurses], [ - AC_LINK_IFELSE([AC_LANG_CALL([], [initscr])], - [ax_cv_ncurses=yes], [ax_cv_ncurses=no]) - ]) AS_IF([test "x$ax_cv_ncurses" = xno && test "x$with_ncurses" = xyes], [ AC_MSG_ERROR([--with-ncurses specified but could not find Ncurses library]) ]) @@ -335,7 +393,8 @@ AC_DEFUN([AX_WITH_CURSES], [ AS_IF([test "x$ax_cv_ncurses" = xyes], [ ax_cv_curses=yes ax_cv_curses_which=ncurses - CURSES_LIB="-lncurses" + CURSES_LIBS="$pkg_cv__ax_cv_ncurses_libs" + CURSES_CFLAGS="$pkg_cv__ax_cv_ncurses_cppflags" AC_DEFINE([HAVE_NCURSES], [1], [Define to 1 if the Ncurses library is present]) AC_DEFINE([HAVE_CURSES], [1], [Define to 1 if a SysV or X/Open compatible Curses library is present]) @@ -390,12 +449,13 @@ AC_DEFUN([AX_WITH_CURSES], [ ]) ]) ]) + unset pkg_cv__ax_cv_ncurses_libs + unset pkg_cv__ax_cv_ncurses_cppflags - # Test for plain Curses (or if CURSES_LIB was set by user) - + # Test for plain Curses (or if CURSES_LIBS was set by user) AS_IF([test "x$with_plaincurses" != xno && test "x$ax_cv_curses_which" = xno], [ - AS_IF([test "x$CURSES_LIB" != x], [ - LIBS="$ax_saved_LIBS $CURSES_LIB" + AS_IF([test "x$CURSES_LIBS" != x], [ + LIBS="$ax_saved_LIBS $CURSES_LIBS" ], [ LIBS="$ax_saved_LIBS -lcurses" ]) @@ -408,8 +468,8 @@ AC_DEFUN([AX_WITH_CURSES], [ AS_IF([test "x$ax_cv_plaincurses" = xyes], [ ax_cv_curses=yes ax_cv_curses_which=plaincurses - AS_IF([test "x$CURSES_LIB" = x], [ - CURSES_LIB="-lcurses" + AS_IF([test "x$CURSES_LIBS" = x], [ + CURSES_LIBS="-lcurses" ]) AC_DEFINE([HAVE_CURSES], [1], [Define to 1 if a SysV or X/Open compatible Curses library is present]) @@ -515,4 +575,8 @@ AC_DEFUN([AX_WITH_CURSES], [ AS_IF([test "x$ax_cv_curses_obsolete" != xyes], [ax_cv_curses_obsolete=no]) LIBS=$ax_saved_LIBS + CPPFLAGS=$ax_saved_CPPFLAGS + + unset ax_saved_LIBS + unset ax_saved_CPPFLAGS ])dnl