2001-02-24 Michael Kifer <kifer@cs.sunysb.edu>
[emacs.git] / aclocal.m4
blob25474afe907dc89bb275893e493584b530cb9970
1 dnl The following are from prerelease autoconf 2.14a.  When 2.14 is
2 dnl released, we should be able to zap them and just use AC_PREREQ(2.14).
4 % Copyright (C) 2000, 2001  Free Software Foundation, Inc.
6 % This file is part of GNU Emacs.
8 % GNU Emacs is free software; you can redistribute it and/or modify
9 % it under the terms of the GNU General Public License as published by
10 % the Free Software Foundation; either version 2, or (at your option)
11 % any later version.
13 % GNU Emacs is distributed in the hope that it will be useful,
14 % but WITHOUT ANY WARRANTY; without even the implied warranty of
15 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 % GNU General Public License for more details.
18 % You should have received a copy of the GNU General Public License
19 % along with GNU Emacs; see the file COPYING.  If not, write to the
20 % Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 % Boston, MA 02111-1307, USA.
23 ifelse(_AC_VERSION_COMPARE(AC_ACVERSION, [2.14]), -1,
25 # AC_PROG_CC_STDC
26 # ---------------
27 # If the C compiler in not in ANSI C mode by default, try to add an
28 # option to output variable @code{CC} to make it so.  This macro tries
29 # various options that select ANSI C on some system or another.  It
30 # considers the compiler to be in ANSI C mode if it handles function
31 # prototypes correctly.
32 AC_DEFUN(AC_PROG_CC_STDC,
33 [AC_REQUIRE([AC_PROG_CC])dnl
34 AC_BEFORE([$0], [AC_C_INLINE])dnl
35 AC_BEFORE([$0], [AC_C_CONST])dnl
36 dnl Force this before AC_PROG_CPP.  Some cpp's, eg on HPUX, require
37 dnl a magic option to avoid problems with ANSI preprocessor commands
38 dnl like #elif.
39 dnl FIXME: can't do this because then AC_AIX won't work due to a
40 dnl circular dependency.
41 dnl AC_BEFORE([$0], [AC_PROG_CPP])
42 AC_MSG_CHECKING(for ${CC-cc} option to accept ANSI C)
43 AC_CACHE_VAL(ac_cv_prog_cc_stdc,
44 [ac_cv_prog_cc_stdc=no
45 ac_save_CC="$CC"
46 # Don't try gcc -ansi; that turns off useful extensions and
47 # breaks some systems' header files.
48 # AIX                   -qlanglvl=ansi
49 # Ultrix and OSF/1      -std1
50 # HP-UX 10.20 and later -Ae
51 # HP-UX older versions  -Aa -D_HPUX_SOURCE
52 # SVR4                  -Xc -D__EXTENSIONS__
53 for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
55   CC="$ac_save_CC $ac_arg"
56   AC_TRY_COMPILE(
57 [#include <stdarg.h>
58 #include <stdio.h>
59 #include <sys/types.h>
60 #include <sys/stat.h>
61 /* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
62 struct buf { int x; };
63 FILE * (*rcsopen) (struct buf *, struct stat *, int);
64 static char *e (p, i)
65      char **p;
66      int i;
68   return p[i];
70 static char *f (char * (*g) (char **, int), char **p, ...)
72   char *s;
73   va_list v;
74   va_start (v,p);
75   s = g (p, va_arg (v,int));
76   va_end (v);
77   return s;
79 int test (int i, double x);
80 struct s1 {int (*f) (int a);};
81 struct s2 {int (*f) (double a);};
82 int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
83 int argc;
84 char **argv;],
85 [return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];],
86 [ac_cv_prog_cc_stdc="$ac_arg"; break])
87 done
88 CC="$ac_save_CC"
90 case "x$ac_cv_prog_cc_stdc" in
91   x|xno)
92     AC_MSG_RESULT([none needed]) ;;
93   *)
94     AC_MSG_RESULT($ac_cv_prog_cc_stdc)
95     CC="$CC $ac_cv_prog_cc_stdc" ;;
96 esac
97 ])# AC_PROG_CC_STDC
99 # AC_FUNC_MKTIME
100 # --------------
101 AC_DEFUN(AC_FUNC_MKTIME,
102 [AC_REQUIRE([AC_HEADER_TIME])dnl
103 AC_CHECK_HEADERS(sys/time.h unistd.h)
104 AC_CHECK_FUNCS(alarm)
105 AC_CACHE_CHECK([for working mktime], ac_cv_func_working_mktime,
106 [AC_TRY_RUN(
107 [/* Test program from Paul Eggert (eggert@twinsun.com)
108    and Tony Leneis (tony@plaza.ds.adp.com).  */
109 #if TIME_WITH_SYS_TIME
110 # include <sys/time.h>
111 # include <time.h>
112 #else
113 # if HAVE_SYS_TIME_H
114 #  include <sys/time.h>
115 # else
116 #  include <time.h>
117 # endif
118 #endif
120 #if HAVE_UNISTD_H
121 # include <unistd.h>
122 #endif
124 #if !HAVE_ALARM
125 # define alarm(X) /* empty */
126 #endif
128 /* Work around redefinition to rpl_putenv by other config tests.  */
129 #undef putenv
131 static time_t time_t_max;
133 /* Values we'll use to set the TZ environment variable.  */
134 static const char *const tz_strings[] = {
135   (const char *) 0, "TZ=GMT0", "TZ=JST-9",
136   "TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00"
138 #define N_STRINGS (sizeof (tz_strings) / sizeof (tz_strings[0]))
140 /* Fail if mktime fails to convert a date in the spring-forward gap.
141    Based on a problem report from Andreas Jaeger.  */
142 static void
143 spring_forward_gap ()
145   /* glibc (up to about 1998-10-07) failed this test) */
146   struct tm tm;
148   /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0"
149      instead of "TZ=America/Vancouver" in order to detect the bug even
150      on systems that don't support the Olson extension, or don't have the
151      full zoneinfo tables installed.  */
152   putenv ("TZ=PST8PDT,M4.1.0,M10.5.0");
154   tm.tm_year = 98;
155   tm.tm_mon = 3;
156   tm.tm_mday = 5;
157   tm.tm_hour = 2;
158   tm.tm_min = 0;
159   tm.tm_sec = 0;
160   tm.tm_isdst = -1;
161   if (mktime (&tm) == (time_t)-1)
162     exit (1);
165 static void
166 mktime_test (now)
167      time_t now;
169   struct tm *lt;
170   if ((lt = localtime (&now)) && mktime (lt) != now)
171     exit (1);
172   now = time_t_max - now;
173   if ((lt = localtime (&now)) && mktime (lt) != now)
174     exit (1);
177 static void
178 irix_6_4_bug ()
180   /* Based on code from Ariel Faigon.  */
181   struct tm tm;
182   tm.tm_year = 96;
183   tm.tm_mon = 3;
184   tm.tm_mday = 0;
185   tm.tm_hour = 0;
186   tm.tm_min = 0;
187   tm.tm_sec = 0;
188   tm.tm_isdst = -1;
189   mktime (&tm);
190   if (tm.tm_mon != 2 || tm.tm_mday != 31)
191     exit (1);
194 static void
195 bigtime_test (j)
196      int j;
198   struct tm tm;
199   time_t now;
200   tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = j;
201   now = mktime (&tm);
202   if (now != (time_t) -1)
203     {
204       struct tm *lt = localtime (&now);
205       if (! (lt
206              && lt->tm_year == tm.tm_year
207              && lt->tm_mon == tm.tm_mon
208              && lt->tm_mday == tm.tm_mday
209              && lt->tm_hour == tm.tm_hour
210              && lt->tm_min == tm.tm_min
211              && lt->tm_sec == tm.tm_sec
212              && lt->tm_yday == tm.tm_yday
213              && lt->tm_wday == tm.tm_wday
214              && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst)
215                   == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst))))
216         exit (1);
217     }
221 main ()
223   time_t t, delta;
224   int i, j;
226   /* This test makes some buggy mktime implementations loop.
227      Give up after 60 seconds; a mktime slower than that
228      isn't worth using anyway.  */
229   alarm (60);
231   for (time_t_max = 1; 0 < time_t_max; time_t_max *= 2)
232     continue;
233   time_t_max--;
234   delta = time_t_max / 997; /* a suitable prime number */
235   for (i = 0; i < N_STRINGS; i++)
236     {
237       if (tz_strings[i])
238         putenv (tz_strings[i]);
240       for (t = 0; t <= time_t_max - delta; t += delta)
241         mktime_test (t);
242       mktime_test ((time_t) 60 * 60);
243       mktime_test ((time_t) 60 * 60 * 24);
245       for (j = 1; 0 < j; j *= 2)
246         bigtime_test (j);
247       bigtime_test (j - 1);
248     }
249   irix_6_4_bug ();
250   spring_forward_gap ();
251   exit (0);
253 ac_cv_func_working_mktime=yes, ac_cv_func_working_mktime=no,
254 ac_cv_func_working_mktime=no)])
255 if test $ac_cv_func_working_mktime = no; then
256   LIBOBJS="$LIBOBJS mktime.${ac_objext}"
258 AC_SUBST(LIBOBJS)dnl
259 ])# AC_FUNC_MKTIME
261 # AC_C_VOLATILE
262 # -------------
263 # Note that, unlike const, #defining volatile to be the empty string can
264 # actually turn a correct program into an incorrect one, since removing
265 # uses of volatile actually grants the compiler permission to perform
266 # optimizations that could break the user's code.  So, do not #define
267 # volatile away unless it is really necessary to allow the user's code
268 # to compile cleanly.  Benign compiler failures should be tolerated.
269 AC_DEFUN(AC_C_VOLATILE,
270 [AC_REQUIRE([AC_PROG_CC_STDC])dnl
271 AC_CACHE_CHECK([for working volatile], ac_cv_c_volatile,
272 [AC_TRY_COMPILE(,[
273 volatile int x;
274 int * volatile y;],
275 ac_cv_c_volatile=yes, ac_cv_c_volatile=no)])
276 if test $ac_cv_c_volatile = no; then
277   AC_DEFINE(volatile,,
278             [Define to empty if the keyword `volatile' does not work.
279              Warning: valid code using `volatile' can become incorrect
280              without.  Disable with care.])
284 # AC_C_PROTOTYPES
285 # ---------------
286 # Check if the C compiler supports prototypes, included if it needs
287 # options.
288 AC_DEFUN(AC_C_PROTOTYPES,
289 [AC_REQUIRE([AC_PROG_CC_STDC])dnl
290 AC_REQUIRE([AC_PROG_CPP])dnl
291 AC_MSG_CHECKING([for function prototypes])
292 if test "$ac_cv_prog_cc_stdc" != no; then
293   AC_MSG_RESULT(yes)
294   AC_DEFINE(PROTOTYPES, 1,
295             [Define if the compiler supports function prototypes.])
296 else
297   AC_MSG_RESULT(no)
299 ])# AC_C_PROTOTYPES
301 dnl The following is a bit different from the prerelease autoconf at
302 dnl this time since that requires extra definitions.
304 dnl By default, many hosts won't let programs access large files;
305 dnl one must use special compiler options to get large-file access to work.
306 dnl For more details about this brain damage please see:
307 dnl http://www.sas.com/standards/large.file/x_open.20Mar96.html
309 dnl Written by Paul Eggert <eggert@twinsun.com>.
311 dnl Internal subroutine of AC_SYS_LARGEFILE.
312 dnl AC_SYS_LARGEFILE_TEST_INCLUDES
313 AC_DEFUN(AC_SYS_LARGEFILE_TEST_INCLUDES,
314   [[#include <sys/types.h>
315     int a[(off_t) 9223372036854775807 == 9223372036854775807 ? 1 : -1];
316   ]])
318 dnl Internal subroutine of AC_SYS_LARGEFILE.
319 dnl AC_SYS_LARGEFILE_MACRO_VALUE(C-MACRO, VALUE, CACHE-VAR, COMMENT, INCLUDES, FUNCTION-BODY)
320 AC_DEFUN(AC_SYS_LARGEFILE_MACRO_VALUE,
321   [AC_CACHE_CHECK([for $1 value needed for large files], $3,
322      [$3=no
323       AC_TRY_COMPILE([$5],
324         [$6], 
325         ,
326         [AC_TRY_COMPILE([#define $1 $2]
327 [$5]
328            ,
329            [$6],
330            [$3=$2])])])
331    if test "[$]$3" != no; then
332      AC_DEFINE_UNQUOTED([$1], [$]$3, [$4])
333    fi])
335 AC_DEFUN(AC_SYS_LARGEFILE,
336   [AC_REQUIRE([AC_PROG_CC])
337    AC_ARG_ENABLE(largefile,
338      [  --disable-largefile     omit support for large files])
339    if test "$enable_largefile" != no; then
341      AC_CACHE_CHECK([for special C compiler options needed for large files],
342        ac_cv_sys_largefile_CC,
343        [ac_cv_sys_largefile_CC=no
344         if test "$GCC" != yes; then
345           # IRIX 6.2 and later do not support large files by default,
346           # so use the C compiler's -n32 option if that helps.
347           AC_TRY_COMPILE(AC_SYS_LARGEFILE_TEST_INCLUDES, , ,
348             [ac_save_CC="$CC"
349              CC="$CC -n32"
350              AC_TRY_COMPILE(AC_SYS_LARGEFILE_TEST_INCLUDES, ,
351                ac_cv_sys_largefile_CC=' -n32')
352              CC="$ac_save_CC"])
353         fi])
354      if test "$ac_cv_sys_largefile_CC" != no; then
355        CC="$CC$ac_cv_sys_largefile_CC"
356      fi
358      AC_SYS_LARGEFILE_MACRO_VALUE(_FILE_OFFSET_BITS, 64,
359        ac_cv_sys_file_offset_bits,
360        [Number of bits in a file offset, on hosts where this is settable.],
361        AC_SYS_LARGEFILE_TEST_INCLUDES)
362      AC_SYS_LARGEFILE_MACRO_VALUE(_LARGE_FILES, 1,
363        ac_cv_sys_large_files,
364        [Define for large files, on AIX-style hosts.]
365        AC_SYS_LARGEFILE_TEST_INCLUDES)
366    fi
367   ])
369 AC_DEFUN(AC_FUNC_FSEEKO,
370   [AC_SYS_LARGEFILE_MACRO_VALUE(_LARGEFILE_SOURCE, 1,
371      ac_cv_sys_largefile_source,
372      [Define to make fseeko visible on some hosts (e.g. glibc 2.2).],
373      [#include <stdio.h>], [return !fseeko;])
374    # We used to try defining _XOPEN_SOURCE=500 too, to work around a bug
375    # in glibc 2.1.3, but that breaks too many other things.
376    # If you want fseeko and ftello with glibc, upgrade to a fixed glibc.
378    AC_CACHE_CHECK([for fseeko], ac_cv_func_fseeko,
379      [ac_cv_func_fseeko=no
380       AC_TRY_LINK([#include <stdio.h>],
381         [return fseeko && fseeko (stdin, 0, 0);],
382         [ac_cv_func_fseeko=yes])])
383    if test $ac_cv_func_fseeko != no; then
384      AC_DEFINE(HAVE_FSEEKO, 1,
385        [Define if fseeko (and presumably ftello) exists and is declared.])
386    fi])
388 undefine([AC_FUNC_MMAP])dnl
389 dnl The autoconf 2.13 version loses on OSF, at least,
390 dnl by messing up the declaration of malloc.
391 AC_DEFUN([AC_FUNC_MMAP],
392 [AC_CHECK_HEADERS(stdlib.h unistd.h sys/stat.h)
393 AC_CHECK_FUNCS(getpagesize)
394 AC_CACHE_CHECK(for working mmap, ac_cv_func_mmap_fixed_mapped,
395 [AC_TRY_RUN(
396 [/* Thanks to Mike Haertel and Jim Avera for this test.
397    Here is a matrix of mmap possibilities:
398         mmap private not fixed
399         mmap private fixed at somewhere currently unmapped
400         mmap private fixed at somewhere already mapped
401         mmap shared not fixed
402         mmap shared fixed at somewhere currently unmapped
403         mmap shared fixed at somewhere already mapped
404    For private mappings, we should verify that changes cannot be read()
405    back from the file, nor mmap's back from the file at a different
406    address.  (There have been systems where private was not correctly
407    implemented like the infamous i386 svr4.0, and systems where the
408    VM page cache was not coherent with the file system buffer cache
409    like early versions of FreeBSD and possibly contemporary NetBSD.)
410    For shared mappings, we should conversely verify that changes get
411    propogated back to all the places they're supposed to be.
413    Grep wants private fixed already mapped.
414    The main things grep needs to know about mmap are:
415    * does it exist and is it safe to write into the mmap'd area
416    * how to use it (BSD variants)  */
417 #include <sys/types.h>
418 #include <fcntl.h>
419 #include <sys/mman.h>
421 #if STDC_HEADERS || HAVE_STDLIB_H
422 # include <stdlib.h>
423 #else
424 char *malloc ();
425 #endif
426 #if HAVE_UNISTD_H
427 # include <unistd.h>
428 #endif
429 #if HAVE_SYS_STAT_H
430 # include <sys/stat.h>
431 #endif
433 /* This mess was copied from the GNU getpagesize.h.  */
434 #if !HAVE_GETPAGESIZE
435 /* Assume that all systems that can run configure have sys/param.h.  */
436 # if !HAVE_SYS_PARAM_H
437 #  define HAVE_SYS_PARAM_H 1
438 # endif
440 # ifdef _SC_PAGESIZE
441 #  define getpagesize() sysconf(_SC_PAGESIZE)
442 # else /* no _SC_PAGESIZE */
443 #  if HAVE_SYS_PARAM_H
444 #   include <sys/param.h>
445 #   ifdef EXEC_PAGESIZE
446 #    define getpagesize() EXEC_PAGESIZE
447 #   else /* no EXEC_PAGESIZE */
448 #    ifdef NBPG
449 #     define getpagesize() NBPG * CLSIZE
450 #     ifndef CLSIZE
451 #      define CLSIZE 1
452 #     endif /* no CLSIZE */
453 #    else /* no NBPG */
454 #     ifdef NBPC
455 #      define getpagesize() NBPC
456 #     else /* no NBPC */
457 #      ifdef PAGESIZE
458 #       define getpagesize() PAGESIZE
459 #      endif /* PAGESIZE */
460 #     endif /* no NBPC */
461 #    endif /* no NBPG */
462 #   endif /* no EXEC_PAGESIZE */
463 #  else /* no HAVE_SYS_PARAM_H */
464 #   define getpagesize() 8192   /* punt totally */
465 #  endif /* no HAVE_SYS_PARAM_H */
466 # endif /* no _SC_PAGESIZE */
468 #endif /* no HAVE_GETPAGESIZE */
471 main ()
473   char *data, *data2, *data3;
474   int i, pagesize;
475   int fd;
477   pagesize = getpagesize ();
479   /* First, make a file with some known garbage in it. */
480   data = (char *) malloc (pagesize);
481   if (!data)
482     exit (1);
483   for (i = 0; i < pagesize; ++i)
484     *(data + i) = rand ();
485   umask (0);
486   fd = creat ("conftestmmap", 0600);
487   if (fd < 0)
488     exit (1);
489   if (write (fd, data, pagesize) != pagesize)
490     exit (1);
491   close (fd);
493   /* Next, try to mmap the file at a fixed address which already has
494      something else allocated at it.  If we can, also make sure that
495      we see the same garbage.  */
496   fd = open ("conftestmmap", O_RDWR);
497   if (fd < 0)
498     exit (1);
499   data2 = (char *) malloc (2 * pagesize);
500   if (!data2)
501     exit (1);
502   data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1);
503   if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE,
504                      MAP_PRIVATE | MAP_FIXED, fd, 0L))
505     exit (1);
506   for (i = 0; i < pagesize; ++i)
507     if (*(data + i) != *(data2 + i))
508       exit (1);
510   /* Finally, make sure that changes to the mapped area do not
511      percolate back to the file as seen by read().  (This is a bug on
512      some variants of i386 svr4.0.)  */
513   for (i = 0; i < pagesize; ++i)
514     *(data2 + i) = *(data2 + i) + 1;
515   data3 = (char *) malloc (pagesize);
516   if (!data3)
517     exit (1);
518   if (read (fd, data3, pagesize) != pagesize)
519     exit (1);
520   for (i = 0; i < pagesize; ++i)
521     if (*(data + i) != *(data3 + i))
522       exit (1);
523   close (fd);
524   unlink ("conftestmmap");
525   exit (0);
526 }], ac_cv_func_mmap_fixed_mapped=yes, ac_cv_func_mmap_fixed_mapped=no,
527 ac_cv_func_mmap_fixed_mapped=no)])
528 if test $ac_cv_func_mmap_fixed_mapped = yes; then
529   AC_DEFINE(HAVE_MMAP, 1,
530             [Define if you have a working `mmap' system call.])
532 ])# AC_FUNC_MMAP
534 ) dnl ifelse