Use Gnulib's `git-version-gen'.
[bpt/guile.git] / configure.ac
CommitLineData
777b022a
JB
1dnl configuration script for Guile
2dnl Process this file with autoconf to produce configure.
50848747 3dnl
a73256d0
KR
4
5define(GUILE_CONFIGURE_COPYRIGHT,[[
6
75c242a2 7Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
a73256d0
KR
8
9This file is part of GUILE
10
53befeb7
NJ
11GUILE is free software; you can redistribute it and/or modify it under
12the terms of the GNU Lesser General Public License as published by the
13Free Software Foundation; either version 3, or (at your option) any
14later version.
a73256d0 15
53befeb7
NJ
16GUILE is distributed in the hope that it will be useful, but WITHOUT
17ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
19License for more details.
a73256d0 20
53befeb7
NJ
21You should have received a copy of the GNU Lesser General Public
22License along with GUILE; see the file COPYING.LESSER. If not, write
23to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
24Floor, Boston, MA 02110-1301, USA.
a73256d0
KR
25
26]])
50848747 27
4bdc8fb5 28AC_PREREQ(2.61)
237b3247 29
0c1eb9b6 30AC_INIT([GNU Guile],
db10a69b
LC
31 m4_esyscmd([build-aux/git-version-gen \
32 .tarball-version \
33 's/^release_\([0-9]\+\)-\([0-9]\+\)-\([0-9]\+\)-/v\1.\2\.\3-/g']),
2039f7be 34 [bug-guile@gnu.org])
f6b4d9b4
LC
35AC_CONFIG_AUX_DIR([build-aux])
36AC_CONFIG_MACRO_DIR([m4])
5ae51dad 37AC_CONFIG_SRCDIR(GUILE-VERSION)
f6b4d9b4 38
db10a69b 39AM_INIT_AUTOMAKE([gnu no-define -Wall -Wno-override])
5ae51dad 40
a73256d0 41AC_COPYRIGHT(GUILE_CONFIGURE_COPYRIGHT)
8907576f 42AC_CONFIG_SRCDIR([GUILE-VERSION])
5ae51dad 43
2d26def0 44. $srcdir/GUILE-VERSION
db10a69b 45GUILE_VERSION="$PACKAGE_VERSION"
5ae51dad 46
4bdc8fb5 47AC_CONFIG_HEADERS([config.h])
a73256d0 48AH_TOP(/*GUILE_CONFIGURE_COPYRIGHT*/)
2d26def0 49
a6be66ed
RB
50#--------------------------------------------------------------------
51
4bdc8fb5
LC
52AC_LANG([C])
53
a6be66ed 54dnl Some more checks for Win32
4bdc8fb5
LC
55AC_CANONICAL_HOST
56
a6be66ed
RB
57AC_LIBTOOL_WIN32_DLL
58
59AC_PROG_INSTALL
60AC_PROG_CC
6caac03c 61gl_EARLY
a6be66ed 62AC_PROG_CPP
c2be4e89 63AC_PROG_SED
a6be66ed
RB
64AC_PROG_AWK
65
6caac03c
LC
66dnl Gnulib.
67gl_INIT
a6be66ed 68
4bdc8fb5
LC
69AC_PROG_CC_C89
70
45c0ff10
KR
71# for per-target cflags in the libguile subdir
72AM_PROG_CC_C_O
a6be66ed
RB
73
74AC_LIBTOOL_DLOPEN
c78a96e0 75AC_PROG_LIBTOOL
a98dbc87
MV
76AC_CHECK_LIB([ltdl], [lt_dlinit], ,
77 [AC_MSG_ERROR([libltdl not found. See README.])])
96e3f63a
LC
78AC_CHECK_HEADER([ltdl.h], [],
79 [AC_MSG_ERROR([<ltdl.h> not found. See README.])])
a6be66ed
RB
80
81AC_CHECK_PROG(have_makeinfo, makeinfo, yes, no)
82AM_CONDITIONAL(HAVE_MAKEINFO, test "$have_makeinfo" = yes)
83
d995da7f
NJ
84AM_PATH_LISPDIR
85
d7a22073
LC
86AC_DEFINE_UNQUOTED([HOST_TYPE], ["$host"],
87 [Define to the host's GNU triplet.])
88
0e8a8468 89#--------------------------------------------------------------------
3a629497 90#
a6be66ed 91# User options (after above tests that may set default CFLAGS etc.)
3a629497
JB
92#
93#--------------------------------------------------------------------
86789f9b 94
13922e3f 95GUILE_ERROR_ON_WARNING="no"
bdcccc18 96
8afd1a2a
RB
97AC_ARG_ENABLE(error-on-warning,
98 [ --enable-error-on-warning treat compile warnings as errors],
99 [case "${enableval}" in
bdcccc18
RB
100 yes | y) GUILE_ERROR_ON_WARNING="yes" ;;
101 no | n) GUILE_ERROR_ON_WARNING="no" ;;
8afd1a2a
RB
102 *) AC_MSG_ERROR(bad value ${enableval} for --enable-error-on-warning) ;;
103 esac])
104
cf890744 105AC_ARG_ENABLE(debug-malloc,
e73dd549 106 [ --enable-debug-malloc include malloc debugging code],
cf890744 107 if test "$enable_debug_malloc" = y || test "$enable_debug_malloc" = yes; then
feef98f2 108 AC_DEFINE([GUILE_DEBUG_MALLOC], 1,
eede3dbc 109 [Define this if you want to debug scm_must_malloc/realloc/free calls.])
cf890744
MD
110 fi)
111
9a52bc2a 112SCM_I_GSC_GUILE_DEBUG=0
62002dcb 113AC_ARG_ENABLE(guile-debug,
4bdc8fb5 114 [AS_HELP_STRING([--enable-guile-debug],
9a52bc2a 115 [include internal debugging functions])],
62002dcb 116 if test "$enable_guile_debug" = y || test "$enable_guile_debug" = yes; then
9a52bc2a 117 SCM_I_GSC_GUILE_DEBUG=1
62002dcb
MD
118 fi)
119
52cfc69b
GH
120AC_ARG_ENABLE(posix,
121 [ --disable-posix omit posix interfaces],,
122 enable_posix=yes)
123
124AC_ARG_ENABLE(networking,
dc914156 125 [ --disable-networking omit networking interfaces],,
52cfc69b
GH
126 enable_networking=yes)
127
128AC_ARG_ENABLE(regex,
129 [ --disable-regex omit regular expression interfaces],,
130 enable_regex=yes)
131
f5922e27 132AC_ARG_ENABLE([discouraged],
4bdc8fb5 133 AS_HELP_STRING([--disable-discouraged],[omit discouraged features]))
f5922e27
MV
134
135if test "$enable_discouraged" = no; then
136 SCM_I_GSC_ENABLE_DISCOURAGED=0
137else
138 SCM_I_GSC_ENABLE_DISCOURAGED=1
139fi
140
9a52bc2a 141AC_ARG_ENABLE([deprecated],
4bdc8fb5 142 AS_HELP_STRING([--disable-deprecated],[omit deprecated features]))
eede3dbc 143
e73dd549 144if test "$enable_deprecated" = no; then
9a52bc2a 145 SCM_I_GSC_ENABLE_DEPRECATED=0
6ab8238d 146 warn_default=no
e73dd549
MV
147else
148 if test "$enable_deprecated" = yes || test "$enable_deprecated" = ""; then
94a0d885
MV
149 warn_default=summary
150 elif test "$enable_deprecated" = shutup; then
151 warn_default=no
152 else
153 warn_default=$enable_deprecated
e73dd549 154 fi
9a52bc2a 155 SCM_I_GSC_ENABLE_DEPRECATED=1
e73dd549 156fi
feef98f2 157AC_DEFINE_UNQUOTED([SCM_WARN_DEPRECATED_DEFAULT], "$warn_default",
6ab8238d 158[Define this to control the default warning level for deprecated features.])
e73dd549 159
d05bcb2e
NJ
160dnl Added the following configure option in January 2008 following
161dnl investigation of problems with "64" system and library calls on
162dnl Darwin (MacOS X). The libguile code (_scm.h) assumes that if a
163dnl system has stat64, it will have all the other 64 APIs too; but on
164dnl Darwin, stat64 is there but other APIs are missing.
165dnl
166dnl It also appears, from the Darwin docs, that most system call APIs
167dnl there (i.e. the traditional ones _without_ "64" in their names) have
168dnl been 64-bit-capable for a long time now, so it isn't necessary to
169dnl use "64" versions anyway. For example, Darwin's off_t is 64-bit.
170dnl
171dnl A similar problem has been reported for HP-UX:
172dnl http://www.nabble.com/Building-guile-1.8.2-on-hpux-td13106681.html
173dnl
174dnl Therefore, and also because a Guile without LARGEFILE64 support is
175dnl better than no Guile at all, we provide this option to suppress
176dnl trying to use "64" calls.
177dnl
178dnl It may be that for some 64-bit function on Darwin/HP-UX we do need
179dnl to use a "64" call, and hence that by using --without-64-calls we're
180dnl missing out on that. If so, someone can work on that in the future.
181dnl For now, --without-64-calls allows Guile to build on OSs where it
182dnl wasn't building before.
4b26c03e 183AC_MSG_CHECKING([whether to use system and library "64" calls])
d05bcb2e 184AC_ARG_WITH([64-calls],
4bdc8fb5 185 AS_HELP_STRING([--without-64-calls],
d05bcb2e
NJ
186 [don't attempt to use system and library calls with "64" in their names]),
187 [use_64_calls=$withval],
188 [use_64_calls=yes
189 case $host in
190 *-apple-darwin* )
191 use_64_calls=no
192 ;;
32b164aa
NJ
193 powerpc-ibm-aix* )
194 use_64_calls=no
195 ;;
d05bcb2e 196 esac])
4b26c03e 197AC_MSG_RESULT($use_64_calls)
d05bcb2e
NJ
198case "$use_64_calls" in
199 y* )
feef98f2 200 AC_DEFINE([GUILE_USE_64_CALLS], 1,
d05bcb2e
NJ
201 [Define to 1 in order to try to use "64" versions of system and library calls.])
202 ;;
203esac
204
a44e61ac
MV
205#--------------------------------------------------------------------
206
4f6f9ae3
GH
207dnl Check for dynamic linking
208
209use_modules=yes
210AC_ARG_WITH(modules,
211[ --with-modules[=FILES] Add support for dynamic modules],
212use_modules="$withval")
213test -z "$use_modules" && use_modules=yes
214DLPREOPEN=
215if test "$use_modules" != no; then
4f6f9ae3
GH
216 if test "$use_modules" = yes; then
217 DLPREOPEN="-dlpreopen force"
218 else
219 DLPREOPEN="-export-dynamic"
220 for module in $use_modules; do
221 DLPREOPEN="$DLPREOPEN -dlopen $module"
222 done
223 fi
224fi
225
52cfc69b
GH
226dnl files which are destined for separate modules.
227
4f6f9ae3
GH
228if test "$use_modules" != no; then
229 AC_LIBOBJ([dynl])
230fi
231
52cfc69b 232if test "$enable_posix" = yes; then
eede3dbc
RB
233 AC_LIBOBJ([filesys])
234 AC_LIBOBJ([posix])
feef98f2 235 AC_DEFINE([HAVE_POSIX], 1,
eede3dbc 236 [Define this if you want support for POSIX system calls in Guile.])
52cfc69b
GH
237fi
238
239if test "$enable_networking" = yes; then
eede3dbc
RB
240 AC_LIBOBJ([net_db])
241 AC_LIBOBJ([socket])
feef98f2 242 AC_DEFINE([HAVE_NETWORKING], 1,
eede3dbc 243 [Define this if you want support for networking in Guile.])
52cfc69b
GH
244fi
245
cf890744 246if test "$enable_debug_malloc" = yes; then
eede3dbc 247 AC_LIBOBJ([debug-malloc])
cf890744
MD
248fi
249
9a5fa6e9 250AC_CHECK_LIB(uca, __uc_get_ar_bsp)
3d1a89b9 251
3a629497 252AC_C_CONST
5b079b46 253
b3aa4626
KR
254# "volatile" is used in a couple of tests below.
255AC_C_VOLATILE
256
9a52bc2a 257AC_C_INLINE
5bd732c9 258if test "$ac_cv_c_inline" != no; then
9a52bc2a
RB
259 SCM_I_GSC_C_INLINE="\"${ac_cv_c_inline}\""
260else
261 SCM_I_GSC_C_INLINE=NULL
5bd732c9 262fi
9a5fa6e9 263AC_CHECK_LIB(uca, __uc_get_ar_bsp)
5bd732c9 264
9a52bc2a
RB
265AC_C_BIGENDIAN
266
659b4611
AW
267AC_C_LABELS_AS_VALUES
268
9a52bc2a
RB
269AC_CHECK_SIZEOF(char)
270AC_CHECK_SIZEOF(unsigned char)
813b3dd4 271AC_CHECK_SIZEOF(short)
9a52bc2a 272AC_CHECK_SIZEOF(unsigned short)
9dec9737 273AC_CHECK_SIZEOF(int)
9a52bc2a 274AC_CHECK_SIZEOF(unsigned int)
9dec9737 275AC_CHECK_SIZEOF(long)
9a52bc2a 276AC_CHECK_SIZEOF(unsigned long)
813b3dd4 277AC_CHECK_SIZEOF(size_t)
813b3dd4 278AC_CHECK_SIZEOF(long long)
9a52bc2a 279AC_CHECK_SIZEOF(unsigned long long)
fcc5d734
SJ
280AC_CHECK_SIZEOF(__int64)
281AC_CHECK_SIZEOF(unsigned __int64)
1be6b49c 282AC_CHECK_SIZEOF(void *)
9a52bc2a
RB
283AC_CHECK_SIZEOF(intptr_t)
284AC_CHECK_SIZEOF(uintptr_t)
285AC_CHECK_SIZEOF(ptrdiff_t)
d20008c0 286AC_CHECK_SIZEOF(size_t)
4f416616 287AC_CHECK_SIZEOF(off_t)
1be6b49c 288
f3f70257
ML
289if test "$ac_cv_sizeof_long" -ne "$ac_cv_sizeof_void_p"; then
290 AC_MSG_ERROR(sizes of long and void* are not identical)
9dec9737 291fi
3a629497 292
c134fe9d 293if test "$ac_cv_sizeof_ptrdiff_t" -ne 0; then
9a52bc2a
RB
294 SCM_I_GSC_T_PTRDIFF='"ptrdiff_t"'
295else
296 SCM_I_GSC_T_PTRDIFF='"long"'
297fi
298AC_SUBST([SCM_I_GSC_T_PTRDIFF])
299
300AC_CHECK_HEADERS([stdint.h])
301AC_CHECK_HEADERS([inttypes.h])
302
d20008c0
MV
303AC_CHECK_SIZEOF(intmax_t)
304
9a52bc2a
RB
305SCM_I_GSC_NEEDS_STDINT_H=0
306SCM_I_GSC_NEEDS_INTTYPES_H=0
307
308### intptr and uintptr (try not to use inttypes if we don't have to)
309if test "$ac_cv_header_inttypes_h" = yes; then
310 if test "$ac_cv_sizeof_intptr_t" -eq 0; then
311 AC_CHECK_SIZEOF([intptr_t],,[#include <inttypes.h>
312#include <stdio.h>])
313 if test "$ac_cv_sizeof_intptr_t" -ne 0; then
314 SCM_I_GSC_NEEDS_INTTYPES_H=1
315 fi
316 fi
317 if test "$ac_cv_sizeof_uintptr_t" -eq 0; then
318 AC_CHECK_SIZEOF([uintptr_t],,[#include <inttypes.h>
319#include <stdio.h>])
320 if test "$ac_cv_sizeof_uintptr_t" -ne 0; then
321 SCM_I_GSC_NEEDS_INTTYPES_H=1
322 fi
323 fi
324fi
325
326### See what's provided by stdint.h
327if test "$ac_cv_header_stdint_h" = yes; then
328 AC_CHECK_TYPE([int8_t],[scm_stdint_has_int8=1],,[#include <stdint.h>])
329 AC_CHECK_TYPE([uint8_t],[scm_stdint_has_uint8=1],,[#include <stdint.h>])
330 AC_CHECK_TYPE([int16_t],[scm_stdint_has_int16=1],,[#include <stdint.h>])
331 AC_CHECK_TYPE([uint16_t],[scm_stdint_has_uint16=1],,[#include <stdint.h>])
332 AC_CHECK_TYPE([int32_t],[scm_stdint_has_int32=1],,[#include <stdint.h>])
333 AC_CHECK_TYPE([uint32_t],[scm_stdint_has_uint32=1],,[#include <stdint.h>])
334 AC_CHECK_TYPE([int64_t],[scm_stdint_has_int64=1],,[#include <stdint.h>])
335 AC_CHECK_TYPE([uint64_t],[scm_stdint_has_uint64=1],,[#include <stdint.h>])
eb1f89f6
MV
336 AC_CHECK_TYPE([intmax_t],[scm_stdint_has_intmax=1],,[#include <stdint.h>])
337 AC_CHECK_TYPE([uintmax_t],[scm_stdint_has_uintmax=1],,[#include <stdint.h>])
114bc68a
LC
338 AC_CHECK_TYPE([intptr_t],[scm_stdint_has_intptr=1],,[#include <stdint.h>])
339 AC_CHECK_TYPE([uintptr_t],[scm_stdint_has_uintptr=1],,[#include <stdint.h>])
9a52bc2a
RB
340fi
341
342# so we don't get confused by the cache (wish there was a better way
343# to check particular headers for the same type...)
344
345unset ac_cv_type_int8_t
346unset ac_cv_type_uint8_t
347unset ac_cv_type_int16_t
348unset ac_cv_type_uint16_t
349unset ac_cv_type_int32_t
350unset ac_cv_type_uint32_t
351unset ac_cv_type_int64_t
352unset ac_cv_type_uint64_t
eb1f89f6
MV
353unset ac_cv_type_intmax_t
354unset ac_cv_type_uintmax_t
9a52bc2a
RB
355
356### See what's provided by inttypes.h
357if test "$ac_cv_header_inttypes_h" = yes; then
358 AC_CHECK_TYPE([int8_t],[scm_inttypes_has_int8=1],,[#include <inttypes.h>])
359 AC_CHECK_TYPE([uint8_t],[scm_inttypes_has_uint8=1],,[#include <inttypes.h>])
360 AC_CHECK_TYPE([int16_t],[scm_inttypes_has_int16=1],,[#include <inttypes.h>])
361 AC_CHECK_TYPE([uint16_t],[scm_inttypes_has_uint16=1],,[#include <inttypes.h>])
362 AC_CHECK_TYPE([int32_t],[scm_inttypes_has_int32=1],,[#include <inttypes.h>])
363 AC_CHECK_TYPE([uint32_t],[scm_inttypes_has_uint32=1],,[#include <inttypes.h>])
364 AC_CHECK_TYPE([int64_t],[scm_inttypes_has_int64=1],,[#include <inttypes.h>])
365 AC_CHECK_TYPE([uint64_t],[scm_inttypes_has_uint64=1],,[#include <inttypes.h>])
eb1f89f6
MV
366 AC_CHECK_TYPE([intmax_t],[scm_inttypes_has_intmax=1],,[#include <inttypes.h>])
367 AC_CHECK_TYPE([uintmax_t],[scm_inttypes_has_uintmax=1],,[#include <inttypes.h>])
114bc68a
LC
368 AC_CHECK_TYPE([intptr_t],[scm_inttypes_has_intptr=1],,[#include <inttypes.h>])
369 AC_CHECK_TYPE([uintptr_t],[scm_inttypes_has_uintptr=1],,[#include <inttypes.h>])
9a52bc2a
RB
370fi
371
372# Try hard to find definitions for some required scm_t_*int* types.
373
374### Required type scm_t_int8
6aa84fdd 375if test "$scm_stdint_has_int8"; then
9a52bc2a
RB
376 SCM_I_GSC_T_INT8='"int8_t"'
377 SCM_I_GSC_NEEDS_STDINT_H=1
378elif test "$scm_inttypes_has_int8"; then
379 SCM_I_GSC_T_INT8='"int8_t"'
380 SCM_I_GSC_NEEDS_INTTYPES_H=1
6aa84fdd
MV
381elif test "$ac_cv_sizeof_char" -eq 1; then
382 SCM_I_GSC_T_INT8='"signed char"'
9a52bc2a
RB
383else
384 AC_MSG_ERROR([Can't find appropriate type for scm_t_int8.])
385fi
386AC_SUBST([SCM_I_GSC_T_INT8])
387
388### Required type scm_t_uint8
6aa84fdd 389if test "$scm_stdint_has_uint8"; then
9a52bc2a
RB
390 SCM_I_GSC_T_UINT8='"uint8_t"'
391 SCM_I_GSC_NEEDS_STDINT_H=1
392elif test "$scm_inttypes_has_uint8"; then
393 SCM_I_GSC_T_UINT8='"uint8_t"'
394 SCM_I_GSC_NEEDS_INTTYPES_H=1
6aa84fdd
MV
395elif test "$ac_cv_sizeof_unsigned_char" -eq 1; then
396 SCM_I_GSC_T_UINT8='"unsigned char"'
9a52bc2a
RB
397else
398 AC_MSG_ERROR([Can't find appropriate type for scm_t_uint8.])
399fi
400AC_SUBST([SCM_I_GSC_T_UINT8])
9a52bc2a
RB
401
402### Required type scm_t_int16 (ANSI C says int or short might work)
6aa84fdd 403if test "$scm_stdint_has_int16"; then
9a52bc2a
RB
404 SCM_I_GSC_T_INT16='"int16_t"'
405 SCM_I_GSC_NEEDS_STDINT_H=1
406elif test "$scm_inttypes_has_int16"; then
407 SCM_I_GSC_T_INT16='"int16_t"'
408 SCM_I_GSC_NEEDS_INTTYPES_H=1
6aa84fdd
MV
409elif test "$ac_cv_sizeof_int" -eq 2; then
410 SCM_I_GSC_T_INT16='"int"'
6aa84fdd
MV
411elif test "$ac_cv_sizeof_short" -eq 2; then
412 SCM_I_GSC_T_INT16='"short"'
9a52bc2a
RB
413else
414 AC_MSG_ERROR([Can't find appropriate type for scm_t_int16.])
415fi
416AC_SUBST([SCM_I_GSC_T_INT16])
417
418### Required type scm_t_uint16 (ANSI C says int or short might work)
6aa84fdd 419if test "$scm_stdint_has_uint16"; then
9a52bc2a
RB
420 SCM_I_GSC_T_UINT16='"uint16_t"'
421 SCM_I_GSC_NEEDS_STDINT_H=1
422elif test "$scm_inttypes_has_uint16"; then
423 SCM_I_GSC_T_UINT16='"uint16_t"'
424 SCM_I_GSC_NEEDS_INTTYPES_H=1
6aa84fdd
MV
425elif test "$ac_cv_sizeof_unsigned_int" -eq 2; then
426 SCM_I_GSC_T_UINT16='"unsigned int"'
6aa84fdd
MV
427elif test "$ac_cv_sizeof_unsigned_short" -eq 2; then
428 SCM_I_GSC_T_UINT16='"unsigned short"'
9a52bc2a
RB
429else
430 AC_MSG_ERROR([Can't find appropriate type for scm_t_uint16.])
431fi
432AC_SUBST([SCM_I_GSC_T_UINT16])
433
434
435### Required type scm_t_int32 (ANSI C says int, short, or long might work)
6aa84fdd 436if test "$scm_stdint_has_int32"; then
9a52bc2a
RB
437 SCM_I_GSC_T_INT32='"int32_t"'
438 SCM_I_GSC_NEEDS_STDINT_H=1
439elif test "$scm_inttypes_has_int32"; then
440 SCM_I_GSC_T_INT32='"int32_t"'
441 SCM_I_GSC_NEEDS_INTTYPES_H=1
6aa84fdd
MV
442elif test "$ac_cv_sizeof_int" -eq 4; then
443 SCM_I_GSC_T_INT32='"int"'
6aa84fdd
MV
444elif test "$ac_cv_sizeof_long" -eq 4; then
445 SCM_I_GSC_T_INT32='"long"'
6aa84fdd
MV
446elif test "$ac_cv_sizeof_short" -eq 4; then
447 SCM_I_GSC_T_INT32='"short"'
9a52bc2a
RB
448else
449 AC_MSG_ERROR([Can't find appropriate type for scm_t_int32.])
450fi
451AC_SUBST([SCM_I_GSC_T_INT32])
452
453### Required type scm_t_uint32 (ANSI C says int, short, or long might work)
6aa84fdd 454if test "$scm_stdint_has_uint32"; then
9a52bc2a
RB
455 SCM_I_GSC_T_UINT32='"uint32_t"'
456 SCM_I_GSC_NEEDS_STDINT_H=1
457elif test "$scm_inttypes_has_uint32"; then
458 SCM_I_GSC_T_UINT32='"uint32_t"'
459 SCM_I_GSC_NEEDS_INTTYPES_H=1
6aa84fdd
MV
460elif test "$ac_cv_sizeof_unsigned_int" -eq 4; then
461 SCM_I_GSC_T_UINT32='"unsigned int"'
6aa84fdd
MV
462elif test "$ac_cv_sizeof_unsigned_long" -eq 4; then
463 SCM_I_GSC_T_UINT32='"unsigned long"'
6aa84fdd
MV
464elif test "$ac_cv_sizeof_unsigned_short" -eq 4; then
465 SCM_I_GSC_T_UINT32='"unsigned short"'
9a52bc2a
RB
466else
467 AC_MSG_ERROR([Can't find appropriate type for scm_t_uint32.])
468fi
469AC_SUBST([SCM_I_GSC_T_UINT32])
470
a6be66ed 471### Optional type scm_t_int64 (ANSI C says int, short, or long might work)
fcc5d734 472### Also try 'long long' and '__int64' if we have it.
9a52bc2a 473SCM_I_GSC_T_INT64=0
6aa84fdd
MV
474if test "$scm_stdint_has_int64"; then
475 SCM_I_GSC_T_INT64='"int64_t"'
6aa84fdd
MV
476 SCM_I_GSC_NEEDS_STDINT_H=1
477elif test "$scm_inttypes_has_int64"; then
478 SCM_I_GSC_T_INT64='"int64_t"'
6aa84fdd
MV
479 SCM_I_GSC_NEEDS_INTTYPES_H=1
480elif test "$ac_cv_sizeof_int" -eq 8; then
9a52bc2a
RB
481 SCM_I_GSC_T_INT64='"int"'
482elif test "$ac_cv_sizeof_long" -eq 8; then
483 SCM_I_GSC_T_INT64='"long"'
484elif test "$ac_cv_sizeof_short" -eq 8; then
485 SCM_I_GSC_T_INT64='"short"'
486elif test "$ac_cv_sizeof_long_long" -eq 8; then
487 SCM_I_GSC_T_INT64='"long long"'
fcc5d734
SJ
488elif test "$ac_cv_sizeof___int64" -eq 8; then
489 SCM_I_GSC_T_INT64='"__int64"'
9a52bc2a
RB
490else
491 AC_MSG_ERROR([Can't find appropriate type for scm_t_int64.])
492fi
493AC_SUBST([SCM_I_GSC_T_INT64])
6aa84fdd 494
9a52bc2a 495
a6be66ed 496### Optional type scm_t_uint64 (ANSI C says int, short, or long might work)
fcc5d734 497### Also try 'long long' and '__int64' if we have it.
9a52bc2a 498SCM_I_GSC_T_UINT64=0
6aa84fdd
MV
499if test "$scm_stdint_has_uint64"; then
500 SCM_I_GSC_T_UINT64='"uint64_t"'
6aa84fdd
MV
501 SCM_I_GSC_NEEDS_STDINT_H=1
502elif test "$scm_inttypes_has_uint64"; then
503 SCM_I_GSC_T_UINT64='"uint64_t"'
6aa84fdd
MV
504 SCM_I_GSC_NEEDS_INTTYPES_H=1
505elif test "$ac_cv_sizeof_unsigned_int" -eq 8; then
9a52bc2a
RB
506 SCM_I_GSC_T_UINT64='"unsigned int"'
507elif test "$ac_cv_sizeof_unsigned_long" -eq 8; then
508 SCM_I_GSC_T_UINT64='"unsigned long"'
509elif test "$ac_cv_sizeof_unsigned_short" -eq 8; then
510 SCM_I_GSC_T_UINT64='"unsigned short"'
511elif test "$ac_cv_sizeof_unsigned_long_long" -eq 8; then
512 SCM_I_GSC_T_UINT64='"unsigned long long"'
fcc5d734
SJ
513elif test "$ac_cv_sizeof_unsigned___int64" -eq 8; then
514 SCM_I_GSC_T_UINT64='"unsigned __int64"'
9a52bc2a
RB
515else
516 AC_MSG_ERROR([Can't find appropriate type for scm_t_uint64.])
517fi
518AC_SUBST([SCM_I_GSC_T_UINT64])
519
eb1f89f6
MV
520### Required type scm_t_intmax
521###
522### We try 'intmax_t', '__int64', 'long long' in this order. When
523### none of them is available, we use 'long'.
524###
525SCM_I_GSC_T_INTMAX=0
526if test "$scm_stdint_has_intmax"; then
527 SCM_I_GSC_T_INTMAX='"intmax_t"'
528 SCM_I_GSC_NEEDS_STDINT_H=1
529elif test "$scm_inttypes_has_intmax"; then
530 SCM_I_GSC_T_INTMAX='"intmax_t"'
531 SCM_I_GSC_NEEDS_INTTYPES_H=1
532elif test "$ac_cv_sizeof___int64" -ne 0; then
533 SCM_I_GSC_T_INTMAX='"__int64"'
534elif test "$ac_cv_sizeof_long_long" -ne 0; then
535 SCM_I_GSC_T_INTMAX='"long long"'
536else
537 SCM_I_GSC_T_INTMAX='"long"'
538fi
539AC_SUBST([SCM_I_GSC_T_INTMAX])
540
541### Required type scm_t_uintmax
542###
543### We try 'uintmax_t', 'unsigned __int64', 'unsigned long long' in
544### this order. When none of them is available, we use 'unsigned long'.
545###
546SCM_I_GSC_T_UINTMAX=0
547if test "$scm_stdint_has_uintmax"; then
548 SCM_I_GSC_T_UINTMAX='"uintmax_t"'
549 SCM_I_GSC_NEEDS_STDINT_H=1
550elif test "$scm_inttypes_has_uintmax"; then
551 SCM_I_GSC_T_UINTMAX='"uintmax_t"'
552 SCM_I_GSC_NEEDS_INTTYPES_H=1
553elif test "$ac_cv_sizeof_unsigned___int64" -ne 0; then
554 SCM_I_GSC_T_UINTMAX='"unsigned __int64"'
555elif test "$ac_cv_sizeof_unsigned_long_long" -ne 0; then
556 SCM_I_GSC_T_UINTMAX='"unsigned long long"'
557else
558 SCM_I_GSC_T_UINTMAX='"unsigned long"'
559fi
560AC_SUBST([SCM_I_GSC_T_UINTMAX])
561
114bc68a
LC
562### Required type scm_t_intptr
563###
564SCM_I_GSC_T_INTPTR=0
565if test "$scm_stdint_has_intptr"; then
566 SCM_I_GSC_T_INTPTR='"intptr_t"'
567 SCM_I_GSC_NEEDS_STDINT_H=1
568elif test "$scm_inttypes_has_intptr"; then
569 SCM_I_GSC_T_INTPTR='"intptr_t"'
570 SCM_I_GSC_NEEDS_INTTYPES_H=1
571elif test "$ac_cv_sizeof_int" = "$ac_cv_sizeof_void_p"; then
572 SCM_I_GSC_T_INTPTR='"int"'
573elif test "$ac_cv_sizeof_long" = "$ac_cv_sizeof_void_p"; then
574 SCM_I_GSC_T_INTPTR='"long"'
575elif test "$ac_cv_sizeof_long_long" = "$ac_cv_sizeof_void_p"; then
576 SCM_I_GSC_T_INTPTR='"long long"'
577else
578 AC_MSG_ERROR([Can't find appropriate type for `scm_t_intptr'.])
579fi
580AC_SUBST([SCM_I_GSC_T_INTPTR])
581
582### Required type scm_t_uintptr
583###
584SCM_I_GSC_T_UINTPTR=0
585if test "$scm_stdint_has_uintptr"; then
586 SCM_I_GSC_T_UINTPTR='"uintptr_t"'
587 SCM_I_GSC_NEEDS_STDINT_H=1
588elif test "$scm_inttypes_has_uintptr"; then
589 SCM_I_GSC_T_UINTPTR='"uintptr_t"'
590 SCM_I_GSC_NEEDS_INTTYPES_H=1
591elif test "$ac_cv_sizeof_int" = "$ac_cv_sizeof_void_p"; then
592 SCM_I_GSC_T_UINTPTR='"unsigned int"'
593elif test "$ac_cv_sizeof_long" = "$ac_cv_sizeof_void_p"; then
594 SCM_I_GSC_T_UINTPTR='"unsigned long"'
595elif test "$ac_cv_sizeof_long_long" = "$ac_cv_sizeof_void_p"; then
596 SCM_I_GSC_T_UINTPTR='"unsigned long long"'
597else
598 AC_MSG_ERROR([Can't find appropriate type for `scm_t_uintptr'.])
599fi
600AC_SUBST([SCM_I_GSC_T_UINTPTR])
601
9a52bc2a
RB
602
603AC_SUBST([SCM_I_GSC_NEEDS_STDINT_H])
604AC_SUBST([SCM_I_GSC_NEEDS_INTTYPES_H])
605
3a629497 606AC_HEADER_STDC
3a629497
JB
607AC_HEADER_TIME
608AC_HEADER_SYS_WAIT
450be18d
LC
609AC_HEADER_DIRENT
610
611# Reason for checking:
612#
613# HP-UX 11.11 (at least) doesn't provide `struct dirent64', even
614# with `_LARGEFILE64_SOURCE', so check whether it's available.
615#
616AC_CHECK_MEMBER([struct dirent64.d_name],
617 [SCM_I_GSC_HAVE_STRUCT_DIRENT64=1], [SCM_I_GSC_HAVE_STRUCT_DIRENT64=0],
618 [ #ifndef _LARGEFILE64_SOURCE
619 # define _LARGEFILE64_SOURCE
620 #endif
621
622 /* Per Autoconf manual. */
623 #include <sys/types.h>
624 #ifdef HAVE_DIRENT_H
625 # include <dirent.h>
626 #else
627 # define dirent direct
628 # ifdef HAVE_SYS_NDIR_H
629 # include <sys/ndir.h>
630 # endif
631 # ifdef HAVE_SYS_DIR_H
632 # include <sys/dir.h>
633 # endif
634 # ifdef HAVE_NDIR_H
635 # include <ndir.h>
636 # endif
637 #endif ])
638AC_SUBST([SCM_I_GSC_HAVE_STRUCT_DIRENT64])
bdcccc18 639
63177e46 640# Reasons for testing:
8ab3d8a0 641# complex.h - new in C99
63177e46 642# fenv.h - available in C99, but not older systems
66818dbb
LC
643# machine/fpu.h - on Tru64 5.1b, the declaration of fesetround(3) is in
644# this file instead of <fenv.h>
45c0ff10 645# process.h - mingw specific
a2f00b9b 646# langinfo.h, nl_types.h - SuS v2
63177e46 647#
45c0ff10 648AC_CHECK_HEADERS([complex.h fenv.h io.h libc.h limits.h malloc.h memory.h process.h string.h \
bdcccc18
RB
649regex.h rxposix.h rx/rxposix.h sys/dir.h sys/ioctl.h sys/select.h \
650sys/time.h sys/timeb.h sys/times.h sys/stdtypes.h sys/types.h \
651sys/utime.h time.h unistd.h utime.h pwd.h grp.h sys/utsname.h \
66818dbb 652direct.h langinfo.h nl_types.h machine/fpu.h])
bdcccc18 653
56d288b8
LC
654# Reasons for testing:
655# nl_item - lacking on Cygwin
656AC_CHECK_TYPES([nl_item], [], [],
657 [[#ifdef HAVE_LANGINFO_H
658 # include <langinfo.h>
659 #endif
660 #ifdef HAVE_NL_TYPES_H
661 # include <nl_types.h>
662 #endif]])
663
8ab3d8a0
KR
664# "complex double" is new in C99, and "complex" is only a keyword if
665# <complex.h> is included
666AC_CHECK_TYPES(complex double,,,
667[#if HAVE_COMPLEX_H
668#include <complex.h>
669#endif])
670
4f416616
KR
671# On MacOS X <sys/socklen.h> contains socklen_t, so must include that
672# when testing.
673AC_CHECK_TYPE(socklen_t, ,
feef98f2 674 [AC_DEFINE_UNQUOTED([socklen_t], int,
4f416616
KR
675 [Define to `int' if <sys/socket.h> does not define.])],
676 [#if HAVE_SYS_TYPES_H
677#include <sys/types.h>
678#endif
679#include <sys/socket.h>
680])
681AC_CHECK_TYPE(struct ip_mreq)
682
3a629497
JB
683GUILE_HEADER_LIBC_WITH_UNISTD
684
685AC_TYPE_GETGROUPS
686AC_TYPE_SIGNAL
687AC_TYPE_MODE_T
688
45c0ff10
KR
689# On mingw -lm is empty, so this test is unnecessary, but it's
690# harmless so we don't hard-code to suppress it.
691#
692AC_CHECK_LIB(m, cos)
693
4c787b52 694AC_CHECK_FUNCS(gethostbyname)
5852c051
JB
695if test $ac_cv_func_gethostbyname = no; then
696 AC_CHECK_LIB(nsl, gethostbyname)
697fi
39e8f371 698
4c787b52 699AC_CHECK_FUNCS(connect)
5852c051
JB
700if test $ac_cv_func_connect = no; then
701 AC_CHECK_LIB(socket, connect)
702fi
5ee74cec 703
f9e5e096
MV
704dnl
705dnl Check for Winsock and other functionality on Win32 (*not* CygWin)
706dnl
707EXTRA_DEFS=""
45c0ff10
KR
708case $host in
709 *-*-mingw*)
6812c28f 710 AC_CHECK_HEADER(winsock2.h, [AC_DEFINE([HAVE_WINSOCK2_H], 1,
f9e5e096
MV
711 [Define if you have the <winsock2.h> header file.])])
712 AC_CHECK_LIB(ws2_32, main)
eede3dbc
RB
713 AC_LIBOBJ([win32-uname])
714 AC_LIBOBJ([win32-dirent])
b4e15479 715 if test "$enable_networking" = yes ; then
eede3dbc 716 AC_LIBOBJ([win32-socket])
b4e15479
SJ
717 fi
718 if test "$enable_shared" = yes ; then
8f99e3f3 719 EXTRA_DEFS="-DSCM_IMPORT"
feef98f2 720 AC_DEFINE([USE_DLL_IMPORT], 1,
8f99e3f3 721 [Define if you need additional CPP macros on Win32 platforms.])
f9e5e096 722 fi
45c0ff10
KR
723 ;;
724esac
f9e5e096 725AC_SUBST(EXTRA_DEFS)
f9e5e096 726
ef73a2a0
KR
727# Reasons for testing:
728# crt_externs.h - Darwin specific
729#
730AC_CHECK_HEADERS([assert.h crt_externs.h])
bdcccc18 731
ef73a2a0 732# Reasons for testing:
1df72834
KR
733# DINFINITY - OSF specific
734# DQNAN - OSF specific
735# (DINFINITY and DQNAN are actually global variables, not functions)
8ab3d8a0 736# chsize - an MS-DOS-ism, found in mingw
b69471c1
KR
737# cexp, clog - not in various pre-c99 systems, and note that it's possible
738# for gcc to provide the "complex double" type but the system to not
739# have functions like cexp and clog
8ab3d8a0 740# clog10 - not in mingw (though others like clog and csqrt are)
63177e46 741# fesetround - available in C99, but not older systems
8ab3d8a0
KR
742# ftruncate - posix, but probably not older systems (current mingw
743# has it as an inline for chsize)
23f2b9a3 744# ioctl - not in mingw.
c9d1dcc0 745# gmtime_r - recent posix, not on old systems
45c0ff10
KR
746# pipe - not in mingw
747# _pipe - specific to mingw, taking 3 args
66ec83c9 748# readdir_r - recent posix, not on old systems
450be18d 749# readdir64_r - not available on HP-UX 11.11
4f416616 750# stat64 - SuS largefile stuff, not on old systems
6b01eac9 751# sysconf - not on old systems
8ab3d8a0 752# truncate - not in mingw
a17d2654 753# isblank - available as a GNU extension or in C99
ef73a2a0 754# _NSGetEnviron - Darwin specific
a2f00b9b
LC
755# strcoll_l, newlocale - GNU extensions (glibc), also available on Darwin
756# nl_langinfo - X/Open, not available on Windows.
06bfe276 757# utimensat: posix.1-2008
ef73a2a0 758#
06bfe276 759AC_CHECK_FUNCS([DINFINITY DQNAN cexp chsize clog clog10 ctermid fesetround ftime ftruncate fchown getcwd geteuid getsid gettimeofday gmtime_r ioctl lstat mkdir mknod nice pipe _pipe readdir_r readdir64_r readlink rename rmdir select setegid seteuid setlocale setpgid setsid sigaction siginterrupt stat64 strftime strptime symlink sync sysconf tcgetpgrp tcsetpgrp times uname waitpid strdup system usleep atexit on_exit chown link fcntl ttyname getpwent getgrent kill getppid getpgrp fork setitimer getitimer strchr strcmp index bcopy memcpy rindex truncate unsetenv isblank _NSGetEnviron strcoll strcoll_l newlocale nl_langinfo utimensat])
64e121dc 760
6b01eac9
KR
761# Reasons for testing:
762# netdb.h - not in mingw
763# sys/param.h - not in mingw
45c0ff10
KR
764# pthread.h - only available with pthreads. ACX_PTHREAD doesn't
765# check this specifically, we need it for the timespec test below.
8ab3d8a0
KR
766# sethostname - the function itself check because it's not in mingw,
767# the DECL is checked because Solaris 10 doens't have in any header
ca329120
LC
768# hstrerror - on Tru64 5.1b the symbol is available in libc but the
769# declaration isn't anywhere.
5f380d71
LC
770# cuserid - on Tru64 5.1b the declaration is documented to be available
771# only with `_XOPEN_SOURCE' or some such.
6b01eac9 772#
414e4441 773AC_CHECK_HEADERS([crypt.h netdb.h pthread.h sys/param.h sys/resource.h sys/file.h])
94e6d793 774AC_CHECK_FUNCS(chroot flock getlogin cuserid getpriority setpriority getpass sethostname gethostname)
5f380d71 775AC_CHECK_DECLS([sethostname, hstrerror, cuserid])
63271ac5
KR
776
777# crypt() may or may not be available, for instance in some countries there
778# are restrictions on cryptography.
779#
780# crypt() might be in libc (eg. OpenBSD), or it might be in a separate
781# -lcrypt library (eg. Debian GNU/Linux).
782#
783# On HP-UX 11, crypt() is in libc and there's a dummy libcrypt.a. We must
784# be careful to avoid -lcrypt in this case, since libtool will see there's
785# only a static libcrypt and decide to build only a static libguile.
786#
787# AC_SEARCH_LIBS lets us add -lcrypt to LIBS only if crypt() is not in the
788# libraries already in that list.
789#
790AC_SEARCH_LIBS(crypt, crypt,
feef98f2 791 [AC_DEFINE([HAVE_CRYPT],1,
63271ac5 792 [Define to 1 if you have the `crypt' function.])])
94e6d793 793
8cd5eae9
NJ
794# When compiling with GCC on some OSs (Solaris, AIX), _Complex_I doesn't
795# work; in the reported cases so far, 1.0fi works well instead. According
796# to the C99 spec, the complex.h header must provide a working definition
797# of _Complex_I, so we always try _Complex_I first. The 1.0fi fallback
798# is a workaround for the failure of some systems to conform to C99.
4b26c03e
NJ
799if test "$ac_cv_type_complex_double" = yes; then
800 AC_MSG_CHECKING([for i])
4bdc8fb5 801 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
4b26c03e
NJ
802#if HAVE_COMPLEX_H
803#include <complex.h>
804#endif
805complex double z;
4bdc8fb5 806]], [[
4b26c03e 807z = _Complex_I;
4bdc8fb5 808]])],
feef98f2 809 [AC_DEFINE([GUILE_I],_Complex_I,[The imaginary unit (positive square root of -1).])
4bdc8fb5
LC
810 AC_MSG_RESULT([_Complex_I])],
811 [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
4b26c03e
NJ
812#if HAVE_COMPLEX_H
813#include <complex.h>
814#endif
815complex double z;
4bdc8fb5 816]],[[
4b26c03e 817z = 1.0fi;
4bdc8fb5 818]])],
feef98f2 819 [AC_DEFINE([GUILE_I],1.0fi)
4bdc8fb5
LC
820 AC_MSG_RESULT([1.0fi])],
821 [ac_cv_type_complex_double=no
822 AC_MSG_RESULT([not available])])])
4b26c03e
NJ
823fi
824
8ab3d8a0
KR
825# glibc 2.3.6 (circa 2006) and various prior versions had a bug where
826# csqrt(-i) returned a negative real part, when it should be positive
827# for the principal root.
828#
829if test "$ac_cv_type_complex_double" = yes; then
1d8ce4c0 830
8ab3d8a0
KR
831 AC_CACHE_CHECK([whether csqrt is usable],
832 guile_cv_use_csqrt,
4bdc8fb5 833 [AC_RUN_IFELSE([AC_LANG_SOURCE([[
8ab3d8a0
KR
834#include <complex.h>
835/* "volatile" is meant to prevent gcc from calculating the sqrt as a
836 constant, we want to test libc. */
837volatile complex double z = - _Complex_I;
838int
839main (void)
840{
841 z = csqrt (z);
842 if (creal (z) > 0.0)
843 return 0; /* good */
844 else
845 return 1; /* bad */
4bdc8fb5 846}]])],
8ab3d8a0
KR
847 [guile_cv_use_csqrt=yes],
848 [guile_cv_use_csqrt="no, glibc 2.3 bug"],
849 [guile_cv_use_csqrt="yes, hopefully (cross-compiling)"])])
850 case $guile_cv_use_csqrt in
851 yes*)
feef98f2 852 AC_DEFINE([HAVE_USABLE_CSQRT], 1, [Define to 1 if csqrt is bug-free])
8ab3d8a0
KR
853 ;;
854 esac
855fi
856
857
a6be66ed 858dnl GMP tests
db5034ab 859AC_LIB_HAVE_LINKFLAGS([gmp],
4bdc8fb5 860 [],
f4863880 861 [#include <gmp.h>],
db5034ab
LC
862 [mpz_import (0, 0, 0, 0, 0, 0, 0);])
863
864if test "x$HAVE_LIBGMP" != "xyes"; then
865 AC_MSG_ERROR([GNU MP 4.1 or greater not found, see README])
866fi
9f1555fe 867
18c73f8e 868dnl GNU libunistring is checked for by Gnulib's `libunistring' module.
b7b93288
LC
869if test "x$LTLIBUNISTRING" != "x"; then
870 LIBS="$LTLIBUNISTRING $LIBS"
871else
872 AC_MSG_ERROR([GNU libunistring is required, please install it.])
873fi
9f1555fe 874
75c242a2
AW
875dnl Libffi is needed to compile Guile's foreign function interface, but its
876dnl interface isn't exposed in Guile's API.
877PKG_CHECK_MODULES(LIBFFI, libffi)
878AC_SUBST(LIBFFI_CFLAGS)
879AC_SUBST(LIBFFI_LIBS)
880
881dnl figure out approriate ffi type for size_t
882AC_CHECK_SIZEOF(size_t)
883AC_CHECK_SIZEOF(ssize_t)
884ffi_size_type=uint$(($ac_cv_sizeof_size_t*8))
885ffi_ssize_type=sint$(($ac_cv_sizeof_ssize_t*8))
ac7b8e8e 886AC_DEFINE_UNQUOTED([ffi_type_size_t], ffi_type_${ffi_size_type},
75c242a2 887 [ffi type for size_t])
ac7b8e8e 888AC_DEFINE_UNQUOTED([ffi_type_ssize_t], ffi_type_${ffi_ssize_type},
75c242a2
AW
889 [ffi type for ssize_t])
890
83cd507c 891dnl i18n tests
b6540274
MV
892#AC_CHECK_HEADERS([libintl.h])
893#AC_CHECK_FUNCS(gettext)
894#if test $ac_cv_func_gettext = no; then
895# AC_CHECK_LIB(intl, gettext)
896#fi
897#AC_CHECK_FUNCS([bindtextdomain textdomain])
898AM_GNU_GETTEXT([external], [need-ngettext])
83cd507c 899
777b022a
JB
900### Some systems don't declare some functions. On such systems, we
901### need to at least provide our own K&R-style declarations.
902
903### GUILE_FUNC_DECLARED(function, headerfile)
904
905### Check for a declaration of FUNCTION in HEADERFILE; if it is
906### not there, #define MISSING_FUNCTION_DECL.
d70e0619 907AC_DEFUN([GUILE_FUNC_DECLARED], [
fc342a63 908 AC_CACHE_CHECK(for $1 declaration, guile_cv_func_$1_declared,
777b022a 909 AC_EGREP_HEADER($1, $2,
01e5e07e 910 guile_cv_func_$1_declared=yes,
fc342a63
JB
911 guile_cv_func_$1_declared=no))
912 if test [x$guile_cv_func_]$1[_declared] = xno; then
eede3dbc
RB
913 AC_DEFINE([MISSING_]translit($1, [a-z], [A-Z])[_DECL], 1,
914 [Define if the operating system supplies $1 without declaring it.])
777b022a
JB
915 fi
916])
917
c31bfb85 918GUILE_FUNC_DECLARED(sleep, unistd.h)
777b022a 919GUILE_FUNC_DECLARED(usleep, unistd.h)
e1a191a8 920
0777022d
KR
921AC_CHECK_DECLS([strptime],,,
922[#define _GNU_SOURCE /* ask glibc to give strptime prototype */
923#include <time.h>])
924
da753252
JB
925### On some systems usleep has no return value. If it does have one,
926### we'd like to return it; otherwise, we'll fake it.
fc342a63 927AC_CACHE_CHECK([return type of usleep], guile_cv_func_usleep_return_type,
c43f86c1 928 [AC_EGREP_HEADER(changequote(<, >)<void[ ]+usleep>changequote([, ]),
4874dfc8 929 unistd.h,
fc342a63
JB
930 [guile_cv_func_usleep_return_type=void],
931 [guile_cv_func_usleep_return_type=int])])
932case "$guile_cv_func_usleep_return_type" in
933 "void" )
feef98f2 934 AC_DEFINE([USLEEP_RETURNS_VOID], 1,
eede3dbc 935 [Define if the system headers declare usleep to return void.])
fc342a63
JB
936 ;;
937esac
938
da88f0cb
JB
939AC_CHECK_HEADER(sys/un.h, have_sys_un_h=1)
940if test -n "$have_sys_un_h" ; then
feef98f2 941 AC_DEFINE([HAVE_UNIX_DOMAIN_SOCKETS], 1,
eede3dbc 942 [Define if the system supports Unix-domain (file-domain) sockets.])
da88f0cb
JB
943fi
944
4ea9429e
AW
945AC_CHECK_FUNCS(getrlimit setrlimit)
946
d707b9df 947AC_CHECK_FUNCS(socketpair getgroups setgroups setpwent pause tzset)
da88f0cb 948
219a5a5b
JB
949AC_CHECK_FUNCS(sethostent gethostent endhostent dnl
950 setnetent getnetent endnetent dnl
951 setprotoent getprotoent endprotoent dnl
952 setservent getservent endservent dnl
5c11cc9d 953 getnetbyaddr getnetbyname dnl
8912421c 954 inet_lnaof inet_makeaddr inet_netof hstrerror)
da88f0cb 955
feef329e
KR
956# struct sockaddr field sin_len is only present on BSD systems.
957# On 4.4BSD apparently a #define SIN_LEN exists, but on other BSD systems
958# (eg. FreeBSD 4.9) it doesn't and we must use this configure check
959AC_CHECK_MEMBERS([struct sockaddr.sin_len],,,
960[#ifdef HAVE_SYS_TYPES_H
961#include <sys/types.h>
962#endif
963#include <netinet/in.h>])
964
d19c9767 965AC_MSG_CHECKING(for __libc_stack_end)
2e945bcc 966AC_CACHE_VAL(guile_cv_have_libc_stack_end,
4bdc8fb5
LC
967[AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>
968extern char *__libc_stack_end;]],
969 [[printf("%p", (char*) __libc_stack_end);]])],
970 [guile_cv_have_libc_stack_end=yes],
971 [guile_cv_have_libc_stack_end=no])])
2e945bcc
SJ
972AC_MSG_RESULT($guile_cv_have_libc_stack_end)
973
974if test $guile_cv_have_libc_stack_end = yes; then
feef98f2 975 AC_DEFINE([HAVE_LIBC_STACK_END], 1,
d19c9767
MV
976 [Define if you have the __libc_stack_end variable.])
977fi
978
08f980a4
GH
979dnl Some systems do not declare this. Some systems do declare it, as a
980dnl macro. With cygwin it may be in a DLL.
981
982AC_MSG_CHECKING(whether netdb.h declares h_errno)
983AC_CACHE_VAL(guile_cv_have_h_errno,
4bdc8fb5
LC
984 [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <netdb.h>]],
985 [[int a = h_errno;]])],
986 [guile_cv_have_h_errno=yes],
987 [guile_cv_have_h_errno=no])])
08f980a4
GH
988AC_MSG_RESULT($guile_cv_have_h_errno)
989if test $guile_cv_have_h_errno = yes; then
feef98f2 990 AC_DEFINE([HAVE_H_ERRNO], 1, [Define if h_errno is declared in netdb.h.])
08f980a4 991fi
da88f0cb 992
4f522b6f 993AC_MSG_CHECKING(whether uint32_t is defined)
c5316ea3 994AC_CACHE_VAL(guile_cv_have_uint32_t,
4bdc8fb5 995 [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
af68e5e5
SJ
996 #if HAVE_STDINT_H
997 #include <stdint.h>
998 #endif
45c0ff10 999 #ifndef HAVE_NETDB_H
af68e5e5 1000 #include <netdb.h>
4bdc8fb5
LC
1001 #endif]],
1002 [[uint32_t a;]])],
1003 [guile_cv_have_uint32_t=yes],
1004 [guile_cv_have_uint32_t=no])])
c5316ea3
GH
1005AC_MSG_RESULT($guile_cv_have_uint32_t)
1006if test $guile_cv_have_uint32_t = yes; then
feef98f2 1007 AC_DEFINE([HAVE_UINT32_T], 1,
eede3dbc 1008 [Define if uint32_t typedef is defined when netdb.h is include.])
c5316ea3
GH
1009fi
1010
018a53a1
GH
1011AC_MSG_CHECKING(for working IPv6 support)
1012AC_CACHE_VAL(guile_cv_have_ipv6,
4bdc8fb5 1013[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
8f16fe5a
MV
1014#ifdef HAVE_SYS_TYPES_H
1015#include <sys/types.h>
1016#endif
1017#include <netinet/in.h>
4bdc8fb5
LC
1018#include <sys/socket.h>]],
1019[[struct sockaddr_in6 a; a.sin6_family = AF_INET6;]])],
1020[guile_cv_have_ipv6=yes],
1021[guile_cv_have_ipv6=no])])
018a53a1
GH
1022AC_MSG_RESULT($guile_cv_have_ipv6)
1023if test $guile_cv_have_ipv6 = yes; then
feef98f2 1024 AC_DEFINE([HAVE_IPV6], 1, [Define if you want support for IPv6.])
018a53a1
GH
1025fi
1026
67641981
GH
1027# included in rfc2553 but not in older implementations, e.g., glibc 2.1.3.
1028AC_MSG_CHECKING(whether sockaddr_in6 has sin6_scope_id)
1029AC_CACHE_VAL(guile_cv_have_sin6_scope_id,
4bdc8fb5 1030[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
8f16fe5a
MV
1031#ifdef HAVE_SYS_TYPES_H
1032#include <sys/types.h>
1033#endif
4bdc8fb5
LC
1034#include <netinet/in.h>]],
1035[[struct sockaddr_in6 sok; sok.sin6_scope_id = 0;]])],
1036[guile_cv_have_sin6_scope_id=yes],
1037[guile_cv_have_sin6_scope_id=no])])
67641981
GH
1038AC_MSG_RESULT($guile_cv_have_sin6_scope_id)
1039if test $guile_cv_have_sin6_scope_id = yes; then
feef98f2 1040 AC_DEFINE([HAVE_SIN6_SCOPE_ID], 1,
eede3dbc 1041 [Define this if your IPv6 has sin6_scope_id in sockaddr_in6 struct.])
67641981
GH
1042fi
1043
feef329e
KR
1044# struct sockaddr_in6 field sin_len is only present on BSD systems
1045AC_CHECK_MEMBERS([struct sockaddr_in6.sin6_len],,,
1046[#ifdef HAVE_SYS_TYPES_H
1047#include <sys/types.h>
1048#endif
1049#include <netinet/in.h>])
1050
38c1d3c4
GH
1051AC_MSG_CHECKING(whether localtime caches TZ)
1052AC_CACHE_VAL(guile_cv_localtime_cache,
1053[if test x$ac_cv_func_tzset = xyes; then
4bdc8fb5 1054AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <time.h>
38c1d3c4
GH
1055#if STDC_HEADERS
1056# include <stdlib.h>
1057#endif
1058extern char **environ;
1059unset_TZ ()
1060{
1061 char **from, **to;
1062 for (to = from = environ; (*to = *from); from++)
1063 if (! (to[0][0] == 'T' && to[0][1] == 'Z' && to[0][2] == '='))
1064 to++;
1065}
1066char TZ_GMT0[] = "TZ=GMT0";
1067char TZ_PST8[] = "TZ=PST8";
1068main()
1069{
1070 time_t now = time ((time_t *) 0);
1071 int hour_GMT0, hour_unset;
1072 if (putenv (TZ_GMT0) != 0)
1073 exit (1);
1074 hour_GMT0 = localtime (&now)->tm_hour;
1075 unset_TZ ();
1076 hour_unset = localtime (&now)->tm_hour;
1077 if (putenv (TZ_PST8) != 0)
1078 exit (1);
1079 if (localtime (&now)->tm_hour == hour_GMT0)
1080 exit (1);
1081 unset_TZ ();
1082 if (localtime (&now)->tm_hour != hour_unset)
1083 exit (1);
1084 exit (0);
4bdc8fb5
LC
1085}]])],
1086[guile_cv_localtime_cache=no],
1087[guile_cv_localtime_cache=yes],
38c1d3c4
GH
1088[# If we have tzset, assume the worst when cross-compiling.
1089guile_cv_localtime_cache=yes])
1090else
1091 # If we lack tzset, report that localtime does not cache TZ,
1092 # since we can't invalidate the cache if we don't have tzset.
1093 guile_cv_localtime_cache=no
1094fi])dnl
1095AC_MSG_RESULT($guile_cv_localtime_cache)
1096if test $guile_cv_localtime_cache = yes; then
feef98f2 1097 AC_DEFINE([LOCALTIME_CACHE], 1, [Define if localtime caches the TZ setting.])
38c1d3c4
GH
1098fi
1099
52cfc69b
GH
1100if test "$enable_regex" = yes; then
1101 if test "$ac_cv_header_regex_h" = yes ||
1102 test "$ac_cv_header_rxposix_h" = yes ||
1103 test "$ac_cv_header_rx_rxposix_h" = yes; then
eede3dbc 1104 GUILE_NAMED_CHECK_FUNC(regcomp, norx, [AC_LIBOBJ([regex-posix])],
52cfc69b 1105 [AC_CHECK_LIB(rx, main)
eede3dbc 1106 GUILE_NAMED_CHECK_FUNC(regcomp, rx, [AC_LIBOBJ([regex-posix])],
f9e5e096 1107 [AC_CHECK_LIB(regex, main)
eede3dbc 1108 GUILE_NAMED_CHECK_FUNC(regcomp, regex, [AC_LIBOBJ([regex-posix])])])]
52cfc69b
GH
1109 )
1110 dnl The following should not be necessary, but for some reason
1111 dnl autoheader misses it if we don't include it!
1112 if test "$ac_cv_func_regcomp_norx" = yes ||
f9e5e096 1113 test "$ac_cv_func_regcomp_regex" = yes ||
52cfc69b 1114 test "$ac_cv_func_regcomp_rx" = yes; then
feef98f2 1115 AC_DEFINE([HAVE_REGCOMP], 1,
eede3dbc 1116 [This is included as part of a workaround for a autoheader bug.])
52cfc69b
GH
1117 fi
1118 fi
da88f0cb 1119fi
8e1bfcd0 1120
1bf291e4 1121AC_REPLACE_FUNCS([strerror memmove mkstemp])
3a629497 1122
594e69b7
MV
1123AC_CHECK_HEADERS(floatingpoint.h ieeefp.h nan.h)
1124
21b860c8
KR
1125# Reasons for testing:
1126# asinh, acosh, atanh, trunc - C99 standard, generally not available on
1127# older systems
1128# sincos - GLIBC extension
9af31eed 1129#
8ab3d8a0 1130AC_CHECK_FUNCS(asinh acosh atanh copysign finite sincos trunc)
4d0bfea1
KR
1131
1132# C99 specifies isinf and isnan as macros.
1133# HP-UX provides only macros, no functions.
c80bab35
KR
1134# glibc 2.3.2 provides both macros and functions.
1135# IRIX 6.5 and Solaris 8 only provide functions.
4d0bfea1 1136#
c80bab35
KR
1137# The following tests detect isinf and isnan either as functions or as
1138# macros from <math.h>. Plain AC_CHECK_FUNCS is insufficient, it doesn't
1139# use <math.h> so doesn't detect on macro-only systems like HP-UX.
4d0bfea1
KR
1140#
1141AC_MSG_CHECKING([for isinf])
b3aa4626
KR
1142AC_LINK_IFELSE(AC_LANG_SOURCE(
1143[[#include <math.h>
1144volatile double x = 0.0;
1145int main () { return (isinf(x) != 0); }]]),
4d0bfea1 1146 [AC_MSG_RESULT([yes])
feef98f2 1147 AC_DEFINE([HAVE_ISINF], 1,
4d0bfea1
KR
1148 [Define to 1 if you have the `isinf' macro or function.])],
1149 [AC_MSG_RESULT([no])])
1150AC_MSG_CHECKING([for isnan])
b3aa4626
KR
1151AC_LINK_IFELSE(AC_LANG_SOURCE(
1152[[#include <math.h>
1153volatile double x = 0.0;
1154int main () { return (isnan(x) != 0); }]]),
4d0bfea1 1155 [AC_MSG_RESULT([yes])
feef98f2 1156 AC_DEFINE([HAVE_ISNAN], 1,
4d0bfea1
KR
1157 [Define to 1 if you have the `isnan' macro or function.])],
1158 [AC_MSG_RESULT([no])])
594e69b7 1159
23f2b9a3
KR
1160# Reasons for checking:
1161#
1162# st_rdev
1163# st_blksize
1164# st_blocks not in mingw
8ab3d8a0 1165# tm_gmtoff BSD+GNU, not in C99
23f2b9a3
KR
1166#
1167# Note AC_STRUCT_ST_BLOCKS is not used here because we don't want the
1168# AC_LIBOBJ(fileblocks) replacement which that macro gives.
1169#
06bfe276
AW
1170AC_CHECK_MEMBERS([struct stat.st_rdev, struct stat.st_blksize, struct stat.st_blocks, struct stat.st_atim, struct stat.st_mtim, struct stat.st_ctim],,,
1171 [#define _GNU_SOURCE
1172AC_INCLUDES_DEFAULT
1173])
fd02f2ad 1174
3a629497 1175AC_STRUCT_TIMEZONE
8ab3d8a0
KR
1176AC_CHECK_MEMBERS([struct tm.tm_gmtoff],,,
1177[#include <time.h>
1178#ifdef TIME_WITH_SYS_TIME
1179# include <sys/time.h>
1180# include <time.h>
1181#else
1182# if HAVE_SYS_TIME_H
1183# include <sys/time.h>
1184# else
1185# include <time.h>
1186# endif
1187#endif
1188])
3a629497
JB
1189GUILE_STRUCT_UTIMBUF
1190
8ab3d8a0 1191
3a629497
JB
1192#--------------------------------------------------------------------
1193#
1194# Which way does the stack grow?
1195#
4696a666
NJ
1196# Following code comes from Autoconf 2.61's internal _AC_LIBOBJ_ALLOCA
1197# macro (/usr/share/autoconf/autoconf/functions.m4). Gnulib has
1198# very similar code, so in future we could look at using that.
1199#
1200# An important detail is that the code involves find_stack_direction
1201# calling _itself_ - which means that find_stack_direction (or at
1202# least the second find_stack_direction() call) cannot be inlined.
1203# If the code could be inlined, that might cause the test to give
1204# an incorrect answer.
3a629497
JB
1205#--------------------------------------------------------------------
1206
9a52bc2a 1207SCM_I_GSC_STACK_GROWS_UP=0
5ea8e76e 1208AC_RUN_IFELSE([AC_LANG_SOURCE(
4696a666
NJ
1209[AC_INCLUDES_DEFAULT
1210int
1211find_stack_direction ()
1212{
1213 static char *addr = 0;
1214 auto char dummy;
1215 if (addr == 0)
1216 {
1217 addr = &dummy;
1218 return find_stack_direction ();
1219 }
1220 else
1221 return (&dummy > addr) ? 1 : -1;
1222}
1223
1224int
1225main ()
1226{
1227 return find_stack_direction () < 0;
1228}])],
1229 [SCM_I_GSC_STACK_GROWS_UP=1],
1230 [],
5ea8e76e 1231 [AC_MSG_WARN(Guessing that stack grows down -- see scmconfig.h)])
eede3dbc 1232
26224b3f
LC
1233#--------------------------------------------------------------------
1234#
1235# Boehm's GC library
1236#
1237#--------------------------------------------------------------------
1f26b531
LC
1238PKG_CHECK_MODULES([BDW_GC], [bdw-gc])
1239
1240CFLAGS="$BDW_GC_CFLAGS $CFLAGS"
1241LIBS="$BDW_GC_LIBS $LIBS"
26224b3f 1242
9625c900
LC
1243# `GC_do_blocking ()' is available in GC 7.1 but not declared.
1244AC_CHECK_FUNCS([GC_do_blocking])
1245AC_CHECK_DECL([GC_do_blocking],
1246 [AC_DEFINE([HAVE_DECL_GC_DO_BLOCKING], [1],
1247 [Define this if the `GC_do_blocking ()' function is declared])],
1248 [],
1249 [#include <gc/gc.h>])
1250
3d1af79f
LC
1251# `GC_fn_type' is not available in GC 7.1 and earlier.
1252AC_CHECK_TYPE([GC_fn_type],
1253 [AC_DEFINE([HAVE_GC_FN_TYPE], [1],
1254 [Define this if the `GC_fn_type' type is available.])],
1255 [],
1256 [#include <gc/gc.h>])
1257
26224b3f 1258
a9e0a8af
KR
1259AC_CHECK_SIZEOF(float)
1260if test "$ac_cv_sizeof_float" -le "$ac_cv_sizeof_long"; then
feef98f2 1261 AC_DEFINE([SCM_SINGLES], 1,
a9e0a8af
KR
1262 [Define this if floats are the same size as longs.])
1263fi
3a629497
JB
1264
1265AC_MSG_CHECKING(for struct linger)
1266AC_CACHE_VAL(scm_cv_struct_linger,
4bdc8fb5 1267 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
3a629497 1268#include <sys/types.h>
4bdc8fb5
LC
1269#include <sys/socket.h>]],
1270 [[struct linger lgr; lgr.l_linger = 100]])],
1271 [scm_cv_struct_linger="yes"],
1272 [scm_cv_struct_linger="no"]))
3a629497
JB
1273AC_MSG_RESULT($scm_cv_struct_linger)
1274if test $scm_cv_struct_linger = yes; then
feef98f2 1275 AC_DEFINE([HAVE_STRUCT_LINGER], 1,
eede3dbc
RB
1276 [Define this if your system defines struct linger, for use with the
1277 getsockopt and setsockopt system calls.])
3a629497 1278fi
3a629497 1279
7534dfdc 1280
45c0ff10
KR
1281# On mingw, struct timespec is in <pthread.h>.
1282#
7534dfdc
MD
1283AC_MSG_CHECKING(for struct timespec)
1284AC_CACHE_VAL(scm_cv_struct_timespec,
4bdc8fb5 1285 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
45c0ff10
KR
1286#include <time.h>
1287#if HAVE_PTHREAD_H
1288#include <pthread.h>
4bdc8fb5
LC
1289#endif]], [[struct timespec t; t.tv_nsec = 100]])],
1290 [scm_cv_struct_timespec="yes"],
1291 [scm_cv_struct_timespec="no"]))
7534dfdc
MD
1292AC_MSG_RESULT($scm_cv_struct_timespec)
1293if test $scm_cv_struct_timespec = yes; then
feef98f2 1294 AC_DEFINE([HAVE_STRUCT_TIMESPEC], 1,
45c0ff10 1295 [Define this if your system defines struct timespec via either <time.h> or <pthread.h>.])
7534dfdc
MD
1296fi
1297
3a629497
JB
1298#--------------------------------------------------------------------
1299#
1300# Flags for thread support
1301#
1302#--------------------------------------------------------------------
1303
9a52bc2a
RB
1304SCM_I_GSC_USE_PTHREAD_THREADS=0
1305SCM_I_GSC_USE_NULL_THREADS=0
9a52bc2a
RB
1306AC_SUBST([SCM_I_GSC_USE_PTHREAD_THREADS])
1307AC_SUBST([SCM_I_GSC_USE_NULL_THREADS])
9a52bc2a 1308
539c89a1
JB
1309### What thread package has the user asked for?
1310AC_ARG_WITH(threads, [ --with-threads thread interface],
18622c4e 1311 , with_threads=yes)
539c89a1 1312
8ab3d8a0 1313AC_SUBST(SCM_I_GSC_NEED_BRACES_ON_PTHREAD_ONCE_INIT, 0)
66302618 1314AC_SUBST(SCM_I_GSC_NEED_BRACES_ON_PTHREAD_MUTEX_INITIALIZER, 0)
8ab3d8a0 1315
539c89a1 1316case "$with_threads" in
9bc4701c 1317 "yes" | "pthread" | "pthreads" | "pthread-threads" | "")
56ae2148
LC
1318
1319 build_pthread_support="yes"
1320
345b17e9
LC
1321 ACX_PTHREAD([CC="$PTHREAD_CC"
1322 LIBS="$PTHREAD_LIBS $LIBS"
1323 SCM_I_GSC_USE_PTHREAD_THREADS=1
1324 with_threads="pthreads"],
1325 [with_threads="null"
1326 build_pthread_support="no"])
49aaa6d2
MV
1327
1328 old_CFLAGS="$CFLAGS"
1329 CFLAGS="$PTHREAD_CFLAGS $CFLAGS"
8ab3d8a0
KR
1330
1331 # Reasons for testing:
1332 # pthread_getattr_np - "np" meaning "non portable" says it
1333 # all; not present on MacOS X or Solaris 10
45c0ff10
KR
1334 # pthread_get_stackaddr_np - "np" meaning "non portable" says it
1335 # all; specific to MacOS X
1336 # pthread_sigmask - not available on mingw
8ab3d8a0 1337 #
45c0ff10 1338 AC_CHECK_FUNCS(pthread_attr_getstack pthread_getattr_np pthread_get_stackaddr_np pthread_sigmask)
8ab3d8a0
KR
1339
1340 # On past versions of Solaris, believe 8 through 10 at least, you
1341 # had to write "pthread_once_t foo = { PTHREAD_ONCE_INIT };".
66302618 1342 # This is contrary to POSIX:
8ab3d8a0
KR
1343 # http://www.opengroup.org/onlinepubs/000095399/functions/pthread_once.html
1344 # Check here if this style is required.
1345 #
1346 # glibc (2.3.6 at least) works both with or without braces, so the
1347 # test checks whether it works without.
1348 #
66302618
LC
1349
1350 if test "$GCC" = "yes"; then
1351 # Since GCC only issues a warning for missing braces, so we need
1352 # `-Werror' to catch it.
1353 CFLAGS="-Werror -Wmissing-braces $CFLAGS"
1354 fi
1355
8ab3d8a0
KR
1356 AC_CACHE_CHECK([whether PTHREAD_ONCE_INIT needs braces],
1357 guile_cv_need_braces_on_pthread_once_init,
66302618
LC
1358 [AC_COMPILE_IFELSE([#include <pthread.h>
1359 pthread_once_t foo = PTHREAD_ONCE_INIT;],
8ab3d8a0
KR
1360 [guile_cv_need_braces_on_pthread_once_init=no],
1361 [guile_cv_need_braces_on_pthread_once_init=yes])])
1362 if test "$guile_cv_need_braces_on_pthread_once_init" = yes; then
1363 SCM_I_GSC_NEED_BRACES_ON_PTHREAD_ONCE_INIT=1
1364 fi
1365
66302618
LC
1366 # Same problem with `PTHREAD_MUTEX_INITIALIZER', e.g., on IRIX
1367 # 6.5.30m with GCC 3.3.
1368 AC_CACHE_CHECK([whether PTHREAD_MUTEX_INITIALIZER needs braces],
1369 guile_cv_need_braces_on_pthread_mutex_initializer,
1370 [AC_COMPILE_IFELSE([#include <pthread.h>
1371 pthread_mutex_t foo = PTHREAD_MUTEX_INITIALIZER;],
1372 [guile_cv_need_braces_on_pthread_mutex_initializer=no],
1373 [guile_cv_need_braces_on_pthread_mutex_initializer=yes])])
1374 if test "$guile_cv_need_braces_on_pthread_mutex_initializer" = yes; then
1375 SCM_I_GSC_NEED_BRACES_ON_PTHREAD_MUTEX_INITIALIZER=1
1376 fi
1377
49aaa6d2
MV
1378 CFLAGS="$old_CFLAGS"
1379
d707b9df
MV
1380 # On Solaris, sched_yield lives in -lrt.
1381 AC_SEARCH_LIBS(sched_yield, rt)
1382
539c89a1 1383 ;;
539c89a1 1384esac
3a629497 1385
18622c4e 1386case "$with_threads" in
9bc4701c 1387 "pthreads")
585356dc 1388 ;;
18622c4e 1389 "no" | "null")
9a52bc2a 1390 SCM_I_GSC_USE_NULL_THREADS=1
81adf76a 1391 SCM_I_GSC_HAVE_THREAD_STORAGE_CLASS=0
18622c4e 1392 with_threads="null-threads"
18306183 1393 ;;
585356dc 1394 * )
18622c4e 1395 AC_MSG_ERROR(invalid value for --with-threads: $with_threads)
585356dc
MV
1396 ;;
1397esac
539c89a1 1398
18622c4e
MV
1399AC_MSG_CHECKING(what kind of threads to support)
1400AC_MSG_RESULT($with_threads)
933a7411 1401
56ae2148
LC
1402AM_CONDITIONAL([BUILD_PTHREAD_SUPPORT],
1403 [test "x$build_pthread_support" = "xyes"])
1404
1405
4f416616
KR
1406## Check whether pthread_attr_getstack works for the main thread
1407
23f2b9a3
KR
1408if test "$with_threads" = pthreads; then
1409
b016e12e 1410AC_MSG_CHECKING([whether pthread_attr_getstack works for the main thread])
4f416616
KR
1411old_CFLAGS="$CFLAGS"
1412CFLAGS="$PTHREAD_CFLAGS $CFLAGS"
b016e12e
VG
1413if test "$cross_compiling" = "no"; then
1414 AC_RUN_IFELSE([AC_LANG_SOURCE([[
1415 #if HAVE_PTHREAD_ATTR_GETSTACK
1416 #include <pthread.h>
1417
1418 int main ()
1419 {
1420 pthread_attr_t attr;
1421 void *start, *end;
1422 size_t size;
1423
1424 pthread_getattr_np (pthread_self (), &attr);
1425 pthread_attr_getstack (&attr, &start, &size);
1426 end = (char *)start + size;
1427
1428 if ((void *)&attr < start || (void *)&attr >= end)
1429 return 1;
1430 else
1431 return 0;
1432 }
1433 #else
1434 int main ()
1435 {
4f416616 1436 return 1;
b016e12e
VG
1437 }
1438 #endif
1439 ]])],
1440 [works=yes
1441 AC_DEFINE([PTHREAD_ATTR_GETSTACK_WORKS], [1], [Define when pthread_att_get_stack works for the main thread])],
1442 [works=no],
1443 [])
1444else
1445 works="assuming it doesn't"
1446fi
4f416616
KR
1447CFLAGS="$old_CFLAGS"
1448AC_MSG_RESULT($works)
1449
705edb95
LC
1450GUILE_THREAD_LOCAL_STORAGE
1451
23f2b9a3
KR
1452fi # with_threads=pthreads
1453
1454
0db83c04
MV
1455## Cross building
1456if test "$cross_compiling" = "yes"; then
1457 AC_MSG_CHECKING(cc for build)
1458 ## /usr/bin/cc still uses wrong assembler
1459 ## CC_FOR_BUILD="${CC_FOR_BUILD-/usr/bincc}"
1460 CC_FOR_BUILD="${CC_FOR_BUILD-PATH=/usr/bin:$PATH cc}"
1461else
1462 CC_FOR_BUILD="${CC_FOR_BUILD-$CC}"
1463fi
0db83c04
MV
1464
1465## AC_MSG_CHECKING("if we are cross compiling")
1466## AC_MSG_RESULT($cross_compiling)
1467if test "$cross_compiling" = "yes"; then
1468 AC_MSG_RESULT($CC_FOR_BUILD)
1469fi
1470
1471## No need as yet to be more elaborate
1472CCLD_FOR_BUILD="$CC_FOR_BUILD"
1473
1474AC_SUBST(cross_compiling)
457a4e81 1475AC_ARG_VAR(CC_FOR_BUILD,[build system C compiler])
0db83c04
MV
1476AC_SUBST(CCLD_FOR_BUILD)
1477
1478## libtool erroneously calls CC_FOR_BUILD HOST_CC;
1479## --HOST is the platform that PACKAGE is compiled for.
1480HOST_CC="$CC_FOR_BUILD"
1481AC_SUBST(HOST_CC)
1482
1483if test "$cross_compiling" = "yes"; then
1484 AC_MSG_CHECKING(guile for build)
1485 GUILE_FOR_BUILD="${GUILE_FOR_BUILD-guile}"
1486else
1487 GUILE_FOR_BUILD='$(preinstguile)'
1488fi
0db83c04
MV
1489
1490## AC_MSG_CHECKING("if we are cross compiling")
1491## AC_MSG_RESULT($cross_compiling)
1492if test "$cross_compiling" = "yes"; then
1493 AC_MSG_RESULT($GUILE_FOR_BUILD)
1494fi
89f69c52 1495AC_ARG_VAR(GUILE_FOR_BUILD,[guile for build system])
0db83c04
MV
1496AC_SUBST(GUILE_FOR_BUILD)
1497
3a629497 1498## If we're using GCC, ask for aggressive warnings.
f29ded4b 1499GCC_CFLAGS=""
3a629497 1500case "$GCC" in
99be3450 1501 yes )
0a1b8b15
JB
1502 ## We had -Wstrict-prototypes in here for a bit, but Guile does too
1503 ## much stuff with generic function pointers for that to really be
1504 ## less than exasperating.
aee8ca3f
GH
1505 ## -Wpointer-arith was here too, but something changed in gcc/glibc
1506 ## and it became equally exasperating (gcc 2.95 and/or glibc 2.1.2).
8bcecbd3
LC
1507 POTENTIAL_GCC_CFLAGS="-Wall -Wmissing-prototypes \
1508 -Wdeclaration-after-statement -Wundef \
1509 -Wswitch-enum"
5c07af6e
MV
1510 # Do this here so we don't screw up any of the tests above that might
1511 # not be "warning free"
1512 if test "${GUILE_ERROR_ON_WARNING}" = yes
1513 then
f29ded4b 1514 POTENTIAL_GCC_CFLAGS="${POTENTIAL_GCC_CFLAGS} -Werror"
5c07af6e
MV
1515 enable_compile_warnings=no
1516 fi
f29ded4b
LC
1517
1518 for flag in $POTENTIAL_GCC_CFLAGS
1519 do
1520 gl_WARN_ADD([$flag], [GCC_CFLAGS])
1521 done
5c07af6e 1522 ;;
3a629497
JB
1523esac
1524
582a4997
LC
1525AC_SUBST(GCC_CFLAGS)
1526
9d19a9d6
LC
1527# Check for GNU ld's "-z relro".
1528GUILE_GNU_LD_RELRO
1529
1530
3a629497
JB
1531## If we're creating a shared library (using libtool!), then we'll
1532## need to generate a list of .lo files corresponding to the .o files
1533## given in LIBOBJS. We'll call it LIBLOBJS.
eede3dbc 1534LIBLOBJS="`echo ${LIB@&t@OBJS} | sed 's,\.[[^.]]* ,.lo ,g;s,\.[[^.]]*$,.lo,'`"
3a629497 1535
e9e225e5 1536## We also need to create corresponding .doc and .x files
eede3dbc
RB
1537EXTRA_DOT_DOC_FILES="`echo ${LIB@&t@OBJS} | sed 's,\.[[^.]]* ,.doc ,g;s,\.[[^.]]*$,.doc,'`"
1538EXTRA_DOT_X_FILES="`echo ${LIB@&t@OBJS} | sed 's,\.[[^.]]* ,.x ,g;s,\.[[^.]]*$,.x,'`"
91411868 1539
7a5ab369
LC
1540# GNU Readline bindings.
1541GUILE_READLINE
1542
7c86ae05
JB
1543AC_SUBST(GUILE_MAJOR_VERSION)
1544AC_SUBST(GUILE_MINOR_VERSION)
df4a8db0 1545AC_SUBST(GUILE_MICRO_VERSION)
9e6e154e 1546AC_SUBST(GUILE_EFFECTIVE_VERSION)
7c86ae05 1547AC_SUBST(GUILE_VERSION)
9e202853 1548
22b7f585
RB
1549#######################################################################
1550# library versioning
1551
9e202853
RB
1552AC_SUBST(LIBGUILE_INTERFACE_CURRENT)
1553AC_SUBST(LIBGUILE_INTERFACE_REVISION)
1554AC_SUBST(LIBGUILE_INTERFACE_AGE)
1555AC_SUBST(LIBGUILE_INTERFACE)
539c89a1 1556
b8b9ec68 1557AC_SUBST(LIBGUILE_SRFI_SRFI_1_MAJOR)
cfc7c7c0
MD
1558AC_SUBST(LIBGUILE_SRFI_SRFI_1_INTERFACE_CURRENT)
1559AC_SUBST(LIBGUILE_SRFI_SRFI_1_INTERFACE_REVISION)
1560AC_SUBST(LIBGUILE_SRFI_SRFI_1_INTERFACE_AGE)
1561AC_SUBST(LIBGUILE_SRFI_SRFI_1_INTERFACE)
1562
b8b9ec68 1563AC_SUBST(LIBGUILE_SRFI_SRFI_4_MAJOR)
22b7f585
RB
1564AC_SUBST(LIBGUILE_SRFI_SRFI_4_INTERFACE_CURRENT)
1565AC_SUBST(LIBGUILE_SRFI_SRFI_4_INTERFACE_REVISION)
1566AC_SUBST(LIBGUILE_SRFI_SRFI_4_INTERFACE_AGE)
1567AC_SUBST(LIBGUILE_SRFI_SRFI_4_INTERFACE)
1568
b8b9ec68 1569AC_SUBST(LIBGUILE_SRFI_SRFI_13_14_MAJOR)
22b7f585
RB
1570AC_SUBST(LIBGUILE_SRFI_SRFI_13_14_INTERFACE_CURRENT)
1571AC_SUBST(LIBGUILE_SRFI_SRFI_13_14_INTERFACE_REVISION)
1572AC_SUBST(LIBGUILE_SRFI_SRFI_13_14_INTERFACE_AGE)
1573AC_SUBST(LIBGUILE_SRFI_SRFI_13_14_INTERFACE)
1574
6bba4fad
KR
1575AC_SUBST(LIBGUILE_SRFI_SRFI_60_MAJOR)
1576AC_SUBST(LIBGUILE_SRFI_SRFI_60_INTERFACE_CURRENT)
1577AC_SUBST(LIBGUILE_SRFI_SRFI_60_INTERFACE_REVISION)
1578AC_SUBST(LIBGUILE_SRFI_SRFI_60_INTERFACE_AGE)
1579AC_SUBST(LIBGUILE_SRFI_SRFI_60_INTERFACE)
1580
b89c4943
LC
1581AC_SUBST(LIBGUILE_I18N_MAJOR)
1582AC_SUBST(LIBGUILE_I18N_INTERFACE_CURRENT)
1583AC_SUBST(LIBGUILE_I18N_INTERFACE_REVISION)
1584AC_SUBST(LIBGUILE_I18N_INTERFACE_AGE)
1585AC_SUBST(LIBGUILE_I18N_INTERFACE)
1586
1587
22b7f585
RB
1588#######################################################################
1589
d8b1bb93 1590dnl Tell guile-config what flags guile users should compile and link with.
a8d7ba11 1591GUILE_LIBS="$LDFLAGS $LIBS"
25a640ca 1592GUILE_CFLAGS="$CPPFLAGS $PTHREAD_CFLAGS"
daa4f38c 1593AC_SUBST(GUILE_LIBS)
d8b1bb93 1594AC_SUBST(GUILE_CFLAGS)
7c86ae05 1595
3a629497
JB
1596AC_SUBST(AWK)
1597AC_SUBST(LIBLOBJS)
91411868 1598AC_SUBST(EXTRA_DOT_DOC_FILES)
e9e225e5 1599AC_SUBST(EXTRA_DOT_X_FILES)
3a629497 1600
6812c28f
TTN
1601dnl See also top_builddir in info node: (libtool)AC_PROG_LIBTOOL
1602top_builddir_absolute=`pwd`
1603AC_SUBST(top_builddir_absolute)
9e6e154e 1604top_srcdir_absolute=`(cd $srcdir && pwd)`
2f13db9a 1605AC_SUBST(top_srcdir_absolute)
6812c28f 1606
92826dd0
LC
1607dnl We need `sitedir' in `guile-1.8.pc'.
1608dnl Note: `sitedir' must be kept in sync with `GUILE_SITE_DIR' in `guile.m4'.
0c1eb9b6 1609pkgdatadir="$datadir/$PACKAGE_TARNAME"
92826dd0
LC
1610sitedir="$pkgdatadir/site"
1611AC_SUBST([sitedir])
1612
9a52bc2a
RB
1613# Additional SCM_I_GSC definitions are above.
1614AC_SUBST([SCM_I_GSC_GUILE_DEBUG])
f5922e27 1615AC_SUBST([SCM_I_GSC_ENABLE_DISCOURAGED])
9a52bc2a 1616AC_SUBST([SCM_I_GSC_ENABLE_DEPRECATED])
9a52bc2a
RB
1617AC_SUBST([SCM_I_GSC_STACK_GROWS_UP])
1618AC_SUBST([SCM_I_GSC_C_INLINE])
1619AC_CONFIG_FILES([libguile/gen-scmconfig.h])
1620
237b3247
RB
1621AC_CONFIG_FILES([
1622 Makefile
6812c28f 1623 am/Makefile
6caac03c 1624 lib/Makefile
9e6e154e
RB
1625 benchmark-suite/Makefile
1626 doc/Makefile
9e6e154e
RB
1627 doc/r5rs/Makefile
1628 doc/ref/Makefile
1e2346ae 1629 emacs/Makefile
9e6e154e 1630 examples/Makefile
9e6e154e 1631 libguile/Makefile
237b3247 1632 srfi/Makefile
7a5ab369 1633 guile-readline/Makefile
849f29a4
RB
1634 test-suite/Makefile
1635 test-suite/standalone/Makefile
aa592f96 1636 test-suite/vm/Makefile
0b6d8fdc 1637 meta/Makefile
e610dc38 1638 module/Makefile
849f29a4 1639])
9e6e154e 1640
c1a15f3d
LC
1641AC_CONFIG_FILES([meta/guile-2.0.pc])
1642AC_CONFIG_FILES([meta/guile-2.0-uninstalled.pc])
9e6e154e
RB
1643AC_CONFIG_FILES([check-guile], [chmod +x check-guile])
1644AC_CONFIG_FILES([benchmark-guile], [chmod +x benchmark-guile])
0b6d8fdc
AW
1645AC_CONFIG_FILES([meta/guile], [chmod +x meta/guile])
1646AC_CONFIG_FILES([meta/uninstalled-env], [chmod +x meta/uninstalled-env])
1647AC_CONFIG_FILES([meta/gdb-uninstalled-guile], [chmod +x meta/gdb-uninstalled-guile])
54b38caf 1648AC_CONFIG_FILES([meta/guile-tools], [chmod +x meta/guile-tools])
9e6e154e
RB
1649AC_CONFIG_FILES([libguile/guile-snarf],
1650 [chmod +x libguile/guile-snarf])
1651AC_CONFIG_FILES([libguile/guile-doc-snarf],
1652 [chmod +x libguile/guile-doc-snarf])
1653AC_CONFIG_FILES([libguile/guile-func-name-check],
1654 [chmod +x libguile/guile-func-name-check])
1655AC_CONFIG_FILES([libguile/guile-snarf-docs],
1656 [chmod +x libguile/guile-snarf-docs])
d8b6e191
NJ
1657AC_CONFIG_FILES([test-suite/standalone/test-use-srfi],
1658 [chmod +x test-suite/standalone/test-use-srfi])
a9931e4e
NJ
1659AC_CONFIG_FILES([test-suite/standalone/test-fast-slot-ref],
1660 [chmod +x test-suite/standalone/test-fast-slot-ref])
22b5f518 1661AC_CONFIG_FILES([doc/ref/effective-version.texi])
237b3247
RB
1662
1663AC_OUTPUT
0f2d19dd 1664
3a629497
JB
1665dnl Local Variables:
1666dnl comment-start: "dnl "
1667dnl comment-end: ""
1668dnl comment-start-skip: "\\bdnl\\b\\s *"
d67c13f6 1669dnl End: