On Thu, 2014-06-26 at 18:40 +0200, Vincent Bernat wrote:
>  ❦ 26 juin 2014 11:26 -0500, Dan Williams <d...@redhat.com> :
> 
> >> GNU linker will try to resolve dependencies recursively but more modern
> >> linkers like the Gold linker doesn't. GNU linker may be told not to do
> >> that with -Wl,--no-add-needed. Reading the documentation, I see that
> >> --no-add-needed is now --no-copy-dt-needed-entries and I am a bit lazy
> >> to understand the explanation. Also read the --as-needed option:
> >>  https://sourceware.org/binutils/docs/ld/Options.html
> >> 
> >> Some distribution enforce those flags.
> >
> > Yeah, I forgot about gold.  I guess this is why pkgconfig is great,
> > since then you don't have to do a crapload of guesswork yourself (or in
> > the m4).  So, I suppose we add the readline m4 thing, but unfortunately
> > we need to hack it up ourselves, because it doesn't define READLINE_LIBS
> > even though it did all the work to find them...
> 
> I am using this version:
> 
>  https://github.com/vincentbernat/lldpd/blob/master/m4/ax_lib_readline.m4
> 
> Which is almost like the original except that I use READLINE_LIBS (which
> is a copy of $ax_cv_lib_readline only if readline is detected) and I
> check for more symbols to detect a non-broken libreadline (this works
> with libedit too).
> 
> But yes, it would be far more convenient if libreadline would use
> pkg-config. Dunno why they don't.

Hah, I'd just done the attached patch... would that work, or do you
think it should be improved?

Dan
>From 87494f2afb650a65940deb20c95551c76d1358fc Mon Sep 17 00:00:00 2001
From: Dan Williams <d...@redhat.com>
Date: Thu, 26 Jun 2014 12:04:19 -0500
Subject: [PATCH] build: check harder for readline

If NM is built with a linker (like gold) that doesn't add all
dependencies of each library, it will fail to find "libtinfo" which
readline is typically linked against.  So try harder to find
the readline libraries we need.  M4 based on ax_lib_readline.m4 from:

http://www.gnu.org/software/autoconf-archive/ax_lib_readline.html
---
 configure.ac          |  10 +++--
 m4/ax_lib_readline.m4 | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 111 insertions(+), 3 deletions(-)
 create mode 100644 m4/ax_lib_readline.m4

diff --git a/configure.ac b/configure.ac
index 8634203..617554f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -389,19 +389,23 @@ AC_SUBST(LIBNL_LIBS)
 PKG_CHECK_MODULES(UUID, uuid)
 AC_SUBST(UUID_CFLAGS)
 AC_SUBST(UUID_LIBS)
 
 dnl
 dnl Checks for readline library - used by nmcli
 dnl
-#PKG_CHECK_MODULES(READLINE, readline)
-AC_CHECK_LIB(readline, readline, [READLINE_LIBS=-lreadline], [AC_MSG_ERROR(readline library is required)])
-AC_CHECK_HEADERS(readline/readline.h, [], [AC_MSG_ERROR(readline/readline.h - readline devel files required)])
+AX_LIB_READLINE
+READLINE_LIBS="$LIBS"
 AC_SUBST(READLINE_LIBS)
 
+#PKG_CHECK_MODULES(READLINE, readline)
+#AC_CHECK_LIB(readline, readline, [READLINE_LIBS=-lreadline], [AC_MSG_ERROR(readline library is required)])
+#AC_CHECK_HEADERS(readline/readline.h, [], [AC_MSG_ERROR(readline/readline.h - readline devel files required)])
+#AC_SUBST(READLINE_LIBS)
+
 # Intel WiMAX SDK checks
 PKG_CHECK_MODULES(IWMX_SDK, [libiWmxSdk-0 >= 1.5.1], [have_wimax=yes],[have_wimax=no])
 AC_ARG_ENABLE(wimax, AS_HELP_STRING([--enable-wimax], [enable WiMAX support]),
                      [enable_wimax=${enableval}], [enable_wimax=${have_wimax}])
 if (test "${enable_wimax}" = "yes"); then
 	if test x"$have_wimax" = x"no"; then
 		AC_MSG_ERROR(Intel WiMAX SDK is required)
diff --git a/m4/ax_lib_readline.m4 b/m4/ax_lib_readline.m4
new file mode 100644
index 0000000..dc53aa3
--- /dev/null
+++ b/m4/ax_lib_readline.m4
@@ -0,0 +1,104 @@
+# ===========================================================================
+#      http://www.gnu.org/software/autoconf-archive/ax_lib_readline.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_LIB_READLINE
+#
+# DESCRIPTION
+#
+#   Searches for a readline compatible library. If found, defines
+#   `HAVE_LIBREADLINE'. If the found library has the `add_history' function,
+#   sets also `HAVE_READLINE_HISTORY'. Also checks for the locations of the
+#   necessary include files and sets `HAVE_READLINE_H' or
+#   `HAVE_READLINE_READLINE_H' and `HAVE_READLINE_HISTORY_H' or
+#   'HAVE_HISTORY_H' if the corresponding include files exists.
+#
+#   The libraries that may be readline compatible are `libedit',
+#   `libeditline' and `libreadline'. Sometimes we need to link a termcap
+#   library for readline to work, this macro tests these cases too by trying
+#   to link with `libtermcap', `libcurses' or `libncurses' before giving up.
+#
+#   Here is an example of how to use the information provided by this macro
+#   to perform the necessary includes or declarations in a C file:
+#
+#     #ifdef HAVE_LIBREADLINE
+#     #  if defined(HAVE_READLINE_READLINE_H)
+#     #    include <readline/readline.h>
+#     #  elif defined(HAVE_READLINE_H)
+#     #    include <readline.h>
+#     #  else /* !defined(HAVE_READLINE_H) */
+#     extern char *readline ();
+#     #  endif /* !defined(HAVE_READLINE_H) */
+#     char *cmdline = NULL;
+#     #else /* !defined(HAVE_READLINE_READLINE_H) */
+#       /* no readline */
+#     #endif /* HAVE_LIBREADLINE */
+#
+#     #ifdef HAVE_READLINE_HISTORY
+#     #  if defined(HAVE_READLINE_HISTORY_H)
+#     #    include <readline/history.h>
+#     #  elif defined(HAVE_HISTORY_H)
+#     #    include <history.h>
+#     #  else /* !defined(HAVE_HISTORY_H) */
+#     extern void add_history ();
+#     extern int write_history ();
+#     extern int read_history ();
+#     #  endif /* defined(HAVE_READLINE_HISTORY_H) */
+#       /* no history */
+#     #endif /* HAVE_READLINE_HISTORY */
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Ville Laurikari <v...@iki.fi>
+#
+#   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 6
+
+AU_ALIAS([VL_LIB_READLINE], [AX_LIB_READLINE])
+AC_DEFUN([AX_LIB_READLINE], [
+  AC_CACHE_CHECK([for a readline compatible library],
+                 ax_cv_lib_readline, [
+    ORIG_LIBS="$LIBS"
+    for readline_lib in readline edit editline; do
+      for termcap_lib in "" termcap curses ncurses; do
+        if test -z "$termcap_lib"; then
+          TRY_LIB="-l$readline_lib"
+        else
+          TRY_LIB="-l$readline_lib -l$termcap_lib"
+        fi
+        LIBS="$ORIG_LIBS $TRY_LIB"
+        AC_TRY_LINK_FUNC(readline, ax_cv_lib_readline="$TRY_LIB")
+        if test -n "$ax_cv_lib_readline"; then
+          break
+        fi
+      done
+      if test -n "$ax_cv_lib_readline"; then
+        break
+      fi
+    done
+    LIBS="$ORIG_LIBS"
+  ])
+
+  if test -z "$ax_cv_lib_readline"; then
+    AC_MSG_ERROR(readline library is required)
+  fi
+
+  LIBS="$LIBS $ax_cv_lib_readline"
+  AC_CHECK_HEADERS(readline.h readline/readline.h)
+  AC_CACHE_CHECK([whether readline supports history],
+                 ax_cv_lib_readline_history, [
+    ax_cv_lib_readline_history="no"
+    AC_TRY_LINK_FUNC(add_history, ax_cv_lib_readline_history="yes")
+  ])
+  if test "$ax_cv_lib_readline_history" != "yes"; then
+    AC_MSG_ERROR(readline history support is required)
+  fi
+  AC_CHECK_HEADERS(history.h readline/history.h)
+  READLINE_LIBS="$ax_cv_lib_readline"
+])dnl
-- 
1.9.3

_______________________________________________
networkmanager-list mailing list
networkmanager-list@gnome.org
https://mail.gnome.org/mailman/listinfo/networkmanager-list

Reply via email to