Updated config test to add -Wextra to be consistent with others. So, it's back!
[mmh] / configure.ac
1 dnl
2 dnl configure.ac -- autoconf template for nmh
3 dnl
4
5 dnl Move this up a bit
6 AC_PREREQ([2.61])
7
8 AC_INIT([nmh], m4_normalize(m4_include([VERSION])), [nmh-workers@nongnu.org])
9 AC_CONFIG_SRCDIR([h/nmh.h])
10 AC_CONFIG_HEADER([config.h])
11 AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
12
13 AC_CANONICAL_HOST
14
15 echo "configuring for AC_PACKAGE_NAME-AC_PACKAGE_VERSION"
16 AC_SUBST(VERSION,AC_PACKAGE_VERSION)dnl
17
18 dnl What date of nmh are we building?
19 DATE=`cat ${srcdir}/DATE`
20 echo "configuring for nmh dated $DATE"
21 AC_SUBST([DATE])dnl
22
23 dnl --------------------------
24 dnl CHECK COMMAND LINE OPTIONS
25 dnl --------------------------
26
27 dnl Do you want to debug nmh?
28 AC_ARG_ENABLE([debug],
29   AS_HELP_STRING([--enable-debug],[enable nmh code debugging]))
30 dnl The old redundant --enable-nmh-debug is deprecated and undocumented.
31 if test x"$enable_nmh_debug" = x"yes"; then
32   enable_debug=yes
33 fi
34
35 dnl Allow users to send email from addresses other than their default?
36 AC_ARG_ENABLE(masquerade,
37   AS_HELP_STRING([--enable-masquerade='draft_from mmailid username_extension'],
38     [enable up to 3 types of address masquerading]),
39   [if test x"$enable_masquerade" = x"yes"; then
40     masquerade="draft_from mmailid username_extension"
41   else
42     masquerade="$enable_masquerade"
43   fi], [masquerade="draft_from mmailid username_extension"])
44 AC_SUBST(masquerade)dnl
45
46 dnl Do you want client-side support for pop?
47 AC_ARG_ENABLE([pop],
48   AS_HELP_STRING([--enable-pop], [enable client-side support for plain POP3]))
49 dnl The old redundant --enable-nmh-pop is deprecated and undocumented.
50 if test x"$enable_nmh_pop" = x"yes"; then
51   enable_pop=yes
52 fi
53
54 dnl Do you want to disable use of locale functions
55 AH_TEMPLATE([LOCALE],
56 [Undefine if you don't want locale features.  By default this is defined.])
57 AC_ARG_ENABLE([locale],
58 AC_HELP_STRING([--disable-locale], [turn off locale features]),
59 [if test x$enableval = xyes; then
60   AC_DEFINE(LOCALE)
61 fi],
62 AC_DEFINE(LOCALE)
63 )
64
65 dnl Do you want client-side support for using SASL for authentication?
66 dnl Note that this code will be enabled for both POP and SMTP
67 AC_ARG_WITH([cyrus-sasl], AS_HELP_STRING([--with-cyrus-sasl],
68   [Enable SASL support via the Cyrus SASL library]))
69 if test x"$with_cyrus_sasl" != x -a x"$with_cyrus_sasl" != x"no"; then
70   AC_DEFINE([CYRUS_SASL], [1],
71     [Define to use the Cyrus SASL library for authentication of POP and SMTP.])dnl
72   if test x"$with_cyrus_sasl" != xyes; then
73     AC_MSG_WARN([Arguments to --with-cyrus-sasl now ignored])
74     AC_MSG_WARN([Please pass the appropriate arguments to CPPFLAGS/LDFLAGS])
75   fi
76   sasl_support=yes
77 else
78   sasl_support=no
79 fi
80
81 dnl Do you want client-side support for encryption with TLS?
82 AC_ARG_WITH([tls], AS_HELP_STRING([--with-tls], [Enable TLS support]))
83 if test x"$with_tls" != x -a x"$with_tls" != x"no"; then
84   AC_DEFINE([TLS_SUPPORT], [1], [Support TLS for session encryption.])dnl
85   tls_support=yes
86 else
87   tls_support=no
88 fi
89
90 dnl What should be the default editor?
91 AC_ARG_WITH([editor],
92   AS_HELP_STRING([--with-editor=EDITOR],[specify the default editor]))
93
94 if test -n "$with_editor"; then
95   editorpath="$with_editor"
96 fi
97
98 dnl Set the backup prefix
99 AC_ARG_WITH([hash-backup],
100   AS_HELP_STRING([--with-hash-backup],[use # as the backup prefix (default: ,)]))
101 if test x"$with_hash_backup" != x -a x"$with_hash_backup" != x"no"; then
102   backup_prefix="#"
103 else
104   backup_prefix=","
105 fi
106 AC_DEFINE_UNQUOTED([BACKUP_PREFIX], "$backup_prefix",
107     [The prefix that is prepended to the name of message files when they are "removed" by rmm. This should typically be `,' or `#'.])dnl
108
109 dnl After we know if we're including apop and kpop support, do pop stuff
110 if test x"$enable_pop" = x"yes"; then
111   AC_DEFINE([POP], 1,
112     [Define this to compile client-side support for pop into inc and msgchk.])dnl
113 fi
114 AM_CONDITIONAL([POP_SUPPORT], [test x"$enable_pop" = x"yes"])
115
116 dnl What method of locking to use?
117 AC_ARG_WITH(locking,
118   AS_HELP_STRING([--with-locking=@<:@dot|fcntl|flock|lockf@:>@],
119   [specify the file locking method]))
120
121 if test x"$with_locking" = x"dot"; then
122   LOCKTYPE="dot"
123   AC_DEFINE(DOT_LOCKING, 1, [Define to use dot based file locking.])dnl
124 elif test x"$with_locking" = x"flock"; then
125   LOCKTYPE="flock"
126   AC_DEFINE(FLOCK_LOCKING, 1, [Define to use flock() based locking.])dnl
127 elif test x"$with_locking" = x"lockf"; then
128   LOCKTYPE="lockf"
129   AC_DEFINE(LOCKF_LOCKING, 1, [Define to use lockf() based locking.])dnl
130 elif test x"$with_locking" = x"fcntl"; then
131   LOCKTYPE="fcntl"
132   AC_DEFINE(FCNTL_LOCKING, 1, [Define to use fnctl() based locking.])dnl
133 else
134   LOCKTYPE="dot"
135   AC_DEFINE(DOT_LOCKING)dnl
136 fi
137
138 dnl Should we use a locking directory?
139 AC_ARG_ENABLE([lockdir], [
140   AS_HELP_STRING([--enable-lockdir=dir], [Store dot-lock files in "dir"])], [
141   AS_IF([test "x$enableval" = xyes],[
142     AC_MSG_ERROR([--enable-lockdir requires an argument])])
143   AS_IF([test "x$LOCKTYPE" != xdot],[
144     AC_MSG_ERROR([Can only use --enable-lockdir with dot locking])])
145   AC_DEFINE_UNQUOTED([LOCKDIR], ["$enableval"],
146                      [Directory to store dot-locking lock files])
147 ])
148
149 dnl What method of posting should post use?
150 AC_ARG_WITH([mts],
151   AS_HELP_STRING([--with-mts=@<:@smtp|sendmail@:>@],
152   [specify the default mail transport agent/service]))
153
154 if test x"$with_mts" = x"smtp"; then
155   MTS="smtp"
156 elif test x"$with_mts" = x"sendmail"; then
157   MTS="sendmail"
158 else
159   MTS="smtp"
160 fi
161 AC_SUBST([MTS])dnl
162
163 dnl Both the smtp and sendmail mail transport services use the smtp code
164 AC_DEFINE([SMTPMTS], [1],
165   [Define if you want SMTP (simple mail transport protocol) support.])dnl
166
167 dnl What should be the default pager?
168 AC_ARG_WITH([pager],
169   AS_HELP_STRING([--with-pager=PAGER],[specify the default pager]))
170
171 if test -n "$with_pager"; then
172   pagerpath="$with_pager"
173 fi
174
175 dnl What should be the default mail server(s)?
176 AC_ARG_WITH(smtpservers,
177   AS_HELP_STRING([--with-smtpservers='SMTPSERVER1@<:@ SMTPSERVER2...@:>@'],
178   [specify the default SMTP server(s) @<:@localhost@:>@]))
179 if test -n "$with_smtpservers"; then
180   smtpservers="$with_smtpservers"
181 else
182   smtpservers="localhost"
183 fi
184 AC_SUBST([smtpservers])dnl
185
186 dnl ----------------------------------------------------
187 dnl Default location is /usr/local/nmh/{bin,etc,lib,man}
188 dnl ----------------------------------------------------
189 AC_PREFIX_DEFAULT([/usr/local/nmh])
190
191 dnl ------------------
192 dnl CHECK THE COMPILER
193 dnl ------------------
194 dnl We want these before the checks,
195 dnl so the checks can modify their values.
196 test -z "$CFLAGS" && CFLAGS= auto_cflags=1
197 if test x"$enable_debug" = x"yes"; then
198   test -z "$LDFLAGS" && LDFLAGS=-g
199 fi
200
201 AC_PROG_CC
202 AM_PROG_CC_C_O
203
204 AC_CACHE_CHECK([whether preprocessor supports -Wunused-macros],
205   [nmh_cv_has_unusedmacros],
206   [nmh_saved_cppflags="$CPPFLAGS"
207    CPPFLAGS="$CPPFLAGS -Wunused-macros -Wno-unused-macros"
208    AC_TRY_COMPILE([],[],nmh_cv_has_unusedmacros=yes,nmh_cv_has_unusedmacros=no)
209    CPPFLAGS="$nmh_saved_cppflags"])
210
211 if test "$nmh_cv_has_unusedmacros" = 'yes'; then
212   test -z "$CPPLAGS"  &&  CPPFLAGS=-Wunused-macros \
213                       ||  CPPFLAGS="$CPPFLAGS -Wunused-macros"
214   DISABLE_UNUSED_MACROS_WARNING=-Wno-unused-macros
215 fi
216 AC_SUBST(DISABLE_UNUSED_MACROS_WARNING)dnl
217
218 AC_CACHE_CHECK([whether compiler supports -Wextra], [nmh_cv_has_wextra],
219 [nmh_saved_cflags="$CFLAGS"
220  CFLAGS="$CFLAGS -Wextra -Wno-clobbered"
221  AC_TRY_COMPILE([],[],nmh_cv_has_wextra=yes,nmh_cv_has_wextra=no)
222  CFLAGS="$nmh_saved_cflags"])
223
224 AC_CACHE_CHECK([whether compiler supports -Wno-pointer-sign], [nmh_cv_has_noptrsign],
225 [nmh_saved_cflags="$CFLAGS"
226  CFLAGS="$CFLAGS -Wno-pointer-sign"
227  AC_TRY_COMPILE([],[],nmh_cv_has_noptrsign=yes,nmh_cv_has_noptrsign=no)
228  CFLAGS="$nmh_saved_cflags"])
229
230 dnl if the user hasn't specified CFLAGS, then
231 dnl   if compiler is gcc, then
232 dnl     use -O2 and some warning flags
233 dnl   else use -O
234 dnl We use -Wall and -Wextra if supported.  If the compiler supports it we
235 dnl also use -Wno-pointer-sign, because gcc 4 now produces a lot of new
236 dnl warnings which are probably mostly spurious and which in any case we
237 dnl don't want to deal with now.
238 if test "$nmh_cv_has_noptrsign" = "yes"; then
239     if test "$nmh_cv_has_wextra" = "yes"; then
240         nmh_gcc_warnflags="-Wall -Wextra -Wno-clobbered -Wno-pointer-sign"
241     else
242         nmh_gcc_warnflags="-Wall -Wno-pointer-sign"
243     fi
244 else
245     if test "$nmh_cv_has_wextra" = "yes"; then
246         nmh_gcc_warnflags="-Wall -Wextra -Wno-clobbered"
247     else
248         nmh_gcc_warnflags="-Wall"
249     fi
250 fi
251
252 if test -n "$auto_cflags"; then
253   if test x"$enable_debug" = x"yes"; then
254     if test -n "$GCC"; then
255       test -z "$CFLAGS" && CFLAGS="$nmh_gcc_warnflags -g" || CFLAGS="$CFLAGS $nmh_gcc_warnflags -g"
256     else
257       test -z "$CFLAGS" && CFLAGS=-g || CFLAGS="$CFLAGS -g"
258     fi
259   else
260     if test -z "$LDFLAGS"; then
261       case "$build_os" in
262         darwin*)
263           LDFLAGS=
264           ;;
265         *)
266           LDFLAGS=-s
267           ;;
268       esac
269     fi
270     if test -n "$GCC"; then
271       test -z "$CFLAGS" && CFLAGS="$nmh_gcc_warnflags -O2" || CFLAGS="$CFLAGS $nmh_gcc_warnflags -O2"
272     else
273       test -z "$CFLAGS" && CFLAGS=-O  || CFLAGS="$CFLAGS -O"
274     fi
275   fi
276 fi
277
278 AC_C_CONST              dnl Does compiler support `const'.
279
280 dnl ------------------
281 dnl CHECK FOR PROGRAMS
282 dnl ------------------
283 AC_PROG_MAKE_SET        dnl Does make define $MAKE
284 AC_PROG_INSTALL         dnl Check for BSD compatible `install'
285 AC_PROG_RANLIB          dnl Check for `ranlib'
286 AC_PROG_AWK             dnl Check for mawk,gawk,nawk, then awk
287 AC_PROG_SED             dnl Check for Posix-compliant sed
288 AC_PROG_LEX             dnl Check for lex/flex
289
290 dnl Look for `cut'
291 pathtmp=/usr/bin:/bin:/usr/local/bin:/usr/xpg4/bin:/usr/ucb
292 AC_PATH_PROG(cutpath, cut, no, [$pathtmp])
293
294 dnl ----------------------------------------------
295 dnl check for lclint, and lint if it doesn't exist
296 dnl ----------------------------------------------
297 AC_CHECK_PROG(linttmp1, lclint, lclint, no)dnl
298 if test x$ac_cv_prog_linttmp1 != xno ; then
299   LINT=$ac_cv_prog_linttmp1
300   LINTFLAGS="-weak +posixlib -macrovarprefixexclude"
301 else
302   AC_CHECK_PROG(linttmp2, lint, lint, no)dnl
303   if test x$ac_cv_prog_linttmp2 != xno ; then
304     LINT=$ac_cv_prog_linttmp2
305     LINTFLAGS=""
306   else
307     LINT="echo 'No lint program found'"
308     LINTFLAGS=""
309   fi
310 fi
311 AC_SUBST([LINT])dnl
312 AC_SUBST([LINTFLAGS])dnl
313
314 dnl Look for `ls'
315 pathtmp=/usr/bin:/bin:/usr/local/bin:/usr/xpg4/bin:/usr/ucb
316 AC_PATH_PROG([lspath], [ls], [no], [$pathtmp])
317
318 dnl See how we get ls to display the owner and the group
319 if test "$lspath" != "no"; then
320   AC_CACHE_CHECK([how to get ls to show us the group ownership of a file],
321                  [nmh_cv_ls_grpopt],
322   [if test x"`$lspath -dl / | $AWK '{print $9}'`" = x"/"; then
323     dnl There were 9 parameters, so unless this is a really bizarre, nonstandard
324     dnl ls, it would seem -l gave us both the user and group.  On this type of
325     dnl ls, -g makes _only_ the group be displayed (and not the user).
326     nmh_cv_ls_grpopt="-l"
327   else
328     dnl Looks like -l only gave us the user, so we need -g to get the group too.
329     nmh_cv_ls_grpopt="-lg"
330   fi])
331 fi
332
333 dnl Look for `more'
334 pathtmp=/usr/bin:/bin:/usr/ucb:/usr/local/bin
335 AC_PATH_PROG([morepath], [more], [no], [$pathtmp])
336
337 dnl If pager is not specified yet,
338 dnl then use `more' as the default.
339 if test -z "$pagerpath"; then
340   pagerpath="$morepath"
341 fi
342 AC_SUBST(pagerpath)dnl
343
344 dnl Look for `sendmail'
345 pathtmp=/usr/lib:/usr/sbin:/usr/etc:/usr/ucblib:/usr/bin:/bin
346 AC_PATH_PROG([sendmailpath], [sendmail], [/usr/sbin/sendmail], [$pathtmp])
347
348 dnl Look for `vi'
349 pathtmp=/usr/bin:/bin:/usr/ucb:/usr/local/bin
350 AC_PATH_PROG([vipath], [vi], [/bin/vi], [$pathtmp])
351
352 dnl If editor is not specified yet,
353 dnl then use `vi' as the default.
354 if test -z "$editorpath"; then
355   editorpath="$vipath"
356 fi
357 AC_SUBST([editorpath])dnl
358
359 dnl ----------------------------------------------------------
360 dnl FIND MAIL SPOOL AND SEE IF WE NEED TO MAKE inc SETGID MAIL
361 dnl ----------------------------------------------------------
362 AC_CACHE_CHECK(where mail spool is located, nmh_cv_mailspool,
363 [for mailspool in /var/mail        dnl
364                   /var/spool/mail  dnl
365                   /usr/spool/mail  dnl
366                   /dev/null;       dnl Just in case we fall through
367 do
368   test -d $mailspool && break
369 done
370 nmh_cv_mailspool=$mailspool
371 ])
372 mailspool=$nmh_cv_mailspool
373 AC_SUBST(mailspool)dnl
374
375 dnl See whether the mail spool directory is world-writable.
376 if test "$lspath" != "no" -a "$cutpath" != "no"; then
377   AC_CACHE_CHECK(whether the mail spool is world-writable,
378                  nmh_cv_mailspool_world_writable,
379   [if test "`$lspath -dlL $mailspool | $cutpath -c9`" = "-"; then
380     nmh_cv_mailspool_world_writable=no
381   else
382     nmh_cv_mailspool_world_writable=yes
383   fi])
384 fi
385
386 dnl Also, check for liblockfile (as found on Debian systems)
387 AC_CHECK_HEADER([lockfile.h], AC_CHECK_LIB(lockfile, lockfile_create) )
388
389 dnl and whether its companion program dotlockfile is setgid
390 AC_PATH_PROG(dotlockfilepath, dotlockfile, no)
391 if test "$ac_cv_lib_lockfile_lockfile_create" != "no" ; then
392   if test "$ac_cv_path_dotlockfilepath" != "no" ; then
393     AC_CACHE_CHECK(whether dotlockfile is setgid, nmh_cv_dotlockfile_setgid,
394     [ if test -g "$ac_cv_path_dotlockfilepath" ; then
395         nmh_cv_dotlockfile_setgid=yes
396       else
397         nmh_cv_dotlockfile_setgid=no
398       fi])
399   fi
400 fi
401
402 dnl If mailspool is not world-writable and dotlockfile is not setgid,
403 dnl we need to #define MAILGROUP to 1 and make inc setgid.
404 if test x"$LOCKTYPE" = x"dot" -a x"$nmh_cv_mailspool_world_writable" = x"no" -a x"$nmh_cv_dotlockfile_setgid" != x"yes" ; then
405   dnl do we really need both of these?
406   AC_DEFINE(MAILGROUP,1,
407     [Define to 1 if you need to make `inc' set-group-id because your mail spool is not world writable. There are no guarantees as to the safety of doing this, but this #define will add some extra security checks.])dnl
408   SETGID_MAIL=1
409 fi
410 AC_SUBST(SETGID_MAIL)dnl
411
412 dnl Use ls to see which group owns the mail spool directory.
413 AC_CACHE_CHECK(what group owns the mail spool, nmh_cv_ls_mail_grp,
414 [nmh_cv_ls_mail_grp=`$lspath -dL $nmh_cv_ls_grpopt $mailspool|$AWK '{print $4}'`
415 ])
416 MAIL_SPOOL_GRP=$nmh_cv_ls_mail_grp
417 AC_SUBST(MAIL_SPOOL_GRP)dnl
418
419 dnl ------------------
420 dnl CHECK HEADER FILES
421 dnl ------------------
422
423 dnl On glibc we need to define at least the '_XOPEN_SOURCE' level of features,
424 dnl or wchar.h doesn't declare a prototype for wcwidth(). But if we only define
425 dnl that level then db.h won't compile. So we define _GNU_SOURCE which turns
426 dnl on everything. Perhaps other OSes need some feature switch set to get wcwidth()
427 dnl declared; if so they should have an entry added to this case statement.
428 dnl NB that we must define this on the compiler command line, not in config.h,
429 dnl because it must be set before any system header is included and there's no
430 dnl portable way to make sure that files generated by lex include config.h
431 dnl before system header files.
432
433 case "$host_os" in
434   linux*)
435     # Like DEFS, but doesn't get stomped on by configure when using config.h:
436     test -z "$OURDEFS"  &&  OURDEFS="-D_GNU_SOURCE"  \
437                         ||  OURDEFS="$OURDEFS -D_GNU_SOURCE"
438     ;;
439 esac
440 AC_SUBST(OURDEFS)
441
442 AC_HEADER_STDC
443 AC_HEADER_TIOCGWINSZ
444 AC_CHECK_HEADERS(errno.h fcntl.h crypt.h ncurses/termcap.h termcap.h \
445                  langinfo.h wchar.h wctype.h iconv.h netdb.h \
446                  sys/param.h sys/time.h sys/stream.h)
447
448 dnl
449 dnl Checks for _IO_write_ptr. A Linuxism used by nmh on linux. We
450 dnl really use a whole set of them, but this check should be
451 dnl sufficient.
452 dnl
453 AC_CHECK_HEADER(libio.h, [
454   AC_EGREP_HEADER(_IO_write_ptr, libio.h, [
455     AC_DEFINE(LINUX_STDIO,1,[Use the Linux _IO_*_ptr defines from <libio.h>.]) ]) ])
456
457 AC_CHECK_HEADER([sys/ptem.h], AC_DEFINE(WINSIZE_IN_PTEM,1,
458   [Define to 1 if `struct winsize' requires <sys/ptem.h>.]),,
459 [[#if HAVE_SYS_STREAM_H
460 #  include <sys/stream.h>
461 #endif
462 ]])
463
464 dnl ---------------
465 dnl CHECK FUNCTIONS
466 dnl ---------------
467 AC_CHECK_FUNCS(writev lstat nl_langinfo)
468
469 dnl Check for multibyte character set support
470 if test "x$ac_cv_header_wchar_h" = "xyes" -a "x$ac_cv_header_wctype_h" = "xyes" \
471     -a "x$ac_cv_func_wcwidth" = "xyes" -a "x$ac_cv_func_mbtowc" = "xyes"; then
472   AC_DEFINE(MULTIBYTE_SUPPORT, 1,
473     [Define to enable support for multibyte character sets.])
474 fi
475
476 dnl -------------------
477 dnl CHECK FOR LIBRARIES
478 dnl -------------------
479 dnl Check location of modf
480 AC_CHECK_FUNC(modf, , AC_CHECK_LIB(m, modf))
481
482 dnl Checks for network libraries (nsl, socket)
483 NMH_CHECK_NETLIBS
484
485 termcap_curses_order="termcap curses ncurses"
486 for lib in $termcap_curses_order; do
487   AC_CHECK_LIB(${lib}, tgetent, [TERMLIB="-l$lib"; break])
488 done
489 AC_SUBST([TERMLIB])dnl
490
491 dnl ---------------
492 dnl CHECK FOR ICONV
493 dnl ---------------
494
495 dnl Find iconv. It may be in libiconv and may be iconv() or libiconv()
496 if test "x$ac_cv_header_iconv_h" = "xyes"; then
497   AC_CHECK_FUNC(iconv, ac_found_iconv=yes, ac_found_iconv=no)
498   if test "x$ac_found_iconv" = "xno"; then
499     AC_CHECK_LIB(iconv, iconv, ac_found_iconv=yes)
500     if test "x$ac_found_iconv" = "xno"; then
501       AC_CHECK_LIB(iconv, libiconv, ac_found_iconv=yes)
502     fi
503     if test "x$ac_found_iconv" != "xno"; then
504       ICONVLIB="-liconv"
505     fi
506   else
507     dnl Handle case where there is a native iconv but iconv.h is from libiconv
508     AC_CHECK_DECL(_libiconv_version,
509       [ AC_CHECK_LIB(iconv, libiconv, LIBS="-liconv $LIBS") ],,
510       [ #include <iconv.h> ])
511   fi
512 fi
513 if test "x$ac_found_iconv" = xyes; then
514   AC_DEFINE([HAVE_ICONV], [1], [Define if you have the iconv() function.])
515 fi
516 AC_SUBST([ICONVLIB])
517
518 dnl Check if iconv uses const in prototype declaration
519 if test "x$ac_found_iconv" = "xyes"; then
520   AC_CACHE_CHECK(for iconv declaration, ac_cv_iconv_const,
521     [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdlib.h>
522         #include <iconv.h>]],
523         [[#ifdef __cplusplus
524           "C"
525           #endif
526           #if defined(__STDC__) || defined(__cplusplus)
527           size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
528           #else
529           size_t iconv();
530           #endif]])],
531       [ac_cv_iconv_const=],
532       [ac_cv_iconv_const=const])])
533   AC_DEFINE_UNQUOTED([ICONV_CONST], $ac_cv_iconv_const,
534     [Define as const if the declaration of iconv() needs const.])
535 fi
536
537 dnl --------------
538 dnl CHECK FOR NDBM
539 dnl --------------
540
541 AC_ARG_WITH([ndbm],AS_HELP_STRING([--with-ndbm=ARG],[use -lARG to link with ndbm]),
542             [nmh_ndbm=$withval],[nmh_ndbm=autodetect])
543 AC_ARG_WITH([ndbmheader],AS_HELP_STRING([--with-ndbmheader=ARG],[#include <ARG> to use ndbm]),
544             [nmh_ndbmheader=$withval],[nmh_ndbmheader=autodetect])
545
546 if test "$nmh_ndbm" = "autodetect"; then
547   if test "$nmh_ndbmheader" != "autodetect"; then
548     AC_MSG_ERROR([must specify both --with-ndbm and --with-ndbmheader or neither])
549   else
550
551     dnl There are at least four implementations of ndbm, and
552     dnl several of those can be in different places at the whim
553     dnl of the system integrator. A good summary of this mess
554     dnl can be found at http://www.unixpapa.com/incnote/dbm.html
555
556     dnl Classic ndbm with no library required (eg NetBSD): try this
557     dnl first so we don't accidentally link in a pointless but harmless
558     dnl library in one of the later ndbm.h+libfoo tests:
559     NMH_CHECK_NDBM(ndbm.h,,,
560     dnl Berkeley DBv2 emulating ndbm: header in db.h:
561       NMH_CHECK_NDBM(db.h,db,,
562     dnl Berkeley DBv1 emulating ndbm:
563         NMH_CHECK_NDBM(ndbm.h,db,,
564           NMH_CHECK_NDBM(ndbm.h,db1,,
565     dnl Classic ndbm:
566             NMH_CHECK_NDBM(ndbm.h,ndbm,,
567     dnl glibc2.1 systems put db1 in a subdir:
568               NMH_CHECK_NDBM(db1/ndbm.h,db1,,
569     dnl GNU gdbm emulating ndbm, with header possibly in gdbm/
570     dnl and possibly needing gbdm_compat library:
571                 NMH_CHECK_NDBM(gdbm/ndbm.h,gdbm,,
572                   NMH_CHECK_NDBM(gdbm/ndbm.h,gdbm_compat -lgdbm,,
573                     NMH_CHECK_NDBM(ndbm.h,gdbm,,
574                       NMH_CHECK_NDBM(ndbm.h,gdbm_compat -lgdbm))))))))))
575
576   fi
577 else
578   dnl We don't really need to check that the user-specified values work,
579   dnl but it is a convenience to the user to bomb out early rather than
580   dnl after configure and half the compile process.
581   NMH_CHECK_NDBM([$nmh_ndbmheader],[$nmh_ndbm])
582 fi
583
584 if test "$nmh_ndbm_found" = "no"; then
585   AC_MSG_ERROR([could not find a working ndbm library/header combination])
586 else
587   dnl Now export the lib/header to our makefile/config.h:
588   if test x"$nmh_ndbmheader" != x; then
589     AC_DEFINE_UNQUOTED(NDBM_HEADER, <$nmh_ndbmheader>,
590       [Define to the header containing the ndbm API prototypes.])
591   fi
592   if test x"$nmh_ndbm" != x; then
593     NDBM_LIBS="-l$nmh_ndbm"
594   else
595     NDBM_LIBS=
596   fi
597   AC_SUBST([NDBM_LIBS])
598 fi
599
600 dnl ------------------
601 dnl Set RPM build root
602 dnl ------------------
603 dnl nmhrpm is used in the final summary, see below.  The default value is
604 dnl reported there as ./RPM, consistent with the reporting of the default
605 dnl source code location as ., but its absolute path is used in the Makefile.
606 AC_ARG_WITH(rpmdir,
607   AS_HELP_STRING([--with-rpmdir=RPMDIR], [RPM build directory @<:@RPM@:>@]))
608   AS_IF([test x"$with_rpmdir" = x], [rpmdir='$(abs_srcdir)/RPM'; nmhrpm=./RPM],
609           [rpmdir="$with_rpmdir"; eval "nmhrpm=${rpmdir}"])
610 AC_SUBST([rpmdir])
611
612
613 dnl --------------------
614 dnl CHECK FOR CYRUS-SASL
615 dnl --------------------
616
617 AS_IF([test x"$sasl_support" = x"yes"],[
618   AC_CHECK_HEADER([sasl/sasl.h], , [AC_MSG_ERROR([sasl.h not found])])
619   AC_CHECK_LIB([sasl2], [sasl_client_new], [SASLLIB="-lsasl2"],
620     [AC_MSG_ERROR([Cyrus SASL library not found])])],[SASLLIB=""])
621 AC_SUBST([SASLLIB])
622
623 dnl -----------------
624 dnl CHECK FOR OPENSSL
625 dnl -----------------
626
627 AS_IF([test x"$tls_support" = x"yes"],[
628   AC_CHECK_HEADER([openssl/ssl.h], , [AC_MSG_ERROR([openssl/ssl.h not found])])
629   AC_CHECK_LIB([crypto], [BIO_write], ,
630     [AC_MSG_ERROR([OpenSSL crypto library not found])])
631   AC_CHECK_LIB([ssl], [SSL_library_init], ,
632     [AC_MSG_ERROR([OpenSSL library not found])])])
633
634 dnl ---------------------
635 dnl CHECK TERMCAP LIBRARY
636 dnl ---------------------
637
638 dnl Add the termcap library, so that the following configure
639 dnl tests will find it when it tries to link test programs.
640 nmh_save_LIBS="$LIBS"
641 LIBS="$TERMLIB $LIBS"
642
643 dnl Check if tgetent accepts NULL (and will allocate its own termcap buffer)
644 dnl Some termcaps reportedly accept a zero buffer, but then dump core
645 dnl in tgetstr().
646 dnl Under Cygwin test program crashes but exit code is still 0. So,
647 dnl we test for a file that porgram should create
648 AH_TEMPLATE([TGETENT_ACCEPTS_NULL],
649 [Define to 1 if tgetent() accepts NULL as a buffer.])
650 AC_CACHE_CHECK(if tgetent accepts NULL,
651 nmh_cv_func_tgetent_accepts_null,
652 [AC_TRY_RUN([
653 main()
654 {
655     char buf[4096];
656     int r1 = tgetent(buf, "vt100");
657     int r2 = tgetent((char*)0,"vt100");
658     if (r1 >= 0 && r1 == r2) {
659         char tbuf[1024], *u;
660         u = tbuf;
661         tgetstr("cl", &u);
662         creat("conftest.tgetent", 0640);
663     }
664     exit((r1 != r2) || r2 == -1);
665 }
666 ],
667   if test -f conftest.tgetent; then
668     nmh_cv_func_tgetent_accepts_null=yes
669   else
670     nmh_cv_func_tgetent_accepts_null=no
671   fi,
672   nmh_cv_func_tgetent_accepts_null=no,
673   nmh_cv_func_tgetent_accepts_null=no)])
674 if test x$nmh_cv_func_tgetent_accepts_null = xyes; then
675   AC_DEFINE(TGETENT_ACCEPTS_NULL)
676 fi
677 AC_CACHE_CHECK(if tgetent returns 0 on success,
678 nmh_cv_func_tgetent_zero_success,
679 [AC_TRY_RUN([
680 main()
681 {
682     char buf[4096];
683     int r1 = tgetent(buf, "!@#$%^&*");
684     int r2 = tgetent(buf, "vt100");
685     if (r1 < 0 && r2 == 0) {
686         char tbuf[1024], *u;
687         u = tbuf;
688         tgetstr("cl", &u);
689         creat("conftest.tgetent0", 0640);
690     }
691     exit(r1 == r2);
692 }
693 ],
694   if test -f conftest.tgetent0; then
695     nmh_cv_func_tgetent_zero_success=yes
696   else
697     nmh_cv_func_tgetent_zero_success=no
698   fi,
699   nmh_cv_func_tgetent_zero_success=no,
700   nmh_cv_func_tgetent_zero_success=no)])
701 AH_TEMPLATE([TGETENT_SUCCESS],
702 [Define to what tgetent() returns on success (0 on HP-UX X/Open curses).])
703 if test x$nmh_cv_func_tgetent_zero_success = xyes; then
704   AC_DEFINE(TGETENT_SUCCESS, 0)
705 else
706   AC_DEFINE(TGETENT_SUCCESS, 1)
707 fi
708
709 dnl Now put the libraries back to what it was before we
710 dnl starting checking the termcap library.
711 LIBS="$nmh_save_LIBS"
712
713 dnl --------------
714 dnl CHECK TYPEDEFS
715 dnl --------------
716 AC_TYPE_PID_T
717 AC_TYPE_OFF_T
718 AC_TYPE_UID_T
719 AC_TYPE_MODE_T
720 AC_TYPE_SIZE_T
721
722 dnl ----------------
723 dnl CHECK STRUCTURES
724 dnl ----------------
725
726 dnl For platforms such as FreeBSD that have tm_gmtoff in struct tm.
727 dnl (FreeBSD has a timezone() function but not a timezone global
728 dnl variable that is visible).
729 AC_CHECK_MEMBERS([struct tm.tm_gmtoff],,,[#include <time.h>])
730
731 AC_STRUCT_DIRENT_D_TYPE
732
733 dnl Where is <signal.h> located?  Needed as input for signames.awk
734 AC_CACHE_CHECK(where signal.h is located, nmh_cv_path_signal_h,
735 [for SIGNAL_H in /usr/include/bsd/sys/signal.h  dnl Next
736                  /usr/include/asm/signal.h      dnl Linux 1.3.0 and above
737                  /usr/include/asm/signum.h      dnl some versions of Linux/Alpha
738                  /usr/include/linux/signal.h    dnl Linux up to 1.2.11
739                  /usr/include/sys/signal.h      dnl Almost everybody else
740                  /dev/null;                     dnl Just in case we fall through
741 do
742   test -f $SIGNAL_H && \
743   grep '#[      ]*define[       ][      ]*SIG[0-9A-Z]*[         ]*[0-9][0-9]*' $SIGNAL_H > /dev/null && \
744   break
745 done
746 nmh_cv_path_signal_h=$SIGNAL_H
747 ])
748 SIGNAL_H=$nmh_cv_path_signal_h
749 AC_SUBST(SIGNAL_H)dnl
750
751 dnl These odd looking assignments are done to expand out unexpanded
752 dnl variables in bindir et al (for instance mandir is '${datarootdir}/man',
753 dnl but expanding that gives '${prefix}/share/man', so we need to expand
754 dnl again to get the final answer.
755 dnl We only use the expanded versions to print the install paths in
756 dnl the final summary and should use them nowhere else (see the autoconf
757 dnl docs for the rationale for bindir etc being unexpanded).
758 eval "nmhbin=${bindir}";         eval "nmhbin=${nmhbin}"
759 eval "nmhsysconf=${sysconfdir}"; eval "nmhsysconf=${nmhsysconf}"
760 eval "nmhlib=${libdir}";         eval "nmhlib=${nmhlib}"
761 eval "nmhman=${mandir}";         eval "nmhman=${nmhman}"
762 eval "nmhrpm=${nmhrpm}";
763
764 pop_kinds=no
765 if test x"$enable_pop" = x"yes"; then
766   pop_kinds="yes (POP3)"
767 fi
768
769 dnl
770 dnl Sigh, this is required because under the new world order autoconf has
771 dnl nothing to create in a few of the build directories when doing an object
772 dnl tree build.  So make sure we created certain directories if they don't
773 dnl exist.
774 dnl
775
776 AC_CONFIG_COMMANDS([build-directories],
777 [test -d etc || ${MKDIR_P} etc
778 test -d man || ${MKDIR_P} man])
779
780 AC_CONFIG_COMMANDS_POST([
781 echo "
782 nmh configuration
783 -----------------
784 nmh version                : AC_PACKAGE_VERSION
785 host os                    : ${host}
786 compiler                   : ${CC}
787 compiler flags             : ${CFLAGS}
788 linker flags               : ${LDFLAGS}
789 definitions                : ${OURDEFS}
790 source code location       : ${srcdir}
791 binary install path        : ${nmhbin}
792 library install path       : ${nmhlib}
793 config files install path  : ${nmhsysconf}
794 man page install path      : ${nmhman}
795 RPM build root             : ${nmhrpm}
796 backup prefix              : ${backup_prefix}
797 transport system           : ${MTS}
798 file locking type          : ${LOCKTYPE}
799 default smtp servers       : ${smtpservers}
800 default editor             : ${editorpath}
801 default pager              : ${pagerpath}
802 email address masquerading : ${masquerade}
803 pop is enabled             : ${pop_kinds}
804 SASL support               : ${sasl_support}
805 TLS support                : ${tls_support}"
806 echo ""])
807
808 dnl ---------------
809 dnl OUTPUT MAKEFILE
810 dnl ---------------
811 AC_CONFIG_FILES([Makefile])
812 AC_OUTPUT