 # Copyright (c) 2000 Gregory Trubetskoy.  All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions
 # are met:
 #
 # 1. Redistributions of source code must retain the above copyright
 #    notice, this list of conditions and the following disclaimer. 
 #
 # 2. Redistributions in binary form must reproduce the above copyright
 #    notice, this list of conditions and the following disclaimer in
 #    the documentation and/or other materials provided with the
 #    distribution.
 #
 # 3. The end-user documentation included with the redistribution, if
 #    any, must include the following acknowledgment: "This product 
 #    includes software developed by Gregory Trubetskoy."
 #    Alternately, this acknowledgment may appear in the software itself, 
 #    if and wherever such third-party acknowledgments normally appear.
 #
 # 4. The names "mod_python", "modpython" or "Gregory Trubetskoy" must not 
 #    be used to endorse or promote products derived from this software 
 #    without prior written permission. For written permission, please 
 #    contact grisha@modpython.org.
 #
 # 5. Products derived from this software may not be called "mod_python"
 #    or "modpython", nor may "mod_python" or "modpython" appear in their 
 #    names without prior written permission of Gregory Trubetskoy.
 #
 # THIS SOFTWARE IS PROVIDED BY GREGORY TRUBETSKOY ``AS IS'' AND ANY
 # EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GREGORY TRUBETSKOY OR
 # HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 # OF THE POSSIBILITY OF SUCH DAMAGE.
 # ====================================================================
 #

dnl $Id: configure.in,v 1.11 2001/06/11 19:16:25 gtrubetskoy Exp $

dnl Process this file with autoconf to produce a configure script.
AC_INIT(src/mod_python.c)

# includes
INCLUDES="-I`pwd`/src/include"

dnl Checks for programs.
AC_PROG_CC
AC_PROG_RANLIB
AC_SUBST(AR)
AC_CHECK_PROGS(AR, ar aal, ar)
AC_PROG_INSTALL
AC_PROG_MAKE_SET

dnl Replace `main' with a function in -lm:
AC_CHECK_LIB(m, main)

dnl Checks for header files.

dnl Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST

### humor lowers blood pressure
AC_MSG_CHECKING(your blood pressure)
AC_MSG_RESULT([a bit high, but we can proceed])

## The goal is to find apxs
AC_CHECKING(whether apxs is available)
AC_SUBST(APXS)
AC_SUBST(DSO)
AC_SUBST(ALL)

# check for --with-apxs
AC_MSG_CHECKING(for --with-apxs)
AC_ARG_WITH(apxs, [--with-apxs=PATH 	Path to apxs],
[
  if test -x "$withval"
  then
    AC_MSG_RESULT([$withval executable, good])
    APXS=$withval
  else
    echo
    AC_MSG_ERROR([$withval not found or not executable])
  fi
],
AC_MSG_RESULT(no))

# if no apxs found yet, check /usr/local/apache/sbin
# since it's the default Apache location
if test -z "$APXS"; then
  AC_MSG_CHECKING(for apxs in /usr/local/apache/sbin)
  if test -x /usr/local/apache/sbin/apxs; then
    APXS=/usr/local/apache/sbin/apxs
    AC_MSG_RESULT([found, we'll use this. Use --with-apxs to specify another.])
  else
    AC_MSG_RESULT(no)
  fi
fi

# last resort
if test -z "$APXS"; then
  AC_MSG_CHECKING(for apxs in your PATH)
  AC_PATH_PROG(APXS, apxs)
  if test -n "$APXS"; then
    AC_MSG_RESULT([found $APXS, we'll use this. Use --with-apxs to specify another.])
  fi
fi  

# if apxs was still not found, then no DSO
AC_SUBST(LIBEXECDIR)
AC_SUBST(EPRINTF_HACK)
if test -z "$APXS"; then
  AC_MSG_WARN([**** apxs was not found, DSO compilation will not be available.])
  AC_MSG_WARN([**** You can use --with-apxs to specify where your apxs is.])
  DSO="no_dso"
  ALL="static"
else
  DSO="do_dso"
  ALL="dso"
  
  # determine LIBEXEC
  AC_MSG_CHECKING(for Apache libexec directory)
  LIBEXECDIR=`${APXS} -q LIBEXECDIR`
  AC_MSG_RESULT($LIBEXECDIR)

  # determine INCLUDES
  AC_MSG_CHECKING([for Apache include directory])
  AP_INCLUDES="-I`${APXS} -q INCLUDEDIR`"
  AC_MSG_RESULT($AP_INCLUDES)

  dnl Small hack to work around _eprintf.o problem on Solaris
  if test "`uname`" = "SunOS"; then
    AC_MSG_CHECKING([for gcc on Solaris possible missing _eprintf problem])
    if test "$CC" = "gcc"; then
      EPRINTF_HACK="_eprintf.o"
    fi
    AC_MSG_RESULT("done")
  fi

fi

# check for --with-apache
AC_SUBST(AP_SRC)
AC_SUBST(AP_SRC_OWN)
AC_SUBST(AP_SRC_GRP)
AC_MSG_CHECKING(for --with-apache)
AC_ARG_WITH(apache, [--with-apache=DIR 	Path to Apache sources],
[
  AP_SRC=`cd $withval; pwd`

  dnl  For Apache 2.0 apxs in src/support may be usable
  if test ! -f "$AP_SRC/src/include/httpd.h"; then
    AC_MSG_ERROR([$withval does not look like an Apache source directory.])
  fi

  AC_MSG_RESULT($AP_SRC)
  AP_INCLUDES="-I${AP_SRC}/src/include -I${AP_SRC}/src/os/unix"

  # note who owns the apache source directory
  AP_SRC_OWN="`ls -ld $AP_SRC | awk '{print $3}'`"
  AP_SRC_GRP="`ls -ld $AP_SRC | awk '{print $4}'`"
],
AC_MSG_RESULT(no))

AC_SUBST(STATIC)
if test -z "$AP_SRC"; then
  AC_MSG_WARN([**** No apache sources specified, static compilation will not be available.])
  AC_MSG_WARN([**** You can use --with-apache to specify where your Apache sources are.])
  STATIC="no_static"
else
  STATIC="do_static"
fi

if test "$STATIC" = "no_static" -a "$DSO" = "no_dso"; then
  AC_MSG_ERROR([Neither static nor DSO option available, there is no point in continuing.])
fi

AC_MSG_CHECKING(for --with-python)
AC_ARG_WITH(python, [--with-python=DIR	Path to Python sources],
[
  AC_SUBST(PYTHON_SRC)
  PYTHON_SRC=`cd $withval; pwd`
  AC_MSG_RESULT($PYTHON_SRC)
],
AC_MSG_RESULT(no))

# check for Python executable
if test -z "$PYTHON_SRC"; then
  AC_PATH_PROG(PYTHON_BIN, python)
  if test -z "$PYTHON_BIN"; then
    AC_MSG_ERROR(python binary not found)
  fi
else
  AC_PATH_PROG(PYTHON_BIN, python, "", $PYTHON_SRC)
  if test -z "$PYTHON_BIN"; then
    AC_MSG_ERROR([python executable not found in ${withval}, 
perhaps you need to build Python first.])
  fi
fi

# find out python version
AC_MSG_CHECKING(Python version)
PyVERSION=`$PYTHON_BIN -c ['import sys; print sys.version[:3]'`]
AC_MSG_RESULT($PyVERSION)

# check if python is compiled with threads
AC_MSG_CHECKING(whether Python is compiled with thread support)
PyTHREADS=`$PYTHON_BIN -c "import sys; print \"thread\" in sys.builtin_module_names"`
if test "$PyTHREADS" = "1"; then
  AC_MSG_RESULT(yes)
  echo
  echo "  ****** WARNING ******"
  echo "  Python is compiled with thread support. Apache 1.3 does not use threads."
  echo "  On some systems this will cause problems during compilation, on others "
  echo "  it may result in unpredictable behaviour of your Apache server. Yet on"
  echo "  others it will work just fine. The recommended approach is to compile"
  echo "  Python without thread support in a separate location and specify it with"
  echo "  --with-python option to this ./configure script."
  echo 
else
  AC_MSG_RESULT([no threads, good])
fi

# find out compiled in install prefix
AC_MSG_CHECKING(Python install prefix)
PyEXEC_INSTALLDIR=`$PYTHON_BIN -c "import sys; print sys.exec_prefix"`
AC_MSG_RESULT($PyEXEC_INSTALLDIR)

# this is where the Python libraries will get installed
AC_SUBST(PY_STD_LIB)
PY_STD_LIB=${PyEXEC_INSTALLDIR}/lib/python${PyVERSION}

# set python std library variable
AC_MSG_CHECKING(what libraries Python was linked with)
AC_SUBST(LIBS)
if test -z "$PYTHON_SRC"; then
  PyLIBP=${PyEXEC_INSTALLDIR}/lib/python${PyVERSION}
  PyLIBPL=${PyLIBP}/config
  PyPYTHONLIBS=${PyLIBPL}/libpython${PyVERSION}.a
  PyLIBS=`grep "^LIB[[SMC]]=" ${PyLIBPL}/Makefile | cut -f2 -d= | tr '\011\012\015' '   '`
  PyMODLIBS=`grep "^LOCALMODLIBS=" ${PyLIBPL}/Makefile | cut -f2 -d= | tr '\011\012\015' '   '`
  PY_LIBS="${PyPYTHONLIBS} ${PyLIBS} ${PyMODLIBS}"
else
  PyPYTHONLIBS=${PYTHON_SRC}/libpython${PyVERSION}.a
  if test ${PyVERSION} = "2.1"; then
    PyLIBS=`grep "^LIB[[SMC]]=" ${PYTHON_SRC}/Makefile | cut -f2 -d= | tr '\011\012\015' '   '`
    PyMODLIBS=`grep "^LOCALMODLIBS=" ${PYTHON_SRC}/Makefile | cut -f2 -d= | tr '\011\012\015' '   '`
  else
    PyLIBS=`grep "^LIB[[SMC]]=" ${PYTHON_SRC}/Modules/Makefile | cut -f2 -d= | tr '\011\012\015' '   '`
    PyMODLIBS=`grep "^LOCALMODLIBS=" ${PYTHON_SRC}/Modules/Makefile | cut -f2 -d= | tr '\011\012\015' '   '`
  fi
  PY_LIBS="${PyPYTHONLIBS} ${PyLIBS} ${PyMODLIBS}"
fi
 
## XXX this is a small work around for a weird RedHat problem
## erase -lieee from library list
if test -f /etc/redhat-release; then
  PY_LIBS="`echo $PY_LIBS | sed s/-lieee//`"
fi

LIBS="${LIBS} ${PY_LIBS}"
AC_MSG_RESULT($PY_LIBS)

AC_MSG_CHECKING(linker flags used to link Python)
AC_SUBST(LDFLAGS)
if test -z "$PYTHON_SRC"; then
  PyLFS=`grep "^LINKFORSHARED=" ${PyLIBPL}/Makefile | cut -f2 -d= | tr '\011\012\015' '   '`
  PyLDFLAGS=`grep "^LDFLAGS=" ${PyLIBPL}/Makefile | cut -f2 -d= | tr '\011\012\015' '   '`
  LDFLAGS="${LDFLAGS} ${PyLFS} ${PyLDFLAGS}"
else
  PyLFS=`grep "^LINKFORSHARED=" ${PYTHON_SRC}/Makefile | cut -f2 -d= | tr '\011\012\015' '   '`
  PyLDFLAGS=`grep "^LDFLAGS=" ${PYTHON_SRC}/Makefile | cut -f2 -d= | tr '\011\012\015' '   '`
  PY_LDFLAGS="${PyLFS} ${PyLDFLAGS}"
fi
LDFLAGS="${LDFLAGS} ${PY_LDFLAGS}"
AC_MSG_RESULT($PY_LDFLAGS)

AC_MSG_CHECKING(where Python include files are)
AC_SUBST(INCLUDES)
if test -z "$PYTHON_SRC"; then
  PY_INCLUDES="-I${PyEXEC_INSTALLDIR}/include/python${PyVERSION}"
else
  PY_INCLUDES="-I${PYTHON_SRC} -I${PYTHON_SRC}/Include"
fi
INCLUDES="${INCLUDES} ${AP_INCLUDES} ${PY_INCLUDES}"
AC_MSG_RESULT($PY_INCLUDES)

AC_SUBST(MKDEP)

# see if we have mkdep
AC_PATH_PROG(MKDEP, "mkdep")

if test -z "${MKDEP}"; then
  # or makedepend
  AC_PATH_PROG(MKDEP, "makedepend")
fi

AC_OUTPUT(Makefile src/Makefile src/libpython.module Doc/Makefile)

if test -n "$MKDEP"; then
  # make dependencies
  echo "analyzing dependencies" 
  cd src
  make depend > /dev/null 2>&1
fi


