6fc7f1e4eef50708dcc9462f15fff923ed1f642c
[mmh] / configure.in
1 dnl
2 dnl configure.in -- autoconf template for nmh
3 dnl
4
5 dnl Move this up a bit
6 AC_PREREQ(2.61)
7
8 AC_INIT(mmh, m4_normalize(m4_include([VERSION])))
9 AC_CONFIG_SRCDIR(h/nmh.h)
10 AC_CONFIG_HEADER(config.h)
11
12 AC_CANONICAL_TARGET
13
14 dnl ---------------------
15 dnl define a macro or two
16 dnl ---------------------
17
18 AC_DEFUN(NMH_PROG_GNU_LIBTOOL, [
19 if test -n "$LIBTOOL" ; then
20   tmptest=`$LIBTOOL --version 2>&1 | grep GNU`
21   if test x"$tmptest" != x  ; then
22     GNU_LIBTOOL=1
23     AC_SUBST(GNU_LIBTOOL)dnl
24   fi
25 fi
26 ] )
27   
28 echo "configuring for AC_PACKAGE_NAME-AC_PACKAGE_VERSION"
29 AC_SUBST(VERSION,AC_PACKAGE_VERSION)dnl
30
31 dnl What date of nmh are we building?
32 DATE=`cat ${srcdir}/DATE`
33 echo "configuring for nmh dated $DATE"
34 AC_SUBST(DATE)dnl
35
36 dnl --------------------------
37 dnl CHECK COMMAND LINE OPTIONS
38 dnl --------------------------
39
40 dnl Do you want to debug nmh?
41 AC_ARG_ENABLE(debug,
42   AS_HELP_STRING([--enable-debug],[enable nmh code debugging]))
43 dnl The old redundant --enable-nmh-debug is deprecated and undocumented.
44 if test x"$enable_nmh_debug" = x"yes"; then
45   enable_debug=yes
46 fi
47
48 dnl Allow users to send email from addresses other than their default?
49 AC_ARG_ENABLE(masquerade,
50   AS_HELP_STRING([--enable-masquerade='draft_from mmailid username_extension'],
51     [enable up to 3 types of address masquerading]),
52   [if test x"$enable_masquerade" = x"yes"; then
53     masquerade="draft_from mmailid username_extension"
54   else
55     masquerade="$enable_masquerade"
56   fi], [masquerade="draft_from mmailid username_extension"])
57 AC_SUBST(masquerade)dnl
58
59 dnl Do you want mhe support?
60 AC_ARG_ENABLE(mhe,
61   AS_HELP_STRING([--disable-mhe],[disable mhe support]))
62
63 dnl mhe support is on by default, so define it unless --disable-mhe or the
64 dnl deprecated, undocumented --disable-nmh-mhe are specified.
65 if test x"$enable_mhe" != x"no" -a x"$enable_nmh_mhe" != x"no"; then
66   AC_DEFINE(MHE, 1,
67     [Define to compile in support for the Emacs front-end mh-e.])dnl
68 fi
69
70 dnl Do you want to disable use of locale functions
71 AH_TEMPLATE([LOCALE],
72 [Undefine if you don't want locale features.  By default this is defined.])
73 AC_ARG_ENABLE([locale],
74 AC_HELP_STRING([--disable-locale], [turn off locale features]),
75 [if test x$enableval = xyes; then
76   AC_DEFINE(LOCALE)
77 fi],
78 AC_DEFINE(LOCALE)
79 )
80
81 dnl Do you want client-side support for using SASL for authentication?
82 dnl Note that this code will be enabled for SMTP
83 AC_ARG_WITH(cyrus-sasl, AS_HELP_STRING([--with-cyrus-sasl],
84   [Enable SASL support via the Cyrus SASL library]))
85 if test x"$with_cyrus_sasl" != x -a x"$with_cyrus_sasl" != x"no"; then
86   AC_DEFINE(CYRUS_SASL, 1,
87     [Define to use the Cyrus SASL library for authentication of SMTP.])dnl
88   if test x"$with_cyrus_sasl" != xyes; then
89     AC_MSG_WARN([Arguments to --with-cyrus-sasl now ignored])
90     AC_MSG_WARN([Please pass the appropriate arguments to CPPFLAGS/LDFLAGS])
91   fi
92   sasl_support=yes
93 else
94   sasl_support=no
95 fi
96
97 dnl Do you want client-side support for encryption with TLS?
98 AC_ARG_WITH(tls, AS_HELP_STRING([--with-tls], [Enable TLS support]))
99 if test x"$with_tls" != x -a x"$with_tls" != x"no"; then
100   AC_DEFINE(TLS_SUPPORT, 1, [Support TLS for session encryption.])dnl
101   tls_support=yes
102 else
103   tls_support=no
104 fi
105
106 dnl What should be the default editor?
107 AC_ARG_WITH(editor,
108   AS_HELP_STRING([--with-editor=EDITOR],[specify the default editor]))
109
110 if test -n "$with_editor"; then
111   editorpath="$with_editor"
112 fi
113
114 dnl Set the backup prefix
115 AC_ARG_WITH([hash-backup],
116   AS_HELP_STRING([--with-hash-backup],[use # as the backup prefix (default: ,)]))
117 if test x"$with_hash_backup" != x -a x"$with_hash_backup" != x"no"; then
118   backup_prefix="#"
119 else
120   backup_prefix=","
121 fi
122 AC_DEFINE_UNQUOTED(BACKUP_PREFIX, "$backup_prefix",
123     [The prefix that is prepended to the name of message files when they are "removed" by rmm. This should typically be `,' or `#'.])dnl
124
125 dnl What method of locking to use?
126 AC_ARG_WITH(locking,
127   AS_HELP_STRING([--with-locking=@<:@dot|fcntl|flock|lockf@:>@],
128   [specify the file locking method]))
129
130 if test x"$with_locking" = x"dot"; then
131   LOCKTYPE="dot"
132   AC_DEFINE(DOT_LOCKING, 1, [Define to use dot based file locking.])dnl
133 elif test x"$with_locking" = x"flock"; then
134   LOCKTYPE="flock"
135   AC_DEFINE(FLOCK_LOCKING, 1, [Define to use flock() based locking.])dnl
136 elif test x"$with_locking" = x"lockf"; then
137   LOCKTYPE="lockf"
138   AC_DEFINE(LOCKF_LOCKING, 1, [Define to use lockf() based locking.])dnl
139 elif test x"$with_locking" = x"fcntl"; then
140   LOCKTYPE="fcntl"
141   AC_DEFINE(FCNTL_LOCKING, 1, [Define to use fnctl() based locking.])dnl
142 else
143   LOCKTYPE="dot"
144   AC_DEFINE(DOT_LOCKING)dnl
145 fi
146
147 dnl What method of posting should post use?
148 dnl We'll always use sendmail now. (mmh)
149 MTS="sendmail"
150 dnl #AC_SUBST(MTS)dnl
151
152 dnl Both the smtp and sendmail mail transport services use the smtp code
153 AC_DEFINE(SMTPMTS, 1,
154   [Define if you want SMTP (simple mail transport protocol) support.])dnl
155
156 dnl What should be the default pager?
157 AC_ARG_WITH(pager,
158   AS_HELP_STRING([--with-pager=PAGER],[specify the default pager]))
159
160 if test -n "$with_pager"; then
161   pagerpath="$with_pager"
162 fi
163
164 dnl What should be the default mail server(s)?
165 AC_ARG_WITH(smtpservers,
166   AS_HELP_STRING([--with-smtpservers='SMTPSERVER1@<:@ SMTPSERVER2...@:>@'],
167   [specify the default SMTP server(s) @<:@localhost@:>@]))
168 if test -n "$with_smtpservers"; then
169   smtpservers="$with_smtpservers"
170 else
171   smtpservers="localhost"
172 fi
173 AC_SUBST(smtpservers)dnl
174
175 dnl ----------------------------------------------------
176 dnl Default location is /usr/local/mmh/{bin,etc,lib,share/man}
177 dnl ----------------------------------------------------
178 AC_PREFIX_DEFAULT(/usr/local/mmh)
179
180
181 dnl ------------------
182 dnl CHECK THE COMPILER
183 dnl ------------------
184 dnl We want these before the checks,
185 dnl so the checks can modify their values.
186 test -z "$CFLAGS" && CFLAGS= auto_cflags=1
187 if test x"$enable_debug" = x"yes"; then
188   test -z "$LDFLAGS" && LDFLAGS=-g
189 fi
190
191 AC_PROG_CC
192
193 AC_CACHE_CHECK(whether compiler supports -Wno-pointer-sign, nmh_cv_has_noptrsign,
194 [nmh_saved_cflags="$CFLAGS"
195  CFLAGS="$CFLAGS -Wno-pointer-sign"
196  AC_TRY_COMPILE([],[],nmh_cv_has_noptrsign=yes,nmh_cv_has_noptrsign=no)
197  CFLAGS="$nmh_saved_cflags"])
198
199 dnl if the user hasn't specified CFLAGS, then
200 dnl   if compiler is gcc, then
201 dnl     use -O2 and some warning flags
202 dnl   else use -O
203 dnl We use -Wall; if the compiler supports it we also use -Wno-pointer-sign,
204 dnl because gcc 4 now produces a lot of new warnings which are probably mostly
205 dnl spurious and which in any case we don't want to deal with now.
206 if test "$nmh_cv_has_noptrsign" = "yes"; then
207         nmh_gcc_warnflags="-Wall -Wno-pointer-sign"
208 else
209         nmh_gcc_warnflags="-Wall"
210 fi
211
212 if test -n "$auto_cflags"; then
213   if test x"$enable_debug" = x"yes"; then
214     if test -n "$GCC"; then
215       test -z "$CFLAGS" && CFLAGS="$nmh_gcc_warnflags -g" || CFLAGS="$CFLAGS $nmh_gcc_warnflags -g"
216     else
217       test -z "$CFLAGS" && CFLAGS=-g || CFLAGS="$CFLAGS -g"
218     fi
219   else
220     if test -z "$LDFLAGS"; then
221       case "$build_os" in
222         darwin*)
223           LDFLAGS=
224           ;;
225         *)
226           LDFLAGS=-s
227           ;;
228       esac
229     fi
230     if test -n "$GCC"; then
231       test -z "$CFLAGS" && CFLAGS="$nmh_gcc_warnflags -O2" || CFLAGS="$CFLAGS $nmh_gcc_warnflags -O2"
232     else
233       test -z "$CFLAGS" && CFLAGS=-O  || CFLAGS="$CFLAGS -O"
234     fi
235   fi
236 fi
237
238 AC_C_CONST              dnl Does compiler support `const'.
239
240 dnl ------------------
241 dnl CHECK FOR PROGRAMS
242 dnl ------------------
243 AC_PROG_MAKE_SET        dnl Does make define $MAKE
244 AC_PROG_INSTALL         dnl Check for BSD compatible `install'
245 AC_PROG_RANLIB          dnl Check for `ranlib'
246 AC_PROG_AWK             dnl Check for mawk,gawk,nawk, then awk
247 AC_PROG_LEX             dnl Check for lex/flex
248
249 dnl Look for `cut'
250 pathtmp=/usr/bin:/bin:/usr/local/bin:/usr/xpg4/bin:/usr/ucb
251 AC_PATH_PROG(cutpath, cut, no, [$pathtmp])
252
253 dnl ----------------------------------------------
254 dnl check for lclint, and lint if it doesn't exist
255 dnl ----------------------------------------------
256 AC_CHECK_PROG(linttmp1, lclint, lclint, no)dnl
257 if test x$ac_cv_prog_linttmp1 != xno ; then
258   LINT=$ac_cv_prog_linttmp1
259   LINTFLAGS="-weak +posixlib -macrovarprefixexclude"
260 else
261   AC_CHECK_PROG(linttmp2, lint, lint, no)dnl
262   if test x$ac_cv_prog_linttmp2 != xno ; then
263     LINT=$ac_cv_prog_linttmp2
264     LINTFLAGS=""
265   else
266     LINT="echo 'No lint program found'"
267     LINTFLAGS=""
268   fi
269 fi
270 AC_SUBST(LINT)dnl
271 AC_SUBST(LINTFLAGS)dnl
272
273 dnl try to figure out which one we've got
274 AC_CHECK_PROG(LIBTOOL, libtool, libtool, , [$pathtmp])
275 NMH_PROG_GNU_LIBTOOL
276
277 dnl Check for lorder and tsort commands
278 AC_CHECK_PROG(LORDER, lorder, lorder, no)dnl
279 AC_CHECK_PROG(TSORT, tsort, tsort, no)dnl
280
281 dnl If either doesn't exist, replace them with echo and cat
282 if test x$ac_cv_prog_LORDER != xlorder -o x$ac_cv_prog_TSORT != xtsort; then
283   LORDER=echo
284   TSORT=cat
285   AC_SUBST(LORDER)dnl
286   AC_SUBST(TSORT)dnl
287 dnl Mac OS X has lorder, but sh is too broken for it to work
288 dnl elif test -z "`lorder config/config.c 2>&1 | grep config/config.c`" ; then
289 dnl   LORDER=echo
290 dnl   TSORT=cat
291 dnl   AC_SUBST(LORDER)dnl
292 dnl   AC_SUBST(TSORT)dnl
293 fi
294
295 dnl Check whether tsort can deal with loops
296 AC_CACHE_CHECK(whether tsort can deal with loops, nmh_cv_tsort_loop,
297   [if test -z "`echo a b b a | tsort 2>/dev/null | grep a`" ; then
298     nmh_cv_tsort_loop=no
299   else
300     nmh_cv_tsort_loop=yes
301   fi])
302 if test x$nmh_cv_tsort_loop = xno ; then
303   LORDER=echo
304   TSORT=cat
305   AC_SUBST(LORDER)dnl
306   AC_SUBST(TSORT)dnl
307 fi
308
309 dnl Look for `ls'
310 pathtmp=/usr/bin:/bin:/usr/local/bin:/usr/xpg4/bin:/usr/ucb
311 AC_PATH_PROG(lspath, ls, no, [$pathtmp])
312
313 dnl See how we get ls to display the owner and the group
314 if test "$lspath" != "no"; then
315   AC_CACHE_CHECK(how to get ls to show us the group ownership of a file, 
316                  nmh_cv_ls_grpopt,
317   [if test x"`$lspath -dl / | $AWK '{print $9}'`" = x"/"; then
318     dnl There were 9 parameters, so unless this is a really bizarre, nonstandard
319     dnl ls, it would seem -l gave us both the user and group.  On this type of
320     dnl ls, -g makes _only_ the group be displayed (and not the user).
321     nmh_cv_ls_grpopt="-l"
322   else
323     dnl Looks like -l only gave us the user, so we need -g to get the group too.
324     nmh_cv_ls_grpopt="-lg"
325   fi])
326 fi
327
328 dnl Look for `more'
329 pathtmp=/usr/bin:/bin:/usr/ucb:/usr/local/bin
330 AC_PATH_PROG(morepath, more, no, [$pathtmp])
331
332 dnl If pager is not specified yet,
333 dnl then use `more' as the default.
334 if test -z "$pagerpath"; then
335   pagerpath="$morepath"
336 fi
337 AC_SUBST(pagerpath)dnl
338
339 dnl Look for `sendmail'
340 pathtmp=/usr/lib:/usr/sbin:/usr/etc:/usr/ucblib:/usr/bin:/bin
341 AC_PATH_PROG(sendmailpath, sendmail, /usr/sbin/sendmail, [$pathtmp])
342
343 dnl Look for `vi'
344 pathtmp=/usr/bin:/bin:/usr/ucb:/usr/local/bin
345 AC_PATH_PROG(vipath, vi, /bin/vi, [$pathtmp])
346
347 dnl If editor is not specified yet,
348 dnl then use `vi' as the default.
349 if test -z "$editorpath"; then
350   editorpath="$vipath"
351 fi
352 AC_SUBST(editorpath)dnl
353
354 dnl ----------------------------------------------------------
355 dnl FIND MAIL SPOOL AND SEE IF WE NEED TO MAKE inc SETGID MAIL
356 dnl ----------------------------------------------------------
357 AC_CACHE_CHECK(where mail spool is located, nmh_cv_mailspool,
358 [for mailspool in /var/mail        dnl
359                   /var/spool/mail  dnl
360                   /usr/spool/mail  dnl
361                   /dev/null;       dnl Just in case we fall through
362 do
363   test -d $mailspool && break
364 done
365 nmh_cv_mailspool=$mailspool
366 ])
367 mailspool=$nmh_cv_mailspool
368 AC_SUBST(mailspool)dnl
369
370 dnl See whether the mail spool directory is world-writable.
371 if test "$lspath" != "no" -a "$cutpath" != "no"; then
372   AC_CACHE_CHECK(whether the mail spool is world-writable, 
373                  nmh_cv_mailspool_world_writable,
374   [if test "`$lspath -dlL $mailspool | $cutpath -c9`" = "-"; then
375     nmh_cv_mailspool_world_writable=no
376   else
377     nmh_cv_mailspool_world_writable=yes
378   fi])
379 fi
380
381 dnl Also, check for liblockfile (as found on Debian systems)
382 AC_CHECK_HEADER(lockfile.h, AC_CHECK_LIB(lockfile, lockfile_create) )
383
384 dnl and whether its companion program dotlockfile is setgid
385 AC_PATH_PROG(dotlockfilepath, dotlockfile, no)
386 if test "$ac_cv_lib_lockfile_lockfile_create" != "no" ; then
387   if test "$ac_cv_path_dotlockfilepath" != "no" ; then
388     AC_CACHE_CHECK(whether dotlockfile is setgid, nmh_cv_dotlockfile_setgid,
389     [ if test -g "$ac_cv_path_dotlockfilepath" ; then
390         nmh_cv_dotlockfile_setgid=yes
391       else
392         nmh_cv_dotlockfile_setgid=no
393       fi])
394   fi
395 fi
396
397 dnl If mailspool is not world-writable and dotlockfile is not setgid,
398 dnl we need to #define MAILGROUP to 1 and make inc setgid.
399 if test x"$LOCKTYPE" = x"dot" -a x"$nmh_cv_mailspool_world_writable" = x"no" -a x"$nmh_cv_dotlockfile_setgid" != x"yes" ; then
400   dnl do we really need both of these?
401   AC_DEFINE(MAILGROUP,1,
402     [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
403   SETGID_MAIL=1
404 fi
405 AC_SUBST(SETGID_MAIL)dnl
406
407 dnl Use ls to see which group owns the mail spool directory.
408 AC_CACHE_CHECK(what group owns the mail spool, nmh_cv_ls_mail_grp,
409 [nmh_cv_ls_mail_grp=`$lspath -dL $nmh_cv_ls_grpopt $mailspool|$AWK '{print $4}'`
410 ])
411 MAIL_SPOOL_GRP=$nmh_cv_ls_mail_grp
412 AC_SUBST(MAIL_SPOOL_GRP)dnl
413
414 dnl ------------------
415 dnl CHECK HEADER FILES
416 dnl ------------------
417
418 dnl On glibc we need to define at least the '_XOPEN_SOURCE' level of features,
419 dnl or wchar.h doesn't declare a prototype for wcwidth(). But if we only define
420 dnl that level then db.h won't compile. So we define _GNU_SOURCE which turns
421 dnl on everything. Perhaps other OSes need some feature switch set to get wcwidth()
422 dnl declared; if so they should have an entry added to this case statement.
423 dnl NB that we must define this on the compiler command line, not in config.h,
424 dnl because it must be set before any system header is included and there's no
425 dnl portable way to make sure that files generated by lex include config.h
426 dnl before system header files.
427
428 case "$target_os" in
429   linux*)
430     # Like DEFS, but doesn't get stomped on by configure when using config.h:
431     OURDEFS="$OURDEFS -D_GNU_SOURCE"
432     ;;
433 esac
434 AC_SUBST(OURDEFS)
435
436 AC_HEADER_DIRENT
437 AC_HEADER_STDC
438 AC_HEADER_TIME
439 AC_HEADER_SYS_WAIT
440 AC_HEADER_STAT
441 AC_HEADER_TIOCGWINSZ
442 AC_CHECK_HEADERS(string.h memory.h stdlib.h unistd.h errno.h fcntl.h \
443                  limits.h crypt.h termcap.h termio.h termios.h locale.h \
444                  langinfo.h wchar.h wctype.h iconv.h netdb.h \
445                  sys/param.h sys/time.h sys/utsname.h sys/stream.h \
446                  arpa/inet.h arpa/ftp.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_FUNC_VFORK
468 AC_CHECK_LIB(mkstemp,mkstemp)
469 AC_CHECK_FUNCS(waitpid wait3 sigaction sigprocmask sigblock sigsetmask \
470                sighold sigrelse writev lstat uname tzset killpg mkstemp \
471                getutent nl_langinfo mbtowc wcwidth)
472
473 dnl sigsetjmp may be a macro
474 AC_MSG_CHECKING(for sigsetjmp)
475 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <setjmp.h>]],
476   [[sigsetjmp((void *)0, 0);]])],[AC_DEFINE(HAVE_SIGSETJMP, 1,
477     [Define to 1 if you have the `sigsetjmp'.]) AC_MSG_RESULT(yes)],
478   [AC_MSG_RESULT(no)])
479
480 AC_REPLACE_FUNCS(memmove snprintf strerror strdup)
481
482 dnl Look for the initgroups() declaration.  On AIX 4.[13], Solaris 4.1.3, and
483 dnl ULTRIX 4.2A the function is defined in libc but there's no declaration in
484 dnl any system header.  
485 dnl
486 dnl On Solaris 2.[456], the declaration is in <grp.h>.  On HP-UX 9-11 and
487 dnl (reportedly) FreeBSD 3.[23], it's in <unistd.h>.  Any other locations we
488 dnl need to check?
489 AH_TEMPLATE(INITGROUPS_HEADER, [Define to the header containing the declaration of `initgroups'.])
490 AC_EGREP_HEADER(initgroups, grp.h, AC_DEFINE(INITGROUPS_HEADER, <grp.h>),
491                 AC_EGREP_HEADER(initgroups, unistd.h, 
492                                 AC_DEFINE(INITGROUPS_HEADER, <unistd.h>)))
493
494 dnl On AIX 4.1, snprintf() is defined in libc.a but there's no prototype in
495 dnl <stdio.h> or elsewhere.  Apparently it's not officially supported (though it
496 dnl seems to work perfectly and IBM apparently uses it in internal code).
497 dnl Anyhow, if we omit our own snprintf() and vsnprintf() prototypes when we
498 dnl HAVE_SNPRINTF, we get a billion warnings at compile time.  Use the C
499 dnl preprocessor to preprocess stdio.h and make sure that there's actually a 
500 dnl prototype. 
501 AC_EGREP_HEADER(snprintf, stdio.h, AC_DEFINE(HAVE_SNPRINTF_PROTOTYPE,1,
502   [Define to 1 if <stdio.h> has a prototype for snprintf().]))
503
504 dnl Check for multibyte character set support
505 if test "x$ac_cv_header_wchar_h" = "xyes" -a "x$ac_cv_header_wctype_h" = "xyes" \
506     -a "x$ac_cv_func_wcwidth" = "xyes" -a "x$ac_cv_func_mbtowc" = "xyes"; then
507   AC_DEFINE(MULTIBYTE_SUPPORT, 1,
508     [Define to enable support for multibyte character sets.])
509 fi
510
511 dnl -------------------
512 dnl CHECK FOR LIBRARIES
513 dnl -------------------
514 dnl Check location of modf
515 AC_CHECK_FUNC(modf, , AC_CHECK_LIB(m, modf))
516
517 dnl Checks for network libraries (nsl, socket)
518 AC_CHECK_NETLIBS
519
520 termcap_curses_order="termcap curses ncurses"
521 for lib in $termcap_curses_order; do
522   AC_CHECK_LIB(${lib}, tgetent, [TERMLIB="-l$lib"; break])
523 done
524 AC_SUBST(TERMLIB)dnl
525
526 dnl ---------------
527 dnl CHECK FOR ICONV
528 dnl ---------------
529
530 dnl Find iconv. It may be in libiconv and may be iconv() or libiconv()
531 if test "x$ac_cv_header_iconv_h" = "xyes"; then
532   AC_CHECK_FUNC(iconv, ac_found_iconv=yes, ac_found_iconv=no)
533   if test "x$ac_found_iconv" = "xno"; then
534     AC_CHECK_LIB(iconv, iconv, ac_found_iconv=yes)
535     if test "x$ac_found_iconv" = "xno"; then
536       AC_CHECK_LIB(iconv, libiconv, ac_found_iconv=yes)
537     fi
538     if test "x$ac_found_iconv" != "xno"; then
539       LIBS="-liconv $LIBS"
540     fi
541   else
542     dnl Handle case where there is a native iconv but iconv.h is from libiconv
543     AC_CHECK_DECL(_libiconv_version,
544       [ AC_CHECK_LIB(iconv, libiconv, LIBS="-liconv $LIBS") ],,
545       [ #include <iconv.h> ])
546   fi
547 fi
548 if test "x$ac_found_iconv" = xyes; then
549   AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.])
550 fi
551
552 dnl Check if iconv uses const in prototype declaration
553 if test "x$ac_found_iconv" = "xyes"; then
554   AC_CACHE_CHECK(for iconv declaration, ac_cv_iconv_const,
555     [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdlib.h>
556         #include <iconv.h>]],
557         [[#ifdef __cplusplus
558           "C"
559           #endif
560           #if defined(__STDC__) || defined(__cplusplus)
561           size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
562           #else
563           size_t iconv();
564           #endif]])],
565       [ac_cv_iconv_const=],
566       [ac_cv_iconv_const=const])])
567   AC_DEFINE_UNQUOTED([ICONV_CONST], $ac_cv_iconv_const,
568     [Define as const if the declaration of iconv() needs const.])
569 fi
570
571 dnl --------------
572 dnl CHECK FOR NDBM
573 dnl --------------
574
575 AC_ARG_WITH([ndbm],AS_HELP_STRING([--with-ndbm=ARG],[use -lARG to link with ndbm]),
576             [nmh_ndbm=$withval],[nmh_ndbm=autodetect])
577 AC_ARG_WITH([ndbmheader],AS_HELP_STRING([--with-ndbmheader=ARG],[#include <ARG> to use ndbm]),
578             [nmh_ndbmheader=$withval],[nmh_ndbmheader=autodetect])
579
580 if test "$nmh_ndbm" = "autodetect"; then
581   if test "$nmh_ndbmheader" != "autodetect"; then
582     AC_MSG_ERROR([must specify both --with-ndbm and --with-ndbmheader or neither])
583   else
584
585     dnl There are at least four implementations of ndbm, and
586     dnl several of those can be in different places at the whim
587     dnl of the system integrator. A good summary of this mess
588     dnl can be found at http://www.unixpapa.com/incnote/dbm.html
589
590     dnl Classic ndbm with no library required (eg NetBSD): try this
591     dnl first so we don't accidentally link in a pointless but harmless
592     dnl library in one of the later ndbm.h+libfoo tests:
593     NMH_CHECK_NDBM(ndbm.h,,,
594     dnl Berkeley DBv2 emulating ndbm: header in db.h:
595       NMH_CHECK_NDBM(db.h,db,,
596     dnl Berkeley DBv1 emulating ndbm:
597         NMH_CHECK_NDBM(ndbm.h,db,,
598           NMH_CHECK_NDBM(ndbm.h,db1,,
599     dnl Classic ndbm:
600             NMH_CHECK_NDBM(ndbm.h,ndbm,,
601     dnl glibc2.1 systems put db1 in a subdir:
602               NMH_CHECK_NDBM(db1/ndbm.h,db1,,
603     dnl GNU gdbm emulating ndbm, with header possibly in gdbm/
604     dnl and possibly needing gbdm_compat library:
605                 NMH_CHECK_NDBM(gdbm/ndbm.h,gdbm,,
606                   NMH_CHECK_NDBM(gdbm/ndbm.h,gdbm_compat -lgdbm,,
607                     NMH_CHECK_NDBM(ndbm.h,gdbm,,
608                       NMH_CHECK_NDBM(ndbm.h,gdbm_compat -lgdbm))))))))))
609
610   fi
611 else
612   dnl We don't really need to check that the user-specified values work,
613   dnl but it is a convenience to the user to bomb out early rather than
614   dnl after configure and half the compile process.
615   NMH_CHECK_NDBM([$nmh_ndbmheader],[$nmh_ndbm])
616 fi
617
618 if test "$nmh_ndbm_found" = "no"; then
619   AC_MSG_ERROR([could not find a working ndbm library/header combination])
620 else
621   dnl Now export the lib/header to our makefile/config.h:
622   if test x"$nmh_ndbmheader" != x; then
623     AC_DEFINE_UNQUOTED(NDBM_HEADER, <$nmh_ndbmheader>,
624       [Define to the header containing the ndbm API prototypes.])
625   fi
626   if test x"$nmh_ndbm" != x; then
627     NDBM_LIBS="-l$nmh_ndbm"
628   else
629     NDBM_LIBS=
630   fi
631   AC_SUBST(NDBM_LIBS)
632 fi
633
634
635 dnl --------------------
636 dnl CHECK FOR CYRUS-SASL
637 dnl --------------------
638
639 AS_IF([test x"$sasl_support" = x"yes"],[
640   AC_CHECK_HEADER([sasl/sasl.h], , [AC_MSG_ERROR([sasl.h not found])])
641   AC_CHECK_LIB([sasl2], [sasl_client_new], ,
642     [AC_MSG_ERROR([Cyrus SASL library not found])])])
643
644 dnl -----------------
645 dnl CHECK FOR OPENSSL
646 dnl -----------------
647
648 AS_IF([test x"$tls_support" = x"yes"],[
649   AC_CHECK_HEADER([openssl/ssl.h], , [AC_MSG_ERROR([openssl/ssl.h not found])])
650   AC_CHECK_LIB([crypto], [BIO_write], ,
651     [AC_MSG_ERROR([OpenSSL crypto library not found])])
652   AC_CHECK_LIB([ssl], [SSL_library_init], ,
653     [AC_MSG_ERROR([OpenSSL library not found])])])
654
655 dnl ---------------------
656 dnl CHECK TERMCAP LIBRARY
657 dnl ---------------------
658
659 dnl Add the termcap library, so that the following configure
660 dnl tests will find it when it tries to link test programs.
661 nmh_save_LIBS="$LIBS"
662 LIBS="$TERMLIB $LIBS"
663
664 dnl Checks for external variable ospeed in the termcap library.
665 AC_CACHE_CHECK(if an include file defines ospeed,
666 nmh_cv_decl_ospeed_include_defines,
667 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
668 #if HAVE_TERMIOS_H
669 #include <termios.h>
670 #endif
671 #if HAVE_TERMCAP_H
672 #include <termcap.h>
673 #endif]], [[ospeed = 0;]])],
674 nmh_cv_decl_ospeed_include_defines=yes,nmh_cv_decl_ospeed_include_defines=no)])
675  
676 if test $nmh_cv_decl_ospeed_include_defines = no; then
677   AC_CACHE_CHECK(if you must define ospeed,
678   nmh_cv_decl_ospeed_must_define,
679   [AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
680   [[extern short ospeed; ospeed = 0;]])],
681   nmh_cv_decl_ospeed_must_define=yes,nmh_cv_decl_ospeed_must_define=no)])
682 fi
683  
684 AH_TEMPLATE(HAVE_OSPEED, [Define to 1 if your termcap library has the ospeed variable.])
685 if test $nmh_cv_decl_ospeed_include_defines = yes; then
686   AC_DEFINE(HAVE_OSPEED)dnl
687 elif test $nmh_cv_decl_ospeed_must_define = yes; then
688   AC_DEFINE(HAVE_OSPEED)
689   AC_DEFINE(MUST_DEFINE_OSPEED, 1,
690     [Define to 1 if you have ospeed, but it is not defined in termcap.h.])
691 fi
692
693 dnl Check if tgetent accepts NULL (and will allocate its own termcap buffer)
694 dnl Some termcaps reportedly accept a zero buffer, but then dump core
695 dnl in tgetstr().
696 dnl Under Cygwin test program crashes but exit code is still 0. So,
697 dnl we test for a file that porgram should create
698 AH_TEMPLATE([TGETENT_ACCEPTS_NULL],
699 [Define to 1 if tgetent() accepts NULL as a buffer.])
700 AC_CACHE_CHECK(if tgetent accepts NULL,
701 nmh_cv_func_tgetent_accepts_null,
702 [AC_TRY_RUN([
703 main()
704 {
705     char buf[4096];
706     int r1 = tgetent(buf, "vt100");
707     int r2 = tgetent((char*)0,"vt100");
708     if (r1 >= 0 && r1 == r2) {
709         char tbuf[1024], *u;
710         u = tbuf;
711         tgetstr("cl", &u);
712         creat("conftest.tgetent", 0640);
713     }
714     exit((r1 != r2) || r2 == -1);
715 }
716 ],
717   if test -f conftest.tgetent; then
718     nmh_cv_func_tgetent_accepts_null=yes
719   else
720     nmh_cv_func_tgetent_accepts_null=no
721   fi,
722   nmh_cv_func_tgetent_accepts_null=no,
723   nmh_cv_func_tgetent_accepts_null=no)])
724 if test x$nmh_cv_func_tgetent_accepts_null = xyes; then
725   AC_DEFINE(TGETENT_ACCEPTS_NULL)
726 fi
727 AC_CACHE_CHECK(if tgetent returns 0 on success,
728 nmh_cv_func_tgetent_zero_success,
729 [AC_TRY_RUN([
730 main()
731 {
732     char buf[4096];
733     int r1 = tgetent(buf, "!@#$%^&*");
734     int r2 = tgetent(buf, "vt100");
735     if (r1 < 0 && r2 == 0) {
736         char tbuf[1024], *u;
737         u = tbuf;
738         tgetstr("cl", &u);
739         creat("conftest.tgetent0", 0640);
740     }
741     exit(r1 == r2);
742 }
743 ],
744   if test -f conftest.tgetent0; then
745     nmh_cv_func_tgetent_zero_success=yes
746   else
747     nmh_cv_func_tgetent_zero_success=no
748   fi,
749   nmh_cv_func_tgetent_zero_success=no,
750   nmh_cv_func_tgetent_zero_success=no)])
751 AH_TEMPLATE([TGETENT_SUCCESS],
752 [Define to what tgetent() returns on success (0 on HP-UX X/Open curses).])
753 if test x$nmh_cv_func_tgetent_zero_success = xyes; then
754   AC_DEFINE(TGETENT_SUCCESS, 0)
755 else
756   AC_DEFINE(TGETENT_SUCCESS, 1)
757 fi
758
759 dnl Now put the libraries back to what it was before we
760 dnl starting checking the termcap library.
761 LIBS="$nmh_save_LIBS"
762
763 dnl --------------
764 dnl CHECK TYPEDEFS
765 dnl --------------
766 AC_TYPE_SIGNAL
767 AC_TYPE_PID_T
768 AC_TYPE_OFF_T
769 AC_TYPE_UID_T
770 AC_TYPE_MODE_T
771 AC_TYPE_SIZE_T
772
773 dnl Check for sigset_t.  Currently I'm looking in
774 dnl <sys/types.h> and <signal.h>.  Others might need
775 dnl to be added.
776 AC_CACHE_CHECK(for sigset_t, nmh_cv_type_sigset_t,
777 [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
778 #include <signal.h>]], [[sigset_t tempsigset;]])],
779 nmh_cv_type_sigset_t=yes,nmh_cv_type_sigset_t=no)])
780 if test $nmh_cv_type_sigset_t = no; then
781   AC_DEFINE(sigset_t, unsigned int,
782     [Define to `unsigned int' if <sys/types.h> or <signal.h> doesn't define.])
783 fi
784
785 dnl ----------------
786 dnl CHECK STRUCTURES
787 dnl ----------------
788 AC_CHECK_MEMBERS(struct stat.st_blksize)
789
790 AC_CHECK_MEMBERS(struct tm.tm_gmtoff,,,
791   [#ifdef TIME_WITH_SYS_TIME
792 # include <sys/time.h>
793 # include <time.h>
794 #else
795 # ifdef TM_IN_SYS_TIME
796 #  include <sys/time.h>
797 # else
798 #  include <time.h>
799 # endif
800 #endif])
801
802 AC_CHECK_MEMBERS(struct utmp.ut_type,,,[#include <utmp.h>])
803
804 AC_MSG_CHECKING(for union wait)
805 AC_CACHE_VAL(nmh_cv_union_wait, [dnl
806   AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
807 #include <sys/wait.h>]],
808     [[union wait status; int pid; pid = wait (&status);
809 #ifdef WEXITSTATUS
810 /* Some POSIXoid systems have both the new-style macros and the old
811    union wait type, and they do not work together.  If union wait
812    conflicts with WEXITSTATUS et al, we don't want to use it at all.  */
813         if (WEXITSTATUS (status) != 0) pid = -1;
814 #ifdef WTERMSIG
815         /* If we have WEXITSTATUS and WTERMSIG, just use them on ints.  */
816         -- blow chunks here --
817 #endif
818 #endif
819 #ifdef HAVE_WAITPID
820         /* Make sure union wait works with waitpid.  */
821         pid = waitpid (-1, &status, 0);
822 #endif
823       ]])],
824     [nmh_cv_union_wait=yes],
825     [nmh_cv_union_wait=no])])
826 if test "$nmh_cv_union_wait" = yes; then
827   AC_DEFINE(HAVE_UNION_WAIT, 1,
828     [Define to 1 if you have the \`union wait' type in <sys/wait.h>.])
829 fi
830 AC_MSG_RESULT($nmh_cv_union_wait)
831
832 CHECK_TYPE_STRUCT_DIRENT_D_TYPE()
833
834 dnl -------------
835 dnl CHECK SIGNALS
836 dnl -------------
837 dnl What style of signal do you have (POSIX, BSD, or SYSV)?
838 AH_TEMPLATE(RELIABLE_SIGNALS, [Define to 1 if you have reliable signals.])
839 AC_MSG_CHECKING(what style of signals to use)
840 if test $ac_cv_func_sigaction = yes -a $ac_cv_func_sigprocmask = yes; then
841   signals_style=POSIX_SIGNALS
842   AC_DEFINE(POSIX_SIGNALS, 1,
843     [Define to 1 if you use POSIX style signal handling.])
844   AC_DEFINE(RELIABLE_SIGNALS)
845 elif test $ac_cv_func_sigblock = yes -a $ac_cv_func_sigsetmask = yes; then
846   signals_style=BSD_SIGNALS
847   AC_DEFINE(BSD_SIGNALS,1,
848     [Define to 1 if you use BSD style signal handling (and can block signals).])
849   AC_DEFINE(RELIABLE_SIGNALS)
850 elif test $ac_cv_func_sighold = yes -a $ac_cv_func_sigrelse = yes; then
851   signals_style=SYSV_SIGNALS
852   AC_DEFINE(SYSV_SIGNALS,1,
853     [Define to 1 if you use SYSV style signal handling (and can block signals).])
854 else
855   signals_style=NO_SIGNAL_BLOCKING
856   AC_DEFINE(NO_SIGNAL_BLOCKING,1,
857     [Define to 1 if you have no signal blocking at all (bummer).])
858 fi
859
860 AC_MSG_RESULT($signals_style)
861
862 dnl Where is <signal.h> located?  Needed as input for signames.awk
863 AC_CACHE_CHECK(where signal.h is located, nmh_cv_path_signal_h,
864 [for SIGNAL_H in /usr/include/bsd/sys/signal.h  dnl Next
865                  /usr/include/asm/signal.h      dnl Linux 1.3.0 and above
866                  /usr/include/asm/signum.h      dnl some versions of Linux/Alpha
867                  /usr/include/linux/signal.h    dnl Linux up to 1.2.11
868                  /usr/include/sys/signal.h      dnl Almost everybody else
869                  /dev/null;                     dnl Just in case we fall through
870 do
871   test -f $SIGNAL_H && \
872   grep '#[      ]*define[       ][      ]*SIG[0-9A-Z]*[         ]*[0-9][0-9]*' $SIGNAL_H > /dev/null && \
873   break
874 done
875 nmh_cv_path_signal_h=$SIGNAL_H
876 ])
877 SIGNAL_H=$nmh_cv_path_signal_h
878 AC_SUBST(SIGNAL_H)dnl
879
880 dnl ----------------
881 dnl OS SPECIFIC DEFINES
882 dnl ----------------
883 AH_TEMPLATE(SYS5, [Defined for Solaris 2.x, Irix, OSF/1, HP-UX, AIX, SCO5; only used in vmh.c which is not built.])
884 AH_TEMPLATE(SVR4, [Defined for Solaris 2.x, Irix, OSF/1, HP-UX, AIX; only used in vmh.c which is not built.])
885 AH_TEMPLATE(BSD44, [Defined for SunOS 4, FreeBSD, NetBSD, OpenBSD, BSD/OS, Mac OS X/Rhapsody; only used in vmh.c which is not built.])
886 AH_TEMPLATE(BSD42, [Defined for SunOS 4, FreeBSD, NetBSD, OpenBSD, BSD/OS, Mac OS X/Rhapsody -- does PicoBSD have uname?])
887 AH_TEMPLATE(SCO_5_STDIO, [Defined for SCO5.])
888
889 case "$target_os" in
890
891   solaris2*)
892     AC_DEFINE(SYS5)
893     AC_DEFINE(SVR4)
894     ;;
895   irix*)
896     AC_DEFINE(SYS5)
897     AC_DEFINE(SVR4)
898     ;;
899   osf*)
900     AC_DEFINE(SYS5)
901     AC_DEFINE(SVR4)
902     ;;
903   aix*)
904     AC_DEFINE(SYS5)
905     AC_DEFINE(SVR4)
906     ;;
907   sunos4*)
908     AC_DEFINE(BSD42)
909     ;;
910   freebsd*)  
911     AC_DEFINE(BSD42)
912     AC_DEFINE(BSD44)
913     ;;
914   netbsd*)
915     AC_DEFINE(BSD42)
916     AC_DEFINE(BSD44)
917     ;;
918   openbsd*)
919     AC_DEFINE(BSD42)
920     AC_DEFINE(BSD44)
921     ;;
922   bsd/os*)
923     AC_DEFINE(BSD42)
924     AC_DEFINE(BSD44)
925     ;;
926   sco5*)
927     AC_DEFINE(SYS5)
928     AC_DEFINE(SCO_5_STDIO)
929     ;;
930 esac
931
932
933 dnl ----------------
934 dnl OUTPUT MAKEFILES
935 dnl ----------------
936 AC_CONFIG_FILES(Makefile config/Makefile h/Makefile sbr/Makefile uip/Makefile \
937                 mts/Makefile mts/smtp/Makefile \
938                 etc/Makefile docs/Makefile man/Makefile)
939 AC_CONFIG_COMMANDS([stamp],[test -z "$CONFIG_HEADERS" || echo > stamp-h])
940 AC_OUTPUT
941
942 dnl These odd looking assignments are done to expand out unexpanded
943 dnl variables in bindir et al (for instance mandir is '${datarootdir}/man',
944 dnl but expanding that gives '${prefix}/share/man', so we need to expand
945 dnl again to get the final answer.
946 dnl We only use the expanded versions to print the install paths in
947 dnl the final summary and should use them nowhere else (see the autoconf
948 dnl docs for the rationale for bindir etc being unexpanded).
949 eval "nmhbin=${bindir}";         eval "nmhbin=${nmhbin}"
950 eval "nmhsysconf=${sysconfdir}"; eval "nmhsysconf=${nmhsysconf}"
951 eval "nmhlib=${libdir}";         eval "nmhlib=${nmhlib}"
952 eval "nmhman=${mandir}";         eval "nmhman=${nmhman}"
953
954 echo "
955 nmh configuration
956 -----------------
957 nmh version                : AC_PACKAGE_VERSION
958 target os                  : ${target}
959 compiler                   : ${CC}
960 compiler flags             : ${CFLAGS}
961 linker flags               : ${LDFLAGS}
962 definitions                : ${OURDEFS}
963 source code location       : ${srcdir}
964 binary install path        : ${nmhbin}
965 library install path       : ${nmhlib}
966 config files install path  : ${nmhsysconf}
967 man page install path      : ${nmhman}
968 backup prefix              : ${backup_prefix}
969 transport system           : ${MTS}
970 file locking type          : ${LOCKTYPE}
971 default smtp servers       : ${smtpservers}
972 default editor             : ${editorpath}
973 default pager              : ${pagerpath}
974 email address masquerading : ${masquerade}
975 SASL support               : ${sasl_support}
976 TLS support                : ${tls_support}"
977 echo ""