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