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