* Numerous fixups needed for Windows port:
[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], [6.02], [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(db, [  --with-db@<:@=DIR@:>@         use Sleepycat DB 3.x @<:@DIR=/usr/local/BerkeleyDB.3.@<:@123@:>@@:>@])
23 AC_ARG_WITH(ssl,
24         [  --with-ssl=PATH     Specify path to OpenSSL installation ],
25         [
26                 if test "x$withval" != "xno" ; then
27                         tryssldir=$withval
28                 fi
29         ]
30 )
31 AC_ARG_WITH(ncurses, [  --without-ncurses       don't use ncurses])
32
33 AC_ARG_WITH(with_zlib, [  --with-zlib             use zlib compression if present])
34 AC_ARG_WITH(with_libical, [  --with-libical          use libical calendaring library])
35
36 if test "x$with_db" != xno -a "x$with_db" != xyes -a "$with_db"; then
37         db_dir="$with_db"
38         with_db=yes
39 else
40         test -f /usr/local/lib/libdb.a -o -f /usr/local/lib/libdb.so \
41           -o -f /usr/local/lib/libdb4.a -o -f /usr/local/lib/libdb4.so \
42           && db_dir=/usr/local
43
44         test -d /usr/local/BerkeleyDB.4.1 && db_dir=/usr/local/BerkeleyDB.4.1
45 fi
46
47 dnl By default, we only build the client (citadel and whobbs) unless we can
48 dnl figure out how to build with POSIX threads.
49 TARGETS=client
50
51 AC_CANONICAL_HOST
52 PTHREAD_DEFS=-D_REENTRANT
53 case "$host" in
54         dnl BSDI 3.0 wants relocatable object modules instead of shared libs
55         dnl for dlopen(), and has a wrapper script to link with shared libs.
56         dnl Also has stupid non-reentrant gethostbyaddr() and friends.
57         *-*-bsdi[123]*)
58                 test -z "$CC" -a -x /usr/bin/shlicc2 && CC=shlicc2
59                 AC_DEFINE(HAVE_NONREENTRANT_NETDB)
60         ;;
61         *-*-bsdi*)
62                 AC_DEFINE(HAVE_NONREENTRANT_NETDB)
63         ;;
64         dnl Curses support on Mac OS X is kind of screwed at the moment.
65         *-*-darwin*)
66                 AC_DEFINE(DISABLE_CURSES)
67         ;;
68         dnl Digital Unix has an odd way to build for pthreads, and we can't
69         dnl build pthreads programs with gcc due to header problems.
70         alpha*-dec-osf*)
71                 test -z "$CC" && CC=cc
72                 LIBS="-lpthread -lexc $LIBS"
73                 check_pthread=no
74         ;;
75         dnl FreeBSD is similar to Digital UNIX with DEC C, which has a -pthread flag:
76         *-*-freebsd*)
77                 if test "$with_kthread" = yes; then
78                         LIBS="-kthread $LIBS"
79                 else
80                         LIBS="-pthread $LIBS"
81                 fi
82                 check_pthread=no
83                 PTHREAD_DEFS=-D_THREAD_SAFE
84         ;;
85         *-*-openbsd*)
86                 LIBS="-pthread $LIBS"
87                 check_pthread=no
88                 PTHREAD_DEFS=-pthread
89         ;;
90         *-*-solaris*)
91                 PTHREAD_DEFS="-D_REENTRANT -D_PTHREADS"
92         ;;
93         *-*-cygwin*)
94                 SERVER_LDFLAGS="-Wl,-subsystem,windows"
95         ;;
96 esac
97 DEFS="$DEFS $PTHREAD_DEFS"
98
99 dnl Checks for programs.
100 AC_PROG_CC
101
102 dnl Set up system-dependent compiler flags.
103 if test "$GCC" = yes; then
104         case "$host" in
105                 *-*-solaris*|alpha*-dec-osf*)
106                         CFLAGS="$CFLAGS -Wall -Wcast-qual -Wcast-align -Wno-char-subscripts"
107                 ;;
108                 *)
109                         CFLAGS="$CFLAGS -Wall -Wcast-qual -Wcast-align -Wstrict-prototypes"
110                 ;;
111         esac
112 fi
113 AC_DISABLE_STATIC
114 AC_PROG_INSTALL
115 AC_PROG_YACC
116 missing_dir=`cd $ac_aux_dir && pwd`
117 AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
118 AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
119
120 dnl Checks for system services.
121
122 dnl Check the size of various builtin types; see typesize.h (error)
123 AC_CHECK_SIZEOF(char, 0)
124 AC_CHECK_SIZEOF(short, 0)
125 AC_CHECK_SIZEOF(int, 0)
126 AC_CHECK_SIZEOF(long, 0)
127 dnl AC_CHECK_SIZEOF(long long, 0)
128
129 dnl Checks for libraries.
130
131 dnl We want to test for the following in libc before checking for their
132 dnl respective libraries, because some systems (like Irix) have both, and the
133 dnl non-libc versions may be broken.
134 AC_CHECK_FUNCS(crypt gethostbyname connect)
135
136 if test "$ac_cv_func_gethostbyname" = no; then
137         AC_CHECK_LIB(nsl, gethostbyname)
138 fi
139
140 if test "$ac_cv_func_connect" = no; then
141         AC_CHECK_LIB(socket, connect)
142 fi
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 -f /usr/local/lib/libresolv.a && LDFLAGS="$LDFLAGS -L/usr/local/lib"
184 AC_CHECK_LIB(resolv, res_query, RESOLV="$RESOLV -lresolv")
185
186 if test "x$with_ncurses" != "xno"; then
187         AC_SEARCH_LIBS(tgetent, [ncurses curses termcap])
188         AC_SEARCH_LIBS(scrollok, [ncurses curses])
189         AC_SEARCH_LIBS(initscr, [ncurses curses])
190 else
191         AC_SEARCH_LIBS(tgetent, [curses termcap])
192         AC_SEARCH_LIBS(initscr, [curses])
193 fi
194 AC_CHECK_FUNCS(vw_printw wcolor_set resizeterm wresize)
195
196 dnl Check for libpthread(s) if we're not using Digital UNIX or FreeBSD. (On
197 dnl which the -pthread flag takes care of this.)
198 if test "$check_pthread" != no; then
199         AC_CHECK_LIB(pthread, pthread_create)
200         AC_CHECK_LIB(pthreads, pthread_create)
201 fi
202
203 test -d /usr/kerberos/include && CPPFLAGS="$CPPFLAGS -I/usr/kerberos/include"
204
205 # The big search for OpenSSL
206 if test "$with_ssl" != "no"; then
207         saved_LIBS="$LIBS"
208         saved_LDFLAGS="$LDFLAGS"
209         saved_CFLAGS="$CFLAGS"
210         if test "x$prefix" != "xNONE"; then
211                 tryssldir="$tryssldir $prefix"
212         fi
213         AC_CACHE_CHECK([for OpenSSL], ac_cv_openssldir, [
214                 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
215                         CFLAGS="$saved_CFLAGS"
216                         LDFLAGS="$saved_LDFLAGS"
217                         LIBS="$saved_LIBS -lssl -lcrypto"
218         
219                         # Skip directories if they don't exist
220                         if test ! -z "$ssldir" -a ! -d "$ssldir" ; then
221                                 continue;
222                         fi
223                         if test ! -z "$ssldir" -a "x$ssldir" != "x/usr"; then
224                                 # Try to use $ssldir/lib if it exists, otherwise
225                                 # $ssldir
226                                 if test -d "$ssldir/lib" ; then
227                                         LDFLAGS="-L$ssldir/lib $saved_LDFLAGS"
228                                         if test ! -z "$need_dash_r" ; then
229                                                 LDFLAGS="-R$ssldir/lib $LDFLAGS"
230                                         fi
231                                 else
232                                         LDFLAGS="-L$ssldir $saved_LDFLAGS"
233                                         if test ! -z "$need_dash_r" ; then
234                                                 LDFLAGS="-R$ssldir $LDFLAGS"
235                                         fi
236                                 fi
237                                 # Try to use $ssldir/include if it exists, otherwise
238                                 # $ssldir
239                                 if test -d "$ssldir/include" ; then
240                                         CFLAGS="-I$ssldir/include $saved_CFLAGS"
241                                 else
242                                         CFLAGS="-I$ssldir $saved_CFLAGS"
243                                 fi
244                         fi
245         
246                         # Basic test to check for compatible version and correct linking
247                         # *does not* test for RSA - that comes later.
248                         AC_TRY_RUN(
249                                 [
250         #include <string.h>
251         #include <openssl/rand.h>
252         int main(void)
253         {
254                 char a[2048];
255                 memset(a, 0, sizeof(a));
256                 RAND_add(a, sizeof(a), sizeof(a));
257                 return(RAND_status() <= 0);
258         }
259                                 ],
260                                 [
261                                         found_crypto=1
262                                         break;
263                                 ], []
264                         )
265         
266                         if test ! -z "$found_crypto" ; then
267                                 break;
268                         fi
269                 done
270         
271                 if test -z "$ssldir" ; then
272                         ssldir="(system)"
273                 fi
274         
275                 if test ! -z "$found_crypto" ; then
276                         ac_cv_openssldir=$ssldir
277                 else
278                         ac_cv_openssldir="no"
279                 fi
280         ])
281         LIBS="$saved_LIBS"
282         LDFLAGS="$saved_LDFLAGS"
283         CFLAGS="$saved_CFLAGS"
284         
285         if test "x$ac_cv_openssldir" != "xno" ; then
286                 AC_DEFINE(HAVE_OPENSSL)
287                 LIBS="-lssl -lcrypto $LIBS"
288                 dnl Need to recover ssldir - test above runs in subshell
289                 ssldir=$ac_cv_openssldir
290                 if test ! -z "$ssldir" -a "x$ssldir" != "x/usr" -a "x$ssldir" != "x(system)"; then
291                         # Try to use $ssldir/lib if it exists, otherwise
292                         # $ssldir
293                         if test -d "$ssldir/lib" ; then
294                                 LDFLAGS="-L$ssldir/lib $saved_LDFLAGS"
295                                 if test ! -z "$need_dash_r" ; then
296                                         LDFLAGS="-R$ssldir/lib $LDFLAGS"
297                                 fi
298                         else
299                                 LDFLAGS="-L$ssldir $saved_LDFLAGS"
300                                 if test ! -z "$need_dash_r" ; then
301                                         LDFLAGS="-R$ssldir $LDFLAGS"
302                                 fi
303                         fi
304                         # Try to use $ssldir/include if it exists, otherwise
305                         # $ssldir
306                         if test -d "$ssldir/include" ; then
307                                 CFLAGS="-I$ssldir/include $saved_CFLAGS"
308                         else
309                                 CFLAGS="-I$ssldir $saved_CFLAGS"
310                         fi
311                 fi
312         fi
313 fi
314
315 if test "x$with_db" != xno; then
316         test "$db_dir" && LDFLAGS="$LDFLAGS -L$db_dir/lib"
317
318         dblib=""
319
320         if test -d "$db_dir/include/db4"; then
321                 CPPFLAGS="$CPPFLAGS -I$db_dir/include/db4"
322                 dblib="db4"
323         elif test "$db_dir"; then
324                 CPPFLAGS="$CPPFLAGS -I$db_dir/include"
325         elif test -d /usr/include/db4; then
326                 CPPFLAGS="$CPPFLAGS -I/usr/include/db4"
327                 dblib="db4"
328         fi
329
330
331         AC_CHECK_DB([db db-4.1 db-4 db4],
332                     [
333                      DATABASE=database_sleepycat.c
334                     ],
335                     AC_MSG_ERROR([[Can not locate a suitable Berkeley DB
336                                   library.  Use --with-db=PATH to specify
337                                   the path]]))
338
339 fi
340
341
342 dnl Checks for the zlib compression library.
343 if test "x$with_zlib" != xno ; then
344         AC_CHECK_HEADERS(zlib.h,
345                 [AC_CHECK_LIB(z, zlibVersion,
346                         [ok_zlib=yes],,
347         )])
348 fi
349
350 if test "x$ok_zlib" = xyes ; then
351         LIBS="-lz $LIBS"
352         AC_DEFINE(HAVE_ZLIB)
353 fi
354
355
356
357 dnl Checks for the libical calendaring library.
358 if test "x$with_libical" != xno ; then
359         AC_CHECK_HEADERS(ical.h,
360                 [AC_CHECK_LIB(ical, icalcomponent_new,
361                         [ok_libical=yes],,
362         )])
363 fi
364
365 if test "x$ok_libical" = xyes ; then
366
367         AC_TRY_RUN(
368                 [
369 #include <ical.h>
370 main() {
371         float v;
372         int i;
373         sscanf(ICAL_VERSION, "%f", &v);
374         printf("libical version: %0.2f\n", v);
375         v = v * 100.0;
376         i = (int) v;
377         if (i >= 24) {
378                 printf("This version is ok.\n");
379                 return(0);
380         }
381         printf("libical 0.24 or newer required.\n");
382         printf("Citadel will be built without calendar support.\n");
383         return(1);
384 }
385                 ], 
386                 [
387                         LIBS="-lical $LIBS"
388                         AC_DEFINE(HAVE_LIBICAL)
389                 ]
390         )
391 fi
392
393
394
395 dnl Checks for header files.
396 AC_HEADER_DIRENT
397 AC_HEADER_STDC
398 AC_HEADER_SYS_WAIT
399
400 dnl
401 dnl TODO: for the DB header checks, we should check whether the headers
402 dnl define db_env_create, somehow
403 dnl
404 AC_CHECK_HEADERS(curses.h dl.h fcntl.h limits.h malloc.h termios.h sys/ioctl.h sys/select.h sys/time.h syslog.h unistd.h utmp.h utmpx.h paths.h db.h db4/db.h pthread.h netinet/in.h arpa/nameser.h)
405
406 dnl
407 dnl need to check if this is actually compilable, sometimes there are
408 dnl conflicts with the system's headers (eg solaris xpg4 style headers)
409 dnl
410 if test "x$with_ncurses" != xno; then
411         AC_CHECK_HEADERS(ncurses.h,,,[ ])
412 fi
413
414 AC_CHECK_HEADER(resolv.h,AC_DEFINE(HAVE_RESOLV_H),,
415 [#ifdef HAVE_SYS_TYPES_H
416 #include <sys/types.h>
417 #endif
418 #ifdef HAVE_NETINET_IN_H
419 #include <netinet/in.h>
420 #endif
421 #ifdef HAVE_ARPA_NAMESER_H
422 #include <arpa/nameser.h>
423 #endif])
424
425
426 dnl Checks for typedefs, structures, and compiler characteristics.
427 AC_C_CONST
428 AC_TYPE_PID_T
429 AC_TYPE_SIZE_T
430 AC_HEADER_TIME
431
432 dnl defined in acinclude.m4:
433 CIT_STRUCT_TM
434
435 AC_CACHE_CHECK([for ut_type in struct utmp], ac_cv_struct_ut_type,
436 [AC_TRY_COMPILE([#include <sys/types.h>
437 #include <utmp.h>], [struct utmp ut; ut.ut_type;],
438 ac_cv_struct_ut_type=yes, ac_cv_struct_ut_type=no)])
439 if test $ac_cv_struct_ut_type = yes; then
440         AC_DEFINE(HAVE_UT_TYPE)
441 fi
442
443 AC_CACHE_CHECK([for ut_host in struct utmp], ac_cv_struct_ut_host,
444 [AC_TRY_COMPILE([#include <sys/types.h>
445 #include <utmp.h>], [struct utmp ut; ut.ut_host;],
446 ac_cv_struct_ut_host=yes, ac_cv_struct_ut_host=no)])
447 if test $ac_cv_struct_ut_host = yes; then
448         AC_DEFINE(HAVE_UT_HOST)
449 fi
450
451 dnl Checks for library functions.
452 AC_FUNC_GETPGRP
453 AC_PROG_GCC_TRADITIONAL
454 AC_TYPE_SIGNAL
455 AC_FUNC_VPRINTF
456 AC_CHECK_FUNCS(getspnam getutxline mkdir mkfifo mktime rmdir select socket strerror strcasecmp strncasecmp)
457
458 dnl Now check for pthreads
459
460 dnl On some platforms, AC_CHECK_FUNC[S] doesn't work for pthreads programs;
461 dnl we need to include pthread.h
462
463 AC_CACHE_CHECK([for pthread_cancel], ac_cv_func_pthread_cancel,
464 [AC_TRY_LINK([#include <pthread.h>],
465 [       pthread_t thread;
466
467         /* The GNU C library defines this for functions which it implements
468            to always fail with ENOSYS.  Some functions are actually named
469            something starting with __ and the normal name is an alias.  */
470 #if defined (__stub_pthread_cancel) || defined (__stub___pthread_cancel)
471         choke me
472 #else
473         pthread_cancel(thread);
474 #endif],
475 ac_cv_func_pthread_cancel=yes, ac_cv_func_pthread_cancel=no)])
476 if test "$ac_cv_func_pthread_cancel" = yes; then
477         AC_DEFINE(HAVE_PTHREAD_CANCEL)
478 fi
479
480 AC_CACHE_CHECK([for pthread_create], ac_cv_func_pthread_create,
481 [AC_TRY_LINK([#include <pthread.h>],
482 [       /* The GNU C library defines this for functions which it implements
483            to always fail with ENOSYS.  Some functions are actually named
484            something starting with __ and the normal name is an alias.  */
485 #if defined (__stub_pthread_cancel) || defined (__stub___pthread_cancel)
486         choke me
487 #else
488         pthread_create(NULL, NULL, NULL, NULL);
489 #endif],
490 ac_cv_func_pthread_create=yes, ac_cv_func_pthread_create=no)])
491 if test "$ac_cv_func_pthread_create" = yes; then
492         test "$DATABASE" && TARGETS="client server utils"
493         if test "x$enable_threaded_client" != xno; then
494                 AC_DEFINE(THREADED_CLIENT)
495         fi
496 fi
497
498 AC_REPLACE_FUNCS(snprintf getutline)
499
500 # AC_CACHE_CHECK([the weather], ac_cv_weather, [
501 #       sleep 1
502 #       echo $ECHO_N "opening your window... $ECHO_C" >&6
503 #       sleep 2
504 #       month=`date | cut -f 2 -d ' '`
505 #       case $month in
506 #       Dec | Jan | Feb)
507 #               ac_cv_weather="it's cold!"
508 #               ;;
509 #       Mar | Apr)
510 #               ac_cv_weather="it's wet!"
511 #               ;;
512 #       Jul | Aug)
513 #               ac_cv_weather="it's hot!"
514 #               ;;
515 #       Oct | Nov)
516 #               ac_cv_weather="it's cool"
517 #               ;;
518 #       May | Jun | Sep | *)
519 #               ac_cv_weather="it's fine"
520 #               ;;
521 #       esac
522 #       ])
523
524 AC_CACHE_CHECK([under the bed], ac_cv_under_the_bed, [
525         number=`date | cut -c 19`
526         case $number in
527         7)
528                 ac_cv_under_the_bed="lunatics and monsters found"
529                 ;;
530         *)
531                 ac_cv_under_the_bed="dust bunnies found"
532                 ;;
533         esac
534         ])
535
536 dnl Done! Now write the Makefile and sysdep.h
537 AC_SUBST(AUTH)
538 AC_SUBST(CHKPWD)
539 AC_SUBST(RESOLV)
540 AC_SUBST(chkpwd_LIBS)
541 AC_SUBST(TARGETS)
542 AC_SUBST(DATABASE)
543 AC_SUBST(SERVER_LDFLAGS)
544 AC_CONFIG_HEADER(sysdep.h)
545 AC_CONFIG_FILES([Makefile weekly])
546 AC_OUTPUT
547
548 if test -z "$DATABASE"; then
549         AC_MSG_WARN([No database driver was found. Please install Berkeley DB.])
550 fi
551
552 echo ...
553 echo ...
554 echo "... On many operating systems, you must use GNU make (gmake) to compile"
555 echo ... Citadel.
556 echo ...
557 echo ...