#!/bin/sh 
dnl This file is an input file used by the GNU "autoconf" program to
dnl generate the file "configure", which is run when building Rivet
dnl to configure the system for the local environment.
dnl
dnl You need at least autoconf 2.59
dnl
#
#-----------------------------------------------------------------------
# Sample configure.in for Tcl Extensions.  The only places you should
# need to modify this file are marked by the string __CHANGE__
#-----------------------------------------------------------------------

#-----------------------------------------------------------------------
# __CHANGE__
# Set your package name and version numbers here.
#
# This initializes the environment with PACKAGE_NAME and PACKAGE_VERSION
# set as provided.  These will also be added as -D defs in your Makefile
# so you can encode the package version directly into the source files.
#-----------------------------------------------------------------------

AC_INIT([Rivet],[m4_esyscmd_s([cat VERSION])],[rivet-dev@tcl.apache.org])
TEA_INIT([3.9])

# we are storing here the configure command line, as recursive
# invocations change the value of the shell variables $0 $*

CONFIGURE_CMD="$0 $*"

AC_CONFIG_AUX_DIR(tclconfig)
AM_INIT_AUTOMAKE
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([m4])

# AX_PREFIX_CONFIG_H is a macro taken from the autotools macro archive.
# The typical configure generated 'config.h' can be renamed and 
# preprocessor symbols in it can be prefixed in order to avoid clashes 
# with Apache's config.h
# 
# As of today (27 Sept 2008) this macro is not part of autotools and
# it's in the 'm4' directory
#

AX_PREFIX_CONFIG_H([rivet_config.h],[rivet])

#--------------------------------------------------------------------
# Call TEA_INIT as the first TEA_ macro to set up initial vars.
# This will define a ${TEA_PLATFORM} variable == "unix" or "windows"
# as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE.
#--------------------------------------------------------------------

#
# Init automake stuff
#
AC_DISABLE_STATIC
AM_INIT_AUTOMAKE([foreign subdir-objects])

#--------------------------------------------------------------------
# Load the tclConfig.sh file
#--------------------------------------------------------------------

TEA_PATH_TCLCONFIG
TEA_LOAD_TCLCONFIG

#--------------------------------------------------------------------
# Load the tkConfig.sh file if necessary (Tk extension)
#--------------------------------------------------------------------

#TEA_PATH_TKCONFIG
#TEA_LOAD_TKCONFIG

#-----------------------------------------------------------------------
# Handle the --prefix=... option by defaulting to what Tcl gave.
# Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER.
#-----------------------------------------------------------------------

TEA_PREFIX

#-----------------------------------------------------------------------
# Standard compiler checks.
# This sets up CC by using the CC env var, or looks for gcc otherwise.
# This also calls AC_PROG_CC, AC_PROG_INSTALL and a few others to create
# the basic setup necessary to compile executables.
#-----------------------------------------------------------------------

TEA_SETUP_COMPILER

#
# For automake to be happy, we also need AC_PROG_LIBTOOL
#
# the LIBTOOL_DEPS macro sets up for automatic updating of the
# libtool script if it becomes out of date, as per libtool docs
#
AC_PROG_LIBTOOL
AC_SUBST(LIBTOOL_DEPS)

#-----------------------------------------------------------------------
# __CHANGE__
# Specify the C source files to compile in TEA_ADD_SOURCES,
# public headers that need to be installed in TEA_ADD_HEADERS,
# stub library C source files to compile in TEA_ADD_STUB_SOURCES,
# and runtime Tcl library files in TEA_ADD_TCL_SOURCES.
# This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS
# and PKG_TCL_SOURCES.
#-----------------------------------------------------------------------

# Unused: src/TclWeb.c

#TEA_ADD_SOURCES([src/TclWebcgi.c src/TclWebapache.c src/apache_multipart_buffer.c src/apache_request.c src/mod_rivet.c src/parserPkgInit.c src/rivetChannel.c src/rivetCore.c src/rivetCrypt.c src/rivetList.c src/rivetParser.c src/rivetPkgInit.c src/rivetWWW.c win/nmakehlp.c src/testing.c])
#TEA_ADD_HEADERS([src/TclWeb.h src/apache_multipart_buffer.h src/apache_request.h src/mod_rivet.h src/rivet.h src/rivetChannel.h src/rivetParser.h])
TEA_ADD_INCLUDES([])
TEA_ADD_LIBS([])
TEA_ADD_CFLAGS([])
TEA_ADD_STUB_SOURCES([])
TEA_ADD_TCL_SOURCES([])

#--------------------------------------------------------------------
# __CHANGE__
# A few miscellaneous platform-specific items:
#
# Define a special symbol for Windows (BUILD_sample in this case) so
# that we create the export library with the dll.
#
# Windows creates a few extra files that need to be cleaned up.
# You can add more files to clean if your extension creates any extra
# files.
#
# TEA_ADD_* any platform specific compiler/build info here.
#--------------------------------------------------------------------

# removed AC_DEFINE(BUILD_rivet....) as per TEA 3.9 (Massimo Manghi 20100825)

if test "${TEA_PLATFORM}" = "windows" ; then
#   AC_DEFINE(BUILD_rivet,1,[Define to define the BUILD_rivet define (?)])
    CLEANFILES="pkgIndex.tcl *.lib *.dll *.exp *.ilk *.pdb vc*.pch"
#   #TEA_ADD_SOURCES([win/winFile.c])
#   #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/win)\"])
else
    CLEANFILES="pkgIndex.tcl"
#   #TEA_ADD_SOURCES([unix/unixFile.c])
#   #TEA_ADD_LIBS([-lsuperfly])
fi
AC_SUBST(CLEANFILES)

#--------------------------------------------------------------------
# __CHANGE__
# Choose which headers you need.  Extension authors should try very
# hard to only rely on the Tcl public header files.  Internal headers
# contain private data structures and are subject to change without
# notice.
# This MUST be called after TEA_LOAD_TCLCONFIG / TEA_LOAD_TKCONFIG
#--------------------------------------------------------------------

TEA_PUBLIC_TCL_HEADERS
#TEA_PRIVATE_TCL_HEADERS

#TEA_PUBLIC_TK_HEADERS
#TEA_PRIVATE_TK_HEADERS
#TEA_PATH_X

#--------------------------------------------------------------------
# Check whether --enable-threads or --disable-threads was given.
# This auto-enables if Tcl was compiled threaded.
#--------------------------------------------------------------------

TEA_ENABLE_THREADS

#--------------------------------------------------------------------
# The statement below defines a collection of symbols related to
# building as a shared library instead of a static library.
#--------------------------------------------------------------------

TEA_ENABLE_SHARED

#--------------------------------------------------------------------
# This macro figures out what flags to use with the compiler/linker
# when building shared/static debug/optimized objects.  This information
# can be taken from the tclConfig.sh file, but this figures it all out.
#--------------------------------------------------------------------

TEA_CONFIG_CFLAGS

#--------------------------------------------------------------------
# Set the default compiler switches based on the --enable-symbols option.
#--------------------------------------------------------------------

TEA_ENABLE_SYMBOLS

#--------------------------------------------------------------------
# Everyone should be linking against the Tcl stub library.  If you
# can't for some reason, remove this definition.  If you aren't using
# stubs, you also need to modify the SHLIB_LD_LIBS setting below to
# link against the non-stubbed Tcl library.  Add Tk too if necessary.
#--------------------------------------------------------------------

#
# stubs are causing segmentation violations when mod_rivet is getting
# loaded into apache.  it would be nice if we did no stubs for this and
# still did stubs for librivet and librivetparser, which seem to be OK.
#
#AC_DEFINE(USE_TCL_STUBS,1,[Define to link against the Tcl stub library])
#AC_DEFINE(USE_TK_STUBS)

#--------------------------------------------------------------------
# This macro generates a line to use when building a library.  It
# depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS,
# and TEA_LOAD_TCLCONFIG macros above.
#--------------------------------------------------------------------

TEA_MAKE_LIB

#--------------------------------------------------------------------
# Find tclsh so that we can run pkg_mkIndex to generate the pkgIndex.tcl
# file during the install process.  Don't run the TCLSH_PROG through
# ${CYGPATH} because it's being used directly by make.
# Require that we use a tclsh shell version 8.2 or later since earlier
# versions have bugs in the pkg_mkIndex routine.
# Add WISH as well if this is a Tk extension.
#--------------------------------------------------------------------

# We have to either find a working tclsh or be told where it is 
# using --with-tclsh
AC_ARG_WITH(tclsh, [  --with-tclsh=FILE location of a working tclsh executable], with_tclsh=${withval})

#
# allow them to override the tclsh we think we found
#
if test x"${with_tclsh}" != x ; then
    AC_MSG_CHECKING([for tclsh])
    if test -f "${with_tclsh}" ; then
        TCLSH_PROG=${with_tclsh}
        AC_MSG_RESULT([manually set by --with-tclsh=$TCLSH_PROG])
    else
        AC_MSG_ERROR([No tclsh at place specified by --with-tclsh (${with_tclsh})])
    fi
    AC_SUBST(TCLSH_PROG)
else
    TEA_PROG_TCLSH
fi

#TEA_PROG_WISH

# apache base directory

AC_DEFUN([APACHE],[
    AC_MSG_CHECKING(for Apache base)
    AC_ARG_WITH(
        apache,
        [  --with-apache[=DIR] Apache server base directory],, 
        [with_apache="/usr/local/apache2"]
    )
    apache_base="${with_apache}"
    AC_MSG_RESULT([$apache_base])
])

#
# We have to either find apxs or be told where it is using --with-apxs 
#
AC_DEFUN([CHECK_APXS],[
    AC_MSG_CHECKING(for Apache apxs)
    AC_ARG_WITH(
        apxs,
        [  --with-apxs=FILE        location of Apache apxs tool],  
        [if test -x "${with_apxs}" ; then
            apxs_found="${with_apxs}"
            AC_MSG_RESULT([$apxs_found])
         fi]
        ,
        [ 
            APXS_NAMES=apxs
            for apxs_file in ${APXS_NAMES}; do 
                for apxs_path in bin sbin; do 
                     if test -x "${apache_base}"/"${apxs_path}"/"${apxs_file}"; then
                            apxs_found="${apache_base}"/"${apxs_path}"/"${apxs_file}" 
                            break 2
                      fi
                done
            done
            if test x"$apxs_found" = x; then
                AC_PATH_PROGS(with_apxs, apxs)
                if test "${with_apxs+set}" = set ; then
                    apxs_found="${with_apxs}"
                fi
            fi
            if test x"${apxs_found}" = x; then
                AC_MSG_ERROR([Could not find apxs.  apxs must be in your PATH or you must specify the location of the apxs script using --with-apxs])
            else
                AC_MSG_RESULT([$apxs_found])
            fi
        ]
    )
    if test "${apxs_found+set}" = set ; then
        dnl At this point we already have apr sorted out
        export PATH=$PATH:`dirname $apxs_found`
        APXS_CPPFLAGS=`${apxs_found} -q CFLAGS`
        AC_SUBST(APXS_CPPFLAGS)
        APXS_LDFLAGS=`${apxs_found} -q LDFLAGS_SHLIB`
        AC_SUBST(APXS_LDFLAGS)
        APXS_LIBS=`${apxs_found} -q LIBS_SHLIB`
        AC_SUBST(APXS_LIBS)
        APXS_INCLUDES=-I`${apxs_found} -q INCLUDEDIR`
        AC_SUBST(APXS_INCLUDES)
        APXS_CPPFLAGS_SHLIB=`${apxs_found} -q CFLAGS_SHLIB`
        AC_SUBST(APXS_CPPFLAGS_SHLIB)
        APXS_LD_SHLIB=`${apxs_found} -q LD_SHLIB`
        AC_SUBST(APXS_LD_SHLIB)
        APXS_LIBEXECDIR=`${apxs_found} -q LIBEXECDIR`
        AC_SUBST(APXS_LIBEXECDIR)
        APXS_SYSCONFDIR=`${apxs_found} -q SYSCONFDIR`
        AC_SUBST(APXS_SYSCONFDIR)
        APXS_PREFIX=`${apxs_found} -q PREFIX`
        AC_SUBST(APXS_PREFIX)
    else 
        AC_MSG_ERROR([Could not find apxs.  apxs must be in your PATH or you must specify the location of the apxs script using --with-apxs])
    fi
])


AC_DEFUN([APACHE_INCLUDES],[
  AC_ARG_WITH(
    apache_include,
    [  --with-apache-include[=DIR]     Apache server directory],
     [apache_include="${with_apache_include}"] 
    ,[apache_include="${APXS_INCLUDES}"]
  )
    AC_SUBST(apache_include)
])

AC_DEFUN([APR_HANDLING],[
  AC_MSG_CHECKING(for Apache apr)
  AC_ARG_WITH(
   apr_config,
    [  --with-apr-config=FILE     apr portable apr-1-config path],
     [if test -x "${with_apr_config}"; then
         apr_found="${with_apr_config}"
     fi]
         ,
    [if test -x "${apache_base}/bin/apr-1-config" ; then
         apr_found="${apache_base}/bin/apr-1-config" 
    elif test -x "${apache_base}/sbin/apr-1-config" ; then
         apr_found="${apache_base}/sbin/apr-1-config" 
    elif test "${apache_base+set}" = set; then 
        AC_PATH_PROGS(with_apr_config, apr-1-config)
        if test "${with_apr_config+set}" = set ; then
            apr_found="${with_apr_config}"
        fi
    else 
        AC_MSG_ERROR( Specify the apr-1-config path using --with-apr-config, 1)
    fi]
)
    if test "${apr_found+set}" = set ; then
        AC_MSG_RESULT([$apr_found])
        dnl At this point we already have apr sorted out
        dnl It actually calls another script, so the PATH needs to be set.
        export PATH=$PATH:`dirname ${apr_found}`
        APR_CPPFLAGS=`${apr_found} --cppflags`
        AC_SUBST(APR_CPPFLAGS)
        APR_INCLUDES=`${apr_found} --includes`
        AC_SUBST(APR_INCLUDES)
        APR_LDLFAGS=`${apr_found} --link-libtool --libs`
        AC_SUBST(APR_LDFLAGS)
    else
        AC_MSG_ERROR([Could not find apr-1-config. apr-1-config must be in your PATH or you must specify the location of the apr script using --with-apr-config])
    fi
])

# -- APU_HANDLING
#
# calling apu-1-config to determine where apr-utils includes
# and library are
#

AC_DEFUN([APU_HANDLING],[
  AC_MSG_CHECKING(for Apache apu)
  AC_ARG_WITH(
   apu_config,
    [  --with-apu-config=FILE     apu portable apu-1-config path],
    [if "${with_apu_config}" --version; then
         apu_found="${with_apu_config}"
    fi]
     ,
    [if apu-1-config --version; then
         apu_found=apu-1-config
    elif test -x "${apache_base}/bin/apu-1-config" ; then
         apu_found="${apache_base}/bin/apu-1-config" 
    elif test -x "${apache_base}/sbin/apu-1-config" ; then
         apu_found="${apache_base}/sbin/apu-1-config" 
    elif test "${apache_base+set}" = set; then 
        AC_PATH_PROGS(with_apu_config, apu-1-config)
        if test "${with_apu_config+set}" = set ; then
            apu_found="${with_apu_config}"
        fi
    else 
        AC_MSG_ERROR( Specify the apu-1-config path or program name using --with-apu-config, 1)
    fi]
)
    if test "${apu_found+set}" = set ; then
        AC_MSG_RESULT([$apu_found_])
        dnl At this point we already have apu sorted out
        dnl It actually calls another script, so the PATH needs to be set.
        export PATH=$PATH:`dirname ${apu_found}`
        APU_INCLUDES=`${apu_found} --includes`
        AC_SUBST(APU_INCLUDES)
        APU_LDLFAGS=`${apu_found} --link-libtool --libs`
        AC_SUBST(APU_LDFLAGS)
    else
        AC_MSG_ERROR([Could not find apu-1-config. apu-1-config must be in your PATH or you must specify the location of the apu script using --with-apu-config])
    fi
])

#--------------------------------------------------------------------
# 6-Dec-2011: Introducing new ::rivet namespace. Some components 
# (namely RivetTcl, providing Tcl level initialization) are required 
# within mod_rivet.c. Unfortunalely Tcl < 8.5.10 shared
# libs exporting names could clash with Apache's binary own names. 
# Hence we have to make sure we are running a Tcl compatible version.
# (See Tcl bug #3216070). 
# 
# Effect: If you're running Tcl < 8.5.10 we refuse to build Rivet...

AX_COMPARE_VERSION([$TCL_VERSION$TCL_PATCH_LEVEL],[lt],[8.5.10],[
    AC_MSG_ERROR([Rivet 2.1 requires Tcl > 8.5.10 (current is $TCL_VERSION$TCL_PATCH_LEVEL)])
] , [
    AC_MSG_NOTICE([we are building Rivet with Tcl $TCL_VERSION$TCL_PATCH_LEVEL])
])


print_fileevent_msg="0"
AX_COMPARE_VERSION([$TCL_VERSION$TCL_PATCH_LEVEL],[lt],[8.5.15],[
    print_fileevent_msg="1"
] , )


AX_COMPARE_VERSION([$TCL_VERSION],[eq],[8.6],[
    if test "$TCL_PATCH_LEVEL" = ".0" ; then
        print_fileevent_msg="1"
    fi
] , )

# MOD_RIVET_CORE
#
# Determining the path to the mod_rivet.* source files
#

AC_DEFUN([MOD_RIVET_CORE],[
    AC_ARG_WITH(
       rivet_core,
       [  --with-rivet-core[=path] mod_rivet core directory],,
       [with_rivet_core="mod_rivet_ng"]
    )

    AC_MSG_CHECKING([mod_rivet core])

    #if [[ -d "src/${with_rivet_core}" ]]; then
    #    rivet_core=$(pwd)/src/${with_rivet_core}
    #else
    #    rivet_core=${with_rivet_core}
    #fi
    
    rivet_core=${with_rivet_core}
   
    # by default we search the channel and core commands
    # implementation in the same directory. This can
    # be superseded by other macros

    default_rivet_commands=${rivet_core}
    default_rivet_channel=${rivet_core}

    #AC_CONFIG_FILES([src/${rivet_core}/Makefile])
    AC_SUBST(rivet_core)
    AC_MSG_RESULT([$rivet_core])
])

# 

AC_DEFUN([HANDLE_TCL_PACKAGE_PATH],[
    # shamelessly stolen from TEA_LOAD_TCLCONFIG
    AC_MSG_CHECKING([Debian TCL_PACKAGE_PATH workaround])
        if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then
           AC_MSG_RESULT([loading])
           . "${TCL_BIN_DIR}/tclConfig.sh"
        else
           AC_MSG_RESULT([could not find ${TCL_BIN_DIR}/tclConfig.sh])
        fi
    # If we have multiple paths, pull the first one, add end slash if needed
    res=`echo ${TCL_PACKAGE_PATH} | \
             grep '[[^\]] ' | \
             sed -e 's/\([[^\]]\)\( \)\(.*\)$/\1/'  -e 's/\([[^\/]]\)$/\1\//' `
    if test x"${res}" != x; then
        TCL_PACKAGE_PATH=${res}
        AC_SUBST(TCL_PACKAGE_PATH)
    fi
])

AC_DEFUN([GET_RIVET_BASE], [
    RIVET_BASE_INCLUDE=`pwd`/src    
    AC_SUBST(RIVET_BASE_INCLUDE)
    RIVET_SOURCE_BASE=`pwd`/src    
    AC_SUBST(RIVET_SOURCE_BASE)
])

# APACHE_REQUEST
#
# Choosing where is located the code for handling Apache request data (like
# form data etc). Default: 'request'  

AC_DEFUN([APACHE_REQUEST],[
    AC_ARG_WITH(
        apache_request,
        [  --with-apache-request=DIR path to rivet HTML form and urlencoded data handler],,
        [with_apache_request="request"]
    )

    AC_MSG_CHECKING([code for HTML form and urlencoded data handling])
    apache_request=${with_apache_request}
    AC_SUBST(apache_request)
    AC_MSG_RESULT([$apache_request])
])

# RIVET_CORE_CMDS
#
# selecting non default directory for Rivet code commands core
#

AC_DEFUN([RIVET_CORE_CMDS],[
    AC_ARG_WITH(
        rivet_commands,
        [  --with-rivet-commands[=dir] path to Rivet core commands code],,
        [with_rivet_commands=$default_rivet_commands]
    )

    AC_MSG_CHECKING([for Rivet core commands code])
    rivet_commands=${with_rivet_commands}
    AC_SUBST(rivet_commands)
    AC_MSG_RESULT([$rivet_commands])

])

# RIVET_CHANNEL
#
# selecting the Rivet channel code directory

AC_DEFUN([RIVET_CHANNEL],[
    AC_ARG_WITH(
        rivet_channel,
        [  --with-rivet-channel=DIR Rivet channel code path ],,
        [with_rivet_channel=$default_rivet_channel]
    )

    AC_MSG_CHECKING([for Rivet channel code path])
    rivet_channel=${with_rivet_channel}

    AC_SUBST(rivet_channel)
    AC_MSG_RESULT([$rivet_channel])
])

# RIVET_TCL_LIB
#
#

AC_DEFUN([RIVET_TCL_LIB],[
    AC_ARG_WITH(
        rivet_target_dir,
        [  --with-rivet-target-dir=DIR  Rivet tcl and binary libraries target dir ],,
        with_rivet_target_dir="${apache_base}/lib/rivet${PACKAGE_VERSION}"
    )
    AC_MSG_CHECKING([for Rivet libraries target])
    RIVET_TCL_TARGET=${with_rivet_target_dir}
    AC_SUBST(RIVET_TCL_TARGET)
    AC_MSG_RESULT([$with_rivet_target_dir])
])

# DISPLAY_RIVET_VERSION
#
# --enable-version-display=[yes|no] (default: no)
# switches on version number display in Apache's signature.
#

AC_DEFUN([DISPLAY_RIVET_VERSION],[
    AC_ARG_ENABLE(
        version_display,
    [  --enable-version-display  Display Rivet version in Apache signature],
    [ signature_version_display=$enable_version_display ],
    [ signature_version_display="no" ]
    )

    AC_MSG_CHECKING([whether rivet version is printed in Apache signature])
    if test "$signature_version_display" = "yes"; then
        AC_MSG_RESULT([yes])
        AC_DEFINE(DISPLAY_VERSION,1,[Display Rivet version in Apache signature])
    else
        AC_MSG_RESULT([no, Rivet version will be hidden])
        AC_DEFINE(DISPLAY_VERSION,0,[Display Rivet version in Apache signature])
    fi
])

# UPLOAD_DIRECTORY
# 
# Adds '--with-upload-dir=DIR' to configure's arguments
#
# let's make configuration of the upload directory more flexible for windows builds
# (in case someone steps forward and takes up the Windows port)
# The upload directory can be changed in the configuration, but we give the 
# user/packager the chance to set a default at compile time.
# Default: /tmp

AC_DEFUN([UPLOAD_DIRECTORY],[
    AC_ARG_WITH(
    upload_dir,
    [  --with-upload-dir=DIR Default directory for uploads],,
        with_upload_dir="/tmp"
    )
    AC_MSG_CHECKING(where Rivet will save uploads)
    RIVET_UPLOAD_DIR=${with_upload_dir}
    AC_SUBST(RIVET_UPLOAD_DIR)
    AC_MSG_RESULT([$with_upload_dir])
])

# HONOR_HEAD_REQUESTS (--enable-head-requests)
# Rivet answers to HEAD requests with a standard response to avoid the whole workload
# of generating the content of a page with to the sole purpose of returning the HTTP 
# headers.To test the configuration or scripts that manipulate the headers it 
# can be useful to let Rivet honor a HEAD request as if the whole content was 
# generated so that the real headers are returned (this can be set in configuration 
# by adding "RivetServerConf HonorHeaderOnlyRequests yes" to the server configuration)
#
# Default: no

AC_DEFUN([HONOR_HEAD_REQUESTS],[
    AC_ARG_ENABLE(
    head_requests,
    [  --enable-head-requests Returns real headers in response to a HEAD request],
    [ honor_head_requests=$enable_head_requests ],
    [ honor_head_requests="no"]
    )

    AC_MSG_CHECKING([if Rivet has to honor HEAD requests])
    if test "$honor_head_requests" = "yes"; then
        AC_MSG_RESULT([yes])
        AC_DEFINE(HEAD_REQUESTS,1,[Honor HEAD requests])
    else
        AC_MSG_RESULT([no, Rivet will shunt HEAD requests])
        AC_DEFINE(HEAD_REQUESTS,0,[Honor HEAD requests])
    fi
])

# SINGLE_WORKER_TCL_THREAD 
#
# This options is used by the worker MPM bridge for debugging.
# When enabled rivet_worker_bridge will create a single Tcl interp thread instead 
# of the a whole pool of them
# 
# Defautl: no

AC_DEFUN([SINGLE_WORKER_TCL_THREAD],[
    AC_ARG_ENABLE(
    single_thread,
    [  --enable-single-thread forces the worker brigde to create a single thread (debug)],
    [ single_thread=$enable_single_thread ],
    [ single_thread="no"]
    )

    AC_MSG_CHECKING([if the worker MPM bridge will run in single thread mode])
    if test "$single_thread" = "yes"; then
        AC_MSG_RESULT([yes])
        AC_DEFINE(MPM_SINGLE_TCL_THREAD,1,[yes, MPM worker single thread])
    else
        AC_MSG_RESULT([no, maximal number of Tcl threads])
    fi
])

# -- SERIALIZE_HTTP_REQUEST
#
# The macro defines the symbol SERIALIZE_HTTP_REQUESTS and cooperates 
# with macro HTTP_REQUESTS_PROC. This option is useful only 
# for debugging (avoids threads concurrency). See the code of the
# worker bridge to see the preprocessor macros cooperating to
# attain this feature
#
# Default: no

AC_DEFUN([HTTP_REQUESTS_MUTEX],[
    AC_ARG_ENABLE(
        requests_serialization,
        [  --enable-requests-serialization Forces HTTP requests serialization among threads(debug)],
        [ requests_serialization=$enable_requests_serialization ],
        [ requests_serialization="no" ]
    )

    AC_MSG_CHECKING([if we want the worker bridge to serialize HTTP requests])
    if test "$requests_serialization" = "yes"; then
        AC_MSG_RESULT([yes])
        AC_DEFINE(SERIALIZE_HTTP_REQUESTS,1,[requests will be serialized])
    else
        AC_MSG_RESULT([no, HTTP requests will not be serialized])
    fi
])

# -- RIVET_DEBUG_BUILD
#
# Defining a symbol for conditional inclusion of code for debugging purposes
#
# Default: no
#

AC_DEFUN([BUILD_DEBUG_CODE],[
    AC_ARG_ENABLE(
        rivet_debug_build,
        [  --enable-rivet-debug-build Includes optional debugging code],
        [ rivet_debug_build=$enable_rivet_debug_build ],
        [ rivet_debug_build="no" ]
    )

    AC_MSG_CHECKING([if we are building mod_rivet for debugging])
    if test "$rivet_debug_build" = "yes"; then
        AC_MSG_RESULT([yes])
        AC_DEFINE(DEBUG_BUILD,1,[we are building mod_rivet with optional code])
    else
        AC_MSG_RESULT([no, ordinary build])
    fi
])

# RIVET_COMMANDS_EXPORT (--enable-rivet-commands-export).
# Enable export of commands in Rivet's namespace. Definining this symbols
# sets the boolean configuration variable rivet_commands_export 
# Default: yes

AC_DEFUN([RIVET_COMMANDS_EXPORT],[
    AC_ARG_ENABLE(
        rivet-commands-export,
        [  --disable-rivet-commands-export to prevent export from ::rivet namespace],
        [ rivet_commands_export=$enable_rivet_commands_export ],
        [ rivet_commands_export="yes"]
    )

    AC_MSG_CHECKING([if the commands in ::rivet namespace will be exported])
    if test "$rivet_commands_export" = "yes"; then
        AC_MSG_RESULT([yes])
        AC_DEFINE(NAMESPACE_EXPORT,1,[commands will be exported])
    else
        AC_MSG_RESULT([no])
        AC_DEFINE(NAMESPACE_EXPORT,0,[commands will not be exported])
    fi
])

# IMPORT_RIVET_COMMANDS (--enable-import-rivet-commands).
# For compatibility the module can be compiled and installed forcing rivet
# to import commands from ::rivet into the global namespace.
# Default: no

AC_DEFUN([IMPORT_RIVET_COMMANDS],[
    AC_ARG_ENABLE(
        import-rivet-commands,
        [  --enable-import-rivet-commands requires explicit namespace import],
        [ import_rivet_commands=$enable_import_rivet_commands],
        [ import_rivet_commands="no"]
    )

    AC_MSG_CHECKING([if ::rivet namespace will be automatically imported for compatibility])
    if test "$import_rivet_commands" = "yes"; then
        AC_MSG_RESULT([yes])
        AC_DEFINE(NAMESPACE_IMPORT,1,[commands will be imported into the global namespace])
    else
        AC_MSG_RESULT([no])
        AC_DEFINE(NAMESPACE_IMPORT,0,[good, no automatic import will be done])
    fi
])


# SEPARATE_VIRTUAL_INTERPS (--enable-virtual-interps-separation)
# Virtual hosts get their own interpreter and configuration. Different
# applications running on different virtual hosts don't mix up variables
# and namespaces, avoiding conflicts.
# Default: no

AC_DEFUN([VIRTUAL_INTERPS_SEPARATION],[
    AC_ARG_ENABLE(
    virtual-interps-separation,
    [  --enable-virtual-interps-separation to turn on virtual host separation],
    [ separate_virtual_interps=$enable_virtual_interps_separation ],
    [ separate_virtual_interps="no"]
    )

    AC_MSG_CHECKING([whether Rivet will create an interpreter for each virtual host])
    if test "$separate_virtual_interps" = "yes"; then
        AC_MSG_RESULT([yes])
        AC_DEFINE(SEPARATE_VIRTUAL_INTERPS,1,[virtual hosts will have their own interp])
    else
        AC_MSG_RESULT([no])
        AC_DEFINE(SEPARATE_VIRTUAL_INTERPS,0,[one interpreter per child])
    fi
])

# POST_MAX_SIZE (--with-post-max)
# Maximum size of data posted by a form
# Default: 0=unlimited

AC_DEFUN([POST_MAX_SIZE],[
    AC_ARG_WITH(
    post_max,
    [  --with-post-max=BYTES Maximum size of data to be sent with a POST],,
        with_post_max=0
    )
    
    AC_MSG_CHECKING([maximum size of a POST])
    MAX_POST=${with_post_max}
    AC_SUBST(MAX_POST)
    if test $with_post_max = 0; then
        AC_MSG_RESULT([unlimited size])
    else
        AC_MSG_RESULT([$with_post_max])
    fi
])

# UPLOAD_TO_VAR (--enable-upload-var)
# Enables upload of files into Tcl variables
# Default: 1=enabled

AC_DEFUN([UPLOAD_TO_VAR],[
    AC_ARG_ENABLE(
    upload-var,
    [  --disable-upload-var to disable automatic upload to variables ],
    [ upload_var=$enable_upload_var ],
    [ upload_var="yes"]
    )

    AC_MSG_CHECKING([whether files are uploaded to Tcl variables])
    if test "$upload_var" = "yes"; then
        AC_MSG_RESULT([yes])
        AC_DEFINE(UPLOAD_FILES_TO_VAR,1,[Files are uploaded to Tcl variables])
    else
        AC_MSG_RESULT([no])
        AC_DEFINE(UPLOAD_FILES_TO_VAR,0,[uploads go to files])
    fi

])

#APACHE_VERSION
MOD_RIVET_CORE
GET_RIVET_BASE
APACHE
CHECK_APXS
APACHE_INCLUDES
APR_HANDLING
APU_HANDLING
RIVET_TCL_LIB
DISPLAY_RIVET_VERSION
UPLOAD_DIRECTORY
HONOR_HEAD_REQUESTS
VIRTUAL_INTERPS_SEPARATION
POST_MAX_SIZE
UPLOAD_TO_VAR
IMPORT_RIVET_COMMANDS
APACHE_REQUEST
RIVET_CORE_CMDS
RIVET_CHANNEL
SINGLE_WORKER_TCL_THREAD
HTTP_REQUESTS_MUTEX
BUILD_DEBUG_CODE
AC_HEADER_STDBOOL

# Let's separate the point version from the major and minor version
# to build a Rivet version to be substituted as basic version for 
# package Rivet, central initialization of the Tcl environment

VERSION=${PACKAGE_VERSION}
AX_SPLIT_VERSION
AC_DEFINE_UNQUOTED(INIT_VERSION,"${AX_MAJOR_VERSION}.${AX_MINOR_VERSION}",[Rivet Tcl package version])
AC_MSG_NOTICE([Rivet package version is ${AX_MAJOR_VERSION}.${AX_MINOR_VERSION}])
AC_SUBST(INIT_VERSION,"${AX_MAJOR_VERSION}.${AX_MINOR_VERSION}")
AC_SUBST(RIVETLIB_PACKAGE,"rivetlib",[rivetlib package name])
AC_SUBST(RIVETLIB_PACKAGE_VERSION,"${AX_MAJOR_VERSION}.${AX_MINOR_VERSION}")

if test $import_rivet_commands = "yes"; then
    AC_MSG_NOTICE([forcing Rivet to export commands from ::rivet namespace])
    AC_DEFINE(NAMESPACE_EXPORT,1,[commands will be exported])
else
    RIVET_COMMANDS_EXPORT
fi
AC_C_INLINE

#AC_SUBST(apache_version_dir)
AC_SUBST(MOD_RIVET_INCLUDES)

AC_DEFINE_UNQUOTED(RIVETLIB_DESTDIR,"${RIVET_TCL_TARGET}",[The path to the rivet tcl library])
AC_DEFINE_UNQUOTED(NAMEOFEXECUTABLE,"${TCLSH_PROG}",[The path to a working tclsh executable])
AC_DEFINE_UNQUOTED(UPLOAD_DIR,"${RIVET_UPLOAD_DIR}",[Path to the disk directory where uploads are saved])
AC_DEFINE_UNQUOTED(MAX_POST,[$MAX_POST],[Max size of data in POST operations])
AC_DEFINE_UNQUOTED(SEPARATE_CHANNELS,0,[Separate Channels for virtual hosts])
AC_DEFINE_UNQUOTED(CONFIGURE_CMD,"${CONFIGURE_CMD}",[configure command string])
AC_DEFINE_UNQUOTED(RIVET_CORE,"${rivet_core}",[mod_rivet core])

# We need to use the package path for the installation procedure.  On
#Debian linux TCL_PACKAGE_PATH may have more than one path in the
#TCL_PACKAGE_PATH variable, so we have to handle this
HANDLE_TCL_PACKAGE_PATH
AC_SUBST(TCL_PACKAGE_PATH)


# Finally, substitute all of the various values into the Makefile.
# You may alternatively have a special pkgIndex.tcl.in or other files
# which require substituting the AC variables in.  Include these here.
#--------------------------------------------------------------------
AC_CONFIG_FILES([Makefile src/Makefile rivet/init.tcl doc/Makefile doc/convert_examples.tcl doc/rivet.xml])

#case $apache_version_dir in
#    apache-1) AC_CONFIG_FILES([Makefile src/Makefile src/apache-1/Makefile doc/Makefile]) ;;
#    apache-2) AC_CONFIG_FILES([Makefile src/Makefile src/apache-2/Makefile doc/Makefile]) ;;
#esac
AC_OUTPUT

if test "$print_fileevent_msg" = "1"; then
    AC_MSG_NOTICE([========================================================================])
    AC_MSG_NOTICE([                             WARNING!])
    AC_MSG_NOTICE([========================================================================])
    AC_MSG_NOTICE([The Tcl notifier (and consequently the event loop) does not work with])
    AC_MSG_NOTICE([Rivet running Tcl $TCL_VERSION$TCL_PATCH_LEVEL and the 'prefork' MPM of Apache.])
    AC_MSG_NOTICE([In order to have asynchronous I/O working the required versions are:])
    AC_MSG_NOTICE([   - threaded builds: Tcl >= 8.5.15 (8.5 version) or Tcl >= 8.6.1])
    AC_MSG_NOTICE([   - any non-threaded build of Tcl >= 8.5.10])
    AC_MSG_NOTICE([])
    AC_MSG_NOTICE([Nonetheless Rivet scripts work with Tcl >= 8.5.10 provided])
    AC_MSG_NOTICE([you do not have to rely on the event loop to do I/O (e.g. you])
    AC_MSG_NOTICE([cannot use the 'fileevent' command to set up callbacks)])
    AC_MSG_NOTICE([see https://issues.apache.org/bugzilla/show_bug.cgi?id=55153])
    AC_MSG_NOTICE([========================================================================])
fi 

