made some changes that should hopefully make configure detect rawhide's
[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 -d /usr/local/BerkeleyDB.3.1 && db_dir=/usr/local/BerkeleyDB.3.1
43         test -d /usr/local/BerkeleyDB.3.2 && db_dir=/usr/local/BerkeleyDB.3.2
44         test -d /usr/local/BerkeleyDB.3.3 && db_dir=/usr/local/BerkeleyDB.3.3
45         test -d /usr/local/BerkeleyDB.4.0 && db_dir=/usr/local/BerkeleyDB.4.0
46 fi
47
48 if test "x$with_gdbm" = xyes -a "x$with_db" = xyes; then
49         AC_MSG_ERROR(can't enable both gdbm and db)
50 fi
51
52 dnl By default, we only build the client (citadel and whobbs) unless we can
53 dnl figure out how to build with POSIX threads.
54 TARGETS=client
55
56 AC_CANONICAL_HOST
57 PTHREAD_DEFS=-D_REENTRANT
58 case "$host" in
59         dnl BSDI 3.0 wants relocatable object modules instead of shared libs
60         dnl for dlopen(), and has a wrapper script to link with shared libs.
61         dnl Also has stupid non-reentrant gethostbyaddr() and friends.
62         *-*-bsdi[123]*)
63                 test -z "$CC" -a -x /usr/bin/shlicc2 && CC=shlicc2
64                 AC_DEFINE(HAVE_NONREENTRANT_NETDB)
65         ;;
66         *-*-bsdi*)
67                 AC_DEFINE(HAVE_NONREENTRANT_NETDB)
68         ;;
69         dnl Digital Unix has an odd way to build for pthreads, and we can't
70         dnl build pthreads programs with gcc due to header problems.
71         alpha*-dec-osf*)
72                 test -z "$CC" && CC=cc
73                 PTHREAD_LIBS="-lpthread -lexc"
74                 check_pthread=no
75         ;;
76         dnl FreeBSD is similar to Digital UNIX with DEC C, which has a -pthread flag:
77         *-*-freebsd*)
78                 if test "$with_kthread" = yes; then
79                         PTHREAD_LIBS=-kthread
80                 else
81                         PTHREAD_LIBS=-pthread
82                 fi
83                 check_pthread=no
84                 PTHREAD_DEFS=-D_THREAD_SAFE
85         ;;
86         *-*-openbsd*)
87                 PTHREAD_LIBS=-pthread
88                 check_pthread=no
89                 PTHREAD_DEFS=-pthread
90         ;;
91         *-*-solaris*)
92                 PTHREAD_DEFS="-D_REENTRANT -D_PTHREADS"
93         ;;
94 esac
95
96 dnl Checks for programs.
97 AC_PROG_CC
98
99 dnl Set up system-dependent compiler flags.
100 if test "$GCC" = yes; then
101         case "$host" in
102                 *-*-solaris*|alpha*-dec-osf*)
103                         CFLAGS="$CFLAGS -Wall -Wcast-qual -Wcast-align -Wno-char-subscripts"
104                 ;;
105                 *)
106                         CFLAGS="$CFLAGS -Wall -Wcast-qual -Wcast-align -Wstrict-prototypes"
107                 ;;
108         esac
109 fi
110 AC_LIBTOOL_DLOPEN
111 AC_LIBTOOL_WIN32_DLL
112 AC_DISABLE_STATIC
113 AC_PROG_LIBTOOL
114 AC_SUBST(LIBTOOL_DEPS)
115 AC_PROG_INSTALL
116 AC_PROG_YACC
117 missing_dir=`cd $ac_aux_dir && pwd`
118 AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
119 AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
120
121 dnl Checks for system services.
122
123 dnl Checks for libraries.
124
125 dnl libdl, libgdbm, and libcrypt are only used in the server, so the
126 dnl Makefile only passes $(LIBS) to that target. If other programs start
127 dnl requiring additional libraries, we'll have to use other variables, as is
128 dnl done with curses.
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, NETLIBS="-lnsl $NETLIBS")
137 fi
138
139 if test "$ac_cv_func_connect" = no; then
140         AC_CHECK_LIB(socket, connect, NETLIBS="-lsocket $NETLIBS",, $NETLIBS)
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         test "$db_dir" && CPPFLAGS="$CPPFLAGS -I$db_dir/include" || \
194                 ( test -d /usr/include/db4 && CPPFLAGS="$CPPFLAGS -I/usr/include/db4" ) || \
195                 ( test -d /usr/local/include/db4 && CPPFLAGS="$CPPFLAGS -I/usr/local/include/db4" ) || \
196                 ( test -d /usr/include/db3 && CPPFLAGS="$CPPFLAGS -I/usr/include/db3" ) || \
197                 ( test -d /usr/local/include/db3 && CPPFLAGS="$CPPFLAGS -I/usr/local/include/db3" )
198
199         AC_CHECK_LIB(db3, db_env_create,
200                 [GDBM="$GDBM -ldb3"
201                 DATABASE=database_sleepycat.c
202                 with_gdbm=no], [AC_CHECK_LIB(db, db_env_create,
203                                         [GDBM="$GDBM -ldb"
204                                         DATABASE=database_sleepycat.c
205                                         with_gdbm=no], [], [$NETLIBS])], [$NETLIBS])
206 fi
207
208 if test "x$with_gdbm" != xno -a "x$with_db" != xyes; then
209         test -f /usr/local/lib/libgdbm.a -o -f /usr/local/lib/libgdbm.so && db_dir=/usr/local
210         test "$db_dir" && LDFLAGS="$LDFLAGS -L$db_dir/lib"
211
212         test "$db_dir" && CPPFLAGS="$CPPFLAGS -I$db_dir/include"
213
214         AC_CHECK_LIB(gdbm, gdbm_open,
215                 [GDBM="$GDBM -lgdbm"
216                 DATABASE=database.c
217                 with_db=no])
218 fi
219
220 test -f /usr/local/lib/libresolv.a && LDFLAGS="$LDFLAGS -L/usr/local/lib"
221 AC_CHECK_LIB(resolv, res_query, RESOLV="$RESOLV -lresolv")
222
223 save_LIBS=$LIBS
224 LIBS=$CURSES
225 AC_SEARCH_LIBS(tgetent, [ncurses curses termcap])
226 AC_SEARCH_LIBS(initscr, [ncurses curses])
227 AC_CHECK_FUNCS(vw_printw wcolor_set)
228 CURSES=$LIBS
229 LIBS=$save_LIBS
230
231 dnl Check for libpthread(s) if we're not using Digital UNIX or FreeBSD. (On
232 dnl which the -pthread flag takes care of this.)
233 if test "$check_pthread" != no; then
234         AC_CHECK_LIB(pthread, pthread_create,
235                 PTHREAD_LIBS="-lpthread $PTHREAD_LIBS")
236         AC_CHECK_LIB(pthreads, pthread_create,
237                 PTHREAD_LIBS="-lpthreads $PTHREAD_LIBS")
238 fi
239
240 # The big search for OpenSSL
241 if test "$with_ssl" != "no"; then
242         saved_LIBS="$LIBS"
243         saved_LDFLAGS="$LDFLAGS"
244         saved_CFLAGS="$CFLAGS"
245         if test "x$prefix" != "xNONE"; then
246                 tryssldir="$tryssldir $prefix"
247         fi
248         AC_CACHE_CHECK([for OpenSSL], ac_cv_openssldir, [
249                 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
250                         CFLAGS="$saved_CFLAGS"
251                         LDFLAGS="$saved_LDFLAGS"
252                         LIBS="$saved_LIBS -lssl -lcrypto"
253         
254                         # Skip directories if they don't exist
255                         if test ! -z "$ssldir" -a ! -d "$ssldir" ; then
256                                 continue;
257                         fi
258                         if test ! -z "$ssldir" -a "x$ssldir" != "x/usr"; then
259                                 # Try to use $ssldir/lib if it exists, otherwise
260                                 # $ssldir
261                                 if test -d "$ssldir/lib" ; then
262                                         LDFLAGS="-L$ssldir/lib $saved_LDFLAGS"
263                                         if test ! -z "$need_dash_r" ; then
264                                                 LDFLAGS="-R$ssldir/lib $LDFLAGS"
265                                         fi
266                                 else
267                                         LDFLAGS="-L$ssldir $saved_LDFLAGS"
268                                         if test ! -z "$need_dash_r" ; then
269                                                 LDFLAGS="-R$ssldir $LDFLAGS"
270                                         fi
271                                 fi
272                                 # Try to use $ssldir/include if it exists, otherwise
273                                 # $ssldir
274                                 if test -d "$ssldir/include" ; then
275                                         CFLAGS="-I$ssldir/include $saved_CFLAGS"
276                                 else
277                                         CFLAGS="-I$ssldir $saved_CFLAGS"
278                                 fi
279                         fi
280         
281                         # Basic test to check for compatible version and correct linking
282                         # *does not* test for RSA - that comes later.
283                         AC_TRY_RUN(
284                                 [
285         #include <string.h>
286         #include <openssl/rand.h>
287         int main(void)
288         {
289                 char a[2048];
290                 memset(a, 0, sizeof(a));
291                 RAND_add(a, sizeof(a), sizeof(a));
292                 return(RAND_status() <= 0);
293         }
294                                 ],
295                                 [
296                                         found_crypto=1
297                                         break;
298                                 ], []
299                         )
300         
301                         if test ! -z "$found_crypto" ; then
302                                 break;
303                         fi
304                 done
305         
306                 if test -z "$ssldir" ; then
307                         ssldir="(system)"
308                 fi
309         
310                 if test ! -z "$found_crypto" ; then
311                         ac_cv_openssldir=$ssldir
312                 else
313                         ac_cv_openssldir="no"
314                 fi
315         ])
316         LIBS="$saved_LIBS"
317         LDFLAGS="$saved_LDFLAGS"
318         CFLAGS="$saved_CFLAGS"
319         
320         if test "x$ac_cv_openssldir" != "xno" ; then
321                 AC_DEFINE(HAVE_OPENSSL)
322                 LIBS="$saved_LIBS"
323                 SSL_LIBS="-lssl -lcrypto"
324                 dnl Need to recover ssldir - test above runs in subshell
325                 ssldir=$ac_cv_openssldir
326                 if test ! -z "$ssldir" -a "x$ssldir" != "x/usr" -a "x$ssldir" != "x(system)"; then
327                         # Try to use $ssldir/lib if it exists, otherwise
328                         # $ssldir
329                         if test -d "$ssldir/lib" ; then
330                                 LDFLAGS="-L$ssldir/lib $saved_LDFLAGS"
331                                 if test ! -z "$need_dash_r" ; then
332                                         LDFLAGS="-R$ssldir/lib $LDFLAGS"
333                                 fi
334                         else
335                                 LDFLAGS="-L$ssldir $saved_LDFLAGS"
336                                 if test ! -z "$need_dash_r" ; then
337                                         LDFLAGS="-R$ssldir $LDFLAGS"
338                                 fi
339                         fi
340                         # Try to use $ssldir/include if it exists, otherwise
341                         # $ssldir
342                         if test -d "$ssldir/include" ; then
343                                 CFLAGS="-I$ssldir/include $saved_CFLAGS"
344                         else
345                                 CFLAGS="-I$ssldir $saved_CFLAGS"
346                         fi
347                 fi
348         fi
349 fi
350         
351 dnl Checks for header files.
352 AC_HEADER_DIRENT
353 AC_HEADER_STDC
354 AC_HEADER_SYS_WAIT
355
356 dnl
357 dnl TODO: for the DB header checks, we should check whether the headers
358 dnl define db_env_create, somehow
359 dnl
360 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)
361
362 AC_CHECK_HEADER(resolv.h, [SMTP=modules/libsmtp.la; DOMAIN=domain.c])
363 AC_SUBST(SMTP)
364 AC_SUBST(DOMAIN)
365
366 dnl some systems require -pthread, -D_REENTRANT, etc to be passed to cc if we
367 dnl include pthread.h:
368 save_CPPFLAGS=$CPPFLAGS
369 CPPFLAGS="$CPPFLAGS $PTHREAD_DEFS"
370 AC_CHECK_HEADERS(pthread.h)
371 CPPFLAGS=$save_CPPFLAGS
372
373 dnl Checks for typedefs, structures, and compiler characteristics.
374 AC_C_CONST
375 AC_TYPE_PID_T
376 AC_TYPE_SIZE_T
377 AC_HEADER_TIME
378
379 dnl defined in acinclude.m4:
380 CIT_STRUCT_TM
381
382 dnl Check the size of various builtin types; see typesize.h (error)
383 AC_CHECK_SIZEOF(char, 0)
384 AC_CHECK_SIZEOF(short, 0)
385 AC_CHECK_SIZEOF(int, 0)
386 AC_CHECK_SIZEOF(long, 0)
387 dnl AC_CHECK_SIZEOF(long long, 0)
388
389 AC_CACHE_CHECK([for ut_type in struct utmp], ac_cv_struct_ut_type,
390 [AC_TRY_COMPILE([#include <sys/types.h>
391 #include <utmp.h>], [struct utmp ut; ut.ut_type;],
392 ac_cv_struct_ut_type=yes, ac_cv_struct_ut_type=no)])
393 if test $ac_cv_struct_ut_type = yes; then
394         AC_DEFINE(HAVE_UT_TYPE)
395 fi
396
397 AC_CACHE_CHECK([for ut_host in struct utmp], ac_cv_struct_ut_host,
398 [AC_TRY_COMPILE([#include <sys/types.h>
399 #include <utmp.h>], [struct utmp ut; ut.ut_host;],
400 ac_cv_struct_ut_host=yes, ac_cv_struct_ut_host=no)])
401 if test $ac_cv_struct_ut_host = yes; then
402         AC_DEFINE(HAVE_UT_HOST)
403 fi
404
405 dnl Checks for library functions.
406 AC_FUNC_GETPGRP
407 AC_PROG_GCC_TRADITIONAL
408 AC_TYPE_SIGNAL
409 AC_FUNC_VPRINTF
410 AC_CHECK_FUNCS(getspnam getutxline mkdir mkfifo mktime rmdir select socket strerror strcasecmp strncasecmp)
411
412 dnl Now check for pthreads -- set up variables so that the compiler will be run
413 dnl with proper flags for pthread programs
414 save_LIBS=$LIBS
415 LIBS="$PTHREAD_LIBS $LIBS"
416
417 dnl On some platforms, AC_CHECK_FUNC[S] doesn't work for pthreads programs;
418 dnl we need to include pthread.h
419
420 AC_CACHE_CHECK([for pthread_cancel], ac_cv_func_pthread_cancel,
421 [AC_TRY_LINK([#include <pthread.h>],
422 [       pthread_t thread;
423
424         /* The GNU C library defines this for functions which it implements
425            to always fail with ENOSYS.  Some functions are actually named
426            something starting with __ and the normal name is an alias.  */
427 #if defined (__stub_pthread_cancel) || defined (__stub___pthread_cancel)
428         choke me
429 #else
430         pthread_cancel(thread);
431 #endif],
432 ac_cv_func_pthread_cancel=yes, ac_cv_func_pthread_cancel=no)])
433 if test "$ac_cv_func_pthread_cancel" = yes; then
434         AC_DEFINE(HAVE_PTHREAD_CANCEL)
435 fi
436
437 AC_CACHE_CHECK([for pthread_create], ac_cv_func_pthread_create,
438 [AC_TRY_LINK([#include <pthread.h>],
439 [       /* The GNU C library defines this for functions which it implements
440            to always fail with ENOSYS.  Some functions are actually named
441            something starting with __ and the normal name is an alias.  */
442 #if defined (__stub_pthread_cancel) || defined (__stub___pthread_cancel)
443         choke me
444 #else
445         pthread_create(NULL, NULL, NULL, NULL);
446 #endif],
447 ac_cv_func_pthread_create=yes, ac_cv_func_pthread_create=no)])
448 if test "$ac_cv_func_pthread_create" = yes; then
449         test "$DATABASE" && TARGETS="client server utils serv_modules"
450         if test "x$enable_threaded_client" != xno; then
451                 AC_DEFINE(THREADED_CLIENT)
452                 CLIENT_PTLIBS=$PTHREAD_LIBS
453                 CL_LIBOBJS='$(LIBOBJS:.o=.ro)'
454                 CX=.ro
455         fi
456 fi
457
458 if test "x$CX" != x.ro; then
459         CL_LIBOBJS='$(LIBOBJS)'
460         CX=.o
461 fi
462
463 dnl Now restore the old libs so we don't pass the wrong stuff to makefile
464 LIBS=$save_LIBS
465
466 AC_REPLACE_FUNCS(snprintf getutline)
467
468 dnl Done! Now write the Makefile and sysdep.h
469 AC_SUBST(AUTH)
470 AC_SUBST(CHKPWD)
471 AC_SUBST(CURSES)
472 AC_SUBST(GDBM)
473 AC_SUBST(RESOLV)
474 AC_SUBST(NETLIBS)
475 AC_SUBST(chkpwd_LIBS)
476 AC_SUBST(TARGETS)
477 AC_SUBST(PTHREAD_DEFS)
478 AC_SUBST(PTHREAD_LIBS)
479 AC_SUBST(CLIENT_PTLIBS)
480 AC_SUBST(CL_LIBOBJS)
481 AC_SUBST(CX)
482 AC_SUBST(DATABASE)
483 AC_SUBST(SSL_LIBS)
484 AC_CONFIG_HEADER(sysdep.h)
485 AC_CONFIG_FILES([Makefile weekly])
486 AC_OUTPUT
487
488 if test -z "$DATABASE"; then
489         AC_MSG_WARN([No database driver was found. Please install Berkeley DB.])
490 fi