finally changed configure to complain if there's no database driver ;)
[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
25 if test "x$with_gdbm" != xno -a "x$with_gdbm" != xyes -a "$with_gdbm"; then
26         db_dir="$with_gdbm"
27         with_gdbm=yes
28 else
29         test -f /usr/local/lib/libgdbm.a -o -f /usr/local/lib/libgdbm.so && db_dir=/usr/local
30 fi
31
32 if test "x$with_db" != xno -a "x$with_db" != xyes -a "$with_db"; then
33         db_dir="$with_db"
34         with_db=yes
35 else
36         test -d /usr/local/BerkeleyDB.3.1 && db_dir=/usr/local/BerkeleyDB.3.1
37         test -d /usr/local/BerkeleyDB.3.2 && db_dir=/usr/local/BerkeleyDB.3.2
38         test -d /usr/local/BerkeleyDB.3.3 && db_dir=/usr/local/BerkeleyDB.3.3
39         test -d /usr/local/BerkeleyDB.4.0 && db_dir=/usr/local/BerkeleyDB.4.0
40 fi
41
42 if test "x$with_gdbm" = xyes -a "x$with_db" = xyes; then
43         AC_MSG_ERROR(can't enable both gdbm and db)
44 fi
45
46 dnl By default, we only build the client (citadel and whobbs) unless we can
47 dnl figure out how to build with POSIX threads.
48 TARGETS=client
49
50 AC_CANONICAL_HOST
51 PTHREAD_DEFS=-D_REENTRANT
52 case "$host" in
53         dnl BSDI 3.0 wants relocatable object modules instead of shared libs
54         dnl for dlopen(), and has a wrapper script to link with shared libs.
55         dnl Also has stupid non-reentrant gethostbyaddr() and friends.
56         *-*-bsdi[123]*)
57                 test -z "$CC" -a -x /usr/bin/shlicc2 && CC=shlicc2
58                 AC_DEFINE(HAVE_NONREENTRANT_NETDB)
59         ;;
60         *-*-bsdi*)
61                 AC_DEFINE(HAVE_NONREENTRANT_NETDB)
62         ;;
63         dnl Digital Unix has an odd way to build for pthreads, and we can't
64         dnl build pthreads programs with gcc due to header problems.
65         alpha*-dec-osf*)
66                 test -z "$CC" && CC=cc
67                 PTHREAD_LIBS="-lpthread -lexc"
68                 check_pthread=no
69         ;;
70         dnl FreeBSD is similar to Digital UNIX with DEC C, which has a -pthread flag:
71         *-*-freebsd*)
72                 if test "$with_kthread" = yes; then
73                         PTHREAD_LIBS=-kthread
74                 else
75                         PTHREAD_LIBS=-pthread
76                 fi
77                 check_pthread=no
78                 PTHREAD_DEFS=-D_THREAD_SAFE
79         ;;
80         *-*-openbsd*)
81                 PTHREAD_LIBS=-pthread
82                 check_pthread=no
83                 PTHREAD_DEFS=-pthread
84         ;;
85         *-*-solaris*)
86                 PTHREAD_DEFS="-D_REENTRANT -D_PTHREADS"
87         ;;
88 esac
89
90 dnl Checks for programs.
91 AC_PROG_CC
92
93 dnl Set up system-dependent compiler flags.
94 if test "$GCC" = yes; then
95         case "$host" in
96                 *-*-solaris*|alpha*-dec-osf*)
97                         CFLAGS="$CFLAGS -Wall -Wcast-align -Wno-char-subscripts"
98                 ;;
99                 *)
100                         CFLAGS="$CFLAGS -Wall -Wcast-align -Wstrict-prototypes"
101                 ;;
102         esac
103 fi
104 AC_LIBTOOL_DLOPEN
105 AC_LIBTOOL_WIN32_DLL
106 AC_DISABLE_STATIC
107 AC_PROG_LIBTOOL
108 AC_SUBST(LIBTOOL_DEPS)
109 AC_PROG_INSTALL
110 AC_PROG_YACC
111 missing_dir=`cd $ac_aux_dir && pwd`
112 AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
113
114 dnl Checks for system services.
115
116 dnl Checks for libraries.
117
118 dnl libdl, libgdbm, and libcrypt are only used in the server, so the
119 dnl Makefile only passes $(LIBS) to that target. If other programs start
120 dnl requiring additional libraries, we'll have to use other variables, as is
121 dnl done with curses.
122
123 dnl We want to test for the following in libc before checking for their
124 dnl respective libraries, because some systems (like Irix) have both, and the
125 dnl non-libc versions may be broken.
126 AC_CHECK_FUNCS(crypt dlopen gethostbyname connect)
127
128 if test "$ac_cv_func_gethostbyname" = no; then
129         AC_CHECK_LIB(nsl, gethostbyname, NETLIBS="-lnsl $NETLIBS")
130 fi
131
132 if test "$ac_cv_func_connect" = no; then
133         AC_CHECK_LIB(socket, connect, NETLIBS="-lsocket $NETLIBS",, $NETLIBS)
134 fi
135
136 if test "$ac_cv_func_dlopen" = no; then
137         AC_CHECK_LIB(dl, dlopen, [LIBS="-ldl $LIBS"
138                test "$with_pam" = yes && chkpwd_LIBS="-ldl $chkpwd_LIBS"])
139 fi
140
141 dnl Check for HP/UX dyanmic loader. This should only be in -ldld.
142 AC_CHECK_LIB(dld, shl_load, LIBS="-ldld $LIBS")
143
144 dnl Check for Solaris realtime support
145 AC_CHECK_LIB(rt, sched_yield)
146
147 dnl Determine the system's authentication capabilities, if autologin is
148 dnl requested. We currently support PAM, standard getpwnam(), and getspnam()
149 dnl (Linux shadow passwords)
150 if test "$enable_autologin" != no; then
151         if test "$with_pam" = yes; then
152                 save_LIBS=$LIBS
153                 AC_CHECK_LIB(pam, pam_start, [chkpwd_LIBS="-lpam $chkpwd_LIBS"
154                         LIBS="-lpam $LIBS"])
155                 AC_CHECK_FUNCS(pam_start)
156                 test "$enable_chkpwd" != no && LIBS=$save_LIBS
157         fi
158         if test "$ac_cv_func_pam_start" = no -o "$with_pam" != yes; then
159                 save_LIBS=$LIBS
160                 AC_SEARCH_LIBS(getspnam, shadow, [
161                         if test "$ac_cv_search_getspnam" = -lshadow; then
162                                 chkpwd_LIBS="-lshadow $chkpwd_LIBS"
163                         fi])
164                 test "$enable_chkpwd" != no && LIBS=$save_LIBS
165                 if test "$ac_cv_func_crypt" = no; then
166                         AC_CHECK_LIB(crypt, crypt, [
167                                 chkpwd_LIBS="-lcrypt $chkpwd_LIBS"
168                                 test "$enable_chkpwd" = no && \
169                                         LIBS="-lcrypt $LIBS"])
170                 fi
171         fi
172         if test "$ac_cv_func_crypt" = yes -o "$ac_cv_lib_crypt_crypt" = yes -o "$ac_cv_func_pam_start" = yes; then
173                 AC_DEFINE(ENABLE_AUTOLOGIN)
174                 if test "$enable_chkpwd" != no; then
175                         AC_DEFINE(ENABLE_CHKPWD)
176                         CHKPWD=chkpwd
177                 else
178                         AUTH=auth.lo
179                 fi
180         fi
181 fi
182
183 test "$db_dir" && LDFLAGS="$LDFLAGS -L$db_dir/lib"
184 if test "x$with_db" != xno -a "x$with_gdbm" != xyes; then
185         AC_CHECK_LIB(db3, db_env_create,
186                 [GDBM="$GDBM -ldb3"
187                 DATABASE=database_sleepycat.c
188                 with_gdbm=no], [AC_CHECK_LIB(db, db_env_create,
189                                         [GDBM="$GDBM -ldb"
190                                         DATABASE=database_sleepycat.c
191                                         with_gdbm=no], [], [$NETLIBS])], [$NETLIBS])
192 fi
193
194 if test "x$with_gdbm" != xno -a "x$with_db" != xyes; then
195         AC_CHECK_LIB(gdbm, gdbm_open,
196                 [GDBM="$GDBM -lgdbm"
197                 DATABASE=database.c
198                 with_db=no])
199 fi
200
201 test -f /usr/local/lib/libresolv.a && LDFLAGS="$LDFLAGS -L/usr/local/lib"
202 AC_CHECK_LIB(resolv, res_query, RESOLV="$RESOLV -lresolv")
203
204 save_LIBS=$LIBS
205 LIBS=$CURSES
206 AC_SEARCH_LIBS(tgetent, [curses termcap])
207 AC_SEARCH_LIBS(initscr, [curses ncurses])
208 CURSES=$LIBS
209 LIBS=$save_LIBS
210
211 dnl Check for libpthread(s) if we're not using Digital UNIX or FreeBSD. (On
212 dnl which the -pthread flag takes care of this.)
213 if test "$check_pthread" != no; then
214         AC_CHECK_LIB(pthread, pthread_create,
215                 PTHREAD_LIBS="-lpthread $PTHREAD_LIBS")
216         AC_CHECK_LIB(pthreads, pthread_create,
217                 PTHREAD_LIBS="-lpthreads $PTHREAD_LIBS")
218 fi
219
220 dnl Checks for header files.
221 AC_HEADER_DIRENT
222 AC_HEADER_STDC
223 AC_HEADER_SYS_WAIT
224
225 test "$db_dir" && CPPFLAGS="$CPPFLAGS -I$db_dir/include"
226
227 AC_CHECK_HEADERS(curses.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)
228
229 AC_CHECK_HEADER(resolv.h, [SMTP=modules/libsmtp.la; DOMAIN=domain.c])
230 AC_SUBST(SMTP)
231 AC_SUBST(DOMAIN)
232
233 dnl some systems require -pthread, -D_REENTRANT, etc to be passed to cc if we
234 dnl include pthread.h:
235 save_CPPFLAGS=$CPPFLAGS
236 CPPFLAGS="$CPPFLAGS $PTHREAD_DEFS"
237 AC_CHECK_HEADERS(pthread.h)
238 CPPFLAGS=$save_CPPFLAGS
239
240 dnl Checks for typedefs, structures, and compiler characteristics.
241 AC_C_CONST
242 AC_TYPE_PID_T
243 AC_TYPE_SIZE_T
244 AC_HEADER_TIME
245 AC_STRUCT_TM
246
247 dnl Check the size of various builtin types; see typesize.h (error)
248 AC_CHECK_SIZEOF(char, 0)
249 AC_CHECK_SIZEOF(short, 0)
250 AC_CHECK_SIZEOF(int, 0)
251 AC_CHECK_SIZEOF(long, 0)
252 dnl AC_CHECK_SIZEOF(long long, 0)
253
254 AC_CACHE_CHECK([for ut_type in struct utmp], ac_cv_struct_ut_type,
255 [AC_TRY_COMPILE([#include <sys/types.h>
256 #include <utmp.h>], [struct utmp ut; ut.ut_type;],
257 ac_cv_struct_ut_type=yes, ac_cv_struct_ut_type=no)])
258 if test $ac_cv_struct_ut_type = yes; then
259         AC_DEFINE(HAVE_UT_TYPE)
260 fi
261
262 AC_CACHE_CHECK([for ut_host in struct utmp], ac_cv_struct_ut_host,
263 [AC_TRY_COMPILE([#include <sys/types.h>
264 #include <utmp.h>], [struct utmp ut; ut.ut_host;],
265 ac_cv_struct_ut_host=yes, ac_cv_struct_ut_host=no)])
266 if test $ac_cv_struct_ut_host = yes; then
267         AC_DEFINE(HAVE_UT_HOST)
268 fi
269
270 dnl Checks for library functions.
271 AC_FUNC_GETPGRP
272 AC_PROG_GCC_TRADITIONAL
273 AC_TYPE_SIGNAL
274 AC_FUNC_VPRINTF
275 AC_CHECK_FUNCS(getspnam getutxline mkdir mkfifo mktime rmdir select socket strerror strcasecmp strncasecmp)
276
277 dnl Now check for pthreads -- set up variables so that the compiler will be run
278 dnl with proper flags for pthread programs
279 save_LIBS=$LIBS
280 LIBS="$PTHREAD_LIBS $LIBS"
281
282 dnl On some platforms, AC_CHECK_FUNC[S] doesn't work for pthreads programs;
283 dnl we need to include pthread.h
284
285 AC_CACHE_CHECK([for pthread_cancel], ac_cv_func_pthread_cancel,
286 [AC_TRY_LINK([#include <pthread.h>],
287 [       pthread_t thread;
288
289         /* The GNU C library defines this for functions which it implements
290            to always fail with ENOSYS.  Some functions are actually named
291            something starting with __ and the normal name is an alias.  */
292 #if defined (__stub_pthread_cancel) || defined (__stub___pthread_cancel)
293         choke me
294 #else
295         pthread_cancel(thread);
296 #endif],
297 ac_cv_func_pthread_cancel=yes, ac_cv_func_pthread_cancel=no)])
298 if test "$ac_cv_func_pthread_cancel" = yes; then
299         AC_DEFINE(HAVE_PTHREAD_CANCEL)
300 fi
301
302 AC_CACHE_CHECK([for pthread_create], ac_cv_func_pthread_create,
303 [AC_TRY_LINK([#include <pthread.h>],
304 [       /* The GNU C library defines this for functions which it implements
305            to always fail with ENOSYS.  Some functions are actually named
306            something starting with __ and the normal name is an alias.  */
307 #if defined (__stub_pthread_cancel) || defined (__stub___pthread_cancel)
308         choke me
309 #else
310         pthread_create(NULL, NULL, NULL, NULL);
311 #endif],
312 ac_cv_func_pthread_create=yes, ac_cv_func_pthread_create=no)])
313 if test "$ac_cv_func_pthread_create" = yes; then
314         test "$DATABASE" && TARGETS="client server utils serv_modules"
315         if test "x$enable_threaded_client" != xno; then
316                 AC_DEFINE(THREADED_CLIENT)
317                 CLIENT_PTLIBS=$PTHREAD_LIBS
318                 CL_LIBOBJS='$(LIBOBJS:.o=.ro)'
319                 CX=.ro
320         fi
321 fi
322
323 if test "x$CX" != x.ro; then
324         CL_LIBOBJS='$(LIBOBJS)'
325         CX=.o
326 fi
327
328 dnl Now restore the old libs so we don't pass the wrong stuff to makefile
329 LIBS=$save_LIBS
330
331 AC_REPLACE_FUNCS(snprintf getutline)
332
333 dnl Done! Now write the Makefile and sysdep.h
334 AC_SUBST(AUTH)
335 AC_SUBST(CHKPWD)
336 AC_SUBST(CURSES)
337 AC_SUBST(GDBM)
338 AC_SUBST(RESOLV)
339 AC_SUBST(NETLIBS)
340 AC_SUBST(chkpwd_LIBS)
341 AC_SUBST(TARGETS)
342 AC_SUBST(PTHREAD_DEFS)
343 AC_SUBST(PTHREAD_LIBS)
344 AC_SUBST(CLIENT_PTLIBS)
345 AC_SUBST(CL_LIBOBJS)
346 AC_SUBST(CX)
347 AC_SUBST(DATABASE)
348 AC_CONFIG_HEADER(sysdep.h)
349 AC_CONFIG_FILES([Makefile weekly])
350 AC_OUTPUT
351
352 if test -z "$DATABASE"; then
353         AC_MSG_WARN([No database driver was found. Please install Berkeley DB.])
354 fi