dnl   SVN_LIB_NEON(wanted_regex, latest_working_ver, url)
dnl
dnl   Search for a suitable version of neon.  wanted_regex is a
dnl   regular expression used in a Bourne shell switch/case statement
dnl   to match versions of Neon that can be used.  latest_working_ver
dnl   is the latest version of neon that can be used, which is not
dnl   necessarily the latest released version of neon that exists.
dnl   can be used.  url is the URL of the latest version of Neon.
dnl
dnl   If there is a neon/ subdir we assume we want to use it.
dnl   If the subdir is the wrong version we exit with a failure
dnl   regardless if neon is installed somewhere else on the system.
dnl
dnl   If there isn't a neon/ subdir then we look for 'neon-config'
dnl   in PATH (or the location specified by a --with-neon=PATH 
dnl   switch).  

AC_DEFUN(SVN_LIB_NEON,
[
  NEON_WANTED_REGEX="$1"
  NEON_LATEST_WORKING_VER="$2"
  NEON_URL="$3"

  AC_MSG_NOTICE([checking neon library])

  AC_ARG_WITH(neon,
              [AC_HELP_STRING([--with-neon=PREFIX], 
	      [Determine neon library configuration based on 
	      'PREFIX/bin/neon-config'. Default is to search for neon 
	      in a subdirectory of the top source directory and then to
	      look for neon-config in $PATH.])],
  [
    if test -d $abs_srcdir/neon ; then
      AC_MSG_ERROR([--with-neon option but neon/ subdir exists.
Please either remove that subdir or don't use the --with-neon option.])
    else
      if test "$withval" = "yes" ; then
        AC_PATH_PROG(neon_config,neon-config)
      else
        neon_config="$withval/bin/neon-config"
      fi

      SVN_NEON_CONFIG()
    fi
  ],
  [
    if test -d $abs_srcdir/neon ; then
      AC_MSG_CHECKING([neon library version])
      NEON_VERSION=`$abs_srcdir/ac-helpers/get-neon-ver.sh $abs_srcdir/neon`
      AC_MSG_RESULT([$NEON_VERSION])
      case "$NEON_VERSION" in
        $NEON_WANTED_REGEX)
          echo "Using neon found in source directory."
          SVN_NEON_INCLUDES=-'I$(abs_srcdir)/neon/src'
          NEON_LIBS="\$(abs_builddir)/neon/src/libneon.la"

dnl Configure neon --------------------------
          # The arguments passed to this configure script are passed down to
          # neon's configure script, but, since neon defaults to *not* building
          # shared libs, and we default to building shared libs, we have to 
          # explicitly pass down an --{enable,disable}-shared argument, to make
          # sure neon does the same as we do.
          if test "$enable_shared" = "yes"; then
            args="--enable-shared"
          else
            args="--disable-shared"
          fi
  
          SVN_SUBDIR_CONFIG(neon, $args --with-expat="$abs_srcdir/expat-lite/libexpat.la")

          if test -f "$abs_builddir/neon/neon-config" ; then
            AC_MSG_CHECKING([for any extra libraries neon needs])
            # this is not perfect since it will pick up extra -L flags too,
            # but that shouldn't do any real damage.
            NEON_LIBS_NEW=`$SHELL $abs_builddir/neon/neon-config --libs | sed -e"s/-lneon//g"`
            AC_MSG_RESULT([$NEON_LIBS_NEW])
            NEON_LIBS="$NEON_LIBS $NEON_LIBS_NEW"
            # Also find out which macros neon defines (but ignore extra include paths):
            # this will include -DNEON_SSL if neon was built with SSL support
            changequote(<<, >>)dnl
            CFLAGS="$CFLAGS `$SHELL $abs_builddir/neon/neon-config --cflags | sed -e 's/-I[^ ]*//g'`"
            changequote([, ])dnl
          fi

          SVN_SUBDIRS="$SVN_SUBDIRS neon"
          ;;

        *)
          echo "You have a neon/ subdir containing version $NEON_VERSION,"
          echo "but Subversion needs neon ${NEON_LATEST_WORKING_VER}."
          SVN_DOWNLOAD_NEON()
          ;;
      esac
    else
      # no --with-neon switch, and no neon subdir, look in PATH
      AC_PATH_PROG(neon_config,neon-config)
      SVN_NEON_CONFIG()
    fi

  ])
  
  AC_SUBST(SVN_NEON_INCLUDES)
  AC_SUBST(NEON_LIBS)
])

dnl SVN_NEON_CONFIG()
dnl neon-config found, gather relevant information from it
AC_DEFUN(SVN_NEON_CONFIG,
[
  if test "$neon_config" != ""; then
    AC_MSG_CHECKING([neon library version])
    NEON_VERSION=`$neon_config --version | sed -e 's/^neon //'`
    AC_MSG_RESULT([$NEON_VERSION])

    case "$NEON_VERSION" in
      $NEON_WANTED_REGEX)
        changequote(<<, >>)dnl
        SVN_NEON_INCLUDES=`$neon_config --cflags | sed -e 's/-D[^ ]*//g'`
        NEON_LIBS=`$neon_config --libs`
        CFLAGS="$CFLAGS `$neon_config --cflags | sed -e 's/-I[^ ]*//g'`"
        changequote([, ])dnl
        ;;
      *)
        echo "You have neon version $NEON_VERSION,"
        echo "but Subversion needs neon $NEON_LATEST_WORKING_VER."
        SVN_DOWNLOAD_NEON()
        ;;
    esac
  else
    # no neon subdir, no neon-config in PATH
    AC_MSG_RESULT([nothing])
    echo "No suitable neon can be found."
    SVN_DOWNLOAD_NEON()
  fi
])

dnl SVN_DOWNLOAD_NEON()
dnl no neon found, print out a message telling the user what to do
AC_DEFUN(SVN_DOWNLOAD_NEON,
[
  echo "Please either install neon ${NEON_LATEST_WORKING_VER} on this system"
  echo ""
  echo "or"
  echo ""
  echo "get neon ${NEON_LATEST_WORKING_VER} from:"
  echo "    ${NEON_URL}"
  echo "unpack the archive using tar/gunzip and rename the resulting"
  echo "directory from ./neon-${NEON_LATEST_WORKING_VER}/ to ./neon/"
  AC_MSG_ERROR([no suitable neon found])
])
