* configure.in: Call AM_PROG_CC_STDC, to see what flags we should
[bpt/guile.git] / configure.in
1 dnl configuration script for Guile
2 dnl Process this file with autoconf to produce configure.
3 dnl
4 dnl Copyright (C) 1998 Free Software Foundation, Inc.
5 dnl
6 dnl This file is part of GUILE
7 dnl
8 dnl GUILE is free software; you can redistribute it and/or modify it
9 dnl under the terms of the GNU General Public License as published by
10 dnl the Free Software Foundation; either version 2, or (at your
11 dnl option) any later version.
12 dnl
13 dnl GUILE is distributed in the hope that it will be useful, but
14 dnl WITHOUT ANY WARRANTY; without even the implied warranty of
15 dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 dnl General Public License for more details.
17 dnl
18 dnl You should have received a copy of the GNU General Public License
19 dnl along with GUILE; see the file COPYING. If not, write to the
20 dnl Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 dnl Boston, MA 02111-1307, USA.
22
23 AC_INIT(Makefile.in)
24 . $srcdir/GUILE-VERSION
25 AM_INIT_AUTOMAKE($PACKAGE, $VERSION, no-define)
26 AM_MAINTAINER_MODE
27 AM_CONFIG_HEADER(libguile/scmconfig.h)
28
29 #--------------------------------------------------------------------
30 #
31 # User options
32 #
33 #--------------------------------------------------------------------
34
35 AC_ARG_ENABLE(dynamic-linking,
36 [ --enable-dynamic-linking Include support for dynamic linking],,
37 enable_dynamic_linking=yes)
38
39 AC_ARG_ENABLE(guile-debug,
40 [ --enable-guile-debug Include internal debugging functions])
41 if test "$enableval" = y || test "$enableval" = yes; then
42 AC_DEFINE(GUILE_DEBUG)
43 fi
44
45 dnl The --disable-debug used to control these two. But now they are
46 dnl a required part of the distribution.
47 AC_DEFINE(DEBUG_EXTENSIONS)
48 AC_DEFINE(READER_EXTENSIONS)
49
50 #--------------------------------------------------------------------
51
52 AC_PROG_CC
53 AC_PROG_CPP
54 AM_PROG_LIBTOOL
55
56 AC_AIX
57 AC_ISC_POSIX
58 AC_MINIX
59
60 AM_PROG_CC_STDC
61
62 AC_C_CONST
63 AC_C_INLINE
64
65 AC_HEADER_STDC
66 AC_HEADER_DIRENT
67 AC_HEADER_TIME
68 AC_HEADER_SYS_WAIT
69 AC_CHECK_HEADERS(libc.h limits.h malloc.h memory.h string.h regex.h rxposix.h rx/rxposix.h sys/ioctl.h sys/select.h sys/time.h sys/timeb.h sys/times.h sys/types.h sys/utime.h time.h unistd.h utime.h)
70 GUILE_HEADER_LIBC_WITH_UNISTD
71
72 AC_TYPE_GETGROUPS
73 AC_TYPE_SIGNAL
74 AC_TYPE_MODE_T
75
76 AC_CHECK_LIB(m, main)
77 AC_CHECK_FUNCS(gethostbyname)
78 if test $ac_cv_func_gethostbyname = no; then
79 AC_CHECK_LIB(nsl, gethostbyname)
80 fi
81 AC_CHECK_FUNCS(connect)
82 if test $ac_cv_func_connect = no; then
83 AC_CHECK_LIB(socket, connect)
84 fi
85 AC_CHECK_LIB(termcap, tgoto)
86 AC_CHECK_LIB(readline, readline)
87 AC_CHECK_FUNCS(rl_clear_signals rl_cleanup_after_signal)
88
89 AC_CACHE_CHECK([for rl_getc_function pointer in readline],
90 ac_cv_var_rl_getc_function,
91 [AC_TRY_LINK([
92 #include <stdio.h>
93 #include <readline/readline.h>],
94 [rl_getc_function;],
95 [ac_cv_var_rl_getc_function=yes],
96 [ac_cv_var_rl_getc_function=no])])
97 if test "$ac_cv_var_rl_getc_function" = "yes"; then
98 AC_DEFINE(HAVE_RL_GETC_FUNCTION)
99 fi
100
101 if test $ac_cv_lib_readline_readline = yes -a $ac_cv_var_rl_getc_function = no; then
102 echo 'Warning: libreadline is too old on your system. Need >= 2.1.'
103 fi
104
105 # Checks for dynamic linking
106
107 if test "$enable_dynamic_linking" = "yes"; then
108
109 AC_CHECK_LIB(dl,dlopen)
110 if test "$ac_cv_lib_dl_dlopen" = "yes"; then
111 AC_CHECK_FUNCS(dlopen)
112 AC_DEFINE(DYNAMIC_LINKING)
113 else
114 AC_CHECK_LIB(dld,dld_link)
115 if test "$ac_cv_lib_dld_dld_link" = "yes"; then
116 AC_DEFINE(DYNAMIC_LINKING)
117 else
118 AC_CHECK_FUNCS(shl_load)
119 if test "$ac_cv_func_shl_load" = "yes"; then
120 AC_DEFINE(DYNAMIC_LINKING)
121 else
122 AC_CHECK_FUNCS(dlopen)
123 if test "$ac_cv_func_dlopen" = "yes"; then
124 AC_DEFINE(DYNAMIC_LINKING)
125 fi
126 fi
127 fi
128 fi
129
130 fi
131
132 GUILE_DLSYM_USCORE
133
134 AC_CHECK_FUNCS(ctermid ftime getcwd geteuid gethostent gettimeofday lstat mkdir mknod nice readlink rename rmdir select setegid seteuid setlocale setpgid setsid sigaction strftime strptime symlink sync tcgetpgrp tcsetpgrp times uname waitpid bzero strdup system usleep)
135
136 ### Some systems don't declare some functions. On such systems, we
137 ### need to at least provide our own K&R-style declarations.
138
139 ### GUILE_FUNC_DECLARED(function, headerfile)
140
141 ### Check for a declaration of FUNCTION in HEADERFILE; if it is
142 ### not there, #define MISSING_FUNCTION_DECL.
143 AC_DEFUN(GUILE_FUNC_DECLARED, [
144 AC_CACHE_CHECK(for $1 declaration, guile_cv_func_$1_declared,
145 AC_EGREP_HEADER($1, $2,
146 guile_cv_func_$1_declared=yes,
147 guile_cv_func_$1_declared=no))
148 if test [x$guile_cv_func_]$1[_declared] = xno; then
149 AC_DEFINE([MISSING_]translit($1, [a-z], [A-Z])[_DECL])
150 fi
151 ])
152
153 GUILE_FUNC_DECLARED(strptime, time.h)
154 GUILE_FUNC_DECLARED(bzero, string.h)
155 GUILE_FUNC_DECLARED(sleep, unistd.h)
156 GUILE_FUNC_DECLARED(usleep, unistd.h)
157
158 ### On some systems usleep has no return value. If it does have one,
159 ### we'd like to return it; otherwise, we'll fake it.
160 AC_CACHE_CHECK([return type of usleep], guile_cv_func_usleep_return_type,
161 [AC_EGREP_HEADER(changequote(<, >)<void[ ]+usleep>changequote([, ]),
162 /usr/include/unistd.h,
163 [guile_cv_func_usleep_return_type=void],
164 [guile_cv_func_usleep_return_type=int])])
165 case "$guile_cv_func_usleep_return_type" in
166 "void" )
167 AC_DEFINE(USLEEP_RETURNS_VOID)
168 ;;
169 esac
170
171 dnl <GNU-WIN32 hacks>
172
173 AC_CHECK_HEADER(sys/un.h, have_sys_un_h=1)
174 if test -n "$have_sys_un_h" ; then
175 AC_DEFINE(HAVE_UNIX_DOMAIN_SOCKETS)
176 fi
177
178 AC_CHECK_FUNCS(socketpair getgroups setpwent pause tzset)
179
180 dnl I don't know what this prefixing of cygwin32_ is for.
181 dnl scmconfig.h wasn't updated with the test results.
182 dnl so use AC_CHECK_FUNCS for now.
183
184 dnl how about:
185 dnl save confdefs.h
186 dnl if test $ac_cv_cigwin = yes; then
187 dnl modify confdefs.h
188 dnl fi
189 dnl AC_CHECK_FUNCS...
190 dnl restore confdefs.h
191
192 dnl cp confdefs.h confdefs.h.bak
193 dnl for func in sethostent endhostent getnetent setnetent endnetent getprotoent endprotoent getservent endservent getnetbyaddr getnetbyname inet_lnaof inet_makeaddr inet_netof ; do
194 dnl cp confdefs.h.bak confdefs.h
195 dnl cat >> confdefs.h << EOF
196 dnl #ifdef __CYGWIN32__
197 dnl #define $func cygwin32_$func
198 dnl #endif
199 dnl EOF
200 dnl AC_CHECK_FUNC($func)
201 dnl done
202 dnl cp confdefs.h.bak confdefs.h
203
204 AC_CHECK_FUNCS(sethostent endhostent getnetent setnetent endnetent getprotoent endprotoent getservent endservent getnetbyaddr getnetbyname inet_lnaof inet_makeaddr inet_netof)
205
206 dnl </GNU-WIN32 hacks>
207
208 AC_CACHE_CHECK([for restartable system calls], scm_cv_restarts,
209 if test $ac_cv_func_sigaction = yes; then
210 [AC_TRY_COMPILE([#include <signal.h>],
211 [int a = SA_RESTART],
212 scm_cv_restarts=yes,
213 scm_cv_restarts=no)]
214 else
215 scm_cv_restarts=no
216 fi)
217 if test $scm_cv_restarts = yes; then
218 AC_DEFINE(HAVE_RESTARTS)
219 fi
220
221 if test "$ac_cv_header_regex_h" = yes ||
222 test "$ac_cv_header_rxposix_h" = yes ||
223 test "$ac_cv_header_rx_rxposix_h" = yes; then
224 GUILE_NAMED_CHECK_FUNC(regcomp, norx, [LIBOBJS="regex-posix.o $LIBOBJS"],
225 [AC_CHECK_LIB(rx, main)
226 GUILE_NAMED_CHECK_FUNC(regcomp, rx, [LIBOBJS="regex-posix.o $LIBOBJS"])]
227 )
228 dnl The following should not be necessary, but for some reason
229 dnl autoheader misses it if we don't include it!
230 if test "$ac_cv_func_regcomp_norx" = yes ||
231 test "$ac_cv_func_regcomp_rx" = yes; then
232 AC_DEFINE(HAVE_REGCOMP)
233 fi
234 fi
235
236 AC_REPLACE_FUNCS(inet_aton putenv strerror)
237
238 # When testing for the presence of alloca, we need to add alloca.o
239 # explicitly to LIBOBJS to make sure that it is translated to
240 # `alloca.lo' for libtool later on. This can and should be done more cleanly.
241 AC_FUNC_ALLOCA
242 if test "$ALLOCA" = "alloca.o"; then LIBOBJS="alloca.o $LIBOBJS"; fi
243
244 AC_STRUCT_ST_RDEV
245 AC_STRUCT_ST_BLKSIZE
246
247 # We could use AC_STRUCT_ST_BLOCKS here, but that adds fileblocks.o to
248 # LIBOBJS, which we don't need. This seems more direct.
249 AC_CACHE_CHECK([for st_blocks in struct stat], ac_cv_struct_st_blocks,
250 [AC_TRY_COMPILE([#include <sys/types.h>
251 #include <sys/stat.h>], [struct stat s; s.st_blocks;],
252 ac_cv_struct_st_blocks=yes, ac_cv_struct_st_blocks=no)])
253 if test $ac_cv_struct_st_blocks = yes; then
254 AC_DEFINE(HAVE_ST_BLOCKS)
255 fi
256
257 AC_STRUCT_TIMEZONE
258 GUILE_STRUCT_UTIMBUF
259
260 #--------------------------------------------------------------------
261 #
262 # Which way does the stack grow?
263 #
264 #--------------------------------------------------------------------
265
266 AC_TRY_RUN(aux (l) unsigned long l;
267 { int x; exit (l >= ((unsigned long)&x)); }
268 main () { int q; aux((unsigned long)&q); },
269 AC_DEFINE(SCM_STACK_GROWS_UP),,AC_MSG_WARN(Guessing that stack grows down -- see scmconfig.h.in))
270
271 AC_CACHE_CHECK([whether floats fit in longs], guile_cv_type_float_fits_long,
272 [AC_TRY_RUN([main () { exit (sizeof(float) > sizeof(long)); }],
273 [guile_cv_type_float_fits_long=yes],
274 [guile_cv_type_float_fits_long=no],
275 [guile_cv_type_float_fits_long=guess-yes])])
276 case $guile_cv_type_float_fits_long in
277 "yes" )
278 AC_DEFINE(SCM_SINGLES)
279 ;;
280 "guess-yes" )
281 AC_DEFINE(SCM_SINGLES)
282 AC_MSG_WARN([guessing that sizeof(long) == sizeof(float)])
283 AC_MSG_WARN([see SCM_SINGLES in scmconfig.h.in])
284 ;;
285 esac
286
287
288 AC_MSG_CHECKING(for struct linger)
289 AC_CACHE_VAL(scm_cv_struct_linger,
290 AC_TRY_COMPILE([
291 #include <sys/types.h>
292 #include <sys/socket.h>],
293 [struct linger lgr; lgr.l_linger = 100],
294 scm_cv_struct_linger="yes",
295 scm_cv_struct_linger="no"))
296 AC_MSG_RESULT($scm_cv_struct_linger)
297 if test $scm_cv_struct_linger = yes; then
298 AC_DEFINE(HAVE_STRUCT_LINGER)
299 fi
300
301 #--------------------------------------------------------------------
302 #
303 # How can you violate a stdio abstraction by setting a stream's fd?
304 #
305 #--------------------------------------------------------------------
306
307 AC_MSG_CHECKING(how to set a stream file descriptor)
308 AC_CACHE_VAL(scm_cv_fd_setter,
309 AC_TRY_COMPILE([#include <stdio.h>],
310 [stdout->_file = 1],
311 scm_cv_fd_setter="_file",
312 AC_TRY_COMPILE([#include <stdio.h>],
313 [stdout->__file = 1],
314 scm_cv_fd_setter="__file",
315 AC_TRY_COMPILE([#include <stdio.h>],
316 [stdout->_fileno = 1],
317 scm_cv_fd_setter="_fileno",
318 scm_cv_fd_setter=""))))
319
320 if test "$scm_cv_fd_setter"; then
321 AC_MSG_RESULT($scm_cv_fd_setter)
322 AC_DEFINE_UNQUOTED(FD_SETTER, $scm_cv_fd_setter)
323 else
324 AC_MSG_RESULT(we couldn't do it!)
325 fi
326
327 #--------------------------------------------------------------------
328 # How to find out whether a FILE structure contains buffered data.
329 # From Tk we have the following list:
330 # _cnt: Most UNIX systems
331 # __cnt: HPUX and SCO
332 # _r: BSD
333 # readCount: Sprite
334 # Or, in GNU libc there are two fields, _gptr and _egptr, which
335 # have to be compared.
336 # These can also be known as _IO_read_ptr and _IO_read_end.
337 #--------------------------------------------------------------------
338
339 AC_MSG_CHECKING(how to get buffer char count from FILE structure)
340 AC_CACHE_VAL(scm_cv_struct_file_count,
341 AC_TRY_COMPILE([#include <stdio.h>],
342 [FILE *f = stdin; f->_cnt = 0],
343 scm_cv_struct_file_count="_cnt",
344 AC_TRY_COMPILE([#include <stdio.h>],
345 [FILE *f = stdin; f->__cnt = 0],
346 scm_cv_struct_file_count="__cnt",
347 AC_TRY_COMPILE([#include <stdio.h>],
348 [FILE *f = stdin; f->_r = 0],
349 scm_cv_struct_file_count="_r",
350 AC_TRY_COMPILE([#include <stdio.h>],
351 [FILE *f = stdin; f->readCount = 0],
352 scm_cv_struct_file_count="readCount",
353 scm_cv_struct_file_count="")))))
354 if test "$scm_cv_struct_file_count"; then
355 AC_MSG_RESULT($scm_cv_struct_file_count)
356 AC_DEFINE_UNQUOTED(FILE_CNT_FIELD, $scm_cv_struct_file_count)
357 else
358 AC_CACHE_VAL(scm_cv_struct_file_gptr,
359 AC_TRY_COMPILE([#include <stdio.h>],
360 [FILE *f = stdin; f->_gptr = f->egptr;],
361 scm_cv_struct_file_gptr=1,
362 scm_cv_struct_file_gptr=""))
363 if test "$scm_cv_struct_gptr"; then
364 AC_MSG_RESULT(gptr)
365 AC_DEFINE_UNQUOTED(FILE_CNT_GPTR, $scm_cv_struct_file_gptr)
366 else
367 AC_CACHE_VAL(scm_cv_struct_file_readptr,
368 AC_TRY_COMPILE([#include <stdio.h>],
369 [FILE *f = stdin; f->_IO_read_ptr = f->_IO_read_end;],
370 scm_cv_struct_file_readptr=1))
371 if test "$scm_cv_struct_file_readptr"; then
372 AC_MSG_RESULT(read_ptr)
373 AC_DEFINE_UNQUOTED(FILE_CNT_READPTR, $scm_cv_struct_file_readptr)
374 else
375 AC_MSG_RESULT(we couldn't do it!)
376 fi
377 fi
378 fi
379
380 #--------------------------------------------------------------------
381 #
382 # Flags for thread support
383 #
384 #--------------------------------------------------------------------
385
386 ### What thread package has the user asked for?
387 AC_ARG_WITH(threads, [ --with-threads thread interface],
388 , with_threads=no)
389
390 ### Turn $with_threads into either the name of a threads package, like
391 ### `qt', or `no', meaning that threads should not be supported.
392 AC_MSG_CHECKING(whether to support threads)
393 case "$with_threads" in
394 "yes" | "qt" | "coop" | "")
395 with_threads=qt
396 ;;
397 "no" )
398 ;;
399 * )
400 AC_MSG_ERROR(invalid value for --with-threads: $with_threads)
401 ;;
402 esac
403 AC_MSG_RESULT($with_threads)
404
405 ## Make sure the threads package we've chosen is actually supported on
406 ## the present platform.
407 case "${with_threads}" in
408 "qt" )
409 ## This configures the QuickThreads package, and sets or clears
410 ## the THREAD_PACKAGE variable if qthreads don't configure
411 ## correctly.
412 QTHREADS_CONFIGURE
413 ;;
414 esac
415
416 ## If we're using threads, bring in some other parts of Guile which
417 ## work with them.
418 if test "${THREAD_PACKAGE}" != "" ; then
419 AC_DEFINE(USE_THREADS, 1)
420
421 ## Include the Guile thread interface in the library...
422 LIBOBJS="$LIBOBJS threads.o"
423
424 ## ... and tell it which package to talk to.
425 case "${THREAD_PACKAGE}" in
426 "QT" )
427 AC_DEFINE(USE_COOP_THREADS, 1)
428 ;;
429 * )
430 AC_MSG_ERROR(invalid value for THREAD_PACKAGE: ${THREAD_PACKAGE})
431 ;;
432 esac
433
434 ## Bring in scm_internal_select, if appropriate.
435 if test $ac_cv_func_gettimeofday = yes &&
436 test $ac_cv_func_select = yes; then
437 LIBOBJS="$LIBOBJS iselect.o"
438 AC_DEFINE(GUILE_ISELECT, 1)
439 fi
440 fi
441
442 ## If we're using GCC, ask for aggressive warnings.
443 case "$GCC" in
444 yes )
445 ## We had -Wstrict-prototypes in here for a bit, but Guile does too
446 ## much stuff with generic function pointers for that to really be
447 ## less than exasperating.
448 CFLAGS="$CFLAGS -Wall -Wpointer-arith -Wmissing-prototypes" ;;
449 esac
450
451 AC_PROG_AWK
452
453 ## If we're creating a shared library (using libtool!), then we'll
454 ## need to generate a list of .lo files corresponding to the .o files
455 ## given in LIBOBJS. We'll call it LIBLOBJS.
456 LIBLOBJS="`echo ${LIBOBJS} | sed 's/\.o/.lo/g'`"
457
458 AC_SUBST(GUILE_MAJOR_VERSION)
459 AC_SUBST(GUILE_MINOR_VERSION)
460 AC_SUBST(GUILE_VERSION)
461
462 dnl Tell guile-config what flags guile users should link against.
463 GUILE_LIBS="$LDFLAGS $THREAD_LIBS_INSTALLED $LIBS"
464 AC_SUBST(GUILE_LIBS)
465
466 dnl timestamping the interpreter and scheme libraries:
467 dnl
468 dnl Help us notice when we're running one version of the Guile
469 dnl interpreter against a different version of the ice-9 Scheme code.
470 dnl This will definitely detect version skew due to differing
471 dnl snapshots and releases, but may not catch skew for the developers.
472 dnl Hopefully it will not detect skew when there is none; if that
473 dnl happens, the warnings will be useless, and we should remove this.
474 GUILE_STAMP="`date`"
475 AC_SUBST(GUILE_STAMP)
476
477 AC_SUBST(AWK)
478 AC_SUBST(LIBLOBJS)
479
480 AC_OUTPUT([Makefile libguile/Makefile libguile/guile-snarf libguile/versiondat.h ice-9/Makefile ice-9/version.scm qt/Makefile qt/qt.h qt/md/Makefile qt/time/Makefile guile-config/Makefile doc/Makefile], [chmod +x libguile/guile-snarf])
481
482 dnl Local Variables:
483 dnl comment-start: "dnl "
484 dnl comment-end: ""
485 dnl comment-start-skip: "\\bdnl\\b\\s *"
486 dnl End: