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"
  ]
)
