libtool has matured a lot since the last time i looked at it (years ago)
[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_DISABLE_STATIC
105 AC_PROG_LIBTOOL
106 AC_SUBST(LIBTOOL_DEPS)
107 AC_PROG_INSTALL
108 AC_PROG_YACC
109 missing_dir=`cd $ac_aux_dir && pwd`
110 AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
111
112 dnl Checks for system services.
113
114 dnl Checks for libraries.
115
116 dnl libdl, libgdbm, and libcrypt are only used in the server, so the
117 dnl Makefile only passes $(LIBS) to that target. If other programs start
118 dnl requiring additional libraries, we'll have to use other variables, as is
119 dnl done with curses.
120
121 dnl We want to test for the following in libc before checking for their
122 dnl respective libraries, because some systems (like Irix) have both, and the
123 dnl non-libc versions may be broken.
124 AC_CHECK_FUNCS(crypt dlopen gethostbyname connect)
125
126 if test "$ac_cv_func_gethostbyname" = no; then
127         AC_CHECK_LIB(nsl, gethostbyname, NETLIBS="-lnsl $NETLIBS")
128 fi
129
130 if test "$ac_cv_func_connect" = no; then
131         AC_CHECK_LIB(socket, connect, NETLIBS="-lsocket $NETLIBS",, $NETLIBS)
132 fi
133
134 if test "$ac_cv_func_dlopen" = no; then
135         AC_CHECK_LIB(dl, dlopen, [LIBS="-ldl $LIBS"
136                test "$with_pam" = yes && chkpwd_LIBS="-ldl $chkpwd_LIBS"])
137 fi
138
139 dnl Check for HP/UX dyanmic loader. This should only be in -ldld.
140 AC_CHECK_LIB(dld, shl_load, LIBS="-ldld $LIBS")
141
142 dnl Check for Solaris realtime support
143 AC_CHECK_LIB(rt, sched_yield)
144
145 dnl Determine the system's authentication capabilities, if autologin is
146 dnl requested. We currently support PAM, standard getpwnam(), and getspnam()
147 dnl (Linux shadow passwords)
148 if test "$enable_autologin" != no; then
149         if test "$with_pam" = yes; then
150                 save_LIBS=$LIBS
151                 AC_CHECK_LIB(pam, pam_start, [chkpwd_LIBS="-lpam $chkpwd_LIBS"
152                         LIBS="-lpam $LIBS"])
153                 AC_CHECK_FUNCS(pam_start)
154                 test "$enable_chkpwd" != no && LIBS=$save_LIBS
155         fi
156         if test "$ac_cv_func_pam_start" = no -o "$with_pam" != yes; then
157                 save_LIBS=$LIBS
158                 AC_SEARCH_LIBS(getspnam, shadow, [
159                         if test "$ac_cv_search_getspnam" = -lshadow; then
160                                 chkpwd_LIBS="-lshadow $chkpwd_LIBS"
161                         fi])
162                 test "$enable_chkpwd" != no && LIBS=$save_LIBS
163                 if test "$ac_cv_func_crypt" = no; then
164                         AC_CHECK_LIB(crypt, crypt, [
165                                 chkpwd_LIBS="-lcrypt $chkpwd_LIBS"
166                                 test "$enable_chkpwd" = no && \
167                                         LIBS="-lcrypt $LIBS"])
168                 fi
169         fi
170         if test "$ac_cv_func_crypt" = yes -o "$ac_cv_lib_crypt_crypt" = yes -o "$ac_cv_func_pam_start" = yes; then
171                 AC_DEFINE(ENABLE_AUTOLOGIN)
172                 if test "$enable_chkpwd" != no; then
173                         AC_DEFINE(ENABLE_CHKPWD)
174                         CHKPWD=chkpwd
175                 else
176                         AUTH=auth.ro
177                 fi
178         fi
179 fi
180
181 test "$db_dir" && LDFLAGS="$LDFLAGS -L$db_dir/lib"
182 if test "x$with_db" != xno -a "x$with_gdbm" != xyes; then
183         AC_CHECK_LIB(db, db_env_create,
184                 [GDBM="$GDBM -ldb"
185                 DATABASE=database_sleepycat.c
186                 with_gdbm=no], [], [$NETLIBS])
187 fi
188
189 if test "x$with_gdbm" != xno -a "x$with_db" != xyes; then
190         AC_CHECK_LIB(gdbm, gdbm_open,
191                 [GDBM="$GDBM -lgdbm"
192                 DATABASE=database.c
193                 with_db=no])
194 fi
195
196 test -f /usr/local/lib/libresolv.a && LDFLAGS="$LDFLAGS -L/usr/local/lib"
197 AC_CHECK_LIB(resolv, res_query, RESOLV="$RESOLV -lresolv")
198
199 save_LIBS=$LIBS
200 LIBS=$CURSES
201 AC_SEARCH_LIBS(tgetent, [curses termcap])
202 AC_SEARCH_LIBS(initscr, [curses ncurses])
203 CURSES=$LIBS
204 LIBS=$save_LIBS
205
206 dnl Check for libpthread(s) if we're not using Digital UNIX or FreeBSD. (On
207 dnl which the -pthread flag takes care of this.)
208 if test "$check_pthread" != no; then
209         AC_CHECK_LIB(pthread, pthread_create,
210                 PTHREAD_LIBS="-lpthread $PTHREAD_LIBS")
211         AC_CHECK_LIB(pthreads, pthread_create,
212                 PTHREAD_LIBS="-lpthreads $PTHREAD_LIBS")
213 fi
214
215 dnl Checks for header files.
216 AC_HEADER_DIRENT
217 AC_HEADER_STDC
218 AC_HEADER_SYS_WAIT
219 test "$db_dir" && CPPFLAGS="$CPPFLAGS -I$db_dir/include"
220 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)
221
222 dnl some systems require -pthread, -D_REENTRANT, etc to be passed to cc if we
223 dnl include pthread.h:
224 save_CPPFLAGS=$CPPFLAGS
225 CPPFLAGS="$CPPFLAGS $PTHREAD_DEFS"
226 AC_CHECK_HEADERS(pthread.h)
227 CPPFLAGS=$save_CPPFLAGS
228
229 dnl Checks for typedefs, structures, and compiler characteristics.
230 AC_C_CONST
231 AC_TYPE_PID_T
232 AC_TYPE_SIZE_T
233 AC_HEADER_TIME
234 AC_STRUCT_TM
235
236 dnl Check the size of various builtin types; see typesize.h (error)
237 AC_CHECK_SIZEOF(char, 0)
238 AC_CHECK_SIZEOF(short, 0)
239 AC_CHECK_SIZEOF(int, 0)
240 AC_CHECK_SIZEOF(long, 0)
241 dnl AC_CHECK_SIZEOF(long long, 0)
242
243 AC_CACHE_CHECK([for ut_type in struct utmp], ac_cv_struct_ut_type,
244 [AC_TRY_COMPILE([#include <sys/types.h>
245 #include <utmp.h>], [struct utmp ut; ut.ut_type;],
246 ac_cv_struct_ut_type=yes, ac_cv_struct_ut_type=no)])
247 if test $ac_cv_struct_ut_type = yes; then
248         AC_DEFINE(HAVE_UT_TYPE)
249 fi
250
251 AC_CACHE_CHECK([for ut_host in struct utmp], ac_cv_struct_ut_host,
252 [AC_TRY_COMPILE([#include <sys/types.h>
253 #include <utmp.h>], [struct utmp ut; ut.ut_host;],
254 ac_cv_struct_ut_host=yes, ac_cv_struct_ut_host=no)])
255 if test $ac_cv_struct_ut_host = yes; then
256         AC_DEFINE(HAVE_UT_HOST)
257 fi
258
259 dnl Checks for library functions.
260 AC_FUNC_GETPGRP
261 AC_PROG_GCC_TRADITIONAL
262 AC_TYPE_SIGNAL
263 AC_FUNC_VPRINTF
264 AC_CHECK_FUNCS(getspnam getutxline mkdir mkfifo mktime rmdir select socket strerror strcasecmp strncasecmp)
265
266 dnl Now check for pthreads -- set up variables so that the compiler will be run
267 dnl with proper flags for pthread programs
268 save_LIBS=$LIBS
269 LIBS="$PTHREAD_LIBS $LIBS"
270
271 dnl On some platforms, AC_CHECK_FUNC[S] doesn't work for pthreads programs;
272 dnl we need to include pthread.h
273 dnl AC_CHECK_FUNCS(pthread_cancel)
274
275 AC_CACHE_CHECK([for pthread_cancel], ac_cv_func_pthread_cancel,
276 [AC_TRY_LINK([#include <pthread.h>],
277 [       pthread_t thread;
278
279         /* The GNU C library defines this for functions which it implements
280            to always fail with ENOSYS.  Some functions are actually named
281            something starting with __ and the normal name is an alias.  */
282 #if defined (__stub_pthread_cancel) || defined (__stub___pthread_cancel)
283         choke me
284 #else
285         pthread_cancel(thread);
286 #endif],
287 ac_cv_func_pthread_cancel=yes, ac_cv_func_pthread_cancel=no)])
288 if test "$ac_cv_func_pthread_cancel" = yes; then
289         AC_DEFINE(HAVE_PTHREAD_CANCEL)
290 fi
291
292 dnl AC_CHECK_FUNC(pthread_create, TARGETS="client server utils serv_modules")
293
294 AC_CACHE_CHECK([for pthread_create], ac_cv_func_pthread_create,
295 [AC_TRY_LINK([#include <pthread.h>],
296 [       /* The GNU C library defines this for functions which it implements
297            to always fail with ENOSYS.  Some functions are actually named
298            something starting with __ and the normal name is an alias.  */
299 #if defined (__stub_pthread_cancel) || defined (__stub___pthread_cancel)
300         choke me
301 #else
302         pthread_create(NULL, NULL, NULL, NULL);
303 #endif],
304 ac_cv_func_pthread_create=yes, ac_cv_func_pthread_create=no)])
305 if test "$ac_cv_func_pthread_create" = yes; then
306         TARGETS="client server utils serv_modules"
307         if test "x$enable_threaded_client" != xno; then
308                 AC_DEFINE(THREADED_CLIENT)
309                 CLIENT_PTLIBS=$PTHREAD_LIBS
310                 CL_LIBOBJS='$(LIBOBJS:.o=.ro)'
311                 CX=.ro
312         fi
313 fi
314
315 if test "x$CX" != x.ro; then
316         CL_LIBOBJS='$(LIBOBJS)'
317         CX=.o
318 fi
319
320 dnl Now restore the old libs so we don't pass the wrong stuff to makefile
321 LIBS=$save_LIBS
322
323 AC_REPLACE_FUNCS(snprintf getutline)
324
325 dnl Done! Now write the Makefile and sysdep.h
326 AC_SUBST(AUTH)
327 AC_SUBST(CHKPWD)
328 AC_SUBST(CURSES)
329 AC_SUBST(GDBM)
330 AC_SUBST(RESOLV)
331 AC_SUBST(NETLIBS)
332 AC_SUBST(chkpwd_LIBS)
333 AC_SUBST(TARGETS)
334 AC_SUBST(PTHREAD_DEFS)
335 AC_SUBST(PTHREAD_LIBS)
336 AC_SUBST(CLIENT_PTLIBS)
337 AC_SUBST(CL_LIBOBJS)
338 AC_SUBST(CX)
339 AC_SUBST(DATABASE)
340 AC_CONFIG_HEADER(sysdep.h)
341 AC_CONFIG_FILES([Makefile weekly])
342 AC_OUTPUT