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

AC_PREREQ(2.13)
AC_INIT(ABOUT_APACHE)

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

dnl #
dnl # Include our own M4 macros along with those for APR and libtool
dnl #
sinclude(srclib/apr/build/apr_common.m4)
sinclude(srclib/apr/build/apr_network.m4)
sinclude(srclib/apr/build/apr_threads.m4)
sinclude(acinclude.m4)

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
dnl APACHE_ENABLE_LAYOUT
AC_MSG_CHECKING(for chosen layout)
AC_ARG_ENABLE(layout,
APACHE_HELP_STRING(--enable-layout=LAYOUT,Default file layout),[
  LAYOUT=$enableval
  APACHE_LAYOUT($srcdir/config.layout, $LAYOUT)
  AC_MSG_RESULT($LAYOUT)
], [
  APACHE_LAYOUT_DEFAULTS
  AC_MSG_RESULT([Autoconf Defaults])
])

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 ## 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"

echo $ac_n "${nl}Configuring Apache Portable Runtime library ...${nl}"

APR_SUBDIR_CONFIG(srclib/apr, "$apache_apr_flags --prefix=$prefix --exec-prefix=$exec_prefix --libdir=$libdir --bindir=$bindir")

echo $ac_n "${nl}Configuring Apache Portable Runtime Utility library...${nl}"

APR_SUBDIR_CONFIG(srclib/apr-util, "--with-apr=../apr --prefix=$prefix --exec-prefix=$exec_prefix --libdir=$libdir --bindir=$bindir")

echo $ac_n "${nl}Configuring PCRE regular expression library ...${nl}"

APR_SUBDIR_CONFIG(srclib/pcre, "--prefix=$prefix --exec-prefix=$exec_prefix --libdir=$libdir --bindir=$bindir")

echo $ac_n "${nl}Configuring Apache httpd ...${nl}"

echo $ac_n "obtaining flag settings from the sub-configures...${nl}"
. ./srclib/apr/APRVARS

dnl Now that we have APR's EXTRA_flags in our environment, move them over
dnl to the normal variables to avoid duplications and use them for testing.
dnl We ignore EXTRA_INCLUDES because our own includes will encompass them.
dnl
APR_ADDTO(CFLAGS, $EXTRA_CFLAGS)
APR_ADDTO(CPPFLAGS, $EXTRA_CPPFLAGS)
APR_ADDTO(LDFLAGS, $EXTRA_LDFLAGS)
APR_ADDTO(LIBS, $EXTRA_LIBS)
EXTRA_CFLAGS=
EXTRA_CPPFLAGS=
EXTRA_LDFLAGS=
EXTRA_LIBS=
EXTRA_INCLUDES=

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

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

if test "$abs_builddir" != "$abs_srcdir"; then
  USE_VPATH=1
  APR_ADDTO(INCLUDES, [-I. -I\$(srcdir) -I\$(top_builddir)/os/\$(OS_DIR) -I\$(top_srcdir)/os/\$(OS_DIR) -I\$(top_builddir)/server/mpm/\$(MPM_NAME) -I\$(top_srcdir)/server/mpm/\$(MPM_NAME) -I\$(top_builddir)/modules/http -I\$(top_srcdir)/modules/http -I\$(top_srcdir)/modules/proxy -I\$(top_builddir)/include -I\$(top_srcdir)/include -I\$(top_builddir)/srclib/apr/include -I\$(top_srcdir)/srclib/apr/include -I\$(top_builddir)/srclib/apr-util/include -I\$(top_srcdir)/srclib/apr-util/include])
else
  APR_ADDTO(INCLUDES, [-I. -I\$(top_srcdir)/os/\$(OS_DIR) -I\$(top_srcdir)/server/mpm/\$(MPM_NAME) -I\$(top_srcdir)/modules/http -I\$(top_srcdir)/modules/proxy -I\$(top_srcdir)/include -I\$(top_srcdir)/srclib/apr/include -I\$(top_srcdir)/srclib/apr-util/include])
fi

echo $ac_n "${nl}Applying OS-specific hints for httpd ...${nl}"

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
      LIBTOOL='$(SHELL) $(top_builddir)/srclib/apr/libtool $(LTFLAGS)'
      libtoolversion=`$abs_builddir/srclib/apr/libtool --version`
      case $libtoolversion in
          *1.4*)
              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)

AP_SIG_GRACEFUL=USR1

case $host in
  *-apple-aux3*)
      APR_SETVAR(APACHE_MPM, [prefork])
      APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1])
      ;;
  *-beos*)
      APR_SETVAR(APACHE_MPM, [beos])
      APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1])
      ;;
  *os2_emx*)
      APR_SETVAR(APACHE_MPM, [mpmt_os2])
      APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1])
      ;;
  *-linux-*)
      case `uname -r` in
        2.0* ) 
            AP_SIG_GRACEFUL=WINCH
            ;;
        2.[[2-9]]* ) 
            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"
      ;;
  *cygwin*)
      APR_SETVAR(APACHE_MPM, [prefork])
      APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1])
      ;;
esac

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_PROG_AWK
AC_PROG_CC
AC_PROG_CPP
AC_PROG_INSTALL
AC_PROG_LN_S
AC_CHECK_TOOL(RANLIB, ranlib, true)
dnl AC_PATH_PROG(PERL_PATH, perl)

dnl various OS checks that apparently set required flags
AC_AIX
AC_ISC_POSIX
AC_MINIX

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 \
strings.h \
sys/processor.h \
sys/sem.h
)
AC_HEADER_SYS_WAIT

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

AC_C_CONST
if test "$ac_cv_prog_gcc" = "yes"; then
  APR_ADDTO(NOTEST_CPPFLAGS,-DAP_HAVE_DESIGNATED_INITIALIZER)
fi

dnl ## Check for library functions

dnl See Comment #Spoon

AC_CHECK_FUNCS( \
getpwnam \
getgrnam \
initgroups \
bindprocessor \
timegm \
)

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)
fi

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$COMPILE_MODE != 64; then
            OS_SPECIFIC_VARS="set LDR_CNTRL=\"MAXDATA=0x80000000\" ; export LDR_CNTRL ;"
        fi
        OS_SPECIFIC_VARS="$OS_SPECIFIC_VARS set AIXTHREAD_SCOPE=S ; export AIXTHREAD_SCOPE"
        ;;
    *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_ENABLE(maintainer-mode,APACHE_HELP_STRING(--enable-maintainer-mode,Turn on debugging and compile time warnings),
[
  APR_ADDTO(CPPFLAGS, -DAP_DEBUG)
])dnl

prefix="$orig_prefix"
APACHE_ENABLE_MODULES

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

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

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"; then
  case $host in
    *-ibm-aix*)
      HTTPD_LDFLAGS="$HTTPD_LDFLAGS -Wl,-uXML_Parse -Wl,-bE:$abs_builddir/server/httpd.exp"
      SH_LDFLAGS="$SH_LDFLAGS \$(EXTRA_LDFLAGS) \$(EXTRA_LIBS)"
      UTIL_LDFLAGS="$UTIL_LDFLAGS -Wl,-uXML_Parse"
      ;;
    *beos)
      SH_LDFLAGS='$(top_builddir)/_APP_'
      PRE_SHARED_CMDS='ln -s $(top_builddir)/httpd $(top_builddir)/_APP_'
      POST_SHARED_CMDS='rm $(top_builddir)/_APP_'
      ;;
    *os390)
      HTTPD_LDFLAGS="$HTTPD_LDFLAGS --main=$abs_srcdir/server/main.o --core-dll=$abs_srcdir/apachecore.dll"
      SH_LDFLAGS="$SH_LDFLAGS --core-dll=$abs_srcdir/apachecore.dll"
  esac
fi

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),[
  AC_DEFINE_UNQUOTED(AP_LOG_EXEC, "$withval", [SuExec log file] ) ] )

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] ) ] )

dnl AP_LIBS specifies the actual libraries. note we have some required libs.
AP_LIBS="$abs_builddir/srclib/pcre/libpcre.la $abs_builddir/srclib/apr-util/libaprutil.la $AP_LIBS"

dnl APR should go after the other libs, so the right symbols can be picked up
AP_LIBS="$AP_LIBS $abs_builddir/srclib/apr/libapr.la"
APACHE_SUBST(AP_LIBS)

AC_DEFINE(AP_USING_AUTOCONF, 1,
		[Using autoconf to configure Apache])

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

AC_DEFINE_UNQUOTED(AP_SIG_GRACEFUL, SIG$AP_SIG_GRACEFUL, [Signal used to gracefully restart])
AC_DEFINE_UNQUOTED(AP_SIG_GRACEFUL_STRING, "SIG$AP_SIG_GRACEFUL", [Signal used to gracefully restart (as a quoted string)])
AC_DEFINE_UNQUOTED(AP_SIG_GRACEFUL_SHORT, $AP_SIG_GRACEFUL, [Signal used to gracefully restart (without SIG prefix)])
AP_SIG_GRACEFUL_SHORT=$AP_SIG_GRACEFUL
AP_SIG_GRACEFUL=SIG$AP_SIG_GRACEFUL_SHORT
AC_SUBST(AP_SIG_GRACEFUL)
AC_SUBST(AP_SIG_GRACEFUL_STRING)
AC_SUBST(AP_SIG_GRACEFUL_SHORT)

dnl check for endianness
if test "$cross_compiling" = "no"; then
  AC_C_BIGENDIAN
else
  AC_DEFINE(AP_UNKNOWN_BYTE_ORDER,1,
		[byte order is unknown due to cross-compilation])
fi

APACHE_FAST_OUTPUT(Makefile modules/Makefile srclib/Makefile) 
APACHE_FAST_OUTPUT(os/beos/Makefile os/os2/Makefile os/Makefile)
APACHE_FAST_OUTPUT(os/unix/Makefile server/Makefile)
APACHE_FAST_OUTPUT(support/Makefile srclib/pcre/Makefile)

if test -d ./test; then
    APACHE_FAST_OUTPUT(test/Makefile)
fi

dnl get the exported vars from APRUTIL
. ./srclib/apr-util/export_vars.sh
APR_ADDTO(LIBS, $APRUTIL_EXPORT_LIBS)
APR_ADDTO(INCLUDES, $APRUTIL_EXPORT_INCLUDES)
APR_ADDTO(LDFLAGS, $APRUTIL_LDFLAGS)
AP_LIBS="$AP_LIBS $LIBTOOL_LIBS"

dnl ## Finalize the variables
echo $ac_n "${nl}Restore user-defined environment settings...${nl}"

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_)

echo $ac_n "${nl}Construct makefiles and header files...${nl}"

APACHE_GEN_CONFIG_VARS

dnl ## Build modules.c
rm -f modules.c
echo $MODLIST | $AWK -f $srcdir/build/build-modules-c.awk > modules.c

APR_EXPAND_VAR(ap_prefix, $prefix)
AC_DEFINE_UNQUOTED(HTTPD_ROOT, "${ap_prefix}",
	[Root directory of the Apache install area])
APR_EXPAND_VAR(ap_sysconfdir, $sysconfdir)
AC_DEFINE_UNQUOTED(SERVER_CONFIG_FILE, "${ap_sysconfdir}/${progname}.conf",
	[Location of the config file, relative to the Apache root directory])
AC_DEFINE_UNQUOTED(APACHE_MPM_DIR, "$MPM_DIR",
	[Location of the source for the current MPM])

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 BSD/OS, we need to use the BSD .include syntax.

BSD_MAKEFILE=no
case $host in
*bsdi*)
    # Check whether they've installed GNU make
    if make --version > /dev/null 2>&1; then
        true
    else
        BSD_MAKEFILE=yes
    fi
    ;;
esac

AC_OUTPUT($APACHE_OUTPUT_FILES 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,[true],[
  APACHE_GEN_MAKEFILES
])

