[ --with-passwd Build with
/etc/passwd support (default)],
if test x$withval = xno; then
[ --with-passwd-file Build with passwd-like file support (default)],
if test x$withval = xno; then
[ --with-shadow Build with shadow password support (default)],
if test x$withval = xno; then
[ --with-pam Build with PAM support (default)],
if test x$withval = xno; then
[ --with-ldap Build with LDAP support],
if test x$withval = xno; then
[ --with-vpopmail Build with vpopmail support (default)],
if test x$withval = xno; then
AC_ARG_WITH(static-userdb,
[ --with-static-userdb Build with static userdb support (default)],
if test x$withval = xno; then
[ --with-pgsql Build with PostgreSQL support],
if test x$withval = xno; then
[ --with-cyrus-sasl2 Build with Cyrus SASL 2 library support],
if test x$withval = xno; then
[ --with-rawlog Build support for logging user traffic],
if test x$withval = xyes; then
AC_DEFINE(BUILD_RAWLOG,, Build with rawlogging feature)
[ --with-ssl=[gnutls|openssl] Build with GNUTLS (default) or OpenSSL],
if test x$withval = xno; then
elif test x$withval = xgnutls; then
elif test x$withval = xopenssl; then
[ --with-ssldir=DIR SSL base directory for certificates (
/etc/ssl)],
[ --with-pop3d Build POP3 server (default)],
if test x$withval = xno; then
AM_CONDITIONAL(BUILD_POP3D, test "$want_pop3d" = "yes")
dnl * gcc specific options
if test "x$ac_cv_prog_gcc" = "xyes"; then
# -Wcast-qual -Wcast-align -Wconversion # too many warnings
# -Wstrict-prototypes -Wredundant-decls # may give warnings in some systems
# -Wmissing-format-attribute -Wmissing-noreturn -Wwrite-strings # a couple of warnings
CFLAGS="$CFLAGS -Wall -W -Wmissing-prototypes -Wmissing-declarations -Wpointer-arith -Wchar-subscripts -Wformat=2 -Wbad-function-cast"
dnl ** just some generic stuff...
AC_CHECK_FUNC(socket, [], [
AC_CHECK_LIB(socket, socket, [
AC_CHECK_FUNC(inet_addr, [], [
AC_CHECK_LIB(nsl, inet_addr, [
AC_CHECK_FUNC(fdatasync, [
AC_CHECK_LIB(rt, fdatasync, [
if test "$have_fdatasync" = "yes"; then
AC_DEFINE(HAVE_FDATASYNC,, Define if you have fdatasync())
dnl * after -lsocket and -lnsl tests, inet_aton() may be in them
AC_CHECK_FUNCS(fcntl flock inet_aton sigaction getpagesize madvise \
strcasecmp stricmp vsnprintf vsyslog writev setrlimit \
AC_DEFINE(IOLOOP_POLL,, Implement I/O loop with poll())
AC_DEFINE(IOLOOP_SELECT,, Implement I/O loop with select())
AC_DEFINE_UNQUOTED(MEM_ALIGN_SIZE, $mem_align, Required memory alignment)
dnl * OS specific options
CFLAGS="$CFLAGS -D_XOPEN_SOURCE_EXTENDED"
AC_CHECK_SIZEOF(long long)
dnl * first check if we can get the size with redefining typedefs
order="int long long-long"
AC_MSG_CHECKING([type of $1])
if test "x$ac_cv_prog_gcc" = "xyes"; then
dnl * try with printf() + -Werror
if test "$fmt" != ""; then
if test "$result" != ""; then
dnl * warning check isn't working
result="`echo $type|sed 's/-/ /g'`"
if test "$result" = ""; then
type="`echo $type|sed 's/-/ /g'`"
if test "$result" != ""; then
dnl * compiler allows redefining to anything
if test "$result" = ""; then
dnl * older autoconfs don't include
sys/types.h, so do it manually
FILE *f=fopen("conftestval", "w");
fprintf(f, "%d\n", sizeof($1));
actype="ac_cv_sizeof_`echo $type|sed 's/-/_/g'`"
if test "$size" = "`eval \"echo \\$$actype\"`"; then
result="`echo $type|sed 's/-/ /g'`"
visible="`expr $size \* 8`bit (using $result)"
if test "$result" = ""; then
visible="`expr $size \* 8`bit (unknown type)"
dnl * off_t checks, try to make it 64bit
AC_DEFINE_UNQUOTED(_FILE_OFFSET_BITS, $preferred_off_t_bits,
[If set to 64, enables 64bit off_t for some systems (eg. Linux, Solaris)])
AC_TYPEOF(off_t, long int long-long)
AC_DEFINE(UOFF_T_INT,, Define if off_t is int)
offt_bits=`expr 8 \* $ac_cv_sizeof_int`
AC_DEFINE(UOFF_T_LONG,, Define if off_t is long)
offt_bits=`expr 8 \* $ac_cv_sizeof_long`
AC_DEFINE(UOFF_T_LONG_LONG,, Define if off_t is long long)
offt_bits=`expr 8 \* $ac_cv_sizeof_long_long`
AC_ERROR([Unsupported off_t type])
AC_DEFINE_UNQUOTED(OFF_T_MAX, $offt_max, Maximum value of off_t)
AC_DEFINE_UNQUOTED(PRIuUOFF_T, "$uofft_fmt", printf() format for uoff_t)
dnl * make sure size_t isn't signed. we'd probably work fine with it, but
dnl * it's more likely vulnerable to buffer overflows. Anyway, C99 specifies
dnl * that it's unsigned and only some old systems define it as signed.
AC_MSG_CHECKING([whether size_t is signed])
/* return 0 if we're signed */
exit((size_t)(int)-1 <= 0 ? 0 : 1);
echo "Your system's size_t is a signed integer, Dovecot isn't designed to"
echo "support it. It probably works just fine, but it's less resistant to"
echo "buffer overflows. If you're not worried about this and still want to"
echo "compile Dovecot, set ignore_signed_size=1 environment."
if test "$ignore_signed_size" = ""; then
case "$typeof_ssize_t" in
dnl older systems didn't have ssize_t, default to int
if test "$typeof_ssize_t" = ""; then
AC_DEFINE(size_t, unsigned int, Define to 'unsigned int' if you don't have it)
AC_DEFINE(ssize_t, int, Define to 'int' if you don't have it)
AC_DEFINE_UNQUOTED(SSIZE_T_MAX, $ssizet_max, Maximum value of ssize_t)
AC_DEFINE_UNQUOTED(PRIuSIZE_T, "$sizet_fmt", printf() format for size_t)
AC_DEFUN(AC_CHECKTYPE2, [
AC_MSG_CHECKING([for $1])
AC_CACHE_VAL(i_cv_type_$1,
AC_MSG_RESULT($i_cv_type_$1)
if test $i_cv_type_uintmax_t = yes; then
AC_DEFINE(HAVE_UINTMAX_T,, Define if you have uintmax_t (C99 type))
dnl use separate check, eg. Solaris 8 has uintmax_t but not uint_fast32_t
AC_CHECKTYPE2(uint_fast32_t, [#include <
inttypes.h>])
if test $i_cv_type_uint_fast32_t = yes; then
AC_DEFINE(HAVE_UINT_FAST32_T,, Define if you have uint_fast32_t (C99 type))
if test $i_cv_type_socklen_t = yes; then
AC_DEFINE(HAVE_SOCKLEN_T,, Define to 'int' if you don't have socklen_t)
dnl * do we have tm_gmtoff
AC_MSG_CHECKING([for tm_gmtoff])
AC_CACHE_VAL(i_cv_field_tm_gmtoff,
[struct tm *tm; return tm->tm_gmtoff;],
i_cv_field_tm_gmtoff=yes,
if test $i_cv_field_tm_gmtoff = yes; then
AC_DEFINE(HAVE_TM_GMTOFF,, Define if you have struct tm->tm_gmtoff)
AC_MSG_RESULT($i_cv_field_tm_gmtoff)
dnl * do we have struct iovec
AC_MSG_CHECKING([for struct iovec])
AC_CACHE_VAL(i_cv_struct_iovec,
if test $i_cv_struct_iovec = yes; then
AC_DEFINE(HAVE_STRUCT_IOVEC,, Define if you have struct iovec)
AC_MSG_RESULT($i_cv_struct_iovec)
dnl * is dev_t an integer or something else?
struct test { dev_t a; };
static struct test t = { 0 };
AC_DEFINE(DEV_T_STRUCT,, Define if your dev_t is a structure instead of integer type)
dnl we can't initialize structures, so don't warn about them either
if test "x$ac_cv_prog_gcc" = "xyes"; then
CFLAGS=`echo $CFLAGS|sed 's/ -W\b//'`
dnl * Do we have RLIMIT_AS?
getrlimit(RLIMIT_AS, &r);
AC_DEFINE(HAVE_RLIMIT_AS,, Define if you have RLIMIT_AS for setrlimit())
dnl * Do we have RLIMIT_NPROC?
getrlimit(RLIMIT_NPROC, &r);
AC_DEFINE(HAVE_RLIMIT_NPROC,, Define if you have RLIMIT_NPROC for setrlimit())
dnl * Linux compatible mremap()
AC_MSG_CHECKING([Linux compatible mremap()])
mremap(0, 0, 0, MREMAP_MAYMOVE);
AC_DEFINE(HAVE_LINUX_MREMAP,, Define if you have Linux-compatible mremap())
dnl * Solaris compatible sendfilev()
AC_CHECK_LIB(sendfile, sendfilev, [
AC_DEFINE(HAVE_SOLARIS_SENDFILEV,, Define if you have Solaris-compatible sendfilev())
dnl * Linux compatible sendfile() - don't check if Solaris one was found.
dnl * This seems to pass with Solaris for some reason..
AC_MSG_CHECKING([Linux compatible sendfile()])
sendfile(0, 0, (void *) 0, 0);
AC_DEFINE(HAVE_LINUX_SENDFILE,, Define if you have Linux-compatible sendfile())
dnl * FreeBSD compatible sendfile()
AC_MSG_CHECKING([FreeBSD compatible sendfile()])
sendfile(0, 0, 0, 0, &hdtr, (void *) 0, 0);
AC_DEFINE(HAVE_FREEBSD_SENDFILE,, Define if you have FreeBSD-compatible sendfile())
dnl *** va_copy checks (from GLIB)
AC_CACHE_CHECK([for an implementation of va_copy()],lib_cv_va_copy,[
if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42)
va_end (args1); va_end (args2);
AC_CACHE_CHECK([for an implementation of __va_copy()],lib_cv___va_copy,[
__va_copy (args2, args1);
if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42)
va_end (args1); va_end (args2);
if test "x$lib_cv_va_copy" = "xyes"; then
else if test "x$lib_cv___va_copy" = "xyes"; then
if test -n "$va_copy_func"; then
AC_DEFINE_UNQUOTED(VA_COPY,$va_copy_func,[A 'va_copy' style function])
AC_CACHE_CHECK([whether va_lists can be copied by value],lib_cv_va_val_copy,[
if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42)
va_end (args1); va_end (args2);
[lib_cv_va_val_copy=yes],
if test "x$lib_cv_va_val_copy" = "xno"; then
AC_DEFINE(VA_COPY_AS_ARRAY,1, ['va_lists' cannot be copies as values])
if test $want_gnutls = yes; then
AC_CHECK_LIB(gnutls, gnutls_global_init, [
AC_DEFINE(HAVE_GNUTLS,, Build with GNUTLS support)
SSL_LIBS="-lgnutls -lgcrypt"
if test "$want_openssl" = "yes" -a "$have_ssl" = "no"; then
AC_CHECK_LIB(ssl, SSL_read, [
AC_DEFINE(HAVE_OPENSSL,, Build with OpenSSL support)
SSL_LIBS="-lssl -lcrypto"
if test "$have_ssl" != "no"; then
AC_DEFINE(HAVE_SSL,, Build with
SSL/TLS support)
dnl ** userdb and passdb checks
if test $want_static_userdb = yes; then
AC_DEFINE(USERDB_STATIC,, Build with static userdb support)
if test $want_passwd = yes; then
AC_DEFINE(USERDB_PASSWD,, Build with passwd support)
AC_DEFINE(PASSDB_PASSWD,, Build with passwd support)
if test $want_passwd_file = yes; then
AC_DEFINE(USERDB_PASSWD_FILE,, Build with passwd-file support)
AC_DEFINE(PASSDB_PASSWD_FILE,, Build with passwd-file support)
userdb="$userdb passwd-file"
passdb="$passdb passwd-file"
if test $want_shadow = yes; then
AC_CHECK_FUNC(getspnam, [
AC_DEFINE(PASSDB_SHADOW,, Build with shadow support)
if test $want_pam = yes; then
AC_CHECK_LIB(pam, pam_start, [
AC_DEFINE(HAVE_SECURITY_PAM_APPL_H,,
AC_DEFINE(HAVE_PAM_PAM_APPL_H,,
if test "$have_pam" = "yes"; then
PASSDB_LIBS="$PASSDB_LIBS -lpam"
AC_DEFINE(PASSDB_PAM,, Build with PAM support)
AC_CHECK_LIB(pam, pam_setcred, [
AC_DEFINE(HAVE_PAM_SETCRED,,
Define if you have pam_setcred())
if test $want_ldap = yes; then
AC_CHECK_LIB(ldap, ldap_init, [
PASSDB_LIBS="$PASSDB_LIBS -lldap"
AC_DEFINE(USERDB_LDAP,, Build with LDAP support)
AC_DEFINE(PASSDB_LDAP,, Build with LDAP support)
if test $want_pgsql = yes; then
LIBS="$LIBS -L$PGSQL_LIBDIR"
AC_CHECK_LIB(pq, PQconnectdb, [
AUTH_CFLAGS="$AUTH_CFLAGS -I$PGSQL_INCLUDE"
PASSDB_LIBS="$PASSDB_LIBS -L$PGSQL_LIBDIR -lpq"
AC_DEFINE(USERDB_PGSQL,, Build with PostgreSQL support)
AC_DEFINE(PASSDB_PGSQL,, Build with PostgreSQL support)
if test $want_vpopmail = yes; then
vpopmail_home="`echo ~vpopmail`"
AC_MSG_CHECKING([for vpopmail configuration at $vpop_libdeps])
if test -f $vpop_libdeps; then
VPOPMAIL_LIBS="`cat $vpop_libdeps`"
AC_DEFINE(USERDB_VPOPMAIL,, Build with vpopmail support)
AC_DEFINE(PASSDB_VPOPMAIL,, Build with vpopmail support)
userdb="$userdb vpopmail"
passdb="$passdb vpopmail"
AC_SUBST(VPOPMAIL_CFLAGS)
if test $want_cyrus_sasl2 = yes; then
AC_CHECK_LIB(sasl2, sasl_server_start, [
AC_DEFINE(USE_CYRUS_SASL2,,
Define if you want to use Cyrus SASL library)
if test $need_crypt = yes; then
AC_CHECK_LIB(crypt, crypt, [
PASSDB_LIBS="$PASSDB_LIBS -lcrypt"
AC_ERROR([crypt() wasn't found])
AC_CHECK_LIB(dl, dlopen, [
PASSDB_LIBS="$PASSDB_LIBS -ldl"
AC_DEFINE(AUTH_MODULES,, Define if you want to build with dynamic auth modules)
userdb="$userdb (modules)"
passdb="$passdb (modules)"
AM_CONDITIONAL(AUTH_MODULES, test "$auth_modules" = "yes")
dnl ** Index file compatibility flags
dnl * currently just checking for endianess
if test $ac_cv_c_bigendian = yes; then
AC_DEFINE_UNQUOTED(MAIL_INDEX_COMPAT_FLAGS, $flags, Index file compatibility flags)
if test "x$want_ipv6" = "xyes"; then
AC_MSG_CHECKING([for IPv6])
AC_CACHE_VAL(i_cv_type_in6_addr,
if test $i_cv_type_in6_addr = yes; then
AC_DEFINE(HAVE_IPV6,, Build with IPv6 support)
AC_MSG_RESULT($i_cv_type_in6_addr)
capability="IMAP4rev1 SORT THREAD=REFERENCES MULTIAPPEND UNSELECT LITERAL+ IDLE CHILDREN LISTEXT LIST-SUBSCRIBED"
AC_DEFINE_UNQUOTED(CAPABILITY_STRING, "$capability", IMAP capabilities)
CFLAGS="$CFLAGS $EXTRA_CFLAGS"
dnl ** register the storage classes
dnl * do it after AC_OUTPUT(), so we know that the directory exists.
dnl * it doesn't when building in different directory
echo "/* this file is generated by configure */" > $file
echo '#include "
lib.h"' >> $file
for storage in $STORAGE; do
echo "extern struct mail_storage ${storage}_storage;" >> $file
echo "void mail_storage_register_all(void) {" >> $file
for storage in $STORAGE; do
echo "mail_storage_class_register(&${storage}_storage);" >> $file
echo "Install prefix ...................... : $prefix"
echo "File offsets ........................ : ${offt_bits}bit"
echo "Building with SSL support ........... : $have_ssl"
echo "Building with IPv6 support .......... : $want_ipv6"
echo "Building with pop3 server ........... : $want_pop3d"
echo "Building with user database modules . :$userdb"
echo "Building with password lookup modules :$passdb"