]> code.citadel.org Git - citadel.git/blob - citadel/configure.ac
don't check for a database driver until after the openssl check is
[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 dynamic 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 test -f /usr/local/lib/libresolv.a && LDFLAGS="$LDFLAGS -L/usr/local/lib"
191 AC_CHECK_LIB(resolv, res_query, RESOLV="$RESOLV -lresolv")
192
193 AC_SEARCH_LIBS(tgetent, [ncurses curses termcap])
194 AC_SEARCH_LIBS(initscr, [ncurses curses])
195 AC_CHECK_FUNCS(vw_printw wcolor_set)
196
197 dnl Check for libpthread(s) if we're not using Digital UNIX or FreeBSD. (On
198 dnl which the -pthread flag takes care of this.)
199 if test "$check_pthread" != no; then
200         AC_CHECK_LIB(pthread, pthread_create)
201         AC_CHECK_LIB(pthreads, pthread_create)
202 fi
203
204 # The big search for OpenSSL
205 if test "$with_ssl" != "no"; then
206         saved_LIBS="$LIBS"
207         saved_LDFLAGS="$LDFLAGS"
208         saved_CFLAGS="$CFLAGS"
209         if test "x$prefix" != "xNONE"; then
210                 tryssldir="$tryssldir $prefix"
211         fi
212         AC_CACHE_CHECK([for OpenSSL], ac_cv_openssldir, [
213                 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
214                         CFLAGS="$saved_CFLAGS"
215                         LDFLAGS="$saved_LDFLAGS"
216                         LIBS="$saved_LIBS -lssl -lcrypto"
217         
218                         # Skip directories if they don't exist
219                         if test ! -z "$ssldir" -a ! -d "$ssldir" ; then
220                                 continue;
221                         fi
222                         if test ! -z "$ssldir" -a "x$ssldir" != "x/usr"; then
223                                 # Try to use $ssldir/lib if it exists, otherwise
224                                 # $ssldir
225                                 if test -d "$ssldir/lib" ; then
226                                         LDFLAGS="-L$ssldir/lib $saved_LDFLAGS"
227                                         if test ! -z "$need_dash_r" ; then
228                                                 LDFLAGS="-R$ssldir/lib $LDFLAGS"
229                                         fi
230                                 else
231                                         LDFLAGS="-L$ssldir $saved_LDFLAGS"
232                                         if test ! -z "$need_dash_r" ; then
233                                                 LDFLAGS="-R$ssldir $LDFLAGS"
234                                         fi
235                                 fi
236                                 # Try to use $ssldir/include if it exists, otherwise
237                                 # $ssldir
238                                 if test -d "$ssldir/include" ; then
239                                         CFLAGS="-I$ssldir/include $saved_CFLAGS"
240                                 else
241                                         CFLAGS="-I$ssldir $saved_CFLAGS"
242                                 fi
243                         fi
244         
245                         # Basic test to check for compatible version and correct linking
246                         # *does not* test for RSA - that comes later.
247                         AC_TRY_RUN(
248                                 [
249         #include <string.h>
250         #include <openssl/rand.h>
251         int main(void)
252         {
253                 char a[2048];
254                 memset(a, 0, sizeof(a));
255                 RAND_add(a, sizeof(a), sizeof(a));
256                 return(RAND_status() <= 0);
257         }
258                                 ],
259                                 [
260                                         found_crypto=1
261                                         break;
262                                 ], []
263                         )
264         
265                         if test ! -z "$found_crypto" ; then
266                                 break;
267                         fi
268                 done
269         
270                 if test -z "$ssldir" ; then
271                         ssldir="(system)"
272                 fi
273         
274                 if test ! -z "$found_crypto" ; then
275                         ac_cv_openssldir=$ssldir
276                 else
277                         ac_cv_openssldir="no"
278                 fi
279         ])
280         LIBS="$saved_LIBS"
281         LDFLAGS="$saved_LDFLAGS"
282         CFLAGS="$saved_CFLAGS"
283         
284         if test "x$ac_cv_openssldir" != "xno" ; then
285                 AC_DEFINE(HAVE_OPENSSL)
286                 LIBS="-lssl -lcrypto $LIBS"
287                 dnl Need to recover ssldir - test above runs in subshell
288                 ssldir=$ac_cv_openssldir
289                 if test ! -z "$ssldir" -a "x$ssldir" != "x/usr" -a "x$ssldir" != "x(system)"; then
290                         # Try to use $ssldir/lib if it exists, otherwise
291                         # $ssldir
292                         if test -d "$ssldir/lib" ; then
293                                 LDFLAGS="-L$ssldir/lib $saved_LDFLAGS"
294                                 if test ! -z "$need_dash_r" ; then
295                                         LDFLAGS="-R$ssldir/lib $LDFLAGS"
296                                 fi
297                         else
298                                 LDFLAGS="-L$ssldir $saved_LDFLAGS"
299                                 if test ! -z "$need_dash_r" ; then
300                                         LDFLAGS="-R$ssldir $LDFLAGS"
301                                 fi
302                         fi
303                         # Try to use $ssldir/include if it exists, otherwise
304                         # $ssldir
305                         if test -d "$ssldir/include" ; then
306                                 CFLAGS="-I$ssldir/include $saved_CFLAGS"
307                         else
308                                 CFLAGS="-I$ssldir $saved_CFLAGS"
309                         fi
310                 fi
311         fi
312 fi
313
314 if test "x$with_db" != xno -a "x$with_gdbm" != xyes; then
315         test "$db_dir" && LDFLAGS="$LDFLAGS -L$db_dir/lib"
316
317         dblib=""
318
319         if test -d "$db_dir/include/db4"; then
320                 CPPFLAGS="$CPPFLAGS -I$db_dir/include/db4"
321                 dblib="db4"
322         elif test -d "$db_dir/include/db3"; then
323                 CPPFLAGS="$CPPFLAGS -I$db_dir/include/db3"
324                 dblib="db3"
325         elif test "$db_dir"; then
326                 CPPFLAGS="$CPPFLAGS -I$db_dir/include"
327         elif test -d /usr/include/db4; then
328                 CPPFLAGS="$CPPFLAGS -I/usr/include/db4"
329                 dblib="db4"
330         elif test -d /usr/include/db3; then
331                 CPPFLAGS="$CPPFLAGS -I/usr/include/db3"
332                 dblib="db3"
333         fi
334
335         AC_SEARCH_LIBS(db_env_create, [$dblib db db4 db3], [
336                 DATABASE=database_sleepycat.c
337                 with_gdbm=no
338         ])
339
340 fi
341
342 if test "x$with_gdbm" != xno -a "x$with_db" != xyes; then
343         test -f /usr/local/lib/libgdbm.a -o -f /usr/local/lib/libgdbm.so && db_dir=/usr/local
344         test "$db_dir" && LDFLAGS="$LDFLAGS -L$db_dir/lib"
345
346         test "$db_dir" && CPPFLAGS="$CPPFLAGS -I$db_dir/include"
347
348         AC_CHECK_LIB(gdbm, gdbm_open,
349                 [LIBS="-lgdbm $LIBS"
350                 DATABASE=database.c
351                 with_db=no])
352 fi
353
354 dnl Checks for header files.
355 AC_HEADER_DIRENT
356 AC_HEADER_STDC
357 AC_HEADER_SYS_WAIT
358
359 dnl
360 dnl TODO: for the DB header checks, we should check whether the headers
361 dnl define db_env_create, somehow
362 dnl
363 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)
364
365 AC_CHECK_HEADER(resolv.h, [SMTP=modules/libsmtp.la; DOMAIN=domain.c],,
366 [#ifdef HAVE_SYS_TYPES_H
367 #include <sys/types.h>
368 #endif
369 #ifdef HAVE_NETINET_IN_H
370 #include <netinet/in.h>
371 #endif])
372
373 AC_SUBST(SMTP)
374 AC_SUBST(DOMAIN)
375
376 dnl Checks for typedefs, structures, and compiler characteristics.
377 AC_C_CONST
378 AC_TYPE_PID_T
379 AC_TYPE_SIZE_T
380 AC_HEADER_TIME
381
382 dnl defined in acinclude.m4:
383 CIT_STRUCT_TM
384
385 dnl Check the size of various builtin types; see typesize.h (error)
386 AC_CHECK_SIZEOF(char, 0)
387 AC_CHECK_SIZEOF(short, 0)
388 AC_CHECK_SIZEOF(int, 0)
389 AC_CHECK_SIZEOF(long, 0)
390 dnl AC_CHECK_SIZEOF(long long, 0)
391
392 AC_CACHE_CHECK([for ut_type in struct utmp], ac_cv_struct_ut_type,
393 [AC_TRY_COMPILE([#include <sys/types.h>
394 #include <utmp.h>], [struct utmp ut; ut.ut_type;],
395 ac_cv_struct_ut_type=yes, ac_cv_struct_ut_type=no)])
396 if test $ac_cv_struct_ut_type = yes; then
397         AC_DEFINE(HAVE_UT_TYPE)
398 fi
399
400 AC_CACHE_CHECK([for ut_host in struct utmp], ac_cv_struct_ut_host,
401 [AC_TRY_COMPILE([#include <sys/types.h>
402 #include <utmp.h>], [struct utmp ut; ut.ut_host;],
403 ac_cv_struct_ut_host=yes, ac_cv_struct_ut_host=no)])
404 if test $ac_cv_struct_ut_host = yes; then
405         AC_DEFINE(HAVE_UT_HOST)
406 fi
407
408 dnl Checks for library functions.
409 AC_FUNC_GETPGRP
410 AC_PROG_GCC_TRADITIONAL
411 AC_TYPE_SIGNAL
412 AC_FUNC_VPRINTF
413 AC_CHECK_FUNCS(getspnam getutxline mkdir mkfifo mktime rmdir select socket strerror strcasecmp strncasecmp)
414
415 dnl Now check for pthreads
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         fi
453 fi
454
455 AC_REPLACE_FUNCS(snprintf getutline)
456
457 dnl Done! Now write the Makefile and sysdep.h
458 AC_SUBST(AUTH)
459 AC_SUBST(CHKPWD)
460 AC_SUBST(RESOLV)
461 AC_SUBST(chkpwd_LIBS)
462 AC_SUBST(TARGETS)
463 AC_SUBST(DATABASE)
464 AC_CONFIG_HEADER(sysdep.h)
465 AC_CONFIG_FILES([Makefile weekly])
466 AC_OUTPUT
467
468 if test -z "$DATABASE"; then
469         AC_MSG_WARN([No database driver was found. Please install Berkeley DB.])
470 fi