dnl -------------------------------------------------------- -*- autoconf -*-
dnl Licensed to the Apache Software Foundation (ASF) under one or more
dnl contributor license agreements.  See the NOTICE file distributed with
dnl this work for additional information regarding copyright ownership.
dnl The ASF licenses this file to You under the Apache License, Version 2.0
dnl (the "License"); you may not use this file except in compliance with
dnl 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, software
dnl distributed under the License is distributed on an "AS IS" BASIS,
dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
dnl See the License for the specific language governing permissions and
dnl limitations under the License.

dnl
dnl pcre.m4: Trafficserver's pcre autoconf macros
dnl

dnl
dnl TS_CHECK_PCRE: look for pcre libraries and headers
dnl
AC_DEFUN([TS_CHECK_PCRE], [
enable_pcre=no
AC_ARG_WITH(pcre, [AC_HELP_STRING([--with-pcre=DIR],[use a specific pcre library])],
[
  if test "x$withval" != "xyes" && test "x$withval" != "x"; then
    pcre_base_dir="$withval"
    if test "$withval" != "no"; then
      enable_pcre=yes
      case "$withval" in
      *":"*)
        pcre_include="`echo $withval |sed -e 's/:.*$//'`"
        pcre_ldflags="`echo $withval |sed -e 's/^.*://'`"
        AC_MSG_CHECKING(checking for pcre includes in $pcre_include libs in $pcre_ldflags )
        ;;
      *)
        pcre_include="$withval/include"
        pcre_ldflags="$withval/lib"
        AC_MSG_CHECKING(checking for pcre includes in $withval)
        ;;
      esac
    fi
  fi
],
[
  AC_CHECK_PROG(PCRE_CONFIG, pcre-config, pcre-config)
  if test "x$PCRE_CONFIG" != "x"; then
    enable_pcre=yes
    pcre_base_dir="`$PCRE_CONFIG --prefix`"
    pcre_include="`$PCRE_CONFIG --cflags | sed -es/-I//`"
    pcre_ldflags="`$PCRE_CONFIG --libs | sed -es/-lpcre// -es/-L//`"
  fi
])

if test "x$pcre_base_dir" = "x"; then
  AC_MSG_CHECKING([for pcre location])
  AC_CACHE_VAL(ats_cv_pcre_dir,[
  for dir in /usr/local /usr ; do
    if test -d $dir && ( test -f $dir/include/pcre.h || test -f $dir/include/pcre/pcre.h ); then
      ats_cv_pcre_dir=$dir
      break
    fi
  done
  ])
  pcre_base_dir=$ats_cv_pcre_dir
  if test "x$pcre_base_dir" = "x"; then
    enable_pcre=no
    AC_MSG_RESULT([not found])
  else
    enable_pcre=yes
    pcre_include="$pcre_base_dir/include"
    pcre_ldflags="$pcre_base_dir/lib"
    AC_MSG_RESULT([$pcre_base_dir])
  fi
else
  AC_MSG_CHECKING(for pcre headers in $pcre_include)
  if test -d $pcre_include && test -d $pcre_ldflags && ( test -f $pcre_include/pcre.h || test -f $pcre_include/pcre/pcre.h ); then
    AC_MSG_RESULT([ok])
  else
    AC_MSG_RESULT([not found])
  fi
fi

if test "$enable_pcre" != "no"; then
  saved_ldflags=$LDFLAGS
  saved_cppflags=$CPPFLAGS
  pcre_have_headers=0
  pcre_have_libs=0
  if test "$pcre_base_dir" != "/usr"; then
    TS_ADDTO(CPPFLAGS, [-I${pcre_include}])
    TS_ADDTO(LDFLAGS, [-L${pcre_ldflags}])
    TS_ADDTO_RPATH(${pcre_ldflags})
  fi
  AC_CHECK_LIB([pcre], [pcre_exec], [pcre_have_libs=1])
  if test "$pcre_have_libs" != "0"; then
    AC_CHECK_HEADERS(pcre.h, [pcre_have_headers=1])
    AC_CHECK_HEADERS(pcre/pcre.h, [pcre_have_headers=1])
  fi
  if test "$pcre_have_headers" != "0"; then
    AC_DEFINE(HAVE_LIBPCRE,1,[Compiling with pcre support])
    AC_SUBST(LIBPCRE, [-lpcre])
  else
    enable_pcre=no
    CPPFLAGS=$saved_cppflags
    LDFLAGS=$saved_ldflags
  fi
fi
])
