dnl ===================================================================
dnl   Licensed to the Apache Software Foundation (ASF) under one
dnl   or more contributor license agreements.  See the NOTICE file
dnl   distributed with this work for additional information
dnl   regarding copyright ownership.  The ASF licenses this file
dnl   to you under the Apache License, Version 2.0 (the
dnl   "License"); you may not use this file except in compliance
dnl   with the License.  You may obtain a copy of the License at
dnl
dnl     http://www.apache.org/licenses/LICENSE-2.0
dnl
dnl   Unless required by applicable law or agreed to in writing,
dnl   software distributed under the License is distributed on an
dnl   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
dnl   KIND, either express or implied.  See the License for the
dnl   specific language governing permissions and limitations
dnl   under the License.
dnl ===================================================================
dnl
dnl  SVN_LIB_SERF(min_major_num, min_minor_num, min_micro_num)
dnl
dnl  Search for a suitable version of serf. min_major_num,
dnl  min_minor_num, and min_micro_num are used to determine
dnl  if the serf library is at least that version.
dnl
dnl  If a --with-serf option (no argument) or --with-serf=yes
dnl  option is passed, then a search for serf on the system will be
dnl  performed with pkg-config.  If --with-serf=yes was actually passed
dnl  then we error if we can't actually find serf.
dnl
dnl  If a --with-serf=PREFIX option is passed search for a suitable
dnl  serf installed on the system under that PREFIX.  First we will
dnl  try to find a pc file for serf under the prefix or directly
dnl  in the prefix (allowing the path that the serf-?.pc file to be
dnl  passed to configure if the pc file is in a non-standard location)
dnl  and then use pkg-config to determine the options to use that library.
dnl  If pkg-confg can't provide us the options to use that library fall
dnl  back on trying to use the guess the options based on just the prefix.
dnl  We will error if we can't find serf.
dnl
dnl  If a --with-serf=no option is passed then no search will be
dnl  conducted.
dnl
dnl  If the search for serf fails, set svn_lib_serf to no, otherwise set
dnl  it to yes.
dnl

AC_DEFUN(SVN_LIB_SERF,
[
  serf_found=no
  serf_required=no
  serf_skip=no

  serf_check_major="$1"
  serf_check_minor="$2"
  serf_check_patch="$3"
  serf_check_version="$1.$2.$3"

  AC_ARG_WITH(serf,AS_HELP_STRING([--with-serf=PREFIX],
                                  [Serf HTTP client library (enabled by default if found)]),
  [
    if test "$withval" = "yes" ; then
      serf_required=yes 
    elif test "$withval" = "no" ; then
      serf_skip=yes 
    else
      serf_required=yes
      serf_prefix="$withval"
    fi
  ])

  if test "$serf_skip" = "no" ; then
    SVN_SERF_PKG_CONFIG()
    if test -n "$serf_prefix" && test "$serf_found" = "no" ; then
      SVN_SERF_PREFIX_CONFIG()
    fi
  
    AC_MSG_CHECKING([was serf enabled])
    if test "$serf_found" = "yes"; then
      AC_MSG_RESULT([yes])
    else 
      AC_MSG_RESULT([no]) 
      SVN_DOWNLOAD_SERF() 
      if test "$serf_required" = "yes"; then
        AC_MSG_ERROR([Serf was explicitly enabled but an appropriate version was not found.])
      fi
    fi
  fi

  svn_lib_serf=$serf_found

  SVN_DOT_CLANGD([$SVN_SERF_INCLUDES])
  AC_SUBST(SVN_SERF_INCLUDES)
  AC_SUBST(SVN_SERF_LIBS)
])

dnl SVN_SERF_PREFIX_CONFIG()
dnl Use user provided prefix to try and detect and configure serf
AC_DEFUN(SVN_SERF_PREFIX_CONFIG,
[
  AC_MSG_NOTICE([serf library configuration via prefix])
  serf_required=yes
  for serf_major in serf-2 serf-1; do
    if ! test -d $serf_prefix/include/$serf_major; then continue; fi
    save_cppflags="$CPPFLAGS"
    CPPFLAGS="$CPPFLAGS $SVN_APR_INCLUDES $SVN_APRUTIL_INCLUDES -I$serf_prefix/include/$serf_major"
    AC_CHECK_HEADERS(serf.h,[
      save_ldflags="$LDFLAGS"
      LDFLAGS="$LDFLAGS `SVN_REMOVE_STANDARD_LIB_DIRS(-L$serf_prefix/lib)`"
      AC_CHECK_LIB($serf_major, serf_context_create,[
        AC_MSG_CHECKING([serf library version])
        serf_h="$serf_prefix/include/$serf_major/serf.h"
        serf_M=`$SED -n '/define *SERF_MAJOR_VERSION/p' "$serf_h" | $SED 's/[[^0-9]]*//'`
        serf_m=`$SED -n '/define *SERF_MINOR_VERSION/p' "$serf_h" | $SED 's/[[^0-9]]*//'`
        serf_p=`$SED -n '/define *SERF_PATCH_VERSION/p' "$serf_h" | $SED 's/[[^0-9]]*//'`
        SERF_VERSION=$serf_M.$serf_m.$serf_p
        AC_MSG_RESULT([$SERF_VERSION])
        AC_MSG_CHECKING([serf version is suitable])
        AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
#include <stdlib.h>
#include "serf.h"
#if ! SERF_VERSION_AT_LEAST($serf_check_major, $serf_check_minor, $serf_check_patch)
#error Serf version too old: need $serf_check_version
#endif
]])],[
AC_MSG_RESULT([yes])
serf_found=yes
],[
AC_MSG_RESULT([no])
AC_MSG_WARN([Serf version too old: need $serf_check_version])
serf_found=no
])], ,
    $SVN_APRUTIL_LIBS $SVN_APR_LIBS)
    LDFLAGS="$save_ldflags"])
    CPPFLAGS="$save_cppflags"
    test $serf_found = yes && break
  done

  if test $serf_found = "yes"; then
    SVN_SERF_INCLUDES="-I$serf_prefix/include/$serf_major"
    if test -e "$serf_prefix/lib/lib$serf_major.la"; then
      SVN_SERF_LIBS="$serf_prefix/lib/lib$serf_major.la"
    else
      SVN_SERF_LIBS="-l$serf_major"
      LDFLAGS="$LDFLAGS `SVN_REMOVE_STANDARD_LIB_DIRS(-L$serf_prefix/lib)`"
    fi
  fi
])

dnl SVN_SERF_PKG_CONFIG()
dnl Use pkg-config to try and detect and configure serf
AC_DEFUN(SVN_SERF_PKG_CONFIG,
[
  AC_MSG_NOTICE([serf library configuration via pkg-config])
  if test -n "$PKG_CONFIG"; then
    for serf_major in serf-2 serf-1; do
      AC_MSG_CHECKING([for $serf_major library])
      if test -n "$serf_prefix" ; then
        dnl User provided a prefix so we try to find the pc file under
        dnl the prefix.  PKG_CONFIG_PATH isn't useful for this because
        dnl we want to make sure that we get the library in the prefix
        dnl the user specifies and we want to allow the prefix path to
        dnl point at the path for the pc file is in (if it's in some
        dnl other path than $serf_prefix/lib/pkgconfig).
        if test -e "$serf_prefix/$serf_major.pc" ; then
          serf_pc_arg="$serf_prefix/$serf_major.pc"
        elif test -e "$serf_prefix/lib/pkgconfig/$serf_major.pc" ; then
          serf_pc_arg="$serf_prefix/lib/pkgconfig/$serf_major.pc"
        else
          AC_MSG_RESULT([no])
          continue
        fi
      else
        serf_pc_arg="$serf_major"
      fi
      if $PKG_CONFIG $serf_pc_arg --exists; then
        AC_MSG_RESULT([yes])
        AC_MSG_CHECKING([serf library version])
        SERF_VERSION=`$PKG_CONFIG $serf_pc_arg --modversion`
        AC_MSG_RESULT([$SERF_VERSION])
        AC_MSG_CHECKING([serf version is suitable])
        if $PKG_CONFIG $serf_pc_arg --atleast-version=$serf_check_version; then
          AC_MSG_RESULT([yes])
          serf_found=yes
          SVN_SERF_INCLUDES=[`$PKG_CONFIG $serf_pc_arg --cflags-only-I`]
          SVN_SERF_LIBS=[`$PKG_CONFIG $serf_pc_arg --libs-only-l`]
          dnl don't use --libs-only-L because then we might miss some options
          LDFLAGS=["$LDFLAGS `$PKG_CONFIG $serf_pc_arg --libs | $SED -e 's/-l[^ ]*//g'`"]
          break
        else
          AC_MSG_RESULT([no])
          AC_MSG_WARN([Serf version too old: need $serf_check_version])
        fi        
      else
        AC_MSG_RESULT([no])
      fi
    done 
  fi
])

dnl SVN_DOWNLOAD_SERF()
dnl no serf found, print out a message telling the user what to do
AC_DEFUN(SVN_DOWNLOAD_SERF,
[
  echo ""
  echo "An appropriate version of serf could not be found, so libsvn_ra_serf"
  echo "will not be built.  If you want to build libsvn_ra_serf, please"
  echo "install serf $serf_check_version or newer."
  echo ""
])
