Macro: ac_lib_readline

Back to the Main Page. | Download the M4 Source.

# ac_lib_readline

## Synopsis

`AC_LIB_READLINE`

## Version

1.1 (2001/08/25) Installed_Packages @ ac-archive-0.5.32

## Author

Ville Laurikari <vl@iki.fi>

## 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:

`#include <config.h>`

`#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 */`

## M4 Source Code

    AC_DEFUN([AC_LIB_READLINE], [
      AC_CACHE_CHECK([for a readline compatible library],
                     ac_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, ac_cv_lib_readline="$TRY_LIB")
            if test -n "$ac_cv_lib_readline"; then
              break
            fi
          done
          if test -n "$ac_cv_lib_readline"; then
            break
          fi
        done
        if test -z "$ac_cv_lib_readline"; then
          ac_cv_lib_readline="no"
          LIBS=$ORIG_LIBS
        fi
      ])

      if test "$ac_cv_lib_readline" != "no"; then
        AC_DEFINE(HAVE_LIBREADLINE, 1,
                  [Define if you have a readline compatible library])
        AC_CHECK_HEADERS(readline.h readline/readline.h)
        AC_CACHE_CHECK([whether readline supports history],
                       ac_cv_lib_readline_history, [
          ac_cv_lib_readline_history="no"
          AC_TRY_LINK_FUNC(add_history, ac_cv_lib_readline_history="yes")
        ])
        if test "$ac_cv_lib_readline_history" = "yes"; then
          AC_DEFINE(HAVE_READLINE_HISTORY, 1,
                    [Define if your readline library has \`add_history'])
          AC_CHECK_HEADERS(history.h readline/history.h)
        fi
      fi
    ])