From 4fbbf33311630a467654077776f088d7810c2202 Mon Sep 17 00:00:00 2001 From: Peter Maydell Date: Thu, 15 Dec 2005 00:45:36 +0000 Subject: [PATCH] Improve the checks for where to find ndbm (dbm_open etc); should now work on systems with new gdbm and libdb4. --- ChangeLog | 7 +++++++ aclocal.m4 | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ configure.in | 36 ++++++++++++++++++++++---------- uip/slocal.c | 2 +- 4 files changed, 98 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 35bf6c6..19cd706 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2005-12-15 Peter Maydell + + * Improve checking for Berkeley db libraries: configure should now + find a suitable library on systems with new gdbm where + compatibility functions are in the gdbm_compat library, and on + systems with libdb4. + 2005-12-13 Michael Forrest * Fedora Bug #163760: sbr/context_read.c (context_read): Ensure that diff --git a/aclocal.m4 b/aclocal.m4 index 7dd6110..c9362ec 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -19,3 +19,68 @@ AC_DEFUN(AC_CHECK_NETLIBS, AC_CHECK_FUNC(socket, , AC_CHECK_LIB(socket, socket)) ]) + +dnl -------------- +dnl CHECK FOR NDBM +dnl -------------- +dnl +dnl NMH_CHECK_DBM(libname,action-if-true,action-if-false,other-libraries) +dnl Check for presence of dbm_open() in the specified library +dnl (if libname is the empty string then don't try to link against +dnl any particular library). If action-if-true is unspecified it +dnl defaults to adding "-llibname" to the beginning of LIBS. +dnl If other-libraries is specified then these are prepended to +dnl LIBS for the duration of the check. +dnl NB that the checks for the right dbm header files must +dnl be done before using this macro! +dnl +dnl We try to link our own code fragment (which includes the +dnl headers in the same way slocal.c does) rather than +dnl using AC_CHECK_LIB because on later versions of libdb +dnl the dbm_open() function is provided via a #define and +dnl we don't want to hardcode searching for the internal +dnl function that lies behind it. (AC_CHECK_LIB works by +dnl defining its own bogus prototype rather than pulling in +dnl the right header files.) +AC_DEFUN(NMH_CHECK_DBM, +[ +if test "x$1" == "x"; then + nmh_libs= + dnl this is just for the benefit of AC_CACHE_CHECK's message + nmh_testname=libc +else + nmh_libs="-l$1 " + nmh_testname="$1" +fi +AC_CACHE_CHECK([for dbm in $nmh_testname], [nmh_cv_check_dbm_$1],[ +nmh_saved_libs="$LIBS" +LIBS="$nmh_libs $4 $LIBS" +AC_LINK_IFELSE(AC_LANG_PROGRAM([[ +#ifdef HAVE_DB1_NDBM_H +#include +#else +#ifdef HAVE_GDBM_NDBM_H +#include +#else +#if defined(HAVE_DB_H) +#define DB_DBM_HSEARCH 1 +#include +#else +#include +#endif +#endif +#endif +]], +[[dbm_open("",0,0);]]),[nmh_cv_check_dbm_$1=yes],[ +nmh_cv_check_dbm_$1=no]) +LIBS="$nmh_saved_libs" +]) +if eval "test \"`echo '$nmh_cv_check_dbm_'$1`\" = yes"; then + nmh_tr_macro=HAVE_LIB`echo $1 | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + AC_DEFINE_UNQUOTED($nmh_tr_macro) + m4_if([$2],,[LIBS="$nmh_libs$LIBS"],[$2]) +else + $3 + : +fi +])dnl diff --git a/configure.in b/configure.in index c60e80f..1ff16b2 100644 --- a/configure.in +++ b/configure.in @@ -599,23 +599,37 @@ if test "x$ac_found_iconv" = "xyes"; then [Define as const if the declaration of iconv() needs const.]) fi -dnl -------------- -dnl CHECK FOR NDBM -dnl -------------- -dnl Checks for ndbm -AC_CHECK_FUNC(dbm_open, , - AC_CHECK_LIB(ndbm, dbm_open, , - AC_CHECK_LIB(dbm, dbm_open, , - AC_CHECK_LIB(db1, dbm_open, , - AC_CHECK_LIB(gdbm, dbm_open, , - AC_CHECK_LIB(db, __db_ndbm_open)))))) - dnl ---------------- dnl CHECK FOR NDBM.H dnl ---------------- AC_CHECK_HEADERS(db1/ndbm.h gdbm/ndbm.h db.h, break, ) +dnl -------------- +dnl CHECK FOR NDBM +dnl -------------- +dnl Checks for ndbm; we use our own autoconf macro rather than +dnl using AC_CHECK_LIB because on later versions of libdb +dnl the dbm_open() function is provided via a #define and +dnl we don't want to hardcode searching for the internal +dnl function that lies behind it. +dnl This *must* come after the ndbm headers check! + +dnl Note the special-casing of the gdbm_compat case: +dnl if we find gdbm_open in -lgdbm and dbm_open in +dnl -lgdbm_compat -lgdbm then we want to have both libraries +dnl in LIBS in that order. +NMH_CHECK_DBM(,, + NMH_CHECK_DBM(ndbm,, + NMH_CHECK_DBM(dbm,, + NMH_CHECK_DBM(db1,, + NMH_CHECK_DBM(db,, + NMH_CHECK_DBM(gdbm,, + AC_CHECK_LIB(gdbm,gdbm_open, + NMH_CHECK_DBM(gdbm_compat,LIBS="-lgdbm_compat -lgdbm $LIBS", + AC_MSG_ERROR([cannot find a library providing dbm_open()]),-lgdbm), + AC_MSG_ERROR([cannot find a library providing dbm_open()])))))))) + dnl ---------------- dnl CHECK FOR HESIOD dnl ---------------- diff --git a/uip/slocal.c b/uip/slocal.c index ca23fd8..0e77916 100644 --- a/uip/slocal.c +++ b/uip/slocal.c @@ -55,7 +55,7 @@ extern int initgroups(char*, int); #ifdef HAVE_GDBM_NDBM_H #include #else -#if defined(HAVE_DB_H) && defined(HAVE_LIBDB) +#if defined(HAVE_DB_H) #define DB_DBM_HSEARCH 1 #include #else -- 1.7.10.4