dnl
dnl Autoconf configuration for Apache httpd
dnl
dnl     Use ./buildconf to produce a configure script
dnl

AC_PREREQ(2.60)
AC_INIT(ABOUT_APACHE)

AC_CONFIG_HEADER(include/ap_config_auto.h)
AC_CONFIG_AUX_DIR(build)

dnl Absolute source/build directory
abs_srcdir=`(cd $srcdir && pwd)`
abs_builddir=`pwd`

dnl Ensure that the httpd version is included
HTTPD_VERSION=`$abs_srcdir/build/get-version.sh all $abs_srcdir/include/ap_release.h AP_SERVER`
HTTPD_MMN=`$abs_srcdir/build/get-version.sh mmn $abs_srcdir/include/ap_mmn.h MODULE_MAGIC_NUMBER`

dnl #
dnl # Include our own M4 macros along with those for APR and libtool
dnl #
sinclude(build/apr_common.m4)
sinclude(build/find_apr.m4)
sinclude(build/find_apu.m4)
sinclude(acinclude.m4)

dnl Later versions of autoconf (>= 2.62) by default cause the produced
dnl configure script to emit at least warnings when it comes across unknown
dnl command line options. These versions also have the macro
dnl AC_DISABLE_OPTION_CHECKING defined which turns this off by default.
dnl We want to have this turned off here since our configure calls can
dnl contain options for APR / APR-UTIL configure that are unknown to us.
dnl So avoid confusing the user by turning this off. See also PR 45221.
ifdef([AC_DISABLE_OPTION_CHECKING], [AC_DISABLE_OPTION_CHECKING])

dnl XXX we can't just use AC_PREFIX_DEFAULT because that isn't subbed in
dnl by configure until it is too late.  Is that how it should be or not?
dnl Something seems broken here.                                               
AC_PREFIX_DEFAULT(/usr/local/apache2)

dnl Get the layout here, so we can pass the required variables to apr
APR_ENABLE_LAYOUT(Apache, [errordir iconsdir htdocsdir cgidir statedir manualdir proxycachedir])

dnl reparse the configure arguments.
APR_PARSE_ARGUMENTS

dnl export expanded and relative configure argument variables
APACHE_EXPORT_ARGUMENTS

dnl Save user-defined environment settings for later restoration
dnl
APR_SAVE_THE_ENVIRONMENT(CPPFLAGS)
APR_SAVE_THE_ENVIRONMENT(CFLAGS)
APR_SAVE_THE_ENVIRONMENT(CXXFLAGS)
APR_SAVE_THE_ENVIRONMENT(LDFLAGS)
APR_SAVE_THE_ENVIRONMENT(LIBS)
APR_SAVE_THE_ENVIRONMENT(INCLUDES)

dnl Generate ./config.nice for reproducing runs of configure
dnl
APR_CONFIG_NICE(config.nice)

nl='
'
dnl Check that mkdir -p works
APR_MKDIR_P_CHECK($top_srcdir/build/mkdir.sh)

dnl get an EGREP to use in the Makefiles
AC_PROG_EGREP
APACHE_SUBST(EGREP)

dnl ## Run configure for packages Apache uses

dnl shared library support for these packages doesn't currently
dnl work on some platforms

AC_CANONICAL_SYSTEM

orig_prefix="$prefix"

AC_MSG_NOTICE([])
AC_MSG_NOTICE([Configuring Apache Portable Runtime library...])
AC_MSG_NOTICE([])

AC_ARG_WITH(included-apr,
APACHE_HELP_STRING(--with-included-apr,Use bundled copies of APR/APR-Util))

if test "x$with_included_apr" = "xyes"; then
  apr_found=reconfig
  if test ! -d srclib/apr && test ! -d $srcdir/srclib/apr; then
    AC_MSG_ERROR([Bundled APR requested but not found at ./srclib/. Please refer to the documentation on APR in the httpd INSTALL file.])
  fi
else 
  APR_FIND_APR("$srcdir/srclib/apr", "./srclib/apr", 1, 1 2, [
    version=`$apr_config --version`
    case x${version} in
    x1.[[0-5]].*)
      AC_MSG_WARN([APR version 1.6.0 or later is required, found $version])
      apr_acceptable=no
      ;;
    esac
    unset version
   ])
fi

if test "$apr_found" = "no"; then
  AC_MSG_ERROR([APR not found.  Please refer to the documentation on APR in the httpd INSTALL file.])
fi

if test "$apr_found" = "reconfig"; then
  APR_SUBDIR_CONFIG(srclib/apr,
                    [$apache_apr_flags --prefix=$prefix --exec-prefix=$exec_prefix --libdir=$libdir --includedir=$includedir --bindir=$bindir --datadir=$datadir --with-installbuilddir=$installbuilddir],
                    [--enable-layout=*|\'--enable-layout=*])
  dnl We must be the first to build and the last to be cleaned
  AP_BUILD_SRCLIB_DIRS="apr $AP_BUILD_SRCLIB_DIRS"
  AP_CLEAN_SRCLIB_DIRS="$AP_CLEAN_SRCLIB_DIRS apr"

  dnl We have to find apr-N-config when we reconfigure APR.
  for majorver in 1 2; do
    test_apr_config="./srclib/apr/apr-${majorver}-config"
    if test -f "$test_apr_config"; then
      apr_config="$test_apr_config"
    fi
  done
fi

APR_SETIFNULL(CC, `$apr_config --cc`)
APR_SETIFNULL(CPP, `$apr_config --cpp`)
APR_ADDTO(CFLAGS, `$apr_config --cflags`)
APR_ADDTO(CPPFLAGS, `$apr_config --cppflags`)
dnl internal-only CPPFLAGS (shouldn't affect third-party module builds)
INTERNAL_CPPFLAGS=""
APR_ADDTO(LDFLAGS, `$apr_config --ldflags`)
SHLIBPATH_VAR=`$apr_config --shlib-path-var`
APR_BINDIR=`$apr_config --bindir`
APR_INCLUDEDIR=`$apr_config --includedir`
APR_INCLUDES=`$apr_config --includes`
APR_VERSION=`$apr_config --version`
apr_major_version=`echo ${APR_VERSION} | sed 's,\..*,,'`
APR_CONFIG="$APR_BINDIR/apr-${apr_major_version}-config"

AC_MSG_NOTICE([])
AC_MSG_NOTICE([Configuring Apache Portable Runtime Utility library...])
AC_MSG_NOTICE([])

if test "x${apr_major_version}" = "x2"; then
  apu_found=obsolete
elif test "x$with_included_apr" = "xyes"; then
  apu_found=reconfig
  if test ! -d srclib/apr-util && test ! -d $srcdir/srclib/apr-util; then
    AC_MSG_ERROR([Bundled APR-Util requested but not found at ./srclib/.  Please refer to the documentation on APR in the httpd INSTALL file.])
  fi
else 
   dnl If httpd is buildconf'ed against an apr 2.x tree, then 1.x
   dnl isn't supported. 
   ifdef([APR_FIND_APU], [
     APR_FIND_APU("$srcdir/srclib/apr-util", "./srclib/apr-util", 
                  1, ${apr_major_version})
   ], [apu_found=no])
fi

if test "$apu_found" = "no"; then
  AC_MSG_ERROR([APR-util not found.  Please refer to the documentation on APR in the httpd INSTALL file.])
fi

# Catch some misconfigurations:
case ${apr_found}.${apu_found} in
reconfig.yes)
  AC_MSG_ERROR([Cannot use an external APR-util with the bundled APR])
  ;;
yes.reconfig)
  AC_MSG_ERROR([Cannot use an external APR with the bundled APR-util])
  ;;
esac  

if test "$apu_found" = "reconfig"; then
  APR_SUBDIR_CONFIG(srclib/apr-util,
                    [--with-apr=../apr --prefix=$prefix --exec-prefix=$exec_prefix --libdir=$libdir --includedir=$includedir --bindir=$bindir],
                    [--enable-layout=*|\'--enable-layout=*])
  dnl We must be the last to build and the first to be cleaned
  AP_BUILD_SRCLIB_DIRS="$AP_BUILD_SRCLIB_DIRS apr-util"
  AP_CLEAN_SRCLIB_DIRS="apr-util $AP_CLEAN_SRCLIB_DIRS"
  dnl APR and APR-Util major versions must match
  apu_config="./srclib/apr-util/apu-${apr_major_version}-config"
fi

if test "$apu_found" = "obsolete"; then
  AC_MSG_NOTICE([APR-util obsoleted, woohoo])
else
  APR_ADDTO(LDFLAGS, `$apu_config --ldflags`)
  APU_BINDIR=`$apu_config --bindir`
  APU_INCLUDEDIR=`$apu_config --includedir`
  APU_INCLUDES=`$apu_config --includes`
  APU_VERSION=`$apu_config --version`
  APU_CONFIG="$APU_BINDIR/apu-`echo ${APU_VERSION} | sed 's,\..*,,'`-config"
fi

dnl In case we picked up CC and CPP from APR, get that info into the
dnl config cache so that PCRE uses it.  Otherwise, CC and CPP used for
dnl PCRE and for our config tests will be whatever PCRE determines.
AC_PROG_CC
AC_PROG_CPP

dnl Try to get c99 support for variadic macros
ifdef([AC_PROG_CC_C99], [AC_PROG_CC_C99])

dnl In case of cross compilation we set CC_FOR_BUILD to cc unless
dnl we got already CC_FOR_BUILD from environment.
if test "x${build_alias}" != "x${host_alias}"; then
  if test "x${CC_FOR_BUILD}" = "x"; then
    CC_FOR_BUILD=cc
  fi
fi

if test "x${cache_file}" = "x/dev/null"; then
  # Likewise, ensure that CC and CPP are passed through to the pcre
  # configure script iff caching is disabled (the autoconf 2.5x default).
  export CC; export CPP
fi

AC_ARG_WITH(pcre,
APACHE_HELP_STRING(--with-pcre=PATH,Use external PCRE library))
if test "x$with_pcre" = "x" || test "$with_pcre" = "yes"; then
  with_pcre="$PATH"
else if command -v $with_pcre 2>/dev/null; then :; else
  with_pcre="$with_pcre/bin:$with_pcre"
fi
fi

AC_CHECK_TARGET_TOOLS(PCRE_CONFIG, [pcre2-config pcre-config],
                      [`command -v $with_pcre 2>/dev/null`], $with_pcre)

if test "x$PCRE_CONFIG" != "x"; then
  if $PCRE_CONFIG --version >/dev/null 2>&1; then :; else
    AC_MSG_ERROR([Did not find working script at $PCRE_CONFIG])
  fi
  case `$PCRE_CONFIG --version` in
  [1[0-9].*])
    AC_DEFINE(HAVE_PCRE2, 1, [Detected PCRE2]) 
    ;;
  [[1-5].*])
    AC_MSG_ERROR([Need at least pcre version 6.7])
    ;;
  [6.[0-6]*])
    AC_MSG_ERROR([Need at least pcre version 6.7])
    ;;
  esac
  AC_MSG_NOTICE([Using external PCRE library from $PCRE_CONFIG])
  APR_ADDTO(PCRE_INCLUDES, [`$PCRE_CONFIG --cflags`])
  APR_ADDTO(PCRE_LIBS, [`$PCRE_CONFIG --libs8 2>/dev/null || $PCRE_CONFIG --libs`])
  APR_ADDTO(HTTPD_LIBS, [\$(PCRE_LIBS)])
else
  AC_MSG_ERROR([pcre(2)-config for libpcre not found. PCRE is required and available from http://pcre.org/])
fi
APACHE_SUBST(PCRE_LIBS)

AC_MSG_NOTICE([])
AC_MSG_NOTICE([Configuring Apache httpd...])
AC_MSG_NOTICE([])

dnl If the source dir is not equal to the build dir, 
dnl then we are running in VPATH mode.

APR_ADDTO(INCLUDES, [-I.])

if test "$abs_builddir" != "$abs_srcdir"; then
  APR_ADDTO(INCLUDES, [-I\$(top_builddir)/include])
fi

APR_ADDTO(INCLUDES, [-I\$(top_srcdir)/os/\$(OS_DIR) -I\$(top_srcdir)/include])

# apr/apr-util --includes may pick up system paths for dependent
# libraries, so ensure these are later in INCLUDES than local source
# directories.
APR_ADDTO(INCLUDES, $APR_INCLUDES)
APR_ADDTO(INCLUDES, $APU_INCLUDES)

dnl Add in path to PCRE includes
APR_ADDTO(INCLUDES, $PCRE_INCLUDES)

save_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $PCRE_INCLUDES"
AC_EGREP_CPP(yes,
[
#ifdef HAVE_PCRE2
yes
#else
#include <pcre.h>
#ifdef PCRE_DUPNAMES
yes
#endif
#endif
],pcre_have_dupnames=yes,pcre_have_dupnames=no)
if test "$pcre_have_dupnames" != "yes"; then
    AC_MSG_ERROR([pcre version does not support PCRE_DUPNAMES])
fi
CPPFLAGS="$save_CPPFLAGS"

AC_MSG_NOTICE([])
AC_MSG_NOTICE([Applying OS-specific hints for httpd...])
AC_MSG_NOTICE([])

case $host in
  *os2*)
      # Use a custom made libtool replacement
      echo "using aplibtool"
      LIBTOOL="$abs_srcdir/srclib/apr/build/aplibtool"
      SH_LIBTOOL="$LIBTOOL --shared --export-all"
      SH_LIBS="\$(ALL_LIBS)"
      CORE_IMPLIB_FILE="ApacheCoreOS2.la"
      CORE_IMPLIB="$abs_srcdir/server/$CORE_IMPLIB_FILE"
      MK_IMPLIB="emximp"
      other_targets="$other_targets os2core"
      INSTALL_PROG_FLAGS="-e .exe"
      SHLTCFLAGS=""
      LTCFLAGS=""
      ;;
  *)
      if test "x$LTFLAGS" = "x"; then
          LTFLAGS='--silent'
      fi
      my_libtool=`$apr_config --apr-libtool`
      LIBTOOL="$my_libtool \$(LTFLAGS)"
      libtoolversion=`$my_libtool --version`
      case $libtoolversion in
          *1.[[45]]* | *[[2-9]].[[0-9]]*)
              SH_LIBTOOL='$(LIBTOOL)'
              SHLTCFLAGS="-prefer-pic"
              LTCFLAGS="-prefer-non-pic -static"
              ;;
          *)
              SH_LIBTOOL='$(SHELL) $(top_builddir)/shlibtool $(LTFLAGS)'
              SHLTCFLAGS=""
              LTCFLAGS=""
              ;;
      esac
      ;;
esac
APACHE_SUBST(SHLTCFLAGS)
APACHE_SUBST(LTCFLAGS)

case $host in
  *-apple-aux3*)
      APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1])
      ;;
  *os2-emx*)
      APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1])
      ;;
  *-linux-*)
      case `uname -r` in
        # Unserialized accept() was not recommended until Linux 2.2.
        [[01]].* | 2.[[01]]* )
            ;;
        * )
            APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1])
            ;;
      esac
      ;;
  *486-*-bsdi* | *-netbsd* | *-freebsd* | *-apple-darwin* | *-dec-osf* | *-qnx)
      APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1])
      ;;
  *-solaris2*)
      dnl This is a hack -- we should be using AC_TRY_RUN instead
      ap_platform_runtime_link_flag="-R"
      dnl solaris 8 and above don't have a thundering herd
      dnl not sure about rev's before this one.
      case `uname -r` in
        5.[[567]]*)
            ;;
        * )
            APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1])
            ;;
      esac
      ;;
  *cygwin*)
      APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1])
      ;;
  *mingw32*)
      APR_ADDTO(INTERNAL_CPPFLAGS, [-DAP_DECLARE_EXPORT])
      APR_ADDTO(INTERNAL_CPPFLAGS, [-DAPREQ_DECLARE_EXPORT])
      APR_SETIFNULL(ac_cv_func_times, [no])
      APR_SETIFNULL(ac_cv_func_getpwnam, [no])
      APR_SETIFNULL(ac_cv_func_getgrnam, [no])
      ;;
  *aix*)
      aixver=`echo $host | sed 's/^[[^0-9]]*//' | sed 's/\.//g'`
      if test $aixver -ge 4320; then
        APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1])
      fi
      ;;
  *os390*)
      APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1])
      ;;
esac

APR_SETVAR(AP_NONBLOCK_WHEN_MULTI_LISTEN, [1])

dnl
dnl Process command line arguments. This is done early in the process so the
dnl user can get feedback quickly in case of an error.
dnl
dnl ### need to move some of the arguments "up here"

dnl ## Check for programs

AC_PATH_PROG(RM, rm)
AC_PATH_PROG(PKGCONFIG, pkg-config)
AC_PATH_PROG(RSYNC, rsync)
AC_PATH_PROG(SVN, svn)
AC_PROG_AWK
AC_PROG_LN_S
AC_CHECK_TOOL(RANLIB, ranlib, true)
dnl AC_PATH_PROG(PERL_PATH, perl)
AC_CHECK_PROGS(LYNX_PATH,[lynx links elinks], [lynx])

# Hard-coded install programs
MKINSTALLDIRS="\$(abs_srcdir)/build/mkdir.sh"
INSTALL="\$(LIBTOOL) --mode=install \$(abs_srcdir)/build/install.sh -c"
APACHE_SUBST(MKINSTALLDIRS)
APACHE_SUBST(INSTALL)

dnl Various OS checks that apparently set required flags
ifdef([AC_USE_SYSTEM_EXTENSIONS], [
AC_USE_SYSTEM_EXTENSIONS
], [
AC_AIX
AC_MINIX
])

AC_ISC_POSIX

# Ensure that satisfactory versions of apr and apr-util are 
# found if external copies are configured.
if test "${apr_found}" = "yes"; then
  # Require at least APR 1.3.x otherwise fail
  APACHE_CHECK_APxVER([apr], 1, 3)
fi

if test "${apu_found}" = "yes"; then
  # Require at least APR-util 1.3.x otherwise fail
  if test "${apr_found}" = "yes"; then
    # we need to add the APR includes to CPPFLAGS
    apu_ckver_CPPFLAGS="$CPPFLAGS"
    CPPFLAGS="$CPPFLAGS `$apr_config --includes`"
    APACHE_CHECK_APxVER([apu], 1, 3)
    CPPFLAGS="$apu_ckver_CPPFLAGS"
  else
    APACHE_CHECK_APxVER([apu], 1, 3)
  fi
fi

dnl Check for what we can generate dependency files with
APR_CHECK_DEPEND

dnl ## Check for libraries

dnl ## Check for header files

dnl I think these are just used all over the place, so just check for
dnl them at the base of the tree. If some are specific to a single
dnl directory, they should be moved (Comment #Spoon)

dnl Regarding standard header files: AC_HEADER_STDC doesn't set symbols
dnl HAVE_STRING_H, HAVE_STDLIB_H, etc., so those are checked for
dnl explicitly so that the normal HAVE_xxx_H symbol is defined.

AC_HEADER_STDC
AC_CHECK_HEADERS( \
string.h \
limits.h \
unistd.h \
sys/socket.h \
pwd.h \
grp.h \
pthread_np.h \
strings.h \
sys/prctl.h \
sys/procctl.h \
sys/processor.h \
sys/sem.h \
sys/sdt.h \
sys/loadavg.h
)
AC_HEADER_SYS_WAIT

dnl ## Check for typedefs, structures, and compiler characteristics.

AC_C_CONST

dnl ## Check for library functions
dnl ## sqrt() only needed in support/ab.c
saved_LIBS="$LIBS"
LIBS=""
AC_SEARCH_LIBS(sqrt, m)
MATH_LIBS="$LIBS"
APACHE_SUBST(MATH_LIBS)
LIBS="$saved_LIBS"

saved_LIBS="$LIBS"
LIBS=""
AC_SEARCH_LIBS(crypt, crypt)
CRYPT_LIBS="$LIBS"
APACHE_SUBST(CRYPT_LIBS)

if test "$ac_cv_search_crypt" != "no"; then
   # Test crypt() with the SHA-512 test vector from https://akkadia.org/drepper/SHA-crypt.txt
   AC_CACHE_CHECK([whether crypt() supports SHA-2], [ap_cv_crypt_sha2], [
    AC_RUN_IFELSE([AC_LANG_PROGRAM([[
#include <crypt.h>
#include <stdlib.h>
#include <string.h>

#define PASSWD_0 "Hello world!"
#define SALT_0 "\$6\$saltstring"
#define EXPECT_0 "\$6\$saltstring\$svn8UoSVapNtMuq1ukKS4tPQd8iKwSMHWjl/O817G3uBnIFNjnQJu" \
               "esI68u4OTLiBFdcbYEdFCoEOfaS35inz1"
]], [char *result = crypt(PASSWD_0, SALT_0);
     if (!result) return 1;
     if (strcmp(result, EXPECT_0)) return 2;
])], [ap_cv_crypt_sha2=yes], [ap_cv_crypt_sha2=no], [ap_cv_crypt_sha2=no])])
   if test "$ap_cv_crypt_sha2" = yes; then
     AC_DEFINE([HAVE_CRYPT_SHA2], 1, [Define if crypt() supports SHA-2 hashes])
   fi
fi

LIBS="$saved_LIBS"

dnl See Comment #Spoon

AC_CHECK_FUNCS( \
getpwnam \
getgrnam \
initgroups \
bindprocessor \
prctl \
procctl \
pthread_getthreadid_np \
timegm \
getpgid \
fopen64 \
getloadavg \
gettid
)

dnl confirm that a void pointer is large enough to store a long integer
APACHE_CHECK_VOID_PTR_LEN

if test $ac_cv_func_gettid = no; then
  # On Linux before glibc 2.30, gettid() is only usable via syscall()
  AC_CACHE_CHECK([for gettid() via syscall], ap_cv_gettid,
[AC_TRY_RUN(#define _GNU_SOURCE
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
int main(int argc, char **argv) {
pid_t t = syscall(SYS_gettid); return t == -1 ? 1 : 0; },
  [ap_cv_gettid=yes], [ap_cv_gettid=no], [ap_cv_gettid=no])])
  if test "$ap_cv_gettid" = "yes"; then
      AC_DEFINE(HAVE_SYS_GETTID, 1, [Define if you have gettid() via syscall()])
  fi
fi

dnl ## Check for the tm_gmtoff field in struct tm to get the timezone diffs
AC_CACHE_CHECK([for tm_gmtoff in struct tm], ac_cv_struct_tm_gmtoff,
[AC_TRY_COMPILE([#include <sys/types.h>
#include <time.h>], [struct tm tm; tm.tm_gmtoff;],
  ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no)])
if test "$ac_cv_struct_tm_gmtoff" = "yes"; then
    AC_DEFINE(HAVE_GMTOFF, 1, [Define if struct tm has a tm_gmtoff field])
fi

AC_CHECK_DECL(CMSG_DATA,,, [#include <sys/types.h>
#include <sys/socket.h>])
if test $ac_cv_have_decl_CMSG_DATA = "yes"; then
   AC_DEFINE([HAVE_FDPASSING], 1, [Define if file descriptor passing is supported])
   ap_has_fdpassing=1
else
   ap_has_fdpassing=0
   AC_MSG_WARN([This system does not support file descriptor passing.])
fi

APACHE_CHECK_SYSTEMD

dnl ## Set up any appropriate OS-specific environment variables for apachectl

case $host in
    *aix*)
        # for 32-bit builds, increase MAXDATA to allow lots of threads
        if test x$OBJECT_MODE != x64; then
            OS_SPECIFIC_VARS="LDR_CNTRL=\"MAXDATA=0x80000000\" ; export LDR_CNTRL ;"
        fi
        OS_SPECIFIC_VARS="$OS_SPECIFIC_VARS AIXTHREAD_SCOPE=S ; export AIXTHREAD_SCOPE"
        OS_SPECIFIC_VARS="$OS_SPECIFIC_VARS ; AIXTHREAD_MUTEX_DEBUG=OFF ; export AIXTHREAD_MUTEX_DEBUG"
        OS_SPECIFIC_VARS="$OS_SPECIFIC_VARS ; AIXTHREAD_RWLOCK_DEBUG=OFF ; export AIXTHREAD_RWLOCK_DEBUG"
        OS_SPECIFIC_VARS="$OS_SPECIFIC_VARS ; AIXTHREAD_COND_DEBUG=OFF ; export AIXTHREAD_COND_DEBUG"
        OS_SPECIFIC_VARS="$OS_SPECIFIC_VARS ; SPINLOOPTIME=1000 ; export SPINLOOPTIME"
        OS_SPECIFIC_VARS="$OS_SPECIFIC_VARS ; YIELDLOOPTIME=8 ; export YIELDLOOPTIME"
        OS_SPECIFIC_VARS="$OS_SPECIFIC_VARS ; MALLOCMULTIHEAP=considersize,heaps:8 ; export MALLOCMULTIHEAP"
        ;;
    *os390*)
        OS_SPECIFIC_VARS="export _CEE_RUNOPTS=\"STACK(,,ANY)\" ; export _EDC_ADD_ERRNO2=1"
        ;;
    *)
        OS_SPECIFIC_VARS=""
esac
      
AC_ARG_WITH(port,APACHE_HELP_STRING(--with-port=PORT,Port on which to listen (default is 80)),
        [if test "$withval" = "yes"; then AC_MSG_ERROR('option --with-port requires a value (the TCP port number)'); else PORT="$withval"; fi],
	[PORT=80])

AC_ARG_WITH(sslport,APACHE_HELP_STRING(--with-sslport=SSLPORT,Port on which to securelisten (default is 443)),
        [if test "$withval" = "yes"; then AC_MSG_ERROR('option --with-sslport requires a value (the SSL TCP port number)'); else SSLPORT="$withval"; fi],
	[SSLPORT=443])

DTRACE=true
AC_ARG_ENABLE(dtrace,APACHE_HELP_STRING(--enable-dtrace,Enable DTrace probes),
[
  enable_dtrace=$enableval
  if test "$enableval" = "yes"; then
    APR_ADDTO(CPPFLAGS, -DAPR_DTRACE_PROVIDER)
    AC_MSG_ERROR('DTrace Support in the build system is not complete. Patches Welcome!')
  fi
],
[
  enable_dtrace=no
])

dnl Disabled dtrace build for now.
enable_dtrace=no

case $host in
  *-solaris2*)
    if test $enable_dtrace = "yes" -a "$ac_cv_header_sys_sdt_h" = "yes"; then
        AC_DEFINE(AP_ENABLE_DTRACE, 1,
                  [Enable DTrace probes])
        DTRACE="/usr/sbin/dtrace $DTRACEFLAGS"
        test -f include/apache_probes.h || $DTRACE -h -s apache_probes.d -o include/apache_probes.h
    fi
    ;;
esac

APACHE_SUBST(DTRACE)

AC_ARG_ENABLE(hook-probes,APACHE_HELP_STRING(--enable-hook-probes,Enable APR hook probes),
[
    if test "$enableval" = "yes"; then
        AC_DEFINE(AP_HOOK_PROBES_ENABLED, 1,
                  [Enable the APR hook probes capability, reading from ap_hook_probes.h])
        APR_ADDTO(INTERNAL_CPPFLAGS, -DAP_HOOK_PROBES_ENABLED)
    fi
])dnl

AC_ARG_ENABLE(exception-hook,APACHE_HELP_STRING(--enable-exception-hook,Enable fatal exception hook),
[
    if test "$enableval" = "yes"; then
        AC_DEFINE(AP_ENABLE_EXCEPTION_HOOK, 1,
                  [Allow modules to run hook after a fatal exception])
    fi
])dnl

AC_ARG_ENABLE(load-all-modules,APACHE_HELP_STRING(--enable-load-all-modules,Load all modules),
[
  LOAD_ALL_MODULES=$enableval
  AC_MSG_NOTICE([Setting "LOAD_ALL_MODULES" to $LOAD_ALL_MODULES])
],
[
  LOAD_ALL_MODULES="no"
])

AC_ARG_ENABLE(maintainer-mode,APACHE_HELP_STRING(--enable-maintainer-mode,Turn on debugging and compile time warnings and load all compiled modules),
[
  if test "$enableval" = "yes"; then
    APR_ADDTO(NOTEST_CPPFLAGS, -DAP_DEBUG)
    if test "$GCC" = "yes"; then
      APACHE_ADD_GCC_CFLAG([-std=c89])
      APACHE_ADD_GCC_CFLAG([-Werror])
      APACHE_ADD_GCC_CFLAG([-Wall])
      APACHE_ADD_GCC_CFLAG([-Wstrict-prototypes])
      APACHE_ADD_GCC_CFLAG([-Wmissing-prototypes])
      APACHE_ADD_GCC_CFLAG([-Wmissing-declarations])
      APACHE_ADD_GCC_CFLAG([-Wdeclaration-after-statement])
      APACHE_ADD_GCC_CFLAG([-Wpointer-arith])
      APACHE_ADD_GCC_CFLAG([-Wformat])
      APACHE_ADD_GCC_CFLAG([-Wformat-security])
      APACHE_ADD_GCC_CFLAG([-Wunused])
    elif test "$AIX_XLC" = "yes"; then
      APR_ADDTO(NOTEST_CFLAGS,-qfullpath -qcheck=all -qinfo=pro)
    fi
    if test "x$enable_load_all_modules" = "x"; then
      LOAD_ALL_MODULES=yes
      AC_MSG_NOTICE([Maintainer mode setting "LOAD_ALL_MODULES" to $LOAD_ALL_MODULES])
    fi
    if test "x$enable_bucketeer" = "x"; then
      enable_bucketeer=yes
      AC_MSG_NOTICE([Maintainer mode setting "enable_bucketeer" to yes])
    fi
  fi
])dnl

AC_ARG_ENABLE(debugger-mode,APACHE_HELP_STRING(--enable-debugger-mode,Turn on debugging and compile time warnings and turn off optimization),
[
  if test "$enableval" = "yes"; then
    APR_ADDTO(NOTEST_CPPFLAGS, -DAP_DEBUG)
    if test "$GCC" = "yes"; then
      APACHE_ADD_GCC_CFLAG([-O0])
      APACHE_ADD_GCC_CFLAG([-Wall])
      APACHE_ADD_GCC_CFLAG([-Wstrict-prototypes])
      APACHE_ADD_GCC_CFLAG([-Wmissing-prototypes])
      APACHE_ADD_GCC_CFLAG([-Wmissing-declarations])
      APACHE_ADD_GCC_CFLAG([-Wdeclaration-after-statement])
      APACHE_ADD_GCC_CFLAG([-Werror=declaration-after-statement])
      APACHE_ADD_GCC_CFLAG([-Wpointer-arith])
      APACHE_ADD_GCC_CFLAG([-Wformat])
      APACHE_ADD_GCC_CFLAG([-Wformat-security])
      APACHE_ADD_GCC_CFLAG([-Werror=format-security])
    elif test "$AIX_XLC" = "yes"; then
      APR_ADDTO(NOTEST_CFLAGS,-qfullpath -qinitauto=FE -qcheck=all -qinfo=pro)
    fi
  fi
])dnl

dnl Conditionally enable PIE support for GNU toolchains.
AC_ARG_ENABLE(pie,APACHE_HELP_STRING(--enable-pie,Build httpd as a Position Independent Executable))
if test "$enable_pie" = "yes"; then
   AC_CACHE_CHECK([whether $CC accepts PIE flags], [ap_cv_cc_pie], [
     save_CFLAGS=$CFLAGS
     save_LDFLAGS=$LDFLAGS
     CFLAGS="$CFLAGS -fPIE"
     LDFLAGS="$LDFLAGS -pie"
     AC_TRY_RUN([static int foo[30000]; int main () { return 0; }],
      [ap_cv_cc_pie=yes], [ap_cv_cc_pie=no], [ap_cv_cc_pie=yes])
     CFLAGS=$save_CFLAGS
     LDFLAGS=$save_LDFLAGS
   ])
   if test "$ap_cv_cc_pie" = "yes"; then
     PICFLAGS="-fPIE"
     PILDFLAGS="-pie"
   else
     AC_ERROR([--enable-pie requested but $CC failed using PIE flags])
   fi
fi
APACHE_SUBST(PICFLAGS)
APACHE_SUBST(PILDFLAGS)

ap_reduced_exports=no
EXPORTS_DOT_C=exports.c
LIBMAIN_LIB=server/libmain.la
APACHE_SUBST(EXPORTS_DOT_C)
APACHE_SUBST(LIBMAIN_LIB)

AC_ARG_ENABLE(reduced-exports,
APACHE_HELP_STRING(--enable-reduced-exports,Reduce binary size if using shared APR libraries),
[
  if test "$enableval" = "yes" -a "$GCC" = "yes"; then
    ap_reduced_exports=yes
  fi
])

if test "$ap_reduced_exports" = "yes"; then
  EXPORTS_DOT_C=
  LIBMAIN_LIB="-Wl,--whole-archive,server/.libs/libmain.a,--no-whole-archive"
  AC_MSG_NOTICE([Using reduced symbol exports])
else
  AC_DEFINE(AP_FORCE_EXPORTS, 1, [Force symbol exports for dependent libraries])
fi

AC_ARG_WITH(valgrind,
  [  --with-valgrind[[=DIR]]   Enable code to reduce valgrind false positives
                          (optionally: set path to valgrind headers) ],
  [ if test "$withval" != no; then
      if test "$withval" = yes; then
        withval=/usr/include/valgrind
      fi
      APR_ADDTO(CPPFLAGS, -I$withval)
      AC_CHECK_HEADERS(valgrind.h memcheck.h)
      APR_IFALLYES(header:valgrind.h header:memcheck.h,
        [AC_DEFINE(HAVE_VALGRIND, 1, [Compile in valgrind support]) ],
        [AC_MSG_ERROR(valgrind headers not found) ]
      )
    fi ]
)

dnl Enable the unit test executable if Check is installed.
dnl TODO: at the moment, only pkg-config discovery is supported.
AC_MSG_CHECKING([for Check to enable unit tests])
if test "x$PKGCONFIG" != "x" -a "$ap_reduced_exports" = "no" && `$PKGCONFIG --atleast-version='0.9.12' check`; then
  UNITTEST_CFLAGS=`$PKGCONFIG --cflags check`
  UNITTEST_LIBS=`$PKGCONFIG --libs check`
  other_targets="$other_targets test/httpdunit"

  AC_MSG_RESULT([yes])
else
  AC_MSG_RESULT([no])
fi
APACHE_SUBST(UNITTEST_CFLAGS)
APACHE_SUBST(UNITTEST_LIBS)


prefix="$orig_prefix"
APACHE_ENABLE_MODULES

dnl reading config stubs
esyscmd(./build/config-stubs .)

APACHE_SUBST(progname)
APACHE_SUBST(OS)
APACHE_SUBST(OS_DIR)
APACHE_SUBST(BUILTIN_LIBS)
APACHE_SUBST(SHLIBPATH_VAR)
APACHE_SUBST(OS_SPECIFIC_VARS)
APACHE_SUBST(HTTPD_LIBS)

PRE_SHARED_CMDS='echo ""'
POST_SHARED_CMDS='echo ""'

dnl apache_need_shared tells us if Apache modules are being built as DSOs

if test "$apache_need_shared" = "yes"; then
  if test -f $ac_aux_dir/ltconfig; then
    $SHELL $ac_aux_dir/ltconfig --output=shlibtool --disable-static --srcdir=$ac_aux_dir --cache-file=./config.cache $ac_aux_dir/ltmain.sh
  fi
  shared_build="shared-build"
fi

dnl enable_so tells us if *any* modules can be built as DSOs

if test "$enable_so" = "yes" -o "$enable_so" = "static"; then
  case $host in
    *-ibm-aix*)
      APR_ADDTO(HTTPD_LDFLAGS, [-Wl,-uXML_Parse -Wl,-bE:$abs_builddir/server/httpd.exp])
      APR_ADDTO(SH_LDFLAGS, [\$(EXTRA_LDFLAGS) \$(EXTRA_LIBS)])
      APR_ADDTO(UTIL_LDFLAGS, [-Wl,-uXML_Parse])
      ;;
    *os390)
      APR_ADDTO(HTTPD_LDFLAGS, [--main=$abs_srcdir/server/main.o --core-dll=$abs_srcdir/apachecore.dll])
      APR_ADDTO(SH_LDFLAGS, [--core-dll=$abs_srcdir/apachecore.dll])
  esac
  MOD_SO_ENABLED=yes
fi
AC_SUBST(MOD_SO_ENABLED)

APACHE_SUBST(PRE_SHARED_CMDS)
APACHE_SUBST(POST_SHARED_CMDS)
APACHE_SUBST(shared_build)

AC_ARG_WITH(program-name,
APACHE_HELP_STRING(--with-program-name,alternate executable name),[
  progname="$withval" ], [
  progname="httpd"] )

# SuExec parameters
AC_ARG_WITH(suexec-bin,
APACHE_HELP_STRING(--with-suexec-bin,Path to suexec binary),[
  AC_DEFINE_UNQUOTED(SUEXEC_BIN, "$withval", [Path to suexec binary] )
] )

AC_ARG_WITH(suexec-caller,
APACHE_HELP_STRING(--with-suexec-caller,User allowed to call SuExec),[
  AC_DEFINE_UNQUOTED(AP_HTTPD_USER, "$withval", [User allowed to call SuExec] ) ] )

AC_ARG_WITH(suexec-userdir,
APACHE_HELP_STRING(--with-suexec-userdir,User subdirectory),[
  AC_DEFINE_UNQUOTED(AP_USERDIR_SUFFIX, "$withval", [User subdirectory] ) ] )

AC_ARG_WITH(suexec-docroot,
APACHE_HELP_STRING(--with-suexec-docroot,SuExec root directory),[
  AC_DEFINE_UNQUOTED(AP_DOC_ROOT, "$withval", [SuExec root directory] ) ] )

AC_ARG_WITH(suexec-uidmin,
APACHE_HELP_STRING(--with-suexec-uidmin,Minimal allowed UID),[
  AC_DEFINE_UNQUOTED(AP_UID_MIN, $withval, [Minimum allowed UID] ) ] )

AC_ARG_WITH(suexec-gidmin,
APACHE_HELP_STRING(--with-suexec-gidmin,Minimal allowed GID),[
  AC_DEFINE_UNQUOTED(AP_GID_MIN, $withval, [Minimum allowed GID] ) ] )

AC_ARG_WITH(suexec-logfile,
APACHE_HELP_STRING(--with-suexec-logfile,Set the logfile),[
  if test "x$withval" = "xyes"; then
    AC_MSG_ERROR([log filename required for --with-suexec-logfile option])
  elif test "x$withval" != "xno"; then
    AC_DEFINE_UNQUOTED(AP_LOG_EXEC, "$withval", [SuExec log file])
  fi
])

AC_ARG_WITH(suexec-syslog,
APACHE_HELP_STRING(--with-suexec-syslog,Use syslog for suexec logging),[
  if test $withval = "yes"; then
    if test "x${with_suexec_logfile}" != "xno"; then
      AC_MSG_NOTICE([hint: use "--without-suexec-logfile --with-suexec-syslog"])
      AC_MSG_ERROR([suexec does not support both logging to file and syslog])
    fi
    AC_CHECK_FUNCS([vsyslog], [], [
       AC_MSG_ERROR([cannot support syslog from suexec without vsyslog()])])
    AC_DEFINE(AP_LOG_SYSLOG, 1, [SuExec log to syslog])
  fi    
])


AC_ARG_WITH(suexec-safepath,
APACHE_HELP_STRING(--with-suexec-safepath,Set the safepath),[
  AC_DEFINE_UNQUOTED(AP_SAFE_PATH, "$withval", [safe shell path for SuExec] ) ] )

AC_ARG_WITH(suexec-umask,
APACHE_HELP_STRING(--with-suexec-umask,umask for suexec'd process),[
  AC_DEFINE_UNQUOTED(AP_SUEXEC_UMASK, 0$withval, [umask for suexec'd process] ) ] )

INSTALL_SUEXEC=setuid
AC_ARG_ENABLE([suexec-capabilities], 
APACHE_HELP_STRING(--enable-suexec-capabilities,Use Linux capability bits not setuid root suexec), [
  if test "$enableval" = "yes"; then
    INSTALL_SUEXEC=caps
    AC_DEFINE(AP_SUEXEC_CAPABILITIES, 1, 
              [Enable if suexec is installed with Linux capabilities, not setuid])
  fi
])
APACHE_SUBST(INSTALL_SUEXEC)

dnl APR should go after the other libs, so the right symbols can be picked up
if test x${apu_found} != xobsolete; then
  AP_LIBS="$AP_LIBS `$apu_config --avoid-ldap --link-libtool --libs`"
fi
AP_LIBS="$AP_LIBS `$apr_config --link-libtool --libs`" 
APACHE_SUBST(AP_LIBS)
APACHE_SUBST(AP_BUILD_SRCLIB_DIRS)
APACHE_SUBST(AP_CLEAN_SRCLIB_DIRS)

if test "$SINGLE_LISTEN_UNSERIALIZED_ACCEPT" = "1"; then
    AC_DEFINE(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, 1, 
              [This platform doesn't suffer from the thundering herd problem])
fi

if test "$AP_NONBLOCK_WHEN_MULTI_LISTEN" = "1"; then
    AC_DEFINE(AP_NONBLOCK_WHEN_MULTI_LISTEN, 1, 
              [Listening sockets are non-blocking when there are more than 1])
fi

APR_CHECK_APR_DEFINE(APR_HAVE_IPV6)

AC_ARG_ENABLE(v4-mapped,APACHE_HELP_STRING(--enable-v4-mapped,Allow IPv6 sockets to handle IPv4 connections),
[ 
  v4mapped=$enableval
],
[
    case $host in
    *freebsd[[1234]].*)
        v4mapped=yes
        ;;
    *freebsd*|*netbsd*|*openbsd*)
        v4mapped=no
        ;;
    *)
        v4mapped=yes
        ;;
    esac
    if ap_mpm_is_enabled winnt; then
        dnl WinNT MPM doesn't support this.
        v4mapped=no
    fi
])

if test $v4mapped = "yes" -a $ac_cv_define_APR_HAVE_IPV6 = "yes"; then
    AC_DEFINE(AP_ENABLE_V4_MAPPED, 1,
              [Allow IPv4 connections on IPv6 listening sockets])
fi

AC_ARG_ENABLE(bsd-makefiles,APACHE_HELP_STRING(--enable-bsd-makefiles,use BSD Makefile syntax),
[
  FORCE_BSD_MAKEFILE=$enableval
  AC_MSG_NOTICE([Setting "FORCE_BSD_MAKEFILE" to $FORCE_BSD_MAKEFILE])
],
[
  FORCE_BSD_MAKEFILE="auto"
])

AC_ARG_WITH([test-suite],
    APACHE_HELP_STRING([--with-test-suite=PATH], [enable in-tree 'make check' with the given Apache::Test suite location]),
    [
        if test "x$withval" = "xyes"; then
            AC_MSG_ERROR([option --with-test-suite requires a directory]);
        else
            test -f "$withval/Makefile.PL" || AC_MSG_ERROR([--with-test-suite directory $withval does not contain the expected Makefile.PL])
            TEST_SUITE_LOCATION="$withval"
            WITH_TEST_SUITE=yes
        fi
    ],
    [ WITH_TEST_SUITE=no ]
)

APACHE_SUBST(TEST_SUITE_LOCATION)
APACHE_SUBST(WITH_TEST_SUITE)

APACHE_FAST_OUTPUT(Makefile modules/Makefile srclib/Makefile) 
APACHE_FAST_OUTPUT(os/Makefile server/Makefile)
APACHE_FAST_OUTPUT(support/Makefile)

if test -d ./test; then
    APACHE_FAST_OUTPUT(test/Makefile)
    AC_CONFIG_FILES([test/pyhttpd/config.ini])
fi

dnl ## Finalize the variables
AC_MSG_NOTICE([])
AC_MSG_NOTICE([Restore user-defined environment settings...])
AC_MSG_NOTICE([])

APACHE_CONF_SEL_CC=${CC}
APACHE_CONF_SEL_CFLAGS="${CFLAGS} ${EXTRA_CFLAGS} ${NOTEST_CFLAGS}"
APACHE_CONF_SEL_CPPFLAGS="${CPPFLAGS} ${EXTRA_CPPFLAGS} ${NOTEST_CPPFLAGS}"
APACHE_CONF_SEL_LDFLAGS="${LDFLAGS} ${EXTRA_LDFLAGS} ${NOTEST_LDFLAGS}"
APACHE_CONF_SEL_LIBS="${LIBS} ${EXTRA_LIBS} ${NOTEST_LIBS}"
APACHE_CONF_SEL_CPP=${CPP}

APR_RESTORE_THE_ENVIRONMENT(CPPFLAGS, EXTRA_)
APR_RESTORE_THE_ENVIRONMENT(CFLAGS, EXTRA_)
APR_RESTORE_THE_ENVIRONMENT(CXXFLAGS, EXTRA_)
APR_RESTORE_THE_ENVIRONMENT(LDFLAGS, EXTRA_)
APR_RESTORE_THE_ENVIRONMENT(LIBS, EXTRA_)
APR_RESTORE_THE_ENVIRONMENT(INCLUDES, EXTRA_)

AC_MSG_NOTICE([])
AC_MSG_NOTICE([Construct makefiles and header files...])
AC_MSG_NOTICE([])

APACHE_GEN_CONFIG_VARS

APR_EXPAND_VAR(ap_prefix, $prefix)
AC_DEFINE_UNQUOTED(HTTPD_ROOT, "${ap_prefix}",
	[Root directory of the Apache install area])
AC_DEFINE_UNQUOTED(SERVER_CONFIG_FILE, "${rel_sysconfdir}/${progname}.conf",
	[Location of the config file, relative to the Apache root directory])
AC_DEFINE_UNQUOTED(AP_TYPES_CONFIG_FILE, "${rel_sysconfdir}/mime.types",
	[Location of the MIME types config file, relative to the Apache root directory])

perlbin=`$ac_aux_dir/PrintPath perl`
if test "x$perlbin" = "x"; then
    perlbin="/replace/with/path/to/perl/interpreter"
fi
AC_SUBST(perlbin)

dnl If we are running on a BSD variant, see if we need to use the BSD .include syntax.

ap_make_include=include
ap_make_ifdef=ifdef
ap_make_else=else
ap_make_endif=endif
ap_make_delimiter=' '
if test "x$FORCE_BSD_MAKEFILE" = "xno"; then
  BSD_MAKEFILE=no
elif test "x$FORCE_BSD_MAKEFILE" = "xyes"; then
  BSD_MAKEFILE=yes
else
  case $host in
  *bsd*)
      # Check whether they've installed GNU make
      if make --version > /dev/null 2>&1; then
          BSD_MAKEFILE=no
      elif gmake --version > /dev/null 2>&1; then
          BSD_MAKEFILE=no
      else
          BSD_MAKEFILE=yes
      fi
      ;;
  *)
      BSD_MAKEFILE=no
      ;;
  esac
fi
if test "x$BSD_MAKEFILE" = "xyes"; then
  ap_make_include=.include
  ap_make_ifdef=.ifdef
  ap_make_else=.else
  ap_make_endif=.endif
  ap_make_delimiter='"'
fi
AC_MSG_NOTICE([using BSD Makefile syntax... $BSD_MAKEFILE])

AC_SUBST(ap_make_include)
AC_SUBST(ap_make_ifdef)
AC_SUBST(ap_make_else)
AC_SUBST(ap_make_endif)
AC_SUBST(ap_make_delimiter)

dnl Ensure that docs/conf is created.
test -d docs/conf||$mkdir_p docs/conf

AC_CONFIG_FILES(docs/conf/httpd.conf docs/conf/extra/httpd-autoindex.conf docs/conf/extra/httpd-dav.conf docs/conf/extra/httpd-default.conf docs/conf/extra/httpd-info.conf docs/conf/extra/httpd-languages.conf docs/conf/extra/httpd-manual.conf docs/conf/extra/httpd-mpm.conf docs/conf/extra/httpd-multilang-errordoc.conf docs/conf/extra/httpd-policy.conf docs/conf/extra/httpd-ssl.conf docs/conf/extra/httpd-userdir.conf docs/conf/extra/httpd-vhosts.conf docs/conf/extra/proxy-html.conf docs/conf/extra/httpd-macro.conf include/ap_config_layout.h support/apxs support/apachectl support/dbmmanage support/envvars-std support/log_server_status support/logresolve.pl support/phf_abuse_log.cgi support/split-logfile build/rules.mk build/pkg/pkginfo build/config_vars.sh)
AC_CONFIG_COMMANDS([default],
  [$SHELL $srcdir/build/fastgen.sh $srcdir $ac_cv_mkdir_p $BSD_MAKEFILE $APACHE_FAST_OUTPUT_FILES >&AS_MESSAGE_FD],
  [ac_cv_mkdir_p=$ac_cv_mkdir_p
BSD_MAKEFILE=$BSD_MAKEFILE
APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES"
])
AC_CONFIG_COMMANDS([modules.c], [
## Build modules.c
rm -f modules.c
echo $MODLIST | $AWK -f $srcdir/build/build-modules-c.awk > modules.c
], [MODLIST="$MODLIST"])
AC_OUTPUT

AC_MSG_NOTICE([summary of build options:

    Server Version: ${HTTPD_VERSION}
    Install prefix: ${prefix}
    C compiler:     ${APACHE_CONF_SEL_CC}
    CFLAGS:         ${APACHE_CONF_SEL_CFLAGS}
    CPPFLAGS:       ${APACHE_CONF_SEL_CPPFLAGS}
    LDFLAGS:        ${APACHE_CONF_SEL_LDFLAGS}
    LIBS:           ${APACHE_CONF_SEL_LIBS}
    C preprocessor: ${APACHE_CONF_SEL_CPP}
])
