* support autoconf 2.53
[citadel.git] / citadel / configure.ac
1 dnl Process this file with autoconf to produce a configure script.
2 dnl $Id$
3 AC_PREREQ(2.52)
4 AC_INIT([Citadel/UX], [5.91], [http://uncensored.citadel.org/])
5 AC_REVISION([$Revision$])
6 AC_CONFIG_SRCDIR([citserver.c])
7 AC_PREFIX_DEFAULT(/usr/local/citadel)
8 if test "$prefix" = NONE; then
9         AC_DEFINE_UNQUOTED(BBSDIR, "$ac_default_prefix")
10 else
11         AC_DEFINE_UNQUOTED(BBSDIR, "$prefix")
12 fi
13
14 AC_ARG_ENABLE(autologin, [  --disable-autologin     disable autologin (default is enabled if possible)])
15 AC_ARG_ENABLE(chkpwd, [  --disable-chkpwd        don't build 'chkpwd'])
16
17 AC_ARG_ENABLE(threaded-client, [  --disable-threaded-client
18                           disable multithreaded client])
19
20 AC_ARG_WITH(pam, [  --with-pam              use PAM if present (see PAM.txt before you try this)])
21 AC_ARG_WITH(kthread, [  --with-kthread          use kernel threads (on FreeBSD) (not recommended yet)])
22 AC_ARG_WITH(gdbm, [  --with-gdbm@<:@=DIR@:>@       use GDBM @<:@DIR=/usr/local@:>@])
23 AC_ARG_WITH(db, [  --with-db@<:@=DIR@:>@         use Sleepycat DB 3.x @<:@DIR=/usr/local/BerkeleyDB.3.@<:@123@:>@@:>@])
24 AC_ARG_WITH(ssl,
25         [  --with-ssl=PATH     Specify path to OpenSSL installation ],
26         [
27                 if test "x$withval" != "xno" ; then
28                         tryssldir=$withval
29                 fi
30         ]
31 )
32
33 if test "x$with_gdbm" != xno -a "x$with_gdbm" != xyes -a "$with_gdbm"; then
34         db_dir="$with_gdbm"
35         with_gdbm=yes
36 fi
37
38 if test "x$with_db" != xno -a "x$with_db" != xyes -a "$with_db"; then
39         db_dir="$with_db"
40         with_db=yes
41 else
42         test -f /usr/local/lib/libdb.a -o -f /usr/local/lib/libdb.so \
43           -o -f /usr/local/lib/libdb4.a -o -f /usr/local/lib/libdb4.so \
44           -o -f /usr/local/lib/libdb3.a -o -f /usr/local/lib/libdb3.so && db_dir=/usr/local
45
46         test -d /usr/local/BerkeleyDB.3.1 && db_dir=/usr/local/BerkeleyDB.3.1
47         test -d /usr/local/BerkeleyDB.3.2 && db_dir=/usr/local/BerkeleyDB.3.2
48         test -d /usr/local/BerkeleyDB.3.3 && db_dir=/usr/local/BerkeleyDB.3.3
49         test -d /usr/local/BerkeleyDB.4.0 && db_dir=/usr/local/BerkeleyDB.4.0
50 fi
51
52 if test "x$with_gdbm" = xyes -a "x$with_db" = xyes; then
53         AC_MSG_ERROR(can't enable both gdbm and db)
54 fi
55
56 dnl By default, we only build the client (citadel and whobbs) unless we can
57 dnl figure out how to build with POSIX threads.
58 TARGETS=client
59
60 AC_CANONICAL_HOST
61 PTHREAD_DEFS=-D_REENTRANT
62 case "$host" in
63         dnl BSDI 3.0 wants relocatable object modules instead of shared libs
64         dnl for dlopen(), and has a wrapper script to link with shared libs.
65         dnl Also has stupid non-reentrant gethostbyaddr() and friends.
66         *-*-bsdi[123]*)
67                 test -z "$CC" -a -x /usr/bin/shlicc2 && CC=shlicc2
68                 AC_DEFINE(HAVE_NONREENTRANT_NETDB)
69         ;;
70         *-*-bsdi*)
71                 AC_DEFINE(HAVE_NONREENTRANT_NETDB)
72         ;;
73         dnl Digital Unix has an odd way to build for pthreads, and we can't
74         dnl build pthreads programs with gcc due to header problems.
75         alpha*-dec-osf*)
76                 test -z "$CC" && CC=cc
77                 LIBS="-lpthread -lexc $LIBS"
78                 check_pthread=no
79         ;;
80         dnl FreeBSD is similar to Digital UNIX with DEC C, which has a -pthread flag:
81         *-*-freebsd*)
82                 if test "$with_kthread" = yes; then
83                         LIBS="-kthread $LIBS"
84                 else
85                         LIBS="-pthread $LIBS"
86                 fi
87                 check_pthread=no
88                 PTHREAD_DEFS=-D_THREAD_SAFE
89         ;;
90         *-*-openbsd*)
91                 LIBS="-pthread $LIBS"
92                 check_pthread=no
93                 PTHREAD_DEFS=-pthread
94         ;;
95         *-*-solaris*)
96                 PTHREAD_DEFS="-D_REENTRANT -D_PTHREADS"
97         ;;
98 esac
99 DEFS="$DEFS $PTHREAD_DEFS"
100
101 dnl Checks for programs.
102 AC_PROG_CC
103
104 dnl Set up system-dependent compiler flags.
105 if test "$GCC" = yes; then
106         case "$host" in
107                 *-*-solaris*|alpha*-dec-osf*)
108                         CFLAGS="$CFLAGS -Wall -Wcast-qual -Wcast-align -Wno-char-subscripts"
109                 ;;
110                 *)
111                         CFLAGS="$CFLAGS -Wall -Wcast-qual -Wcast-align -Wstrict-prototypes"
112                 ;;
113         esac
114 fi
115 AC_LIBTOOL_DLOPEN
116 AC_LIBTOOL_WIN32_DLL
117 AC_DISABLE_STATIC
118 AC_PROG_LIBTOOL
119 AC_SUBST(LIBTOOL_DEPS)
120 AC_PROG_INSTALL
121 AC_PROG_YACC
122 missing_dir=`cd $ac_aux_dir && pwd`
123 AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
124 AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
125
126 dnl Checks for system services.
127
128 dnl Checks for libraries.
129
130 dnl We want to test for the following in libc before checking for their
131 dnl respective libraries, because some systems (like Irix) have both, and the
132 dnl non-libc versions may be broken.
133 AC_CHECK_FUNCS(crypt dlopen gethostbyname connect)
134
135 if test "$ac_cv_func_gethostbyname" = no; then
136         AC_CHECK_LIB(nsl, gethostbyname)
137 fi
138
139 if test "$ac_cv_func_connect" = no; then
140         AC_CHECK_LIB(socket, connect)
141 fi
142
143 if test "$ac_cv_func_dlopen" = no; then
144         AC_CHECK_LIB(dl, dlopen, [LIBS="-ldl $LIBS"
145                test "$with_pam" = yes && chkpwd_LIBS="-ldl $chkpwd_LIBS"])
146 fi
147
148 dnl Check for HP/UX dyanmic loader. This should only be in -ldld.
149 AC_CHECK_LIB(dld, shl_load, LIBS="-ldld $LIBS")
150
151 dnl Check for Solaris realtime support
152 AC_CHECK_LIB(rt, sched_yield)
153
154 dnl Determine the system's authentication capabilities, if autologin is
155 dnl requested. We currently support PAM, standard getpwnam(), and getspnam()
156 dnl (Linux shadow passwords)
157 if test "$enable_autologin" != no; then
158         if test "$with_pam" = yes; then
159                 save_LIBS=$LIBS
160                 AC_CHECK_LIB(pam, pam_start, [chkpwd_LIBS="-lpam $chkpwd_LIBS"
161                         LIBS="-lpam $LIBS"])
162                 AC_CHECK_FUNCS(pam_start)
163                 test "$enable_chkpwd" != no && LIBS=$save_LIBS
164         fi
165         if test "$ac_cv_func_pam_start" = no -o "$with_pam" != yes; then
166                 save_LIBS=$LIBS
167                 AC_SEARCH_LIBS(getspnam, shadow, [
168                         if test "$ac_cv_search_getspnam" = -lshadow; then
169                                 chkpwd_LIBS="-lshadow $chkpwd_LIBS"
170                         fi])
171                 test "$enable_chkpwd" != no && LIBS=$save_LIBS
172                 if test "$ac_cv_func_crypt" = no; then
173                         AC_CHECK_LIB(crypt, crypt, [
174                                 chkpwd_LIBS="-lcrypt $chkpwd_LIBS"
175                                 test "$enable_chkpwd" = no && \
176                                         LIBS="-lcrypt $LIBS"])
177                 fi
178         fi
179         if test "$ac_cv_func_crypt" = yes -o "$ac_cv_lib_crypt_crypt" = yes -o "$ac_cv_func_pam_start" = yes; then
180                 AC_DEFINE(ENABLE_AUTOLOGIN)
181                 if test "$enable_chkpwd" != no; then
182                         AC_DEFINE(ENABLE_CHKPWD)
183                         CHKPWD=chkpwd
184                 else
185                         AUTH=auth.lo
186                 fi
187         fi
188 fi
189
190 if test "x$with_db" != xno -a "x$with_gdbm" != xyes; then
191         test "$db_dir" && LDFLAGS="$LDFLAGS -L$db_dir/lib"
192
193         dblib=""
194         test -d "$db_dir/include/db4" && CPPFLAGS="$CPPFLAGS -I$db_dir/include/db4" && dblib="db4" || \
195         ( test -d "$db_dir/include/db3" && CPPFLAGS="$CPPFLAGS -I$db_dir/include/db3" && dblib="db3" ) || \
196         ( test "$db_dir" -a -d "$db_dir/include" && CPPFLAGS="$CPPFLAGS -I$db_dir/include" ) || \
197         ( test -d /usr/include/db4 && CPPFLAGS="$CPPFLAGS -I/usr/include/db4" && dblib="db4" ) || \
198         ( test -d /usr/include/db3 && CPPFLAGS="$CPPFLAGS -I/usr/include/db3" && dblib="db3" )
199
200         AC_SEARCH_LIBS(db_env_create, [$dblib db db4 db3], [
201                 DATABASE=database_sleepycat.c
202                 with_gdbm=no
203         ])
204
205 fi
206
207 if test "x$with_gdbm" != xno -a "x$with_db" != xyes; then
208         test -f /usr/local/lib/libgdbm.a -o -f /usr/local/lib/libgdbm.so && db_dir=/usr/local
209         test "$db_dir" && LDFLAGS="$LDFLAGS -L$db_dir/lib"
210
211         test "$db_dir" && CPPFLAGS="$CPPFLAGS -I$db_dir/include"
212
213         AC_CHECK_LIB(gdbm, gdbm_open,
214                 [LIBS="-lgdbm $LIBS"
215                 DATABASE=database.c
216                 with_db=no])
217 fi
218
219 test -f /usr/local/lib/libresolv.a && LDFLAGS="$LDFLAGS -L/usr/local/lib"
220 AC_CHECK_LIB(resolv, res_query, RESOLV="$RESOLV -lresolv")
221
222 AC_SEARCH_LIBS(tgetent, [ncurses curses termcap])
223 AC_SEARCH_LIBS(initscr, [ncurses curses])
224 AC_CHECK_FUNCS(vw_printw wcolor_set)
225
226 dnl Check for libpthread(s) if we're not using Digital UNIX or FreeBSD. (On
227 dnl which the -pthread flag takes care of this.)
228 if test "$check_pthread" != no; then
229         AC_CHECK_LIB(pthread, pthread_create)
230         AC_CHECK_LIB(pthreads, pthread_create)
231 fi
232
233 # The big search for OpenSSL
234 if test "$with_ssl" != "no"; then
235         saved_LIBS="$LIBS"
236         saved_LDFLAGS="$LDFLAGS"
237         saved_CFLAGS="$CFLAGS"
238         if test "x$prefix" != "xNONE"; then
239                 tryssldir="$tryssldir $prefix"
240         fi
241         AC_CACHE_CHECK([for OpenSSL], ac_cv_openssldir, [
242                 for ssldir in $tryssldir "" /usr /usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/pkg /opt /opt/openssl ; do
243                         CFLAGS="$saved_CFLAGS"
244                         LDFLAGS="$saved_LDFLAGS"
245                         LIBS="$saved_LIBS -lssl -lcrypto"
246         
247                         # Skip directories if they don't exist
248                         if test ! -z "$ssldir" -a ! -d "$ssldir" ; then
249                                 continue;
250                         fi
251                         if test ! -z "$ssldir" -a "x$ssldir" != "x/usr"; then
252                                 # Try to use $ssldir/lib if it exists, otherwise
253                                 # $ssldir
254                                 if test -d "$ssldir/lib" ; then
255                                         LDFLAGS="-L$ssldir/lib $saved_LDFLAGS"
256                                         if test ! -z "$need_dash_r" ; then
257                                                 LDFLAGS="-R$ssldir/lib $LDFLAGS"
258                                         fi
259                                 else
260                                         LDFLAGS="-L$ssldir $saved_LDFLAGS"
261                                         if test ! -z "$need_dash_r" ; then
262                                                 LDFLAGS="-R$ssldir $LDFLAGS"
263                                         fi
264                                 fi
265                                 # Try to use $ssldir/include if it exists, otherwise
266                                 # $ssldir
267                                 if test -d "$ssldir/include" ; then
268                                         CFLAGS="-I$ssldir/include $saved_CFLAGS"
269                                 else
270                                         CFLAGS="-I$ssldir $saved_CFLAGS"
271                                 fi
272                         fi
273         
274                         # Basic test to check for compatible version and correct linking
275                         # *does not* test for RSA - that comes later.
276                         AC_TRY_RUN(
277                                 [
278         #include <string.h>
279         #include <openssl/rand.h>
280         int main(void)
281         {
282                 char a[2048];
283                 memset(a, 0, sizeof(a));
284                 RAND_add(a, sizeof(a), sizeof(a));
285                 return(RAND_status() <= 0);
286         }
287                                 ],
288                                 [
289                                         found_crypto=1
290                                         break;
291                                 ], []
292                         )
293         
294                         if test ! -z "$found_crypto" ; then
295                                 break;
296                         fi
297                 done
298         
299                 if test -z "$ssldir" ; then
300                         ssldir="(system)"
301                 fi
302         
303                 if test ! -z "$found_crypto" ; then
304                         ac_cv_openssldir=$ssldir
305                 else
306                         ac_cv_openssldir="no"
307                 fi
308         ])
309         LIBS="$saved_LIBS"
310         LDFLAGS="$saved_LDFLAGS"
311         CFLAGS="$saved_CFLAGS"
312         
313         if test "x$ac_cv_openssldir" != "xno" ; then
314                 AC_DEFINE(HAVE_OPENSSL)
315                 LIBS="-lssl -lcrypto $LIBS"
316                 dnl Need to recover ssldir - test above runs in subshell
317                 ssldir=$ac_cv_openssldir
318                 if test ! -z "$ssldir" -a "x$ssldir" != "x/usr" -a "x$ssldir" != "x(system)"; then
319                         # Try to use $ssldir/lib if it exists, otherwise
320                         # $ssldir
321                         if test -d "$ssldir/lib" ; then
322                                 LDFLAGS="-L$ssldir/lib $saved_LDFLAGS"
323                                 if test ! -z "$need_dash_r" ; then
324                                         LDFLAGS="-R$ssldir/lib $LDFLAGS"
325                                 fi
326                         else
327                                 LDFLAGS="-L$ssldir $saved_LDFLAGS"
328                                 if test ! -z "$need_dash_r" ; then
329                                         LDFLAGS="-R$ssldir $LDFLAGS"
330                                 fi
331                         fi
332                         # Try to use $ssldir/include if it exists, otherwise
333                         # $ssldir
334                         if test -d "$ssldir/include" ; then
335                                 CFLAGS="-I$ssldir/include $saved_CFLAGS"
336                         else
337                                 CFLAGS="-I$ssldir $saved_CFLAGS"
338                         fi
339                 fi
340         fi
341 fi
342         
343 dnl Checks for header files.
344 AC_HEADER_DIRENT
345 AC_HEADER_STDC
346 AC_HEADER_SYS_WAIT
347
348 dnl
349 dnl TODO: for the DB header checks, we should check whether the headers
350 dnl define db_env_create, somehow
351 dnl
352 AC_CHECK_HEADERS(curses.h ncurses.h dl.h fcntl.h limits.h termios.h sys/ioctl.h sys/select.h sys/time.h syslog.h unistd.h utmp.h utmpx.h paths.h db.h db3/db.h db4/db.h pthread.h netinet/in.h)
353
354 AC_CHECK_HEADER(resolv.h, [SMTP=modules/libsmtp.la; DOMAIN=domain.c],,
355 [#ifdef HAVE_SYS_TYPES_H
356 #include <sys/types.h>
357 #endif
358 #ifdef HAVE_NETINET_IN_H
359 #include <netinet/in.h>
360 #endif])
361
362 AC_SUBST(SMTP)
363 AC_SUBST(DOMAIN)
364
365 dnl Checks for typedefs, structures, and compiler characteristics.
366 AC_C_CONST
367 AC_TYPE_PID_T
368 AC_TYPE_SIZE_T
369 AC_HEADER_TIME
370
371 dnl defined in acinclude.m4:
372 CIT_STRUCT_TM
373
374 dnl Check the size of various builtin types; see typesize.h (error)
375 AC_CHECK_SIZEOF(char, 0)
376 AC_CHECK_SIZEOF(short, 0)
377 AC_CHECK_SIZEOF(int, 0)
378 AC_CHECK_SIZEOF(long, 0)
379 dnl AC_CHECK_SIZEOF(long long, 0)
380
381 AC_CACHE_CHECK([for ut_type in struct utmp], ac_cv_struct_ut_type,
382 [AC_TRY_COMPILE([#include <sys/types.h>
383 #include <utmp.h>], [struct utmp ut; ut.ut_type;],
384 ac_cv_struct_ut_type=yes, ac_cv_struct_ut_type=no)])
385 if test $ac_cv_struct_ut_type = yes; then
386         AC_DEFINE(HAVE_UT_TYPE)
387 fi
388
389 AC_CACHE_CHECK([for ut_host in struct utmp], ac_cv_struct_ut_host,
390 [AC_TRY_COMPILE([#include <sys/types.h>
391 #include <utmp.h>], [struct utmp ut; ut.ut_host;],
392 ac_cv_struct_ut_host=yes, ac_cv_struct_ut_host=no)])
393 if test $ac_cv_struct_ut_host = yes; then
394         AC_DEFINE(HAVE_UT_HOST)
395 fi
396
397 dnl Checks for library functions.
398 AC_FUNC_GETPGRP
399 AC_PROG_GCC_TRADITIONAL
400 AC_TYPE_SIGNAL
401 AC_FUNC_VPRINTF
402 AC_CHECK_FUNCS(getspnam getutxline mkdir mkfifo mktime rmdir select socket strerror strcasecmp strncasecmp)
403
404 dnl Now check for pthreads
405
406 dnl On some platforms, AC_CHECK_FUNC[S] doesn't work for pthreads programs;
407 dnl we need to include pthread.h
408
409 AC_CACHE_CHECK([for pthread_cancel], ac_cv_func_pthread_cancel,
410 [AC_TRY_LINK([#include <pthread.h>],
411 [       pthread_t thread;
412
413         /* The GNU C library defines this for functions which it implements
414            to always fail with ENOSYS.  Some functions are actually named
415            something starting with __ and the normal name is an alias.  */
416 #if defined (__stub_pthread_cancel) || defined (__stub___pthread_cancel)
417         choke me
418 #else
419         pthread_cancel(thread);
420 #endif],
421 ac_cv_func_pthread_cancel=yes, ac_cv_func_pthread_cancel=no)])
422 if test "$ac_cv_func_pthread_cancel" = yes; then
423         AC_DEFINE(HAVE_PTHREAD_CANCEL)
424 fi
425
426 AC_CACHE_CHECK([for pthread_create], ac_cv_func_pthread_create,
427 [AC_TRY_LINK([#include <pthread.h>],
428 [       /* The GNU C library defines this for functions which it implements
429            to always fail with ENOSYS.  Some functions are actually named
430            something starting with __ and the normal name is an alias.  */
431 #if defined (__stub_pthread_cancel) || defined (__stub___pthread_cancel)
432         choke me
433 #else
434         pthread_create(NULL, NULL, NULL, NULL);
435 #endif],
436 ac_cv_func_pthread_create=yes, ac_cv_func_pthread_create=no)])
437 if test "$ac_cv_func_pthread_create" = yes; then
438         test "$DATABASE" && TARGETS="client server utils serv_modules"
439         if test "x$enable_threaded_client" != xno; then
440                 AC_DEFINE(THREADED_CLIENT)
441         fi
442 fi
443
444 AC_REPLACE_FUNCS(snprintf getutline)
445
446 dnl Done! Now write the Makefile and sysdep.h
447 AC_SUBST(AUTH)
448 AC_SUBST(CHKPWD)
449 AC_SUBST(RESOLV)
450 AC_SUBST(chkpwd_LIBS)
451 AC_SUBST(TARGETS)
452 AC_SUBST(DATABASE)
453 AC_CONFIG_HEADER(sysdep.h)
454 AC_CONFIG_FILES([Makefile weekly])
455 AC_OUTPUT
456
457 if test -z "$DATABASE"; then
458         AC_MSG_WARN([No database driver was found. Please install Berkeley DB.])
459 fi