1 dnl $Id: aclocal.m4,v 1.49 2000/06/08 20:57:02 panne 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 ** Map an arithmetic C type to a Haskell type.
378 dnl Based on autconf's AC_CHECK_SIZEOF.
380 dnl FPTOOLS_CHECK_HTYPE(TYPE)
381 AC_DEFUN(FPTOOLS_CHECK_HTYPE,
382 [changequote(<<, >>)dnl
383 dnl The name to #define.
384 define(<<AC_TYPE_NAME>>, translit(htype_$1, [a-z *], [A-Z_P]))dnl
385 dnl The cache variable name.
386 define(<<AC_CV_NAME>>, translit(fptools_cv_htype_$1, [ *], [_p]))dnl
388 AC_MSG_CHECKING(Haskell type for $1)
389 AC_CACHE_VAL(AC_CV_NAME,
390 [AC_TRY_RUN([#include <stdio.h>
402 FILE *f=fopen("conftestval", "w");
404 if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
406 ((testing)(-1) < (testing)0) ? "Int" : "Word",
410 (sizeof(testing) > sizeof(double)) ? "LDouble" :
411 (sizeof(testing) == sizeof(double)) ? "Double" : "Float");
415 }], AC_CV_NAME=`cat conftestval`, AC_CV_NAME=NotReallyAType, AC_CV_NAME=NotReallyAType)])dnl
416 AC_MSG_RESULT($AC_CV_NAME)
417 AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME)
418 undefine([AC_TYPE_NAME])dnl
419 undefine([AC_CV_NAME])dnl
422 dnl ** figure out whether C compiler supports 'long long's
423 dnl (Closely based on Andreas Zeller's macro for testing
424 dnl for this under C++)
426 dnl If the C compiler supports `long long' types,
427 dnl define `HAVE_LONG_LONG'.
429 AC_DEFUN(FPTOOLS_C_LONG_LONG,
431 AC_REQUIRE([AC_PROG_CC])
432 AC_MSG_CHECKING(whether ${CC} supports long long types)
433 AC_CACHE_VAL(fptools_cv_have_long_long,
437 AC_TRY_COMPILE(,[long long a;],
438 fptools_cv_have_long_long=yes,
439 fptools_cv_have_long_long=no)
442 AC_MSG_RESULT($fptools_cv_have_long_long)
443 if test "$fptools_cv_have_long_long" = yes; then
444 AC_DEFINE(HAVE_LONG_LONG)
448 dnl *** Can we open files in binary mode? ***
450 AC_DEFUN(FPTOOLS_O_BINARY,
452 AC_REQUIRE([AC_PROG_CC])
453 AC_MSG_CHECKING(whether we can open files in binary mode)
454 AC_CACHE_VAL(fptools_cv_have_o_binary,
463 fptools_cv_have_o_binary=yes,
464 fptools_cv_have_o_binary=no)
467 AC_MSG_RESULT($fptools_cv_have_o_binary)
468 if test "$fptools_cv_have_o_binary" = yes; then
469 AC_DEFINE(HAVE_O_BINARY)
473 dnl *** Which one comes first, .text or .data? ***
475 AC_DEFUN(FPTOOLS_CODE_BEFORE_DATA,
476 [AC_CACHE_CHECK([if code section appears before data], fptools_cv_code_bef_data,
478 int f() { return 1; }
480 int main() { return ((char*)&f > (char*)&i); }
483 fptools_cv_code_bef_data=yes, fptools_cv_code_bef_data=no,false)])
484 if test "$fptools_cv_code_bef_data" = yes; then
485 AC_DEFINE(CODE_BEFORE_DATA)
489 dnl *** Helper function **
491 AC_DEFUN(FPTOOLS_IN_SCOPE,AC_TRY_LINK([extern char* $1;],[return (int)&$2], $3=yes, $3=no))
493 dnl *** What's the end-of-text-section marker called? ***
495 AC_DEFUN(FPTOOLS_END_TEXT_SECTION,
496 [AC_MSG_CHECKING([for end of text section marker])
498 for i in data_start _data_start etext _etext __etext; do
499 FPTOOLS_IN_SCOPE($i,$i,fptools_end_of_text)
500 if test "$fptools_end_of_text" = yes; then
501 AC_CACHE_VAL([fptools_cv_end_of_text_decl], AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER_DECL, $i))
502 AC_CACHE_VAL([fptools_cv_end_of_text], AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER, $i))
507 if test "$not_done" = 1; then
508 FPTOOLS_IN_SCOPE(etext asm("etext"),etext,fptools_end_of_text);
509 if test "$fptools_end_of_text" = yes; then
510 AC_CACHE_VAL([fptools_cv_end_of_text], AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER, etext))
511 AC_CACHE_VAL([fptools_cv_end_of_text_decl], AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER_DECL, etext asm("etext")))
513 AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER_DECL, dunno_what_it_is)
514 AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER, dunno_what_it_is)
517 AC_MSG_RESULT([$]fptools_cv_end_of_text)
520 dnl *** What's the end-of-data-section marker called? ***
522 AC_DEFUN(FPTOOLS_END_DATA_SECTION,
523 [AC_MSG_CHECKING([for end of data section marker])
525 for i in end _end __end; do
526 FPTOOLS_IN_SCOPE($i,$i,fptools_end_of_data)
527 if test "$fptools_end_of_data" = yes; then
528 AC_CACHE_VAL([fptools_cv_end_of_data_decl], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER_DECL, $i)])
529 AC_CACHE_VAL([fptools_cv_end_of_data], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER, $i)])
534 if test "$not_done" = 1; then
535 FPTOOLS_IN_SCOPE(end asm("end"),end,fptools_end_of_data);
536 if test "$fptools_end_of_data" = yes; then
537 AC_CACHE_VAL([fptools_cv_end_of_data_decl], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER_DECL, end asm("end"))])
538 AC_CACHE_VAL([fptools_cv_end_of_data], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER, end)])
540 AC_CACHE_VAL([fptools_cv_end_of_data_decl], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER_DECL, dunno_what_it_is)])
541 AC_CACHE_VAL([fptools_cv_end_of_data], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER, dunno_what_it_is)])
544 AC_MSG_RESULT([$]fptools_cv_end_of_data)
549 dnl Based on AC_TRY_LINK - run iftrue if links cleanly with no warning
551 dnl FPTOOLS_TRY_LINK_NOWARN(flags,main?,iftrue,iffalse)
553 AC_DEFUN(FPTOOLS_TRY_LINK_NOWARN,
557 cat > conftest.$ac_ext <<EOF
558 dnl This sometimes fails to find confdefs.h, for some reason.
559 dnl [#]line __oline__ "[$]0"
560 [#]line __oline__ "configure"
561 #include "confdefs.h"
563 int t() { return 0; }
565 if AC_TRY_EVAL(ac_link); then
570 ifelse([$4], , , [else
580 dnl Loosely based on AC_CHECK_LIB in acgeneral.m4 in autoconf distribution
582 dnl FPTOOLS_CHECK_FLAG_NOWARN(NAME, FLAG, CODE, iftrue, iffalse)
584 AC_DEFUN(FPTOOLS_CHECK_FLAG_NOWARN,
585 [AC_MSG_CHECKING([for $1])
586 AC_CACHE_VAL(ac_cv_flag_$1,
587 [FPTOOLS_TRY_LINK_NOWARN("$2", [main() { $3; exit(0); } ],
588 eval "ac_cv_flag_$1=yes",
589 eval "ac_cv_flag_$1=no"
592 if eval "test \"`echo '$ac_cv_flag_'$1`\" = yes"; then
602 dnl FPTOOLS_CHECK_LIB_NOWARN(LIBRARY, FUNCTION)
604 AC_DEFUN(FPTOOLS_CHECK_LIB_NOWARN,
605 [FPTOOLS_CHECK_FLAG_NOWARN([function_$2],[],[extern char $2(); $2();],
607 ac_tr_lib=HAVE_LIB`echo $1 | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
609 AC_DEFINE_UNQUOTED($ac_tr_lib)
611 [FPTOOLS_CHECK_FLAG_NOWARN([library_$1],[-l$1],[extern char $2(); $2();],
613 ac_tr_lib=HAVE_LIB`echo $1 | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
615 AC_DEFINE_UNQUOTED($ac_tr_lib)
621 dnl check for prototypes
623 AC_DEFUN(AC_C_PROTOTYPES,
624 [AC_CACHE_CHECK([prototypes], ac_cv_prototypes,
633 ac_cv_prototypes=yes,
634 ac_cv_prototypes=no)])
635 if test "$ac_cv_prototypes" = yes; then
636 AC_DEFINE(HAVE_PROTOTYPES)
640 dnl ** Check which CATALOG file we have to use with DocBook SGML.
642 dnl FPTOOLS_DOCBOOK_CATALOG(VARIABLE, JADE, STYLESHEET, CATALOGS-TO-CHECK-FOR)
644 dnl If any of the catalogs given in CATALOGS-TO-CHECK-FOR works on this
645 dnl platform, let VARIABLE refer to this catalog; otherwise, VARIABLE
646 dnl is set to "no". JADE is the jade executable and STYLESHEET
647 dnl a DocBook style sheet.
649 AC_DEFUN(FPTOOLS_DOCBOOK_CATALOG,
650 [AC_CACHE_CHECK([for DocBook CATALOG], fptools_cv_sgml_catalog,
652 cat > conftest.sgml << EOF
653 <!DOCTYPE Article PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
657 <Author><OtherName>Test</OtherName></Author>
658 <Address>Test</Address>
659 <PubDate>Test</PubDate>
661 <Sect1><Title>Test</Title>
668 fptools_cv_sgml_catalog=no
669 for fptools_catalog in $4; do
670 ac_try="$2 -t rtf -d $3#print -c $fptools_catalog conftest.sgml"
671 if AC_TRY_EVAL(ac_try); then
672 fptools_cv_sgml_catalog=[$]fptools_catalog
678 if test $fptools_cv_sgml_catalog != "no"; then
679 $1=$fptools_cv_sgml_catalog