From bf86f51c9e5a0afd1f5f0ef3cd7e9947ea329fd2 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 15 Jul 2021 10:27:59 +0200 Subject: [PATCH 1/2] build: rework libreadline detection in autotools - `m4/ax_lib_readline.m4` was already aware of "$with_readline". Move the entire handling of the parameter inside the AX_LIB_READLINE macro. This lets our fork of ax_lib_readline.m4 further deviate from upstream version, but it's already so different that this is no new problem. - raise an error if the user requested --with-readline=libreadline|libedit but the library was not found. - only allow yes|no for --with-nmcli argument. But still default to "yes", which will always require one libreadline library to be detected. In particular, don't automatically disable nmcli if libreadline is not available, because building without nmcli should be an explicit choice. That is like before. - update the "$with_readline" variable for the "auto" case to reflect what was detected. --- configure.ac | 30 ++++----- m4/ax_lib_readline.m4 | 142 ++++++++++++++++++++++++------------------ 2 files changed, 95 insertions(+), 77 deletions(-) diff --git a/configure.ac b/configure.ac index 8f40066be0..3fc92d0892 100644 --- a/configure.ac +++ b/configure.ac @@ -1043,27 +1043,21 @@ fi PKG_CHECK_MODULES(LIBNDP, [libndp]) -AC_ARG_WITH(readline, - AS_HELP_STRING([--with-readline=auto|libreadline|libedit|none], [Using libreadline (auto) or libedit]), - [], [with_readline=auto]) - -if test "$with_readline" != "none" -a "$with_readline" != "auto" -a "$with_readline" != "libreadline" -a "$with_readline" != "libedit"; then - AC_MSG_ERROR([invalid --with-readline option]) -fi - -if test "$with_readline" != "none"; then - AX_LIB_READLINE - if test -z "${READLINE_LIBS}"; then - AC_MSG_FAILURE([readline library not found]) - fi -fi +AX_LIB_READLINE AC_ARG_WITH(nmcli, - AS_HELP_STRING([--with-nmcli=yes|no], [Build nmcli])) -if test "$with_nmcli" != no; then - build_nmcli=yes + AS_HELP_STRING([--with-nmcli=yes|no], [Build nmcli]), + [], + [with_nmcli=yes]) +if test "$with_nmcli" == yes; then + if test "$with_readline" = none; then + AC_MSG_FAILURE([nmcli requires readline library. Use --with-readline or --with-nmcli=no]) + fi + build_nmcli=yes +elif test "$with_nmcli" == no; then + build_nmcli=no else - build_nmcli=no + AC_MSG_ERROR([invalid --with-nmcli option. Valid options are --with-nmcli=yes|no]) fi AM_CONDITIONAL(BUILD_NMCLI, test "$build_nmcli" = yes) diff --git a/m4/ax_lib_readline.m4 b/m4/ax_lib_readline.m4 index 3365e0b979..bbe42e7460 100644 --- a/m4/ax_lib_readline.m4 +++ b/m4/ax_lib_readline.m4 @@ -62,73 +62,97 @@ 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" - search_readlines="readline edit" - if test "$with_readline" = "libreadline"; then - search_readlines="readline" - fi - if test "$with_readline" = "libedit"; then - search_readlines="edit" - fi - for readline_lib in $search_readlines; do - # prefer ncurses since we use it for nmtui too - 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_LINK_IFELSE([AC_LANG_CALL([], [readline])], [ax_cv_lib_readline="$TRY_LIB"]) + AC_ARG_WITH(readline, + AS_HELP_STRING([--with-readline=auto|libreadline|libedit|none], [Using libreadline (auto) or libedit]), + [], + [with_readline=auto]) + + if test "$with_readline" != "none"; then + + AC_CACHE_CHECK([for a readline compatible library], + ax_cv_lib_readline, [ + ORIG_LIBS="$LIBS" + + if test "$with_readline" = "libreadline"; then + search_readlines="readline" + elif test "$with_readline" = "libedit"; then + search_readlines="edit" + elif test "$with_readline" = "auto"; then + search_readlines="readline edit" + else + AC_MSG_ERROR([invalid --with-readline option. Valid options are --with-readline=auto|libreadline|libedit|none]) + fi + + for readline_lib in $search_readlines; do + # prefer ncurses since we use it for nmtui too + 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_LINK_IFELSE([AC_LANG_CALL([], [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 + if test "$with_readline" = auto; then + if test "$readline_lib" = readline; then + with_readline=libreadline + else + with_readline=libedit + fi + fi break fi done - if test -n "$ax_cv_lib_readline"; then - break + if test -z "$ax_cv_lib_readline"; then + if test "$with_readline" != auto; then + AC_MSG_ERROR([libreadline not found for --with-readline=$with_readline"]) + fi + with_readline=none + ax_cv_lib_readline="no" fi - done - if test -z "$ax_cv_lib_readline"; then - ax_cv_lib_readline="no" - fi - LIBS="$ORIG_LIBS" - ]) - - if test "$ax_cv_lib_readline" != "no"; then - READLINE_LIBS="$ax_cv_lib_readline" - AC_SUBST(READLINE_LIBS) - AC_DEFINE(HAVE_LIBREADLINE, 1, - [Define if you have a readline compatible library]) - - if test "$with_readline" = "libedit"; then - AC_DEFINE(HAVE_EDITLINE_READLINE, 1, - [Explicitly set to 1 when libedit shall be used]) - else - AC_DEFINE(HAVE_EDITLINE_READLINE, 0, - [By default the libreadline is used as readline library]) - - fi - - ORIG_LIBS="$LIBS" - LIBS="$ORIG_LIBS $ax_cv_lib_readline" - AC_CACHE_CHECK([whether readline supports history], - ax_cv_lib_readline_history, [ - ax_cv_lib_readline_history="no" - AC_LINK_IFELSE([AC_LANG_CALL([], [history_set_history_state])], - [ax_cv_lib_readline_history="yes"]) + LIBS="$ORIG_LIBS" ]) - LIBS=$ORIG_LIBS - if test "$ax_cv_lib_readline_history" = "yes"; then - AC_DEFINE(HAVE_READLINE_HISTORY, 1, - [Define if your readline library has \`history_set_history_state']) - AC_CHECK_HEADERS(readline/history.h histedit.h) - else - AC_DEFINE(HAVE_READLINE_HISTORY, 0, - [Explicitly set to 0 when libreadline shall not be used]) + if test "$ax_cv_lib_readline" != "no"; then + READLINE_LIBS="$ax_cv_lib_readline" + AC_SUBST(READLINE_LIBS) + AC_DEFINE(HAVE_LIBREADLINE, 1, + [Define if you have a readline compatible library]) + + if test "$with_readline" = "libedit"; then + AC_DEFINE(HAVE_EDITLINE_READLINE, 1, + [Explicitly set to 1 when libedit shall be used]) + else + AC_DEFINE(HAVE_EDITLINE_READLINE, 0, + [By default the libreadline is used as readline library]) + + fi + + ORIG_LIBS="$LIBS" + LIBS="$ORIG_LIBS $ax_cv_lib_readline" + AC_CACHE_CHECK([whether readline supports history], + ax_cv_lib_readline_history, [ + ax_cv_lib_readline_history="no" + AC_LINK_IFELSE([AC_LANG_CALL([], [history_set_history_state])], + [ax_cv_lib_readline_history="yes"]) + ]) + LIBS=$ORIG_LIBS + + if test "$ax_cv_lib_readline_history" = "yes"; then + AC_DEFINE(HAVE_READLINE_HISTORY, 1, + [Define if your readline library has \`history_set_history_state']) + AC_CHECK_HEADERS(readline/history.h histedit.h) + else + AC_DEFINE(HAVE_READLINE_HISTORY, 0, + [Explicitly set to 0 when libreadline shall not be used]) + fi fi + fi ])dnl From 55fa00f05b42293e575b781ec9e1e867ef111644 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 15 Jul 2021 17:33:09 +0200 Subject: [PATCH 2/2] build/meson: cleanup handling of libreadline build option - add "required:false" to dependency() and find_library(), otherwise autodetection will fail. - rename variable "enable_readline" to "with_readline" for consistency with autotools. - with -Dlibreadline=auto, once we detect a library, update "with_readline" variable to reflect the detected choice. This will also be printed in the summary output. This is also important for the nmcli check `assert(with_readline != 'none', 'readline ...`. --- meson.build | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/meson.build b/meson.build index 0c5a28fbc6..3c4be61509 100644 --- a/meson.build +++ b/meson.build @@ -735,31 +735,34 @@ config_h.set10('WITH_CONCHECK', enable_concheck) config_h.set10('HAVE_READLINE_HISTORY', false) config_h.set10('HAVE_EDITLINE_READLINE', false) -enable_readline = get_option('readline') -if enable_readline != 'none' - if enable_readline == 'libreadline' or enable_readline == 'auto' - readline = cc.find_library('readline') +with_readline = get_option('readline') +if with_readline != 'none' + if with_readline == 'libreadline' or with_readline == 'auto' + readline = cc.find_library('readline', required: false) if readline.found() readline_dep = declare_dependency(link_args: '-lreadline') config_h.set10('HAVE_READLINE_HISTORY', true) + with_readline = 'libreadline' else - assert(enable_readline == 'auto', 'libreadline was not found') + assert(with_readline == 'auto', 'libreadline was not found') endif endif - if enable_readline == 'libedit' or (enable_readline == 'auto' and not readline.found()) - edit = dependency('libedit') + if with_readline == 'libedit' or with_readline == 'auto' + edit = dependency('libedit', required: false) if edit.found() readline_dep = declare_dependency(link_args: '-ledit') config_h.set10('HAVE_EDITLINE_READLINE', true) + with_readline = 'libedit' else - assert(enable_readline == 'auto', 'libedit was not found') + assert(with_readline == 'auto', 'libedit was not found') + with_readline = 'none' endif endif endif enable_nmcli = get_option('nmcli') if enable_nmcli - assert(enable_readline != 'none', 'readline library with terminfo support is required (one of readline, edit, or editline, AND one of ncurses, curses, or termcap)') + assert(with_readline != 'none', 'nmcli requires readline library (-Dnmcli=false or -Dreadline=auto|libreadline|libedit|none)') endif enable_nmtui = get_option('nmtui') @@ -1095,5 +1098,5 @@ output += ' sanitizers: ' + get_option('b_sanitize') + '\n' output += ' Mozilla Public Suffix List: ' + enable_libpsl.to_string() + '\n' output += ' vapi: ' + enable_vapi.to_string() + '\n' output += ' ebpf: ' + enable_ebpf.to_string() + '\n' -output += ' readline: ' + enable_readline + '\n' +output += ' readline: ' + with_readline + '\n' message(output)