blob: 1a1880ca64cd39546de9b5611eda394085263ab4 [file] [log] [blame]
dnl SVN_LIB_BERKELEY_DB(major, minor, patch)
dnl
dnl Search for a useable version of Berkeley DB in a number of
dnl common places. The installed DB must be no older than the
dnl version given by MAJOR, MINOR, and PATCH.
dnl
dnl If we find a useable version, set CPPFLAGS and LIBS as
dnl appropriate, and set the shell variable `svn_lib_berkeley_db' to
dnl `yes'. Otherwise, set `svn_lib_berkeley_db' to `no'.
dnl
dnl This macro also checks for the `--with-berkeley-db=PATH' flag;
dnl if given, the macro will use the PATH specified, and the
dnl configuration script will die if it can't find the library. If
dnl the user gives the `--without-berkeley-db' flag, the entire
dnl search is skipped.
dnl
dnl We cache the results of individual searches under particular
dnl prefixes, not the overall result of whether we found Berkeley
dnl DB. That way, the user can re-run the configure script with
dnl different --with-berkeley-db switch values, without interference
dnl from the cache.
AC_DEFUN(SVN_LIB_BERKELEY_DB,
[
db_version=$1.$2.$3
dnl Process the `with-berkeley-db' switch. We set `status' to one
dnl of the following values:
dnl `required' --- the user specified that they did want to use
dnl Berkeley DB, so abort the configuration if we cannot find it.
dnl `if-found' --- search for Berkeley DB in the usual places;
dnl if we cannot find it, just do not build the server code.
dnl `skip' --- Do not look for Berkeley DB, and do not build the
dnl server code.
dnl
dnl Assuming `status' is not `skip', we set the variable `places' to
dnl either `search', meaning we should check in a list of typical places,
dnl or to a single place spec.
dnl
dnl A `place spec' is either:
dnl - the string `std', indicating that we should look for headers and
dnl libraries in the standard places,
dnl - a directory prefix P, indicating we should look for headers in
dnl P/include and libraries in P/lib, or
dnl - a string of the form `HEADER:LIB', indicating that we should look
dnl for headers in HEADER and libraries in LIB.
dnl
dnl You'll notice that the value of the `--with-berkeley-db' switch is a
dnl place spec.
AC_ARG_WITH(berkeley-db,
[ --with-berkeley-db=PATH
Find the Berkeley DB header and library in \`PATH/include' and
\`PATH/lib'. If PATH is of the form \`HEADER:LIB', then search
for header files in HEADER, and the library in LIB. If you omit
the \`=PATH' part completely, the configure script will search
for Berkeley DB in a number of standard places.
The Subversion server requires Berkeley DB $db_version or newer. If
you specify \`--without-berkeley-db', the server will not be
built. Otherwise, the configure script builds the server if and
only if it can find a new enough version installed, or if a copy
of Berkeley DB exists in the subversion tree as subdir \`db'.],
[
if test "$withval" = "yes"; then
status=required
places=search
elif test "$withval" = "no"; then
status=skip
else
status=required
places="$withval"
fi
],
[
# No --with-berkeley-db option:
#
# Check to see if a db directory exists in the build directory.
# If it does then we will be using the berkeley DB version
# from the source tree. We can't test it since it is not built
# yet, so we have to assume it is the correct version.
AC_MSG_CHECKING([for built-in Berkeley DB])
if test -d db ; then
status=builtin
AC_MSG_RESULT([yes])
else
status=if-found
places=search
AC_MSG_RESULT([no])
fi
])
if test "$status" = "builtin"; then
# Use the include and lib files in the build dir.
dbdir=`cd db/dist ; pwd`
SVN_DB_INCLUDES="-I$dbdir"
svn_lib_berkeley_db=yes
# Linking directly to the .la is broken with --disable-shared
# because Berkeley db does not seem to generate a .la library.
if test "$enable_shared" = "yes"; then
SVN_DB_LIBS="$dbdir/libdb-4.0.la"
else
SVN_DB_LIBS="-L$dbdir -ldb"
fi
elif test "$status" = "skip"; then
svn_lib_berkeley_db=no
else
if test "$places" = "search"; then
# This is pretty messed up. It seems that the FreeBSD port of Berkeley
# DB 3.2.9 puts the header file in /usr/local/include/db3, but the
# database library in /usr/local/lib, as libdb.a. There is no
# /usr/local/include/db.h. So if you check for /usr/local first, you'll
# get the old header file from /usr/include, and the new library from
# /usr/local/lib. Disaster. We check for that bogosity first,
# and assume that the bogosity has carried over to the Berkeley
# 4.0.x series -- if it hasn't, someone please make a noise.
places="std /usr/local/include/db4:/usr/local/lib /usr/local
/usr/local/BerkeleyDB.$1.$2 /usr/include/db4:/usr/lib"
fi
# Now `places' is guaranteed to be a list of place specs we should
# search, no matter what flags the user passed.
# Save the original values of the flags we tweak.
SVN_LIB_BERKELEY_DB_save_libs="$LIBS"
SVN_LIB_BERKELEY_DB_save_cppflags="$CPPFLAGS"
# The variable `found' is the prefix under which we've found
# Berkeley DB, or `not' if we haven't found it anywhere yet.
found=not
for place in $places; do
LIBS="$SVN_LIB_BERKELEY_DB_save_libs"
CPPFLAGS="$SVN_LIB_BERKELEY_DB_save_cppflags"
case "$place" in
"std" )
description="the standard places"
;;
*":"* )
header="`echo $place | sed -e 's/:.*$//'`"
lib="`echo $place | sed -e 's/^.*://'`"
CPPFLAGS="$CPPFLAGS -I$header"
LIBS="$LIBS -L$lib"
description="$header and $lib"
;;
* )
LIBS="$LIBS -L$place/lib"
CPPFLAGS="$CPPFLAGS -I$place/include"
description="$place"
;;
esac
# We generate a separate cache variable for each prefix we
# search under. That way, we avoid caching information that
# changes if the user runs `configure' with a different set of
# switches.
changequote(,)
cache_id="`echo svn_cv_lib_berkeley_db_$1_$2_$3_in_${place} \
| sed -e 's/[^a-zA-Z0-9_]/_/g'`"
changequote([,])
dnl We can't use AC_CACHE_CHECK here, because that won't print out
dnl the value of the computed cache variable properly.
AC_MSG_CHECKING([for Berkeley DB in $description])
AC_CACHE_VAL($cache_id,
[
SVN_LIB_BERKELEY_DB_TRY($1, $2, $3)
eval "$cache_id=$svn_have_berkeley_db"
])
result="`eval echo '$'$cache_id`"
AC_MSG_RESULT($result)
# If we found it, no need to search any more.
if test "`eval echo '$'$cache_id`" = "yes"; then
found="$place"
break
fi
done
# Restore the original values of the flags we tweak.
LIBS="$SVN_LIB_BERKELEY_DB_save_libs"
CPPFLAGS="$SVN_LIB_BERKELEY_DB_save_cppflags"
case "$found" in
"not" )
if test "$status" = "required"; then
AC_MSG_ERROR([Could not find Berkeley DB $1.$2.$3.])
fi
svn_lib_berkeley_db=no
;;
"std" )
SVN_DB_INCLUDES=
SVN_DB_LIBS=-ldb
svn_lib_berkeley_db=yes
;;
*":"* )
header="`echo $found | sed -e 's/:.*$//'`"
lib="`echo $found | sed -e 's/^.*://'`"
SVN_DB_INCLUDES="-I$header"
dnl ### should look for a .la file
SVN_DB_LIBS="-L$lib -ldb"
svn_lib_berkeley_db=yes
;;
* )
SVN_DB_INCLUDES="-I$found/include"
dnl ### should look for a .la file
SVN_DB_LIBS="-L$found/lib -ldb"
svn_lib_berkeley_db=yes
;;
esac
fi
])
dnl SVN_LIB_BERKELEY_DB_TRY(major, minor, patch)
dnl
dnl A subroutine of SVN_LIB_BERKELEY_DB.
dnl
dnl Check that a new-enough version of Berkeley DB is installed.
dnl "New enough" means no older than the version given by MAJOR,
dnl MINOR, and PATCH. The result of the test is not cached; no
dnl messages are printed.
dnl
dnl Set the shell variable `svn_have_berkeley_db' to `yes' if we found
dnl an appropriate version installed, or `no' otherwise.
dnl
dnl This macro uses the Berkeley DB library function `db_version' to
dnl find the version. If the library installed doesn't have this
dnl function, then this macro assumes it is too old.
AC_DEFUN(SVN_LIB_BERKELEY_DB_TRY,
[
svn_lib_berkeley_db_try_save_libs="$LIBS"
LIBS="$LIBS -ldb"
svn_check_berkeley_db_major=$1
svn_check_berkeley_db_minor=$2
svn_check_berkeley_db_patch=$3
AC_TRY_RUN(
[
#include <stdio.h>
#include "db.h"
main ()
{
int major, minor, patch;
db_version (&major, &minor, &patch);
if (major < $svn_check_berkeley_db_major)
exit (1);
if (major > $svn_check_berkeley_db_major)
exit (0);
if (minor < $svn_check_berkeley_db_minor)
exit (1);
if (minor > $svn_check_berkeley_db_minor)
exit (0);
if (patch >= $svn_check_berkeley_db_patch)
exit (0);
else
exit (1);
}
],
[svn_have_berkeley_db=yes],
[svn_have_berkeley_db=no],
[svn_have_berkeley_db=yes]
)
LIBS="$svn_lib_berkeley_db_try_save_libs"
]
)