1dnl $Id: db3-check.m4,v 1.23 2010-04-12 14:28:48 franklahm Exp $ 2dnl Autoconf macros to check for the Berkeley DB library 3 4dnl -- check header for minimum version and return version in 5dnl -- $atalk_cv_bdb_MAJOR and $atalk_cv_bdb_MINOR 6AC_DEFUN([NETATALK_BDB_HEADER],[ 7 dnl check for header version 8 AC_MSG_CHECKING([$1/db.h version >= ${DB_MAJOR_REQ}.${DB_MINOR_REQ}.${DB_PATCH_REQ}]) 9 10 atalk_cv_bdb_MAJOR=`grep DB_VERSION_MAJOR "$1/db.h" | cut -f 3` 11 atalk_cv_bdb_MINOR=`grep DB_VERSION_MINOR "$1/db.h" | cut -f 3` 12 13 if test $atalk_cv_bdb_MAJOR -gt $DB_MAJOR_REQ ; then 14 AC_MSG_RESULT([yes]) 15 atalk_cv_bdbheader=yes 16 elif test $DB_MAJOR_REQ -gt $atalk_cv_bdb_MAJOR ; then 17 AC_MSG_RESULT([no]) 18 atalk_cv_bdbheader=no 19 elif test $DB_MINOR_REQ -gt $atalk_cv_bdb_MINOR ; then 20 AC_MSG_RESULT([no]) 21 atalk_cv_bdbheader=no 22 else 23 AC_MSG_RESULT([yes]) 24 atalk_cv_bdbheader=yes 25 fi 26]) 27 28dnl -- Try to link and run with lib with version taken from 29dnl -- $atalk_cv_bdb_MAJOR and $atalk_cv_bdb_MINOR 30AC_DEFUN([NETATALK_BDB_TRY_LINK],[ 31 atalk_cv_bdb_version=no 32 maj=$atalk_cv_bdb_MAJOR 33 min=$atalk_cv_bdb_MINOR 34 atalk_cv_bdb_try_libs="db$maj$min db$maj.$min db-$maj$min db-$maj.$min db$maj-$maj.$min db" 35 36 for lib in $atalk_cv_bdb_try_libs ; do 37 LIBS="-l$lib $savedlibs" 38 AC_MSG_CHECKING([Berkeley DB library (-l$lib)]) 39 AC_TRY_RUN([ 40 #include <stdio.h> 41 #include <db.h> 42 int main(void) { 43 int major, minor, patch; 44 char *version_str; 45 version_str = db_version(&major, &minor, &patch); 46 if ((major*100 + minor*10 + patch) < (DB_MAJOR_REQ*100 + DB_MINOR_REQ*10 + DB_PATCH_REQ)) { 47 printf("linking wrong library version (%d.%d.%d), ",major, minor, patch); 48 return (2); 49 } 50 if ( major != DB_VERSION_MAJOR || minor != DB_VERSION_MINOR || patch != DB_VERSION_PATCH) { 51 printf("header/library version mismatch (%d.%d.%d/%d.%d.%d), ", 52 DB_VERSION_MAJOR, DB_VERSION_MINOR, DB_VERSION_PATCH, major, minor, patch); 53 return (3); 54 } 55 printf("%d.%d.%d ... ",major, minor, patch); 56 return (0); 57 } 58 ],[ 59 AC_MSG_RESULT(yes) 60 atalk_cv_bdb_version="yes" 61 atalk_cv_lib_db="-l$lib" 62 break 63 ],[ 64 AC_MSG_RESULT(no) 65 ],[ 66 bdblibs=`ls $bdblibdir/lib$lib.* 2>/dev/null` 67 for bdblib in $bdblibs ; do 68 echo "Testing for lib file $bdblib" >&AS_MESSAGE_LOG_FD 69 if test -f "$bdblib" ; then 70 AC_MSG_RESULT([yes (cross-compiling)]) 71 atalk_cv_bdb_version="yes" 72 atalk_cv_lib_db="-l$lib" 73 break 74 fi 75 done 76 if test "x$atalk_cv_bdb_version" = "xyes" ; then 77 break 78 fi 79 AC_MSG_RESULT([no (cross-compiling)]) 80 ]) 81 done 82 LIBS="$savedlibs" 83]) 84 85dnl -- This is called from configure 86AC_DEFUN([AC_PATH_BDB],[ 87 trybdbdir="" 88 dobdbsearch=yes 89 bdb_search_dirs="/usr/local /usr" 90 search_subdirs="/ /db5 /db5.1 /db51 /db5.0 /db50 /db4.8 /db48 /db4.7 /db47 /db4.6 /db46 /db4" 91 92 bdbfound=no 93 savedcflags="$CFLAGS" 94 savedldflags="$LDFLAGS" 95 savedcppflags="$CPPFLAGS" 96 savedlibs="$LIBS" 97 saved_shlibpath_var=$shlibpath_var 98 99 dnl required BDB version: 4.6, because of cursor API change 100 DB_MAJOR_REQ=4 101 DB_MINOR_REQ=6 102 DB_PATCH_REQ=0 103 104 dnl make sure atalk_libname is defined beforehand 105 [[ -n "$atalk_libname" ]] || AC_MSG_ERROR([internal error, atalk_libname undefined]) 106 saved_atalk_libname=$atalk_libname 107 108 dnl define the required BDB version 109 AC_DEFINE_UNQUOTED(DB_MAJOR_REQ, ${DB_MAJOR_REQ}, [Required BDB version, major]) 110 AC_DEFINE_UNQUOTED(DB_MINOR_REQ, ${DB_MINOR_REQ}, [Required BDB version, minor]) 111 AC_DEFINE_UNQUOTED(DB_PATCH_REQ, ${DB_PATCH_REQ}, [Required BDB version, patch]) 112 113 AC_ARG_WITH(bdb, 114 [ --with-bdb=PATH specify path to Berkeley DB installation[[auto]]], 115 if test "x$withval" = "xno"; then 116 dobdbsearch=no 117 elif test "x$withval" = "xyes"; then 118 dobdbsearch=yes 119 else 120 bdb_search_dirs="$withval" 121 fi 122 ) 123 124 if test "x$dobdbsearch" = "xyes"; then 125 for bdbdir in $bdb_search_dirs; do 126 if test $bdbfound = "yes"; then 127 break; 128 fi 129 for subdir in ${search_subdirs}; do 130 AC_MSG_CHECKING([for Berkeley DB headers in ${bdbdir}/include${subdir}]) 131 dnl -- First check the mere existence of the header 132 if test -f "${bdbdir}/include${subdir}/db.h" ; then 133 AC_MSG_RESULT([yes]) 134 135 dnl -- Check if it meets minimun requirement, also return the version 136 NETATALK_BDB_HEADER([${bdbdir}/include${subdir}]) 137 138 if test ${atalk_cv_bdbheader} != "no"; then 139 bdblibdir="${bdbdir}/${atalk_libname}" 140 bdbbindir="${bdbdir}/bin" 141 142 CPPFLAGS="-I${bdbdir}/include${subdir} $CPPFLAGS" 143 LDFLAGS="-L$bdblibdir $LDFLAGS" 144 145 dnl -- Uses version set by NETATALK_BDB_HEADER to try to run 146 dnl -- a conftest that checks that header/lib version match 147 dnl -- $shlibpath_var is set by LIBTOOL, its value is 148 dnl -- LD_LIBRARY_PATH on many platforms. This will be fairly 149 dnl -- portable hopefully. Reference: 150 dnl -- http://lists.gnu.org/archive/html/autoconf/2009-03/msg00040.html 151 eval export $shlibpath_var=$bdblibdir 152 NETATALK_BDB_TRY_LINK 153 eval export $shlibpath_var=$saved_shlibpath_var 154 155 if test x"${atalk_cv_bdb_version}" = x"yes"; then 156 BDB_CFLAGS="-I${bdbdir}/include${subdir}" 157 BDB_LIBS="-L${bdblibdir} ${atalk_cv_lib_db}" 158 BDB_BIN="$bdbbindir" 159 BDB_PATH="$bdbdir" 160 bdbfound=yes 161 break; 162 fi 163 164 dnl -- Search lib in "lib" too, as $atalk_libname might be set 165 dnl -- to "lib64" or "lib/64" which would not be found above 166 dnl -- if 64bit lib were installed in a dir named "lib" 167 if test x"$atalk_libname" != x"lib" ; then 168 bdblibdir="${bdbdir}/lib" 169 bdbbindir="${bdbdir}/bin" 170 171 CPPFLAGS="-I${bdbdir}/include${subdir} $CPPFLAGS" 172 LDFLAGS="-L$bdblibdir $LDFLAGS" 173 174 eval export $shlibpath_var=$bdblibdir 175 NETATALK_BDB_TRY_LINK 176 eval export $shlibpath_var=$saved_shlibpath_var 177 178 if test x"${atalk_cv_bdb_version}" = x"yes"; then 179 BDB_CFLAGS="-I${bdbdir}/include${subdir}" 180 BDB_LIBS="-L${bdblibdir} ${atalk_cv_lib_db}" 181 BDB_BIN="$bdbbindir" 182 BDB_PATH="$bdbdir" 183 bdbfound=yes 184 break; 185 fi 186 fi 187 fi 188 CFLAGS="$savedcflags" 189 LDFLAGS="$savedldflags" 190 CPPFLAGS="$savedcppflags" 191 LIBS="$savedlibs" 192 else 193 AC_MSG_RESULT([no]) 194 fi 195 done 196 done 197 fi 198 199 CFLAGS="$savedcflags" 200 LDFLAGS="$savedldflags" 201 CPPFLAGS="$savedcppflags" 202 LIBS="$savedlibs" 203 atalk_libname=$saved_atalk_libname 204 205 if test "x$bdbfound" = "xyes"; then 206 ifelse([$1], , :, [$1]) 207 else 208 ifelse([$2], , :, [$2]) 209 fi 210 211 CFLAGS_REMOVE_USR_INCLUDE(BDB_CFLAGS) 212 LIB_REMOVE_USR_LIB(BDB_LIBS) 213 AC_SUBST(BDB_CFLAGS) 214 AC_SUBST(BDB_LIBS) 215 AC_SUBST(BDB_BIN) 216 AC_SUBST(BDB_PATH) 217]) 218 219 220