dnl
dnl Process this file with autoconf to produce a configure script
dnl

AC_PREREQ(2.59)
AC_INIT(export_vars.sh.in)

AC_CONFIG_HEADER(include/private/apu_config.h)
AC_CONFIG_AUX_DIR(build)

sinclude(build/apu-conf.m4)
sinclude(build/apu-iconv.m4)
sinclude(build/apu-hints.m4)
sinclude(build/apr_common.m4)
sinclude(build/find_apr.m4)
sinclude(build/crypto.m4)
sinclude(build/dbm.m4)
sinclude(build/dbd.m4)
sinclude(build/dso.m4)

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

dnl # Some initial steps for configuration.  We setup the default directory
dnl # and which files are to be configured.

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

if test "$abs_builddir" != "$abs_srcdir"; then
  USE_VPATH=1
  APU_CONFIG_LOCATION=build
else
  APU_CONFIG_LOCATION=source
fi

AC_SUBST(APU_CONFIG_LOCATION)

AC_CANONICAL_SYSTEM

AC_PROG_INSTALL

# Use -no-install or -no-fast-install to link the test 
# programs on all platforms but Darwin, where it would cause
# the programs to be linked against installed versions of
# libapr instead of those just built.
case $host in
    *-apple-darwin*)
        LT_NO_INSTALL=""
        ;;
    *-mingw*)
        LT_NO_INSTALL="-no-fast-install"
        ;;
    *)
        LT_NO_INSTALL="-no-install"
        ;;
esac
AC_SUBST(LT_NO_INSTALL)

dnl
dnl compute the top directory of the build
dnl note: this is needed for LIBTOOL and exporting the bundled Expat
dnl
top_builddir="$abs_builddir"
AC_SUBST(top_builddir)
AC_SUBST(abs_srcdir)
AC_SUBST(abs_builddir)

dnl Initialize mkdir -p functionality.
APR_MKDIR_P_CHECK($abs_srcdir/build/mkdir.sh)

dnl get our version information
get_version="$abs_srcdir/build/get-version.sh"
version_hdr="$abs_srcdir/include/apu_version.h"
APRUTIL_MAJOR_VERSION="`$get_version major $version_hdr APU`"
APRUTIL_DOTTED_VERSION="`$get_version all $version_hdr APU`"

APU_LTVERSION="-version-info `$get_version libtool $version_hdr APU`"

AC_SUBST(APRUTIL_DOTTED_VERSION)
AC_SUBST(APRUTIL_MAJOR_VERSION)
AC_SUBST(APU_LTVERSION)

echo "APR-util Version: ${APRUTIL_DOTTED_VERSION}"

dnl Enable the layout handling code, then reparse the prefix-style
dnl arguments due to autoconf being a PITA.
APR_ENABLE_LAYOUT(apr-util)
dnl This must be synchronized to the prefix of the apr layout, to make
dnl configure --help print the correct default.
AC_PREFIX_DEFAULT([/usr/local/apr])
APR_PARSE_ARGUMENTS

dnl load os-specific hints for apr-util
APU_PRELOAD

dnl
dnl set up the compilation flags and stuff
dnl

APRUTIL_INCLUDES=""
APRUTIL_PRIV_INCLUDES="-I$top_builddir/include -I$top_builddir/include/private"
if test -n "$USE_VPATH"; then
    APRUTIL_PRIV_INCLUDES="$APRUTIL_PRIV_INCLUDES -I$abs_srcdir/include/private -I$abs_srcdir/include"
fi

dnl
dnl Find the APR includes directory and (possibly) the source (base) dir.
dnl
APU_FIND_APR

dnl
dnl even though we use apr_rules.mk for building apr-util, we need
dnl to grab CC and CPP ahead of time so that apr-util config tests
dnl use the same compiler as APR; we need the same compiler options
dnl and feature test macros as well
dnl
APR_SETIFNULL(CC, `$apr_config --cc`)
APR_SETIFNULL(CPP, `$apr_config --cpp`)
APR_ADDTO(CFLAGS, `$apr_config --cflags`)
APR_ADDTO(CPPFLAGS, `$apr_config --cppflags`)
apr_shlibpath_var=`$apr_config --shlib-path-var`
AC_SUBST(apr_shlibpath_var)

dnl
dnl  Find the APR-ICONV directory.
dnl
AC_ARG_WITH(apr-iconv,
            [  --with-apr-iconv=DIR    relative path to apr-iconv source],
  [ apu_apriconv_dir="$withval"
    if test "$apu_apriconv_dir" != "no"; then
      if test -d "$apu_apriconv_dir"; then
        APR_SUBDIR_CONFIG("$apu_apriconv_dir",
                          [$apache_apr_flags \
                             --prefix=$prefix \
                             --exec-prefix=$exec_prefix \
                             --libdir=$libdir \
                             --includedir=$includedir \
                             --bindir=$bindir \
                             --datadir=$datadir \
                             --with-installbuilddir=$installbuilddir],
                          [--enable-layout=*|\'--enable-layout=*])
        APRUTIL_EXPORT_LIBS="$abs_srcdir/$apu_apriconv_dir/lib/libapriconv.la \
                             $APRUTIL_EXPORT_LIBS"
        APRUTIL_INCLUDES="-I$abs_srcdir/$apu_apriconv_dir/include \
                          $APRUTIL_INCLUDES"
        APR_ICONV_DIR="$apu_apriconv_dir"
      else
       APR_ICONV_DIR=""
      fi
    else
      APR_ICONV_DIR=""
    fi
  ])
AC_SUBST(APR_ICONV_DIR)

dnl Find LDAP library
dnl Determine what DBM backend type to use.
dnl Find Expat
dnl Find an iconv library
APU_CHECK_CRYPTO
APU_FIND_LDAP
APU_CHECK_DBM
APU_CHECK_DBD
APU_CHECK_DBD_MYSQL
APU_CHECK_DBD_SQLITE3
APU_CHECK_DBD_SQLITE2
APU_CHECK_DBD_ORACLE
APU_CHECK_DBD_ODBC
APU_FIND_EXPAT
APU_FIND_ICONV

dnl Enable DSO build; must be last:
APU_CHECK_UTIL_DSO

AC_SEARCH_LIBS(crypt, crypt ufc)
case "$ac_cv_search_crypt" in
"no"|"none required")
    ;;
*)
    APR_ADDTO(APRUTIL_LIBS, [$ac_cv_search_crypt])
    ;;
esac
AC_MSG_CHECKING(if system crypt() function is threadsafe)
if test "x$apu_crypt_threadsafe" = "x1"; then
  AC_DEFINE(APU_CRYPT_THREADSAFE, 1, [Define if the system crypt() function is threadsafe])
  msg="yes"
else
  msg="no"
fi
AC_MSG_RESULT([$msg])

AC_CHECK_FUNCS(crypt_r, [ crypt_r="1" ], [ crypt_r="0" ])
if test "$crypt_r" = "1"; then
  APU_CHECK_CRYPT_R_STYLE
fi

AC_CACHE_CHECK([whether the compiler handles weak symbols], [apu_cv_weak_symbols],
[AC_TRY_RUN([
__attribute__ ((weak))
int weak_noop(void)
{
    return 0;
}
int main()
{
    return weak_noop();
}], [apu_cv_weak_symbols=yes], [apu_cv_weak_symbols=no], [apu_cv_weak_symbols=no])])

if test "$apu_cv_weak_symbols" = "yes"; then
    AC_DEFINE(HAVE_WEAK_SYMBOLS, 1, [Define if compiler handles weak symbols])
fi

AC_CACHE_CHECK([for memset_s support], [apu_cv_memset_s],
[AC_TRY_RUN([
#ifdef HAVE_STRING_H
#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h>
#endif

int main(int argc, const char **argv)
{
    char buf[1] = {1};
    return memset_s(buf, sizeof buf, 0, sizeof buf) != 0 || *buf != '\0';
}], [apu_cv_memset_s=yes], [apu_cv_memset_s=no], [apu_cv_memset_s=no])])

if test "$apu_cv_memset_s" = "yes"; then
   AC_DEFINE([HAVE_MEMSET_S], 1, [Define if memset_s function is supported])
fi

AC_CACHE_CHECK([for explicit_bzero support], [apu_cv_explicit_bzero],
[AC_TRY_RUN([
#ifdef HAVE_STRING_H
#include <string.h>
#endif
#ifdef HAVE_STRINGS_H
#include <strings.h>
#endif

int main(int argc, const char **argv)
{
    char buf[1] = {1};
    explicit_bzero(buf, sizeof buf);
    return *buf != '\0';
}], [apu_cv_explicit_bzero=yes], [apu_cv_explicit_bzero=no], [apu_cv_explicit_bzero=no])])

if test "$apu_cv_explicit_bzero" = "yes"; then
   AC_DEFINE([HAVE_EXPLICIT_BZERO], 1, [Define if explicit_bzero function is supported])
fi

so_ext=$APR_SO_EXT
lib_target=$APR_LIB_TARGET
AC_SUBST(so_ext)
AC_SUBST(lib_target)

APRUTIL_LIBNAME="aprutil${libsuffix}"
AC_SUBST(APRUTIL_LIBNAME)

# Set up destination directory for DSOs.
APU_DSO_LIBDIR="\${libdir}/apr-util-${APRUTIL_MAJOR_VERSION}"
# Set APU_HAVE_MODULES appropriately for the Makefile
if test -n "$APU_MODULES"; then 
   APU_HAVE_MODULES=yes
else
   APU_HAVE_MODULES=no
fi
# Define expanded libdir for apu_config.h
APR_EXPAND_VAR(abs_dso_libdir, $APU_DSO_LIBDIR)
AC_DEFINE_UNQUOTED([APU_DSO_LIBDIR], ["$abs_dso_libdir"],
                   [Define to be absolute path to DSO directory])
AC_SUBST(APU_HAVE_MODULES)
AC_SUBST(APU_DSO_LIBDIR)
AC_SUBST(APU_MODULES)
AC_SUBST(EXTRA_OBJECTS)

dnl
dnl Prep all the flags and stuff for compilation and export to other builds
dnl
APR_ADDTO(APRUTIL_LIBS, [$APR_LIBS])

AC_SUBST(APRUTIL_EXPORT_LIBS)
AC_SUBST(APRUTIL_PRIV_INCLUDES)
AC_SUBST(APRUTIL_INCLUDES)
AC_SUBST(APRUTIL_LDFLAGS)
AC_SUBST(APRUTIL_LIBS)
AC_SUBST(LDFLAGS)

dnl copy apr's rules.mk into our build directory.
if test ! -d ./build; then
   $mkdir_p build
fi
dnl
dnl MinGW: If APR is shared, APR_DECLARE_EXPORT will be defined in the
dnl        internal CPPFLAGS, but APR-Util needs APU_DECLARE_EXPORT instead.
dnl        If APR is static, APR_DECLARE_STATIC will be defined in the
dnl        internal CPPFLAGS, but APR-Util needs APU_DECLARE_STATIC too.
dnl
case $host in
    *-mingw*)
        sed -e 's/-DAPR_DECLARE_EXPORT/-DAPU_DECLARE_EXPORT/' \
            -e 's/-DAPR_DECLARE_STATIC/-DAPU_DECLARE_STATIC -DAPR_DECLARE_STATIC/' \
            < $APR_BUILD_DIR/apr_rules.mk > $abs_builddir/build/rules.mk
        ;;
    *)
        cp $APR_BUILD_DIR/apr_rules.mk $abs_builddir/build/rules.mk
        ;;
esac

dnl
dnl BSD/OS (BSDi) needs to use a different include syntax in the Makefiles
dnl
case "$host_alias" in
*bsdi* | BSD/OS)
    # Check whether they've installed GNU make
    if make --version > /dev/null 2>&1; then
        INCLUDE_RULES="include $abs_builddir/build/rules.mk"
        INCLUDE_OUTPUTS="include $abs_srcdir/build-outputs.mk"
    else
        INCLUDE_RULES=".include \"$abs_builddir/build/rules.mk\""
        INCLUDE_OUTPUTS=".include \"$abs_srcdir/build-outputs.mk\""
    fi
    ;;
*)
    INCLUDE_RULES="include $abs_builddir/build/rules.mk"
    INCLUDE_OUTPUTS="include $abs_srcdir/build-outputs.mk"
    ;;
esac
AC_SUBST(INCLUDE_RULES)
AC_SUBST(INCLUDE_OUTPUTS)

for d in include include/private; do
    test -d $top_builddir/$d || mkdir $top_builddir/$d
done

AC_CONFIG_FILES([Makefile export_vars.sh
                 build/pkg/pkginfo apr-util.pc
                 apu-$APRUTIL_MAJOR_VERSION-config:apu-config.in
                 include/private/apu_select_dbm.h
                 include/apr_ldap.h
                 include/apu.h include/apu_want.h])

AC_CONFIG_COMMANDS([default], [
chmod +x apu-$APRUTIL_MAJOR_VERSION-config
],[
APRUTIL_MAJOR_VERSION=$APRUTIL_MAJOR_VERSION
])

if test -d $srcdir/test; then
    AC_CONFIG_FILES([test/Makefile])
fi

AC_OUTPUT
