1 dnl $Id: aclocal.m4,v 1.50 2000/06/15 20:22:53 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 [, DEFAULT_VALUE, [, VALUE-FOR-CROSS-COMPILATION])
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`,
416 ifelse([$2], , AC_CV_NAME=NotReallyAType, AC_CV_NAME=$2),
417 ifelse([$3], , AC_CV_NAME=NotReallyATypeCross, AC_CV_NAME=$3))]) dnl
418 AC_MSG_RESULT($AC_CV_NAME)
419 AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME)
420 undefine([AC_TYPE_NAME])dnl
421 undefine([AC_CV_NAME])dnl
424 dnl ** figure out whether C compiler supports 'long long's
425 dnl (Closely based on Andreas Zeller's macro for testing
426 dnl for this under C++)
428 dnl If the C compiler supports `long long' types,
429 dnl define `HAVE_LONG_LONG'.
431 AC_DEFUN(FPTOOLS_C_LONG_LONG,
433 AC_REQUIRE([AC_PROG_CC])
434 AC_MSG_CHECKING(whether ${CC} supports long long types)
435 AC_CACHE_VAL(fptools_cv_have_long_long,
439 AC_TRY_COMPILE(,[long long a;],
440 fptools_cv_have_long_long=yes,
441 fptools_cv_have_long_long=no)
444 AC_MSG_RESULT($fptools_cv_have_long_long)
445 if test "$fptools_cv_have_long_long" = yes; then
446 AC_DEFINE(HAVE_LONG_LONG)
450 dnl *** Can we open files in binary mode? ***
452 AC_DEFUN(FPTOOLS_O_BINARY,
454 AC_REQUIRE([AC_PROG_CC])
455 AC_MSG_CHECKING(whether we can open files in binary mode)
456 AC_CACHE_VAL(fptools_cv_have_o_binary,
465 fptools_cv_have_o_binary=yes,
466 fptools_cv_have_o_binary=no)
469 AC_MSG_RESULT($fptools_cv_have_o_binary)
470 if test "$fptools_cv_have_o_binary" = yes; then
471 AC_DEFINE(HAVE_O_BINARY)
475 dnl *** Which one comes first, .text or .data? ***
477 AC_DEFUN(FPTOOLS_CODE_BEFORE_DATA,
478 [AC_CACHE_CHECK([if code section appears before data], fptools_cv_code_bef_data,
480 int f() { return 1; }
482 int main() { return ((char*)&f > (char*)&i); }
485 fptools_cv_code_bef_data=yes, fptools_cv_code_bef_data=no,false)])
486 if test "$fptools_cv_code_bef_data" = yes; then
487 AC_DEFINE(CODE_BEFORE_DATA)
491 dnl *** Helper function **
493 AC_DEFUN(FPTOOLS_IN_SCOPE,AC_TRY_LINK([extern char* $1;],[return (int)&$2], $3=yes, $3=no))
495 dnl *** What's the end-of-text-section marker called? ***
497 AC_DEFUN(FPTOOLS_END_TEXT_SECTION,
498 [AC_MSG_CHECKING([for end of text section marker])
500 for i in data_start _data_start etext _etext __etext; do
501 FPTOOLS_IN_SCOPE($i,$i,fptools_end_of_text)
502 if test "$fptools_end_of_text" = yes; then
503 AC_CACHE_VAL([fptools_cv_end_of_text_decl], AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER_DECL, $i))
504 AC_CACHE_VAL([fptools_cv_end_of_text], AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER, $i))
509 if test "$not_done" = 1; then
510 FPTOOLS_IN_SCOPE(etext asm("etext"),etext,fptools_end_of_text);
511 if test "$fptools_end_of_text" = yes; then
512 AC_CACHE_VAL([fptools_cv_end_of_text], AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER, etext))
513 AC_CACHE_VAL([fptools_cv_end_of_text_decl], AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER_DECL, etext asm("etext")))
515 AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER_DECL, dunno_what_it_is)
516 AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER, dunno_what_it_is)
519 AC_MSG_RESULT([$]fptools_cv_end_of_text)
522 dnl *** What's the end-of-data-section marker called? ***
524 AC_DEFUN(FPTOOLS_END_DATA_SECTION,
525 [AC_MSG_CHECKING([for end of data section marker])
527 for i in end _end __end; do
528 FPTOOLS_IN_SCOPE($i,$i,fptools_end_of_data)
529 if test "$fptools_end_of_data" = yes; then
530 AC_CACHE_VAL([fptools_cv_end_of_data_decl], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER_DECL, $i)])
531 AC_CACHE_VAL([fptools_cv_end_of_data], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER, $i)])
536 if test "$not_done" = 1; then
537 FPTOOLS_IN_SCOPE(end asm("end"),end,fptools_end_of_data);
538 if test "$fptools_end_of_data" = yes; then
539 AC_CACHE_VAL([fptools_cv_end_of_data_decl], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER_DECL, end asm("end"))])
540 AC_CACHE_VAL([fptools_cv_end_of_data], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER, end)])
542 AC_CACHE_VAL([fptools_cv_end_of_data_decl], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER_DECL, dunno_what_it_is)])
543 AC_CACHE_VAL([fptools_cv_end_of_data], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER, dunno_what_it_is)])
546 AC_MSG_RESULT([$]fptools_cv_end_of_data)
551 dnl Based on AC_TRY_LINK - run iftrue if links cleanly with no warning
553 dnl FPTOOLS_TRY_LINK_NOWARN(flags,main?,iftrue,iffalse)
555 AC_DEFUN(FPTOOLS_TRY_LINK_NOWARN,
559 cat > conftest.$ac_ext <<EOF
560 dnl This sometimes fails to find confdefs.h, for some reason.
561 dnl [#]line __oline__ "[$]0"
562 [#]line __oline__ "configure"
563 #include "confdefs.h"
565 int t() { return 0; }
567 if AC_TRY_EVAL(ac_link); then
572 ifelse([$4], , , [else
582 dnl Loosely based on AC_CHECK_LIB in acgeneral.m4 in autoconf distribution
584 dnl FPTOOLS_CHECK_FLAG_NOWARN(NAME, FLAG, CODE, iftrue, iffalse)
586 AC_DEFUN(FPTOOLS_CHECK_FLAG_NOWARN,
587 [AC_MSG_CHECKING([for $1])
588 AC_CACHE_VAL(ac_cv_flag_$1,
589 [FPTOOLS_TRY_LINK_NOWARN("$2", [main() { $3; exit(0); } ],
590 eval "ac_cv_flag_$1=yes",
591 eval "ac_cv_flag_$1=no"
594 if eval "test \"`echo '$ac_cv_flag_'$1`\" = yes"; then
604 dnl FPTOOLS_CHECK_LIB_NOWARN(LIBRARY, FUNCTION)
606 AC_DEFUN(FPTOOLS_CHECK_LIB_NOWARN,
607 [FPTOOLS_CHECK_FLAG_NOWARN([function_$2],[],[extern char $2(); $2();],
609 ac_tr_lib=HAVE_LIB`echo $1 | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
611 AC_DEFINE_UNQUOTED($ac_tr_lib)
613 [FPTOOLS_CHECK_FLAG_NOWARN([library_$1],[-l$1],[extern char $2(); $2();],
615 ac_tr_lib=HAVE_LIB`echo $1 | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
617 AC_DEFINE_UNQUOTED($ac_tr_lib)
623 dnl check for prototypes
625 AC_DEFUN(AC_C_PROTOTYPES,
626 [AC_CACHE_CHECK([prototypes], ac_cv_prototypes,
635 ac_cv_prototypes=yes,
636 ac_cv_prototypes=no)])
637 if test "$ac_cv_prototypes" = yes; then
638 AC_DEFINE(HAVE_PROTOTYPES)
642 dnl ** Check which CATALOG file we have to use with DocBook SGML.
644 dnl FPTOOLS_DOCBOOK_CATALOG(VARIABLE, JADE, STYLESHEET, CATALOGS-TO-CHECK-FOR)
646 dnl If any of the catalogs given in CATALOGS-TO-CHECK-FOR works on this
647 dnl platform, let VARIABLE refer to this catalog; otherwise, VARIABLE
648 dnl is set to "no". JADE is the jade executable and STYLESHEET
649 dnl a DocBook style sheet.
651 AC_DEFUN(FPTOOLS_DOCBOOK_CATALOG,
652 [AC_CACHE_CHECK([for DocBook CATALOG], fptools_cv_sgml_catalog,
654 cat > conftest.sgml << EOF
655 <!DOCTYPE Article PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
659 <Author><OtherName>Test</OtherName></Author>
660 <Address>Test</Address>
661 <PubDate>Test</PubDate>
663 <Sect1><Title>Test</Title>
670 fptools_cv_sgml_catalog=no
671 for fptools_catalog in $4; do
672 ac_try="$2 -t rtf -d $3#print -c $fptools_catalog conftest.sgml"
673 if AC_TRY_EVAL(ac_try); then
674 fptools_cv_sgml_catalog=[$]fptools_catalog
680 if test $fptools_cv_sgml_catalog != "no"; then
681 $1=$fptools_cv_sgml_catalog