1 dnl $Id: aclocal.m4,v 1.47 2000/05/09 10:43:45 rrt 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 Is timezone around? (in a header file)
12 AC_DEFUN(FPTOOLS_HAVE_TIMEZONE,
13 [AC_CACHE_CHECK([timezone], fptools_cv_have_timezone,
14 [AC_TRY_COMPILE([#if TIME_WITH_SYS_TIME
15 # include <sys/time.h>
19 # include <sys/time.h>
24 ], [return timezone;],
25 fptools_cv_have_timezone=yes, fptools_cv_have_timezone=no)])
26 if test "$fptools_cv_have_timezone" = yes; then
27 AC_DEFINE(HAVE_TIMEZONE)
32 dnl Has timezone the type time_t or long (HP-UX 10.20 apparently
35 AC_DEFUN(FPTOOLS_TYPE_TIMEZONE,
36 [AC_CACHE_CHECK([type of timezone], fptools_cv_type_timezone,
37 [AC_TRY_COMPILE([#if TIME_WITH_SYS_TIME
38 # include <sys/time.h>
42 # include <sys/time.h>
48 extern time_t timezone;
50 [int i;], fptools_cv_type_timezone=time_t, fptools_cv_type_timezone=long)])
51 AC_DEFINE_UNQUOTED(TYPE_TIMEZONE, $fptools_cv_type_timezone)
54 dnl *** Is altzone available? ***
56 AC_DEFUN(FPTOOLS_ALTZONE,
57 [AC_CACHE_CHECK([altzone], fptools_cv_altzone,
58 [AC_TRY_LINK([#if TIME_WITH_SYS_TIME
59 # include <sys/time.h>
63 # include <sys/time.h>
69 fptools_cv_altzone=yes, fptools_cv_altzone=no)])
70 if test "$fptools_cv_altzone" = yes; then
71 AC_DEFINE(HAVE_ALTZONE)
76 dnl ** check for leading underscores in symbol names
78 dnl Test for determining whether symbol names have a leading
81 dnl We assume that they _haven't_ if anything goes wrong.
83 dnl Some nlist implementations seem to try to be compatible by ignoring
84 dnl a leading underscore sometimes (eg. FreeBSD). We therefore have
85 dnl to work around this by checking for *no* leading underscore first.
88 AC_DEFUN(FPTOOLS_UNDERSCORE,
89 [AC_CHECK_LIB(elf, nlist, LIBS="-lelf $LIBS")dnl
90 AC_CACHE_CHECK([leading underscore in symbol names], fptools_cv_lead_uscore,
93 dnl Hack!: nlist() under Digital UNIX insist on there being an _,
94 dnl but symbol table listings shows none. What is going on here?!?
96 dnl Another hack: cygwin doesn't come with nlist.h , so we hardwire
97 dnl the underscoredness of that "platform"
98 changequote(<<, >>)dnl
100 case $HostPlatform in
101 alpha-dec-osf*) fptools_cv_lead_uscore='no';;
102 *cygwin32) fptools_cv_lead_uscore='yes';;
103 *mingw32) fptools_cv_lead_uscore='yes';;
106 AC_TRY_RUN([#ifdef HAVE_NLIST_H
108 changequote(<<, >>)dnl
110 struct nlist xYzzY1[] = {{"xYzzY1", 0},{0}};
111 struct nlist xYzzY2[] = {{"_xYzzY2", 0},{0}};
119 if(nlist(argv[0], xYzzY1) == 0 && xYzzY1[0].n_value != 0)
121 if(nlist(argv[0], xYzzY2) == 0 && xYzzY2[0].n_value != 0)
126 }], fptools_cv_lead_uscore=yes, fptools_cv_lead_uscore=no, fptools_cv_lead_uscore=NO)
129 LeadingUnderscore=`echo $fptools_cv_lead_uscore | sed 'y/yesno/YESNO/'`
130 AC_SUBST(LeadingUnderscore)
131 case $LeadingUnderscore in
132 YES) AC_DEFINE(LEADING_UNDERSCORE);;
137 dnl Check for Happy and version. If we're building GHC, then we need
138 dnl at least Happy version 1.6. If there's no installed Happy, we look
139 dnl for a happy source tree and point the build system at that instead.
141 dnl ToDo: when we reset HappyCmd to the source tree, autoconf doesn't
142 dnl seems to insert it in the cache file. sigh.
144 AC_DEFUN(FPTOOLS_HAPPY,
145 [AC_PATH_PROG(HappyCmd,happy)
146 AC_CACHE_CHECK([for version of happy], fptools_cv_happy_version,
147 [if test x"$HappyCmd" != x; then
148 fptools_cv_happy_version="`$HappyCmd -v |
150 grep 'Happy Version' | sed -e 's/Happy Version \([^ ]*\).*/\1/g'`" ;
151 elif test -d $srcdir/happy; then
152 HappyCmd=$hardtop/happy/src/happy-inplace;
153 fptools_cv_happy_version=`grep '^ProjectVersion[ ]*=' $srcdir/happy/mk/version.mk | sed 's/.*\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/g'`;
154 echo -n "using happy from the source tree... ";
156 fptools_cv_happy_version="";
159 if expr "$fptools_cv_happy_version" "<" 1.6 > /dev/null 2>&1; then
160 if test -d $srcdir/ghc; then
162 echo "Happy version 1.6 or later is required to compile GHC."
167 HappyVersion=$fptools_cv_happy_version;
168 AC_SUBST(HappyVersion)
172 dnl What's the best way of doing context diffs?
174 dnl (NB: NeXTStep thinks diff'ing a file against itself is "trouble")
176 AC_DEFUN(FPTOOLS_PROG_DIFF,
177 [AC_CACHE_CHECK([for ok way to do context diffs], fptools_cv_context_diffs,
178 [echo foo > conftest1
180 if diff -C 1 conftest1 conftest2 > /dev/null 2>&1 ; then
181 fptools_cv_context_diffs='diff -C 1'
183 if diff -c1 conftest1 conftest2 > /dev/null 2>&1 ; then
184 fptools_cv_context_diffs='diff -c1'
186 echo "Can't figure out how to do context diffs."
187 echo "Neither \`diff -C 1' nor \`diff -c1' works."
191 rm -f conftest1 conftest2
193 ContextDiffCmd=$fptools_cv_context_diffs
194 AC_SUBST(ContextDiffCmd)
198 dnl Finding the Right Yacc
200 AC_DEFUN(FPTOOLS_PROG_YACCY,
202 if test "$YACC" = "yacc"; then
203 AC_CACHE_CHECK([if it is an OK yacc], ac_cv_prog_yacc,
204 [AC_CHECK_PROG(WhatCmd, what, what, :)
205 $WhatCmd $YACC > conftest.out
206 if egrep 'y1\.c 1\..*SMI' conftest.out >/dev/null 2>&1; then
207 echo "I don't trust your $YaccCmd; it looks like an old Sun yacc"
208 if test -f /usr/lang/yacc; then
209 echo "I'm going to use /usr/lang/yacc instead"
210 ac_cv_prog_yacc=/usr/lang/yacc
212 echo "I'm assuming the worst...no parser generator at all"
215 elif egrep 'y1\.c.*Revision: 4\.2\.6\.3.*DEC' conftest.out >/dev/null 2>&1; then
216 echo "I don't trust your $YaccCmd; it looks like a lame DEC yacc"
217 echo "I'm assuming the worst...no parser generator at all"
220 ac_cv_prog_yacc=$YACC
225 ac_cv_prog_yacc=$YACC
227 YaccCmd=$ac_cv_prog_yacc
231 dnl *** Checking for ar and its arguments + whether we need ranlib.
233 dnl ArCmd and RANLIB are AC_SUBST'ed
235 AC_DEFUN(FPTOOLS_PROG_AR_AND_RANLIB,
236 [AC_PATH_PROG(ArCmd,ar)
237 if test -z "$ArCmd"; then
238 echo "You don't seem to have ar in your PATH...I have no idea how to make a library"
241 if $ArCmd clqs conftest.a >/dev/null 2>/dev/null; then
244 elif $ArCmd cqs conftest.a >/dev/null 2>/dev/null; then
247 elif $ArCmd clq conftest.a >/dev/null 2>/dev/null; then
250 elif $ArCmd cq conftest.a >/dev/null 2>/dev/null; then
253 elif $ArCmd cq conftest.a 2>&1 | grep 'no archive members specified' >/dev/null 2>/dev/null; then
257 echo "I can't figure out how to use your $ArCmd"
261 test -n "$ArCmd" && test -n "$verbose" && echo " setting ArCmd to $ArCmd"
263 if test -z "$NeedRanLib"; then
265 test -n "$verbose" && echo " setting RANLIB to $RANLIB"
273 dnl AC_SHEBANG_PERL - can we she-bang perl?
275 AC_DEFUN(FPTOOLS_SHEBANG_PERL,
276 [AC_CACHE_CHECK([if your perl works in shell scripts], fptools_cv_shebang_perl,
281 (SHELL=/bin/sh; export SHELL; ./conftest 69 > /dev/null)
282 if test $? -ne 69; then
283 fptools_cv_shebang_perl=yes
285 fptools_cv_shebang_perl=no
291 dnl Extra testing of the result AC_PROG_CC, testing the gcc version no.
292 dnl *Must* be called after AC_PROG_CC
294 AC_DEFUN(FPTOOLS_HAVE_GCC,
295 [AC_CACHE_CHECK([whether you have an ok gcc], fptools_cv_have_gcc,
296 [if test -z "$GCC"; then
298 echo "You would be better off with gcc"
299 echo "Perhaps it is already installed, but not in your PATH?"
300 fptools_cv_have_gcc='no'
303 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' `"
305 if test `eval $cmd_string 2>/dev/null` != "1"; then
307 echo "I'm not sure if your version of gcc will work,"
308 echo "but it's worth a shot, eh?"
310 fptools_cv_have_gcc='yes'
313 HaveGcc=`echo $fptools_cv_have_gcc | sed 'y/yesno/YESNO/'`
317 dnl Small feature test for perl version. Assumes PerlCmd
318 dnl contains path to perl binary
320 AC_DEFUN(FPTOOLS_CHECK_PERL_VERSION,
321 [$PerlCmd -v >conftest.out 2>&1
322 if grep "version 5" conftest.out >/dev/null 2>&1; then
325 if grep "version 6" conftest.out >/dev/null 2>&1; then
328 echo "Your version of perl probably won't work."
334 dnl ** figure out the alignment restriction of a type
335 dnl (required SIZEOF test but AC_CHECK_SIZEOF doesn't call PROVIDE
336 dnl so we can't call REQUIRE)
338 dnl FPTOOLS_CHECK_ALIGNMENT(TYPE)
339 AC_DEFUN(FPTOOLS_CHECK_ALIGNMENT,
340 [changequote(<<, >>)dnl
341 dnl The name to #define.
342 define(<<AC_TYPE_NAME>>, translit(alignment_$1, [a-z *], [A-Z_P]))dnl
343 dnl The cache variable name.
344 define(<<AC_CV_NAME>>, translit(ac_cv_alignment_$1, [ *], [_p]))dnl
345 dnl The name of the corresponding size.
346 define(<<AC_CV_SIZEOF_NAME>>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl
348 AC_MSG_CHECKING(alignment of $1)
349 AC_CACHE_VAL(AC_CV_NAME,
356 #define offsetof(ty,field) ((size_t)((char *)&((ty *)0)->field - (char *)(ty *)0))
361 FILE *f=fopen("conftestval", "w");
363 fprintf(f, "%d\n", offsetof(struct { char c; $1 ty;},ty));
366 AC_CV_NAME=`cat conftestval`,
367 AC_CV_NAME=$AC_CV_SIZEOF_NAME,
368 AC_CV_NAME=$AC_CV_SIZEOF_NAME)])
369 AC_MSG_RESULT($AC_CV_NAME)
370 AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME)
371 AC_PROVIDE($AC_TYPE_NAME)
372 undefine([AC_TYPE_NAME])dnl
373 undefine([AC_CV_NAME])dnl
374 undefine([AC_CV_SIZEOF_NAME])dnl
377 dnl ** figure out whether C compiler supports 'long long's
378 dnl (Closely based on Andreas Zeller's macro for testing
379 dnl for this under C++)
381 dnl If the C compiler supports `long long' types,
382 dnl define `HAVE_LONG_LONG'.
384 AC_DEFUN(FPTOOLS_C_LONG_LONG,
386 AC_REQUIRE([AC_PROG_CC])
387 AC_MSG_CHECKING(whether ${CC} supports long long types)
388 AC_CACHE_VAL(fptools_cv_have_long_long,
392 AC_TRY_COMPILE(,[long long a;],
393 fptools_cv_have_long_long=yes,
394 fptools_cv_have_long_long=no)
397 AC_MSG_RESULT($fptools_cv_have_long_long)
398 if test "$fptools_cv_have_long_long" = yes; then
399 AC_DEFINE(HAVE_LONG_LONG)
403 dnl *** Can we open files in binary mode? ***
405 AC_DEFUN(FPTOOLS_O_BINARY,
407 AC_REQUIRE([AC_PROG_CC])
408 AC_MSG_CHECKING(whether we can open files in binary mode)
409 AC_CACHE_VAL(fptools_cv_have_o_binary,
418 fptools_cv_have_o_binary=yes,
419 fptools_cv_have_o_binary=no)
422 AC_MSG_RESULT($fptools_cv_have_o_binary)
423 if test "$fptools_cv_have_o_binary" = yes; then
424 AC_DEFINE(HAVE_O_BINARY)
428 dnl *** Which one comes first, .text or .data? ***
430 AC_DEFUN(FPTOOLS_CODE_BEFORE_DATA,
431 [AC_CACHE_CHECK([if code section appears before data], fptools_cv_code_bef_data,
433 int f() { return 1; }
435 int main() { return ((char*)&f > (char*)&i); }
438 fptools_cv_code_bef_data=yes, fptools_cv_code_bef_data=no,false)])
439 if test "$fptools_cv_code_bef_data" = yes; then
440 AC_DEFINE(CODE_BEFORE_DATA)
444 dnl *** Helper function **
446 AC_DEFUN(FPTOOLS_IN_SCOPE,AC_TRY_LINK([extern char* $1;],[return (int)&$2], $3=yes, $3=no))
448 dnl *** What's the end-of-text-section marker called? ***
450 AC_DEFUN(FPTOOLS_END_TEXT_SECTION,
451 [AC_MSG_CHECKING([for end of text section marker])
453 for i in data_start _data_start etext _etext __etext; do
454 FPTOOLS_IN_SCOPE($i,$i,fptools_end_of_text)
455 if test "$fptools_end_of_text" = yes; then
456 AC_CACHE_VAL([fptools_cv_end_of_text_decl], AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER_DECL, $i))
457 AC_CACHE_VAL([fptools_cv_end_of_text], AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER, $i))
462 if test "$not_done" = 1; then
463 FPTOOLS_IN_SCOPE(etext asm("etext"),etext,fptools_end_of_text);
464 if test "$fptools_end_of_text" = yes; then
465 AC_CACHE_VAL([fptools_cv_end_of_text], AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER, etext))
466 AC_CACHE_VAL([fptools_cv_end_of_text_decl], AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER_DECL, etext asm("etext")))
468 AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER_DECL, dunno_what_it_is)
469 AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER, dunno_what_it_is)
472 AC_MSG_RESULT([$]fptools_cv_end_of_text)
475 dnl *** What's the end-of-data-section marker called? ***
477 AC_DEFUN(FPTOOLS_END_DATA_SECTION,
478 [AC_MSG_CHECKING([for end of data section marker])
480 for i in end _end __end; do
481 FPTOOLS_IN_SCOPE($i,$i,fptools_end_of_data)
482 if test "$fptools_end_of_data" = yes; then
483 AC_CACHE_VAL([fptools_cv_end_of_data_decl], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER_DECL, $i)])
484 AC_CACHE_VAL([fptools_cv_end_of_data], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER, $i)])
489 if test "$not_done" = 1; then
490 FPTOOLS_IN_SCOPE(end asm("end"),end,fptools_end_of_data);
491 if test "$fptools_end_of_data" = yes; then
492 AC_CACHE_VAL([fptools_cv_end_of_data_decl], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER_DECL, end asm("end"))])
493 AC_CACHE_VAL([fptools_cv_end_of_data], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER, end)])
495 AC_CACHE_VAL([fptools_cv_end_of_data_decl], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER_DECL, dunno_what_it_is)])
496 AC_CACHE_VAL([fptools_cv_end_of_data], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER, dunno_what_it_is)])
499 AC_MSG_RESULT([$]fptools_cv_end_of_data)
504 dnl Based on AC_TRY_LINK - run iftrue if links cleanly with no warning
506 dnl FPTOOLS_TRY_LINK_NOWARN(flags,main?,iftrue,iffalse)
508 AC_DEFUN(FPTOOLS_TRY_LINK_NOWARN,
512 cat > conftest.$ac_ext <<EOF
513 dnl This sometimes fails to find confdefs.h, for some reason.
514 dnl [#]line __oline__ "[$]0"
515 [#]line __oline__ "configure"
516 #include "confdefs.h"
518 int t() { return 0; }
520 if AC_TRY_EVAL(ac_link); then
525 ifelse([$4], , , [else
535 dnl Loosely based on AC_CHECK_LIB in acgeneral.m4 in autoconf distribution
537 dnl FPTOOLS_CHECK_FLAG_NOWARN(NAME, FLAG, CODE, iftrue, iffalse)
539 AC_DEFUN(FPTOOLS_CHECK_FLAG_NOWARN,
540 [AC_MSG_CHECKING([for $1])
541 AC_CACHE_VAL(ac_cv_flag_$1,
542 [FPTOOLS_TRY_LINK_NOWARN("$2", [main() { $3; exit(0); } ],
543 eval "ac_cv_flag_$1=yes",
544 eval "ac_cv_flag_$1=no"
547 if eval "test \"`echo '$ac_cv_flag_'$1`\" = yes"; then
557 dnl FPTOOLS_CHECK_LIB_NOWARN(LIBRARY, FUNCTION)
559 AC_DEFUN(FPTOOLS_CHECK_LIB_NOWARN,
560 [FPTOOLS_CHECK_FLAG_NOWARN([function_$2],[],[extern char $2(); $2();],
562 ac_tr_lib=HAVE_LIB`echo $1 | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
564 AC_DEFINE_UNQUOTED($ac_tr_lib)
566 [FPTOOLS_CHECK_FLAG_NOWARN([library_$1],[-l$1],[extern char $2(); $2();],
568 ac_tr_lib=HAVE_LIB`echo $1 | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
570 AC_DEFINE_UNQUOTED($ac_tr_lib)
576 dnl check for prototypes
578 AC_DEFUN(AC_C_PROTOTYPES,
579 [AC_CACHE_CHECK([prototypes], ac_cv_prototypes,
588 ac_cv_prototypes=yes,
589 ac_cv_prototypes=no)])
590 if test "$ac_cv_prototypes" = yes; then
591 AC_DEFINE(HAVE_PROTOTYPES)