dnl
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 --------------------------------------------------------------------------
dnl Author Henri Gomez <hgomez@apache.org>
dnl
dnl Inspired by Pier works on webapp m4 macros :)
dnl 
dnl Version $Id$
dnl --------------------------------------------------------------------------

dnl --------------------------------------------------------------------------
dnl JK_APXS
dnl
dnl Get APXS to be used, determine if Apache 1.3 or 2.0 are target
dnl $1 => blank/2 if you want to detect Apache 1.3 & 2.0 
dnl $2 => comment for --with-apxs
dnl --------------------------------------------------------------------------
AC_DEFUN(
  [JK_APXS],
  [
    tempval=""
    AC_ARG_WITH(apxs$1,
    [  --with-apxs$1[=FILE]      $2],
    [
      case "${withval}" in 
        y | yes | true) find_apxs=true ;;
        n | no | false) find_apxs=false ;;
        *) find_apxs=false ;;
      esac

      if ${TEST} ${find_apxs} ; then    
        AC_MSG_RESULT([need to check for Perl first, apxs depends on it...])
        AC_PATH_PROG(PERL,perl,$PATH)dnl
    
        if ${TEST} ${find_apxs} ; then
            APXS$1=${withval}
        else
            AC_PATH_PROG(APXS$1,apxs$1,$PATH)dnl
        fi
    
		use_apxs$1=true;
		
        if ${TEST} -n "${APXS$1}" ; then
            dnl Seems that we have it, but have to check if it is OK first        
            if ${TEST} ! -x "${APXS$1}" ; then
                AC_MSG_ERROR(Invalid location for apxs: '${APXS$1}')
            fi
            
            ${APXS$1} -q PREFIX >/dev/null 2>/dev/null || apxs_support=false
    
            if ${TEST} "${apxs_support}" = "false" ; then
                AC_MSG_RESULT(could not find ${APXS$1})
                AC_MSG_ERROR(You must specify a valid --with-apxs$1 path)
            fi

            dnl apache_dir and apache_include are also needed.
            APACHE$1_HOME=`${APXS$1} -q PREFIX`
            APACHE$1_INCL="-I`${APXS$1} -q INCLUDEDIR`"
            APACHE$1_INCDIR="`${APXS$1} -q INCLUDEDIR`"
            APACHE$1_LIBEXEC="`${APXS$1} -q LIBEXECDIR`"
            APACHE$1_CC="`${APXS$1} -q CC`"

            dnl test apache version
            APA=`${GREP} STANDARD20 ${APXS$1}`

            dnl check if we have an apxs for Apache 1.3 or 2.0
            if ${TEST} -z "$APA" ; then
	      if ${TEST} ! -z "$1" ; then
                AC_MSG_ERROR(Do not use --with-apxs$1 but --with-apxs)
	      fi
              WEBSERVERS="${WEBSERVERS} server/apache13"
              RWEBSERVER="apache-1.3"
              APXS$1_CFLAGS="`${APXS$1} -q CFLAGS`"
              APXS$1_CPPFLAGS=""
            else
	      if ${TEST} -z "$1" ; then
                AC_MSG_ERROR(Do not use --with-apxs but --with-apxs2)
	      fi
              WEBSERVERS="${WEBSERVERS} server/apache2"
              RWEBSERVER="apache-2.0"
              APACHE2_CONFIG_VARS=${apache_dir}/build/config_vars.mk
              JK_CHANNEL_APR_SOCKET="\${JK}jk_channel_apr_socket\${OEXT}"
              JK_POOL_APR="\${JK}jk_pool_apr\${OEXT}"
              APXS$1_CFLAGS="`${APXS$1} -q CFLAGS` `${APXS$1} -q EXTRA_CFLAGS`"
              APXS$1_CPPFLAGS="`${APXS$1} -q EXTRA_CPPFLAGS`"
              APR_INCDIR="-I`${APXS$1} -q APR_INCLUDEDIR`"
			  APR_UTIL_INCDIR="-I`${APXS$1} -q APU_INCLUDEDIR`"
              APACHE2_LIBDIR="`${APXS$1} -q LIBDIR`"
              LIBTOOL=`${APXS$1} -q LIBTOOL`
              if ${TEST} -f ${APACHE2_LIBDIR}/libapr-1.so \
                      -o -f ${APACHE2_LIBDIR}/libapr-1.sl \
                      -o -f ${APACHE2_LIBDIR}/libapr-1.dylib; then
                APR_LIBS="-L${APACHE2_LIBDIR} -lapr-1"
              elif ${TEST} -f ${APACHE2_LIBDIR}/libapr-0.so \
                        -o -f ${APACHE2_LIBDIR}/libapr-0.sl \
                        -o -f ${APACHE2_LIBDIR}/libapr-0.dylib; then
                APR_LIBS="-L${APACHE2_LIBDIR} -lapr-0"
              elif ${TEST} -f ${APACHE2_LIBDIR}/libapr.so \
                        -o -f ${APACHE2_LIBDIR}/libapr.sl \
                        -o -f ${APACHE2_LIBDIR}/libapr.dylib; then
                APR_LIBS="-L${APACHE2_LIBDIR} -lapr"
              else
                AC_MSG_ERROR(can't locate libapr)
              fi
            fi
            
            AC_MSG_RESULT([building connector for \"$RWEBSERVER\"])
        fi

      fi
  ],
  [
	  AC_MSG_RESULT(no apxs$1 given)
  ])

  unset tempval

  AC_SUBST(APXS$1)
  AC_SUBST(APXS$1_CFLAGS)
  AC_SUBST(APACHE$1_CONFIG_VARS)
  AC_SUBST(APXS$1_CPPFLAGS)
  AC_SUBST(APACHE$1_DIR)
  AC_SUBST(APACHE$1_HOME)
  AC_SUBST(APACHE$1_INCDIR)
  AC_SUBST(APACHE$1_INCL)
  AC_SUBST(APACHE$1_LIBEXEC)
  AC_SUBST(APACHE$1_LIBDIR)
  AC_SUBST(APACHE$1_CC)
  AC_SUBST(APXS$1_LDFLAGS)
  AC_SUBST(APR_LIBS)

])

dnl vi:set sts=2 sw=2 autoindent:

