1 dnl $Id: aclocal.m4,v 1.30 1998/10/07 12:41:42 simonm Exp $
3 dnl Extra autoconf macros for the Glasgow fptools
5 dnl To be a good autoconf citizen, names of local macros have
6 dnl prefixed with FPTOOLS_ to ensure we don't clash
7 dnl with any pre-supplied autoconf ones.
10 dnl Has timezone the type time_t or long (HP-UX 10.20 apparently
13 AC_DEFUN(FPTOOLS_TYPE_TIMEZONE,
14 [AC_CACHE_CHECK([type of timezone], fptools_cv_type_timezone,
15 [AC_TRY_COMPILE([#if TIME_WITH_SYS_TIME
16 # include <sys/time.h>
20 # include <sys/time.h>
26 extern time_t timezone;
28 [int i;], fptools_cv_type_timezone=time_t, fptools_cv_type_timezone=long)])
29 AC_DEFINE_UNQUOTED(TYPE_TIMEZONE, $fptools_cv_type_timezone)
32 dnl *** Is altzone available? ***
34 AC_DEFUN(FPTOOLS_ALTZONE,
35 [AC_CACHE_CHECK([altzone], fptools_cv_altzone,
36 [AC_TRY_LINK([#if TIME_WITH_SYS_TIME
37 # include <sys/time.h>
41 # include <sys/time.h>
47 fptools_cv_altzone=yes, fptools_cv_altzone=no)])
48 if test "$fptools_cv_altzone" = yes; then
49 AC_DEFINE(HAVE_ALTZONE)
53 dnl ** check for leading underscores in symbol names
55 dnl Test for determining whether symbol names have a leading
58 dnl We assume that they _haven't_ if anything goes wrong.
60 dnl Some nlist implementations seem to try to be compatible by ignoring
61 dnl a leading underscore sometimes (eg. FreeBSD). We therefore have
62 dnl to work around this by checking for *no* leading underscore first.
65 AC_DEFUN(FPTOOLS_UNDERSCORE,
66 [AC_CHECK_LIB(elf, nlist, LIBS="-lelf $LIBS")dnl
67 AC_CACHE_CHECK([leading underscore in symbol names], fptools_cv_lead_uscore,
70 dnl Hack!: nlist() under Digital UNIX insist on there being an _,
71 dnl but symbol table listings shows none. What is going on here?!?
73 changequote(<<, >>)dnl
76 alpha-dec-osf*) fptools_cv_lead_uscore='no';;
77 *cygwin32) fptools_cv_lead_uscore='yes';;
80 AC_TRY_RUN([#ifdef HAVE_NLIST_H
82 changequote(<<, >>)dnl
84 struct nlist xYzzY1[] = {{"xYzzY1", 0},{0}};
85 struct nlist xYzzY2[] = {{"_xYzzY2", 0},{0}};
93 if(nlist(argv[0], xYzzY1) == 0 && xYzzY1[0].n_value != 0)
95 if(nlist(argv[0], xYzzY2) == 0 && xYzzY2[0].n_value != 0)
100 }], fptools_cv_lead_uscore=yes, fptools_cv_lead_uscore=no, fptools_cv_lead_uscore=NO)
103 LeadingUnderscore=`echo $fptools_cv_lead_uscore | sed 'y/yesno/YESNO/'`
104 AC_SUBST(LeadingUnderscore)
105 case $LeadingUnderscore in
106 YES) AC_DEFINE(LEADING_UNDERSCORE);;
111 dnl Check for Happy and version.
113 AC_DEFUN(FPTOOLS_HAPPY,
114 [AC_PATH_PROG(HappyCmd,happy)
115 AC_CACHE_CHECK([for version of happy], fptools_cv_happy_version,
116 [if test x"$HappyCmd" != x; then
117 fptools_cv_happy_version="`$HappyCmd -v |
119 grep 'Happy Version' | sed -e 's/Happy Version \([^ ]*\).*/\1/g'`" ;
122 fptools_cv_happy_version="";
124 if expr "$fptools_cv_happy_version" "<" 1.4 > /dev/null 2>&1; then
126 echo "Happy version 1.4 or later is required to compile GHC."
130 HappyVersion=$ac_cv_happy_version;
131 AC_SUBST(HappyVersion)
135 dnl What's the best way of doing context diffs?
137 dnl (NB: NeXTStep thinks diff'ing a file against itself is "trouble")
139 AC_DEFUN(FPTOOLS_PROG_DIFF,
140 [AC_CACHE_CHECK([for ok way to do context diffs], fptools_cv_context_diffs,
141 [echo foo > conftest1
143 if diff -C 1 conftest1 conftest2 > /dev/null 2>&1 ; then
144 fptools_cv_context_diffs='diff -C 1'
146 if diff -c1 conftest1 conftest2 > /dev/null 2>&1 ; then
147 fptools_cv_context_diffs='diff -c1'
149 echo "Can't figure out how to do context diffs."
150 echo "Neither \`diff -C 1' nor \`diff -c1' works."
154 rm -f conftest1 conftest2
156 ContextDiffCmd=$fptools_cv_context_diffs
157 AC_SUBST(ContextDiffCmd)
161 dnl Finding the Right Yacc
163 AC_DEFUN(FPTOOLS_PROG_YACCY,
165 if test "$YACC" = "yacc"; then
166 AC_CACHE_CHECK([if it is an OK yacc], ac_cv_prog_yacc,
167 [AC_CHECK_PROG(WhatCmd, what, what, :)
168 $WhatCmd $YACC > conftest.out
169 if egrep 'y1\.c 1\..*SMI' conftest.out >/dev/null 2>&1; then
170 echo "I don't trust your $YaccCmd; it looks like an old Sun yacc"
171 if test -f /usr/lang/yacc; then
172 echo "I'm going to use /usr/lang/yacc instead"
173 ac_cv_prog_yacc=/usr/lang/yacc
175 echo "I'm assuming the worst...no parser generator at all"
178 elif egrep 'y1\.c.*Revision: 4\.2\.6\.3.*DEC' conftest.out >/dev/null 2>&1; then
179 echo "I don't trust your $YaccCmd; it looks like a lame DEC yacc"
180 echo "I'm assuming the worst...no parser generator at all"
183 ac_cv_prog_yacc=$YACC
188 ac_cv_prog_yacc=$YACC
190 YaccCmd=$ac_cv_prog_yacc
194 dnl *** Checking for ar and its arguments + whether we need ranlib.
196 dnl ArCmd and RANLIB are AC_SUBST'ed
198 AC_DEFUN(FPTOOLS_PROG_AR_AND_RANLIB,
199 [AC_PATH_PROG(ArCmd,ar)
200 if test -z "$ArCmd"; then
201 echo "You don't seem to have ar in your PATH...I have no idea how to make a library"
204 if $ArCmd clqs conftest.a >/dev/null 2>/dev/null; then
207 elif $ArCmd cqs conftest.a >/dev/null 2>/dev/null; then
210 elif $ArCmd clq conftest.a >/dev/null 2>/dev/null; then
213 elif $ArCmd cq conftest.a >/dev/null 2>/dev/null; then
216 elif $ArCmd cq conftest.a 2>&1 | grep 'no archive members specified' >/dev/null 2>/dev/null; then
220 echo "I can't figure out how to use your $ArCmd"
224 test -n "$ArCmd" && test -n "$verbose" && echo " setting ArCmd to $ArCmd"
226 if test -z "$NeedRanLib"; then
228 test -n "$verbose" && echo " setting RANLIB to $RANLIB"
236 dnl AC_SHEBANG_PERL - can we she-bang perl?
238 AC_DEFUN(FPTOOLS_SHEBANG_PERL,
239 [AC_CACHE_CHECK([if your perl works in shell scripts], fptools_cv_shebang_perl,
244 (SHELL=/bin/sh; export SHELL; ./conftest 69 > /dev/null)
245 if test $? -ne 69; then
246 fptools_cv_shebang_perl=yes
248 fptools_cv_shebang_perl=no
254 dnl Extra testing of the result AC_PROG_CC, testing the gcc version no.
255 dnl *Must* be called after AC_PROG_CC
257 AC_DEFUN(FPTOOLS_HAVE_GCC,
258 [AC_CACHE_CHECK([whether you have an ok gcc], fptools_cv_have_gcc,
259 [if test -z "$GCC"; then
261 echo "You would be better off with gcc"
262 echo "Perhaps it is already installed, but not in your PATH?"
263 fptools_cv_have_gcc='no'
266 cmd_string="`$CC -v 2>&1 | grep 'version ' | sed -e 's/.*version [^0-9]*\([0-9][0-9]*\)\.\([0-9][0-9]*\).*/expr 20 \\\< \1 \\\* 10 + \2/g' `"
268 if test `eval $cmd_string 2>/dev/null` != "1"; then
270 echo "I'm not sure if your version of gcc will work,"
271 echo "but it's worth a shot, eh?"
273 fptools_cv_have_gcc='yes'
276 HaveGcc=`echo $fptools_cv_have_gcc | sed 'y/yesno/YESNO/'`
281 dnl FPTOOLS_PROG_GNUCPP gathers the path to the cpp that the
282 dnl gcc driver calls upon.
284 dnl Substitutes: GNUCPP and RAWCPP (latter is 'GNUCPP -traditional')
286 AC_DEFUN(FPTOOLS_PROG_GNUCPP,
287 [AC_CACHE_CHECK([how to invoke GNU cpp directly], fptools_cv_gnu_cpp,
288 [if test "$HaveGcc" = "YES"; then
290 gcc -v -E conftest.c >/dev/null 2>conftest.out
292 echo 'tr/\x5c/\//; /(\S+\/)cpp/ && print "[$]{1}cpp -iprefix [$]1";' > conftest.pl
293 fptools_cv_gnu_cpp="`eval $PerlCmd -n conftest.pl conftest.out`"
296 # We need to be able to invoke CPP directly, preferably
297 # with input from stdin (mkdependHS and hscpp depend on
298 # this at the moment).
299 # Take a guess at what to use, this probably won't work.
300 echo Warning: GNU cpp not found, using $CPP
301 fptools_cv_gnu_cpp = $CPP
304 GNUCPP=$fptools_cv_gnu_cpp
305 RAWCPP="$GNUCPP -traditional"
310 dnl Small feature test for perl version. Assumes PerlCmd
311 dnl contains path to perl binary
313 AC_DEFUN(FPTOOLS_CHECK_PERL_VERSION,
314 [$PerlCmd -v >conftest.out 2>&1
315 if grep "version 4" conftest.out >/dev/null 2>&1; then
316 if grep "Patch level: 35" conftest.out >/dev/null 2>&1; then
318 ************************************************************************
319 Uh-oh...looks like you have Perl 4.035.
321 Perl version 4.035 has a bug to do with recursion that will bite if
322 you run the lit2texi script, when making Info files from
323 literate files of various sorts. Either use perl5, the last version of perl4
324 (4.036), or an older version (e.g., perl 4.019). Failing that, don't create
326 ************************************************************************
330 if grep "version 5" conftest.out >/dev/null 2>&1; then
333 echo "I'm not sure if your version of perl will work,"
334 echo "but it's worth a shot, eh?"
340 dnl ** figure out the alignment restriction of a type
341 dnl (required SIZEOF test but AC_CHECK_SIZEOF doesn't call PROVIDE
342 dnl so we can't call REQUIRE)
344 dnl FPTOOLS_CHECK_ALIGNMENT(TYPE)
345 AC_DEFUN(FPTOOLS_CHECK_ALIGNMENT,
346 [changequote(<<, >>)dnl
347 dnl The name to #define.
348 define(<<AC_TYPE_NAME>>, translit(alignment_$1, [a-z *], [A-Z_P]))dnl
349 dnl The cache variable name.
350 define(<<AC_CV_NAME>>, translit(ac_cv_alignment_$1, [ *], [_p]))dnl
351 dnl The name of the corresponding size.
352 define(<<AC_CV_SIZEOF_NAME>>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl
354 AC_MSG_CHECKING(alignment of $1)
355 AC_CACHE_VAL(AC_CV_NAME,
362 #define offsetof(ty,field) ((size_t)((char *)&((ty *)0)->field - (char *)(ty *)0))
367 FILE *f=fopen("conftestval", "w");
369 fprintf(f, "%d\n", offsetof(struct { char c; $1 ty;},ty));
372 AC_CV_NAME=`cat conftestval`,
373 AC_CV_NAME=$AC_CV_SIZEOF_NAME,
374 AC_CV_NAME=$AC_CV_SIZEOF_NAME)])
375 AC_MSG_RESULT($AC_CV_NAME)
376 AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME)
377 AC_PROVIDE($AC_TYPE_NAME)
378 undefine([AC_TYPE_NAME])dnl
379 undefine([AC_CV_NAME])dnl
380 undefine([AC_CV_SIZEOF_NAME])dnl
383 dnl ** figure out whether C compiler supports 'long long's
384 dnl (Closely based on Andreas Zeller's macro for testing
385 dnl for this under C++)
387 dnl If the C compiler supports `long long' types,
388 dnl define `HAVE_LONG_LONG'.
390 AC_DEFUN(FPTOOLS_C_LONG_LONG,
392 AC_REQUIRE([AC_PROG_CC])
393 AC_MSG_CHECKING(whether ${CC} supports long long types)
394 AC_CACHE_VAL(fptools_cv_have_long_long,
398 AC_TRY_COMPILE(,[long long a;],
399 fptools_cv_have_long_long=yes,
400 fptools_cv_have_long_long=no)
403 AC_MSG_RESULT($fptools_cv_have_long_long)
404 if test "$fptools_cv_have_long_long" = yes; then
405 AC_DEFINE(HAVE_LONG_LONG)
409 dnl *** Can we open files in binary mode? ***
411 AC_DEFUN(FPTOOLS_O_BINARY,
413 AC_REQUIRE([AC_PROG_CC])
414 AC_MSG_CHECKING(whether we can open files in binary mode)
415 AC_CACHE_VAL(fptools_cv_have_o_binary,
424 fptools_cv_have_o_binary=yes,
425 fptools_cv_have_o_binary=no)
428 AC_MSG_RESULT($fptools_cv_have_o_binary)
429 if test "$fptools_cv_have_o_binary" = yes; then
430 AC_DEFINE(HAVE_O_BINARY)
434 dnl *** Which one comes first, .text or .data? ***
436 AC_DEFUN(FPTOOLS_CODE_BEFORE_DATA,
437 [AC_CACHE_CHECK([if code section appears before data], fptools_cv_code_bef_data,
439 int f() { return 1; }
441 int main() { return ((char*)&f > (char*)&i); }
444 fptools_cv_code_bef_data=yes, fptools_cv_code_bef_data=no)])
445 if test "$fptools_cv_code_bef_data" = yes; then
446 AC_DEFINE(CODE_BEFORE_DATA)
450 dnl *** Helper function **
452 AC_DEFUN(FPTOOLS_IN_SCOPE,AC_TRY_LINK([extern char* $1;],[return (int)&$2], $3=yes, $3=no))
454 dnl *** What's the end-of-text-section marker called? ***
456 AC_DEFUN(FPTOOLS_END_TEXT_SECTION,
457 [AC_CACHE_CHECK([for end of text section marker], fptools_cv_end_of_text,
460 for i in etext _etext __etext; do
461 FPTOOLS_IN_SCOPE($i,$i,fptools_cv_end_of_text)
462 if test "$fptools_cv_end_of_text" = yes; then
463 AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER, $i)
468 if test "$not_done" = 1; then
469 FPTOOLS_IN_SCOPE(etext asm("etext"),etext,fptools_cv_end_of_text);
470 if test "$fptools_cv_end_of_text" = yes; then
471 AC_DEFINE(TEXT_SECTION_END_MARKER, etext asm("etext"))
473 AC_DEFINE(TEXT_SECTION_END_MARKER, dunno_what_it_is)
478 dnl *** What's the end-of-data-section marker called? ***
480 AC_DEFUN(FPTOOLS_END_DATA_SECTION,
481 [AC_CACHE_CHECK([for end of data section marker], fptools_cv_end_of_data,
484 for i in end _end __end; do
485 FPTOOLS_IN_SCOPE($i,$i,fptools_cv_end_of_data)
486 if test "$fptools_cv_end_of_data" = yes; then
487 AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER, $i)
492 if test "$not_done" = 1; then
493 FPTOOLS_IN_SCOPE(end asm("end"),end,fptools_cv_end_of_data);
494 if test "$fptools_cv_end_of_data" = yes; then
495 AC_DEFINE(DATA_SECTION_END_MARKER, end asm("end"))
497 AC_DEFINE(DATA_SECTION_END_MARKER, dunno_what_it_is)