1 dnl $Id: aclocal.m4,v 1.51 2000/06/29 13:40:17 simonmar 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 *** Does libc contain GNU regex? ***
78 AC_DEFUN(FPTOOLS_REGEX_IN_LIBC,
79 [AC_CACHE_CHECK([for GNU regex in libc], fptools_cv_have_regex,
80 [AC_TRY_LINK([#if HAVE_UNISTD_H
84 ],[ struct re_pattern_buffer patbuf; re_compile_pattern("",0,&patbuf); ],
85 fptools_cv_have_regex=yes, fptools_cv_have_regex=no)])
86 if test "$fptools_cv_have_regex" = yes; then
95 dnl ** check for leading underscores in symbol names
97 dnl Test for determining whether symbol names have a leading
100 dnl We assume that they _haven't_ if anything goes wrong.
102 dnl Some nlist implementations seem to try to be compatible by ignoring
103 dnl a leading underscore sometimes (eg. FreeBSD). We therefore have
104 dnl to work around this by checking for *no* leading underscore first.
107 AC_DEFUN(FPTOOLS_UNDERSCORE,
108 [AC_CHECK_LIB(elf, nlist, LIBS="-lelf $LIBS")dnl
109 AC_CACHE_CHECK([leading underscore in symbol names], fptools_cv_lead_uscore,
112 dnl Hack!: nlist() under Digital UNIX insist on there being an _,
113 dnl but symbol table listings shows none. What is going on here?!?
115 dnl Another hack: cygwin doesn't come with nlist.h , so we hardwire
116 dnl the underscoredness of that "platform"
117 changequote(<<, >>)dnl
119 case $HostPlatform in
120 alpha-dec-osf*) fptools_cv_lead_uscore='no';;
121 *cygwin32) fptools_cv_lead_uscore='yes';;
122 *mingw32) fptools_cv_lead_uscore='yes';;
125 AC_TRY_RUN([#ifdef HAVE_NLIST_H
127 changequote(<<, >>)dnl
129 struct nlist xYzzY1[] = {{"xYzzY1", 0},{0}};
130 struct nlist xYzzY2[] = {{"_xYzzY2", 0},{0}};
138 if(nlist(argv[0], xYzzY1) == 0 && xYzzY1[0].n_value != 0)
140 if(nlist(argv[0], xYzzY2) == 0 && xYzzY2[0].n_value != 0)
145 }], fptools_cv_lead_uscore=yes, fptools_cv_lead_uscore=no, fptools_cv_lead_uscore=NO)
148 LeadingUnderscore=`echo $fptools_cv_lead_uscore | sed 'y/yesno/YESNO/'`
149 AC_SUBST(LeadingUnderscore)
150 case $LeadingUnderscore in
151 YES) AC_DEFINE(LEADING_UNDERSCORE);;
156 dnl Check for Happy and version. If we're building GHC, then we need
157 dnl at least Happy version 1.6. If there's no installed Happy, we look
158 dnl for a happy source tree and point the build system at that instead.
160 dnl ToDo: when we reset HappyCmd to the source tree, autoconf doesn't
161 dnl seems to insert it in the cache file. sigh.
163 AC_DEFUN(FPTOOLS_HAPPY,
164 [AC_PATH_PROG(HappyCmd,happy)
165 AC_CACHE_CHECK([for version of happy], fptools_cv_happy_version,
166 [if test x"$HappyCmd" != x; then
167 fptools_cv_happy_version="`$HappyCmd -v |
169 grep 'Happy Version' | sed -e 's/Happy Version \([^ ]*\).*/\1/g'`" ;
170 elif test -d $srcdir/happy; then
171 HappyCmd=$hardtop/happy/src/happy-inplace;
172 fptools_cv_happy_version=`grep '^ProjectVersion[ ]*=' $srcdir/happy/mk/version.mk | sed 's/.*\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/g'`;
173 echo -n "using happy from the source tree... ";
175 fptools_cv_happy_version="";
178 if expr "$fptools_cv_happy_version" "<" 1.6 > /dev/null 2>&1; then
179 if test -d $srcdir/ghc; then
181 echo "Happy version 1.6 or later is required to compile GHC."
186 HappyVersion=$fptools_cv_happy_version;
187 AC_SUBST(HappyVersion)
191 dnl What's the best way of doing context diffs?
193 dnl (NB: NeXTStep thinks diff'ing a file against itself is "trouble")
195 AC_DEFUN(FPTOOLS_PROG_DIFF,
196 [AC_CACHE_CHECK([for ok way to do context diffs], fptools_cv_context_diffs,
197 [echo foo > conftest1
199 if diff -C 1 conftest1 conftest2 > /dev/null 2>&1 ; then
200 fptools_cv_context_diffs='diff -C 1'
202 if diff -c1 conftest1 conftest2 > /dev/null 2>&1 ; then
203 fptools_cv_context_diffs='diff -c1'
205 echo "Can't figure out how to do context diffs."
206 echo "Neither \`diff -C 1' nor \`diff -c1' works."
210 rm -f conftest1 conftest2
212 ContextDiffCmd=$fptools_cv_context_diffs
213 AC_SUBST(ContextDiffCmd)
217 dnl Finding the Right Yacc
219 AC_DEFUN(FPTOOLS_PROG_YACCY,
221 if test "$YACC" = "yacc"; then
222 AC_CACHE_CHECK([if it is an OK yacc], ac_cv_prog_yacc,
223 [AC_CHECK_PROG(WhatCmd, what, what, :)
224 $WhatCmd $YACC > conftest.out
225 if egrep 'y1\.c 1\..*SMI' conftest.out >/dev/null 2>&1; then
226 echo "I don't trust your $YaccCmd; it looks like an old Sun yacc"
227 if test -f /usr/lang/yacc; then
228 echo "I'm going to use /usr/lang/yacc instead"
229 ac_cv_prog_yacc=/usr/lang/yacc
231 echo "I'm assuming the worst...no parser generator at all"
234 elif egrep 'y1\.c.*Revision: 4\.2\.6\.3.*DEC' conftest.out >/dev/null 2>&1; then
235 echo "I don't trust your $YaccCmd; it looks like a lame DEC yacc"
236 echo "I'm assuming the worst...no parser generator at all"
239 ac_cv_prog_yacc=$YACC
244 ac_cv_prog_yacc=$YACC
246 YaccCmd=$ac_cv_prog_yacc
250 dnl *** Checking for ar and its arguments + whether we need ranlib.
252 dnl ArCmd and RANLIB are AC_SUBST'ed
254 AC_DEFUN(FPTOOLS_PROG_AR_AND_RANLIB,
255 [AC_PATH_PROG(ArCmd,ar)
256 if test -z "$ArCmd"; then
257 echo "You don't seem to have ar in your PATH...I have no idea how to make a library"
260 if $ArCmd clqs conftest.a >/dev/null 2>/dev/null; then
263 elif $ArCmd cqs conftest.a >/dev/null 2>/dev/null; then
266 elif $ArCmd clq conftest.a >/dev/null 2>/dev/null; then
269 elif $ArCmd cq conftest.a >/dev/null 2>/dev/null; then
272 elif $ArCmd cq conftest.a 2>&1 | grep 'no archive members specified' >/dev/null 2>/dev/null; then
276 echo "I can't figure out how to use your $ArCmd"
280 test -n "$ArCmd" && test -n "$verbose" && echo " setting ArCmd to $ArCmd"
282 if test -z "$NeedRanLib"; then
284 test -n "$verbose" && echo " setting RANLIB to $RANLIB"
292 dnl AC_SHEBANG_PERL - can we she-bang perl?
294 AC_DEFUN(FPTOOLS_SHEBANG_PERL,
295 [AC_CACHE_CHECK([if your perl works in shell scripts], fptools_cv_shebang_perl,
300 (SHELL=/bin/sh; export SHELL; ./conftest 69 > /dev/null)
301 if test $? -ne 69; then
302 fptools_cv_shebang_perl=yes
304 fptools_cv_shebang_perl=no
310 dnl Extra testing of the result AC_PROG_CC, testing the gcc version no.
311 dnl *Must* be called after AC_PROG_CC
313 AC_DEFUN(FPTOOLS_HAVE_GCC,
314 [AC_CACHE_CHECK([whether you have an ok gcc], fptools_cv_have_gcc,
315 [if test -z "$GCC"; then
317 echo "You would be better off with gcc"
318 echo "Perhaps it is already installed, but not in your PATH?"
319 fptools_cv_have_gcc='no'
322 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' `"
324 if test `eval $cmd_string 2>/dev/null` != "1"; then
326 echo "I'm not sure if your version of gcc will work,"
327 echo "but it's worth a shot, eh?"
329 fptools_cv_have_gcc='yes'
332 HaveGcc=`echo $fptools_cv_have_gcc | sed 'y/yesno/YESNO/'`
336 dnl Small feature test for perl version. Assumes PerlCmd
337 dnl contains path to perl binary
339 AC_DEFUN(FPTOOLS_CHECK_PERL_VERSION,
340 [$PerlCmd -v >conftest.out 2>&1
341 if grep "version 5" conftest.out >/dev/null 2>&1; then
344 if grep "version 6" conftest.out >/dev/null 2>&1; then
347 echo "Your version of perl probably won't work."
353 dnl ** figure out the alignment restriction of a type
354 dnl (required SIZEOF test but AC_CHECK_SIZEOF doesn't call PROVIDE
355 dnl so we can't call REQUIRE)
357 dnl FPTOOLS_CHECK_ALIGNMENT(TYPE)
358 AC_DEFUN(FPTOOLS_CHECK_ALIGNMENT,
359 [changequote(<<, >>)dnl
360 dnl The name to #define.
361 define(<<AC_TYPE_NAME>>, translit(alignment_$1, [a-z *], [A-Z_P]))dnl
362 dnl The cache variable name.
363 define(<<AC_CV_NAME>>, translit(ac_cv_alignment_$1, [ *], [_p]))dnl
364 dnl The name of the corresponding size.
365 define(<<AC_CV_SIZEOF_NAME>>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl
367 AC_MSG_CHECKING(alignment of $1)
368 AC_CACHE_VAL(AC_CV_NAME,
375 #define offsetof(ty,field) ((size_t)((char *)&((ty *)0)->field - (char *)(ty *)0))
380 FILE *f=fopen("conftestval", "w");
382 fprintf(f, "%d\n", offsetof(struct { char c; $1 ty;},ty));
385 AC_CV_NAME=`cat conftestval`,
386 AC_CV_NAME=$AC_CV_SIZEOF_NAME,
387 AC_CV_NAME=$AC_CV_SIZEOF_NAME)])
388 AC_MSG_RESULT($AC_CV_NAME)
389 AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME)
390 AC_PROVIDE($AC_TYPE_NAME)
391 undefine([AC_TYPE_NAME])dnl
392 undefine([AC_CV_NAME])dnl
393 undefine([AC_CV_SIZEOF_NAME])dnl
396 dnl ** Map an arithmetic C type to a Haskell type.
397 dnl Based on autconf's AC_CHECK_SIZEOF.
399 dnl FPTOOLS_CHECK_HTYPE(TYPE [, DEFAULT_VALUE, [, VALUE-FOR-CROSS-COMPILATION])
400 AC_DEFUN(FPTOOLS_CHECK_HTYPE,
401 [changequote(<<, >>)dnl
402 dnl The name to #define.
403 define(<<AC_TYPE_NAME>>, translit(htype_$1, [a-z *], [A-Z_P]))dnl
404 dnl The cache variable name.
405 define(<<AC_CV_NAME>>, translit(fptools_cv_htype_$1, [ *], [_p]))dnl
407 AC_MSG_CHECKING(Haskell type for $1)
408 AC_CACHE_VAL(AC_CV_NAME,
409 [AC_TRY_RUN([#include <stdio.h>
421 FILE *f=fopen("conftestval", "w");
423 if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
425 ((testing)(-1) < (testing)0) ? "Int" : "Word",
429 (sizeof(testing) > sizeof(double)) ? "LDouble" :
430 (sizeof(testing) == sizeof(double)) ? "Double" : "Float");
434 }], AC_CV_NAME=`cat conftestval`,
435 ifelse([$2], , AC_CV_NAME=NotReallyAType, AC_CV_NAME=$2),
436 ifelse([$3], , AC_CV_NAME=NotReallyATypeCross, AC_CV_NAME=$3))]) dnl
437 AC_MSG_RESULT($AC_CV_NAME)
438 AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME)
439 undefine([AC_TYPE_NAME])dnl
440 undefine([AC_CV_NAME])dnl
443 dnl ** figure out whether C compiler supports 'long long's
444 dnl (Closely based on Andreas Zeller's macro for testing
445 dnl for this under C++)
447 dnl If the C compiler supports `long long' types,
448 dnl define `HAVE_LONG_LONG'.
450 AC_DEFUN(FPTOOLS_C_LONG_LONG,
452 AC_REQUIRE([AC_PROG_CC])
453 AC_MSG_CHECKING(whether ${CC} supports long long types)
454 AC_CACHE_VAL(fptools_cv_have_long_long,
458 AC_TRY_COMPILE(,[long long a;],
459 fptools_cv_have_long_long=yes,
460 fptools_cv_have_long_long=no)
463 AC_MSG_RESULT($fptools_cv_have_long_long)
464 if test "$fptools_cv_have_long_long" = yes; then
465 AC_DEFINE(HAVE_LONG_LONG)
469 dnl *** Can we open files in binary mode? ***
471 AC_DEFUN(FPTOOLS_O_BINARY,
473 AC_REQUIRE([AC_PROG_CC])
474 AC_MSG_CHECKING(whether we can open files in binary mode)
475 AC_CACHE_VAL(fptools_cv_have_o_binary,
484 fptools_cv_have_o_binary=yes,
485 fptools_cv_have_o_binary=no)
488 AC_MSG_RESULT($fptools_cv_have_o_binary)
489 if test "$fptools_cv_have_o_binary" = yes; then
490 AC_DEFINE(HAVE_O_BINARY)
494 dnl *** Which one comes first, .text or .data? ***
496 AC_DEFUN(FPTOOLS_CODE_BEFORE_DATA,
497 [AC_CACHE_CHECK([if code section appears before data], fptools_cv_code_bef_data,
499 int f() { return 1; }
501 int main() { return ((char*)&f > (char*)&i); }
504 fptools_cv_code_bef_data=yes, fptools_cv_code_bef_data=no,false)])
505 if test "$fptools_cv_code_bef_data" = yes; then
506 AC_DEFINE(CODE_BEFORE_DATA)
510 dnl *** Helper function **
512 AC_DEFUN(FPTOOLS_IN_SCOPE,AC_TRY_LINK([extern char* $1;],[return (int)&$2], $3=yes, $3=no))
514 dnl *** What's the end-of-text-section marker called? ***
516 AC_DEFUN(FPTOOLS_END_TEXT_SECTION,
517 [AC_MSG_CHECKING([for end of text section marker])
519 for i in data_start _data_start etext _etext __etext; do
520 FPTOOLS_IN_SCOPE($i,$i,fptools_end_of_text)
521 if test "$fptools_end_of_text" = yes; then
522 AC_CACHE_VAL([fptools_cv_end_of_text_decl], AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER_DECL, $i))
523 AC_CACHE_VAL([fptools_cv_end_of_text], AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER, $i))
528 if test "$not_done" = 1; then
529 FPTOOLS_IN_SCOPE(etext asm("etext"),etext,fptools_end_of_text);
530 if test "$fptools_end_of_text" = yes; then
531 AC_CACHE_VAL([fptools_cv_end_of_text], AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER, etext))
532 AC_CACHE_VAL([fptools_cv_end_of_text_decl], AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER_DECL, etext asm("etext")))
534 AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER_DECL, dunno_what_it_is)
535 AC_DEFINE_UNQUOTED(TEXT_SECTION_END_MARKER, dunno_what_it_is)
538 AC_MSG_RESULT([$]fptools_cv_end_of_text)
541 dnl *** What's the end-of-data-section marker called? ***
543 AC_DEFUN(FPTOOLS_END_DATA_SECTION,
544 [AC_MSG_CHECKING([for end of data section marker])
546 for i in end _end __end; do
547 FPTOOLS_IN_SCOPE($i,$i,fptools_end_of_data)
548 if test "$fptools_end_of_data" = yes; then
549 AC_CACHE_VAL([fptools_cv_end_of_data_decl], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER_DECL, $i)])
550 AC_CACHE_VAL([fptools_cv_end_of_data], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER, $i)])
555 if test "$not_done" = 1; then
556 FPTOOLS_IN_SCOPE(end asm("end"),end,fptools_end_of_data);
557 if test "$fptools_end_of_data" = yes; then
558 AC_CACHE_VAL([fptools_cv_end_of_data_decl], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER_DECL, end asm("end"))])
559 AC_CACHE_VAL([fptools_cv_end_of_data], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER, end)])
561 AC_CACHE_VAL([fptools_cv_end_of_data_decl], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER_DECL, dunno_what_it_is)])
562 AC_CACHE_VAL([fptools_cv_end_of_data], [AC_DEFINE_UNQUOTED(DATA_SECTION_END_MARKER, dunno_what_it_is)])
565 AC_MSG_RESULT([$]fptools_cv_end_of_data)
570 dnl Based on AC_TRY_LINK - run iftrue if links cleanly with no warning
572 dnl FPTOOLS_TRY_LINK_NOWARN(flags,main?,iftrue,iffalse)
574 AC_DEFUN(FPTOOLS_TRY_LINK_NOWARN,
578 cat > conftest.$ac_ext <<EOF
579 dnl This sometimes fails to find confdefs.h, for some reason.
580 dnl [#]line __oline__ "[$]0"
581 [#]line __oline__ "configure"
582 #include "confdefs.h"
584 int t() { return 0; }
586 if AC_TRY_EVAL(ac_link); then
591 ifelse([$4], , , [else
601 dnl Loosely based on AC_CHECK_LIB in acgeneral.m4 in autoconf distribution
603 dnl FPTOOLS_CHECK_FLAG_NOWARN(NAME, FLAG, CODE, iftrue, iffalse)
605 AC_DEFUN(FPTOOLS_CHECK_FLAG_NOWARN,
606 [AC_MSG_CHECKING([for $1])
607 AC_CACHE_VAL(ac_cv_flag_$1,
608 [FPTOOLS_TRY_LINK_NOWARN("$2", [main() { $3; exit(0); } ],
609 eval "ac_cv_flag_$1=yes",
610 eval "ac_cv_flag_$1=no"
613 if eval "test \"`echo '$ac_cv_flag_'$1`\" = yes"; then
623 dnl FPTOOLS_CHECK_LIB_NOWARN(LIBRARY, FUNCTION)
625 AC_DEFUN(FPTOOLS_CHECK_LIB_NOWARN,
626 [FPTOOLS_CHECK_FLAG_NOWARN([function_$2],[],[extern char $2(); $2();],
628 ac_tr_lib=HAVE_LIB`echo $1 | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
630 AC_DEFINE_UNQUOTED($ac_tr_lib)
632 [FPTOOLS_CHECK_FLAG_NOWARN([library_$1],[-l$1],[extern char $2(); $2();],
634 ac_tr_lib=HAVE_LIB`echo $1 | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
636 AC_DEFINE_UNQUOTED($ac_tr_lib)
642 dnl check for prototypes
644 AC_DEFUN(AC_C_PROTOTYPES,
645 [AC_CACHE_CHECK([prototypes], ac_cv_prototypes,
654 ac_cv_prototypes=yes,
655 ac_cv_prototypes=no)])
656 if test "$ac_cv_prototypes" = yes; then
657 AC_DEFINE(HAVE_PROTOTYPES)
661 dnl ** Check which CATALOG file we have to use with DocBook SGML.
663 dnl FPTOOLS_DOCBOOK_CATALOG(VARIABLE, JADE, STYLESHEET, CATALOGS-TO-CHECK-FOR)
665 dnl If any of the catalogs given in CATALOGS-TO-CHECK-FOR works on this
666 dnl platform, let VARIABLE refer to this catalog; otherwise, VARIABLE
667 dnl is set to "no". JADE is the jade executable and STYLESHEET
668 dnl a DocBook style sheet.
670 AC_DEFUN(FPTOOLS_DOCBOOK_CATALOG,
671 [AC_CACHE_CHECK([for DocBook CATALOG], fptools_cv_sgml_catalog,
673 cat > conftest.sgml << EOF
674 <!DOCTYPE Article PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
678 <Author><OtherName>Test</OtherName></Author>
679 <Address>Test</Address>
680 <PubDate>Test</PubDate>
682 <Sect1><Title>Test</Title>
689 fptools_cv_sgml_catalog=no
690 for fptools_catalog in $4; do
691 ac_try="$2 -t rtf -d $3#print -c $fptools_catalog conftest.sgml"
692 if AC_TRY_EVAL(ac_try); then
693 fptools_cv_sgml_catalog=[$]fptools_catalog
699 if test $fptools_cv_sgml_catalog != "no"; then
700 $1=$fptools_cv_sgml_catalog