2 % Copyright (C) 2000, 2001 Free Software Foundation, Inc.
4 % This file is part of GNU Emacs.
6 % GNU Emacs is free software; you can redistribute it and/or modify
7 % it under the terms of the GNU General Public License as published by
8 % the Free Software Foundation; either version 2, or (at your option)
11 % GNU Emacs is distributed in the hope that it will be useful,
12 % but WITHOUT ANY WARRANTY; without even the implied warranty of
13 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 % GNU General Public License for more details.
16 % You should have received a copy of the GNU General Public License
17 % along with GNU Emacs; see the file COPYING. If not, write to the
18 % Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 % Boston, MA 02111-1307, USA.
21 ifelse(_AC_VERSION_COMPARE(AC_ACVERSION, [2.14]), -1,
25 # If the C compiler in not in ANSI C mode by default, try to add an
26 # option to output variable @code{CC} to make it so. This macro tries
27 # various options that select ANSI C on some system or another. It
28 # considers the compiler to be in ANSI C mode if it handles function
29 # prototypes correctly.
30 AC_DEFUN(AC_PROG_CC_STDC,
31 [AC_REQUIRE([AC_PROG_CC])dnl
32 AC_BEFORE([$0], [AC_C_INLINE])dnl
33 AC_BEFORE([$0], [AC_C_CONST])dnl
34 dnl Force this before AC_PROG_CPP. Some cpp's, eg on HPUX, require
35 dnl a magic option to avoid problems with ANSI preprocessor commands
37 dnl FIXME: can't do this because then AC_AIX won't work due to a
38 dnl circular dependency.
39 dnl AC_BEFORE([$0], [AC_PROG_CPP])
40 AC_MSG_CHECKING(for ${CC-cc} option to accept ANSI C)
41 AC_CACHE_VAL(ac_cv_prog_cc_stdc,
42 [ac_cv_prog_cc_stdc=no
44 # Don't try gcc -ansi; that turns off useful extensions and
45 # breaks some systems' header files.
47 # Ultrix and OSF/1 -std1
48 # HP-UX 10.20 and later -Ae
49 # HP-UX older versions -Aa -D_HPUX_SOURCE
50 # SVR4 -Xc -D__EXTENSIONS__
51 for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
53 CC="$ac_save_CC $ac_arg"
57 #include <sys/types.h>
59 /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
60 struct buf { int x; };
61 FILE * (*rcsopen) (struct buf *, struct stat *, int);
68 static char *f (char * (*g) (char **, int), char **p, ...)
73 s = g (p, va_arg (v,int));
77 int test (int i, double x);
78 struct s1 {int (*f) (int a);};
79 struct s2 {int (*f) (double a);};
80 int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
83 [return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];],
84 [ac_cv_prog_cc_stdc="$ac_arg"; break])
88 case "x$ac_cv_prog_cc_stdc" in
90 AC_MSG_RESULT([none needed]) ;;
92 AC_MSG_RESULT($ac_cv_prog_cc_stdc)
93 CC="$CC $ac_cv_prog_cc_stdc" ;;
99 AC_DEFUN(AC_FUNC_MKTIME,
100 [AC_REQUIRE([AC_HEADER_TIME])dnl
101 AC_CHECK_HEADERS(sys/time.h unistd.h)
102 AC_CHECK_FUNCS(alarm)
103 AC_CACHE_CHECK([for working mktime], ac_cv_func_working_mktime,
105 [/* Test program from Paul Eggert (eggert@twinsun.com)
106 and Tony Leneis (tony@plaza.ds.adp.com). */
107 #if TIME_WITH_SYS_TIME
108 # include <sys/time.h>
112 # include <sys/time.h>
123 # define alarm(X) /* empty */
126 /* Work around redefinition to rpl_putenv by other config tests. */
129 static time_t time_t_max;
131 /* Values we'll use to set the TZ environment variable. */
132 static const char *const tz_strings[] = {
133 (const char *) 0, "TZ=GMT0", "TZ=JST-9",
134 "TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00"
136 #define N_STRINGS (sizeof (tz_strings) / sizeof (tz_strings[0]))
138 /* Fail if mktime fails to convert a date in the spring-forward gap.
139 Based on a problem report from Andreas Jaeger. */
141 spring_forward_gap ()
143 /* glibc (up to about 1998-10-07) failed this test) */
146 /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0"
147 instead of "TZ=America/Vancouver" in order to detect the bug even
148 on systems that don't support the Olson extension, or don't have the
149 full zoneinfo tables installed. */
150 putenv ("TZ=PST8PDT,M4.1.0,M10.5.0");
159 if (mktime (&tm) == (time_t)-1)
168 if ((lt = localtime (&now)) && mktime (lt) != now)
170 now = time_t_max - now;
171 if ((lt = localtime (&now)) && mktime (lt) != now)
178 /* Based on code from Ariel Faigon. */
188 if (tm.tm_mon != 2 || tm.tm_mday != 31)
198 tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = j;
200 if (now != (time_t) -1)
202 struct tm *lt = localtime (&now);
204 && lt->tm_year == tm.tm_year
205 && lt->tm_mon == tm.tm_mon
206 && lt->tm_mday == tm.tm_mday
207 && lt->tm_hour == tm.tm_hour
208 && lt->tm_min == tm.tm_min
209 && lt->tm_sec == tm.tm_sec
210 && lt->tm_yday == tm.tm_yday
211 && lt->tm_wday == tm.tm_wday
212 && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst)
213 == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst))))
224 /* This test makes some buggy mktime implementations loop.
225 Give up after 60 seconds; a mktime slower than that
226 isn't worth using anyway. */
229 for (time_t_max = 1; 0 < time_t_max; time_t_max *= 2)
232 delta = time_t_max / 997; /* a suitable prime number */
233 for (i = 0; i < N_STRINGS; i++)
236 putenv (tz_strings[i]);
238 for (t = 0; t <= time_t_max - delta; t += delta)
240 mktime_test ((time_t) 60 * 60);
241 mktime_test ((time_t) 60 * 60 * 24);
243 for (j = 1; 0 < j; j *= 2)
245 bigtime_test (j - 1);
248 spring_forward_gap ();
251 ac_cv_func_working_mktime=yes, ac_cv_func_working_mktime=no,
252 ac_cv_func_working_mktime=no)])
253 if test $ac_cv_func_working_mktime = no; then
254 LIBOBJS="$LIBOBJS mktime.${ac_objext}"
261 # Note that, unlike const, #defining volatile to be the empty string can
262 # actually turn a correct program into an incorrect one, since removing
263 # uses of volatile actually grants the compiler permission to perform
264 # optimizations that could break the user's code. So, do not #define
265 # volatile away unless it is really necessary to allow the user's code
266 # to compile cleanly. Benign compiler failures should be tolerated.
267 AC_DEFUN(AC_C_VOLATILE,
268 [AC_REQUIRE([AC_PROG_CC_STDC])dnl
269 AC_CACHE_CHECK([for working volatile], ac_cv_c_volatile,
273 ac_cv_c_volatile=yes, ac_cv_c_volatile=no)])
274 if test $ac_cv_c_volatile = no; then
276 [Define to empty if the keyword `volatile' does not work.
277 Warning: valid code using `volatile' can become incorrect
278 without. Disable with care.])
284 # Check if the C compiler supports prototypes, included if it needs
286 AC_DEFUN(AC_C_PROTOTYPES,
287 [AC_REQUIRE([AC_PROG_CC_STDC])dnl
288 AC_REQUIRE([AC_PROG_CPP])dnl
289 AC_MSG_CHECKING([for function prototypes])
290 if test "$ac_cv_prog_cc_stdc" != no; then
292 AC_DEFINE(PROTOTYPES, 1,
293 [Define if the compiler supports function prototypes.])
299 dnl The following is a bit different from the prerelease autoconf at
300 dnl this time since that requires extra definitions.
302 dnl By default, many hosts won't let programs access large files;
303 dnl one must use special compiler options to get large-file access to work.
304 dnl For more details about this brain damage please see:
305 dnl http://www.sas.com/standards/large.file/x_open.20Mar96.html
307 dnl Written by Paul Eggert <eggert@twinsun.com>.
309 dnl Internal subroutine of AC_SYS_LARGEFILE.
310 dnl AC_SYS_LARGEFILE_TEST_INCLUDES
311 AC_DEFUN(AC_SYS_LARGEFILE_TEST_INCLUDES,
312 [[#include <sys/types.h>
313 int a[(off_t) 9223372036854775807 == 9223372036854775807 ? 1 : -1];
316 dnl Internal subroutine of AC_SYS_LARGEFILE.
317 dnl AC_SYS_LARGEFILE_MACRO_VALUE(C-MACRO, VALUE, CACHE-VAR, COMMENT, INCLUDES, FUNCTION-BODY)
318 AC_DEFUN(AC_SYS_LARGEFILE_MACRO_VALUE,
319 [AC_CACHE_CHECK([for $1 value needed for large files], $3,
324 [AC_TRY_COMPILE([#define $1 $2]
329 if test "[$]$3" != no; then
330 AC_DEFINE_UNQUOTED([$1], [$]$3, [$4])
333 AC_DEFUN(AC_SYS_LARGEFILE,
334 [AC_REQUIRE([AC_PROG_CC])
335 AC_ARG_ENABLE(largefile,
336 [ --disable-largefile omit support for large files])
337 if test "$enable_largefile" != no; then
339 AC_CACHE_CHECK([for special C compiler options needed for large files],
340 ac_cv_sys_largefile_CC,
341 [ac_cv_sys_largefile_CC=no
342 if test "$GCC" != yes; then
343 # IRIX 6.2 and later do not support large files by default,
344 # so use the C compiler's -n32 option if that helps.
345 AC_TRY_COMPILE(AC_SYS_LARGEFILE_TEST_INCLUDES, , ,
348 AC_TRY_COMPILE(AC_SYS_LARGEFILE_TEST_INCLUDES, ,
349 ac_cv_sys_largefile_CC=' -n32')
352 if test "$ac_cv_sys_largefile_CC" != no; then
353 CC="$CC$ac_cv_sys_largefile_CC"
356 AC_SYS_LARGEFILE_MACRO_VALUE(_FILE_OFFSET_BITS, 64,
357 ac_cv_sys_file_offset_bits,
358 [Number of bits in a file offset, on hosts where this is settable.],
359 AC_SYS_LARGEFILE_TEST_INCLUDES)
360 AC_SYS_LARGEFILE_MACRO_VALUE(_LARGE_FILES, 1,
361 ac_cv_sys_large_files,
362 [Define for large files, on AIX-style hosts.]
363 AC_SYS_LARGEFILE_TEST_INCLUDES)
367 AC_DEFUN(AC_FUNC_FSEEKO,
368 [AC_SYS_LARGEFILE_MACRO_VALUE(_LARGEFILE_SOURCE, 1,
369 ac_cv_sys_largefile_source,
370 [Define to make fseeko visible on some hosts (e.g. glibc 2.2).],
371 [#include <stdio.h>], [return !fseeko;])
372 # We used to try defining _XOPEN_SOURCE=500 too, to work around a bug
373 # in glibc 2.1.3, but that breaks too many other things.
374 # If you want fseeko and ftello with glibc, upgrade to a fixed glibc.
376 AC_CACHE_CHECK([for fseeko], ac_cv_func_fseeko,
377 [ac_cv_func_fseeko=no
378 AC_TRY_LINK([#include <stdio.h>],
379 [return fseeko && fseeko (stdin, 0, 0);],
380 [ac_cv_func_fseeko=yes])])
381 if test $ac_cv_func_fseeko != no; then
382 AC_DEFINE(HAVE_FSEEKO, 1,
383 [Define if fseeko (and presumably ftello) exists and is declared.])
386 undefine([AC_FUNC_MMAP])dnl
387 dnl The autoconf 2.13 version loses on OSF, at least,
388 dnl by messing up the declaration of malloc.
389 AC_DEFUN([AC_FUNC_MMAP],
390 [AC_CHECK_HEADERS(stdlib.h unistd.h sys/stat.h)
391 AC_CHECK_FUNCS(getpagesize)
392 AC_CACHE_CHECK(for working mmap, ac_cv_func_mmap_fixed_mapped,
394 [/* Thanks to Mike Haertel and Jim Avera for this test.
395 Here is a matrix of mmap possibilities:
396 mmap private not fixed
397 mmap private fixed at somewhere currently unmapped
398 mmap private fixed at somewhere already mapped
399 mmap shared not fixed
400 mmap shared fixed at somewhere currently unmapped
401 mmap shared fixed at somewhere already mapped
402 For private mappings, we should verify that changes cannot be read()
403 back from the file, nor mmap's back from the file at a different
404 address. (There have been systems where private was not correctly
405 implemented like the infamous i386 svr4.0, and systems where the
406 VM page cache was not coherent with the file system buffer cache
407 like early versions of FreeBSD and possibly contemporary NetBSD.)
408 For shared mappings, we should conversely verify that changes get
409 propogated back to all the places they're supposed to be.
411 Grep wants private fixed already mapped.
412 The main things grep needs to know about mmap are:
413 * does it exist and is it safe to write into the mmap'd area
414 * how to use it (BSD variants) */
415 #include <sys/types.h>
417 #include <sys/mman.h>
419 #if STDC_HEADERS || HAVE_STDLIB_H
428 # include <sys/stat.h>
431 /* This mess was copied from the GNU getpagesize.h. */
432 #if !HAVE_GETPAGESIZE
433 /* Assume that all systems that can run configure have sys/param.h. */
434 # if !HAVE_SYS_PARAM_H
435 # define HAVE_SYS_PARAM_H 1
439 # define getpagesize() sysconf(_SC_PAGESIZE)
440 # else /* no _SC_PAGESIZE */
441 # if HAVE_SYS_PARAM_H
442 # include <sys/param.h>
443 # ifdef EXEC_PAGESIZE
444 # define getpagesize() EXEC_PAGESIZE
445 # else /* no EXEC_PAGESIZE */
447 # define getpagesize() NBPG * CLSIZE
450 # endif /* no CLSIZE */
453 # define getpagesize() NBPC
456 # define getpagesize() PAGESIZE
457 # endif /* PAGESIZE */
458 # endif /* no NBPC */
459 # endif /* no NBPG */
460 # endif /* no EXEC_PAGESIZE */
461 # else /* no HAVE_SYS_PARAM_H */
462 # define getpagesize() 8192 /* punt totally */
463 # endif /* no HAVE_SYS_PARAM_H */
464 # endif /* no _SC_PAGESIZE */
466 #endif /* no HAVE_GETPAGESIZE */
471 char *data, *data2, *data3;
475 pagesize = getpagesize ();
477 /* First, make a file with some known garbage in it. */
478 data = (char *) malloc (pagesize);
481 for (i = 0; i < pagesize; ++i)
482 *(data + i) = rand ();
484 fd = creat ("conftestmmap", 0600);
487 if (write (fd, data, pagesize) != pagesize)
491 /* Next, try to mmap the file at a fixed address which already has
492 something else allocated at it. If we can, also make sure that
493 we see the same garbage. */
494 fd = open ("conftestmmap", O_RDWR);
497 data2 = (char *) malloc (2 * pagesize);
500 data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1);
501 if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE,
502 MAP_PRIVATE | MAP_FIXED, fd, 0L))
504 for (i = 0; i < pagesize; ++i)
505 if (*(data + i) != *(data2 + i))
508 /* Finally, make sure that changes to the mapped area do not
509 percolate back to the file as seen by read(). (This is a bug on
510 some variants of i386 svr4.0.) */
511 for (i = 0; i < pagesize; ++i)
512 *(data2 + i) = *(data2 + i) + 1;
513 data3 = (char *) malloc (pagesize);
516 if (read (fd, data3, pagesize) != pagesize)
518 for (i = 0; i < pagesize; ++i)
519 if (*(data + i) != *(data3 + i))
522 unlink ("conftestmmap");
524 }], ac_cv_func_mmap_fixed_mapped=yes, ac_cv_func_mmap_fixed_mapped=no,
525 ac_cv_func_mmap_fixed_mapped=no)])
526 if test $ac_cv_func_mmap_fixed_mapped = yes; then
527 AC_DEFINE(HAVE_MMAP, 1,
528 [Define if you have a working `mmap' system call.])