[project @ 1998-09-30 07:54:48 by sof]
[ghc.git] / aclocal.m4
1 dnl $Id: aclocal.m4,v 1.28 1998/09/29 17:30:09 sof Exp $
2 dnl 
3 dnl Extra autoconf macros for the Glasgow fptools
4 dnl
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.
8
9 dnl
10 dnl Has timezone the type time_t or long (HP-UX 10.20 apparently
11 dnl has `long'..)
12 dnl 
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>
17 # include <time.h>
18 #else
19 # if HAVE_SYS_TIME_H
20 #  include <sys/time.h>
21 # else
22 #  include <time.h>
23 # endif
24 #endif
25
26 extern time_t timezone;
27 ],
28 [int i;], fptools_cv_type_timezone=time_t, fptools_cv_type_timezone=long)])
29 AC_DEFINE_UNQUOTED(TYPE_TIMEZONE, $fptools_cv_type_timezone)
30 ])
31
32 dnl *** Is altzone available? ***
33 dnl 
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>
38 # include <time.h>
39 #else
40 # if HAVE_SYS_TIME_H
41 #  include <sys/time.h>
42 # else
43 #  include <time.h>
44 # endif
45 #endif
46 ], [return altzone;], 
47 fptools_cv_altzone=yes, fptools_cv_altzone=no)])
48 if test "$fptools_cv_altzone" = yes; then
49   AC_DEFINE(HAVE_ALTZONE)
50 fi
51 ])
52
53 dnl ** check for leading underscores in symbol names
54 dnl 
55 dnl Test for determining whether symbol names have a leading
56 dnl underscore.
57 dnl 
58 dnl We assume that they _haven't_ if anything goes wrong.
59 dnl
60 AC_DEFUN(FPTOOLS_UNDERSCORE,
61 [AC_CHECK_LIB(elf, nlist, LIBS="-lelf $LIBS")dnl
62 AC_CACHE_CHECK([leading underscore in symbol names], fptools_cv_lead_uscore,
63
64 dnl
65 dnl Hack!: nlist() under Digital UNIX insist on there being an _,
66 dnl but symbol table listings shows none. What is going on here?!?
67 dnl
68 changequote(<<, >>)dnl
69 <<
70 case $HostPlatform in
71 alpha-dec-osf*) fptools_cv_lead_uscore='no';;
72 *cygwin32)      fptools_cv_lead_uscore='yes';;
73 *) >>
74 changequote([, ])dnl
75 AC_TRY_RUN([#ifdef HAVE_NLIST_H
76 #include <nlist.h>
77 changequote(<<, >>)dnl
78 <<
79 struct nlist xYzzY[] = {{"_xYzzY", 0},{0}};
80 #endif
81
82 main(argc, argv)
83 int argc;
84 char **argv;
85 {
86 #ifdef HAVE_NLIST_H
87     if(nlist(argv[0], xYzzY) == 0 && xYzzY[0].n_value != 0)
88         exit(0);>>
89 changequote([, ])dnl
90 #endif
91     exit(1);
92 }], fptools_cv_lead_uscore=yes, fptools_cv_lead_uscore=no, fptools_cv_lead_uscore=NO)
93 ;;
94 esac);
95 LeadingUnderscore=`echo $fptools_cv_lead_uscore | sed 'y/yesno/YESNO/'`
96 AC_SUBST(LeadingUnderscore)
97 case $LeadingUnderscore in
98 YES) AC_DEFINE(LEADING_UNDERSCORE);;
99 esac
100 ])
101
102 dnl
103 dnl Check for Happy and version.
104 dnl
105 AC_DEFUN(FPTOOLS_HAPPY,
106 [AC_PATH_PROG(HappyCmd,happy)
107 AC_CACHE_CHECK([for version of happy], fptools_cv_happy_version,
108 [if test x"$HappyCmd" != x; then
109    fptools_cv_happy_version="`$HappyCmd -v |
110 changequote(, )dnl
111                           grep 'Happy Version' | sed -e 's/Happy Version \([^ ]*\).*/\1/g'`" ;
112 changequote([, ])dnl
113 else
114    fptools_cv_happy_version="";
115 fi;
116 if expr "$fptools_cv_happy_version" "<" 1.4 > /dev/null 2>&1; then
117    echo
118    echo "Happy version 1.4 or later is required to compile GHC."
119    exit 1;
120 fi;
121 ])
122 HappyVersion=$ac_cv_happy_version;
123 AC_SUBST(HappyVersion)
124 ])
125
126 dnl
127 dnl What's the best way of doing context diffs?
128 dnl
129 dnl (NB: NeXTStep thinks diff'ing a file against itself is "trouble")
130 dnl
131 AC_DEFUN(FPTOOLS_PROG_DIFF,
132 [AC_CACHE_CHECK([for ok way to do context diffs], fptools_cv_context_diffs,
133 [echo foo > conftest1
134 echo foo > conftest2
135 if diff -C 1 conftest1 conftest2 > /dev/null 2>&1 ; then
136     fptools_cv_context_diffs='diff -C 1'
137 else
138     if diff -c1 conftest1 conftest2 > /dev/null 2>&1 ; then
139         fptools_cv_context_diffs='diff -c1'
140     else
141         echo "Can't figure out how to do context diffs."
142         echo "Neither \`diff -C 1' nor \`diff -c1' works."
143         exit 1
144     fi
145 fi
146 rm -f conftest1 conftest2
147 ])
148 ContextDiffCmd=$fptools_cv_context_diffs
149 AC_SUBST(ContextDiffCmd)
150 ])
151
152 dnl
153 dnl Finding the Right Yacc
154 dnl
155 AC_DEFUN(FPTOOLS_PROG_YACCY,
156 [AC_PROG_YACC
157 if test "$YACC" = "yacc"; then
158    AC_CACHE_CHECK([if it is an OK yacc], ac_cv_prog_yacc,
159    [AC_CHECK_PROG(WhatCmd, what, what, :)
160     $WhatCmd $YACC > conftest.out
161     if egrep 'y1\.c 1\..*SMI' conftest.out >/dev/null 2>&1; then
162         echo "I don't trust your $YaccCmd; it looks like an old Sun yacc"
163         if test -f /usr/lang/yacc; then
164            echo "I'm going to use /usr/lang/yacc instead"
165            ac_cv_prog_yacc=/usr/lang/yacc
166         else
167            echo "I'm assuming the worst...no parser generator at all"
168            ac_cv_prog_yacc=:
169         fi
170     elif egrep 'y1\.c.*Revision: 4\.2\.6\.3.*DEC' conftest.out >/dev/null 2>&1; then
171         echo "I don't trust your $YaccCmd; it looks like a lame DEC yacc"
172         echo "I'm assuming the worst...no parser generator at all"
173         ac_cv_prog_yacc=:
174     else
175         ac_cv_prog_yacc=$YACC
176     fi
177     rm -fr conftest*
178 ])
179 else
180     ac_cv_prog_yacc=$YACC
181 fi
182 YaccCmd=$ac_cv_prog_yacc
183 AC_SUBST(YaccCmd)
184 ])
185
186 dnl *** Checking for ar and its arguments + whether we need ranlib.
187 dnl
188 dnl ArCmd and RANLIB are AC_SUBST'ed
189 dnl 
190 AC_DEFUN(FPTOOLS_PROG_AR_AND_RANLIB,
191 [AC_PATH_PROG(ArCmd,ar)
192 if test -z "$ArCmd"; then
193     echo "You don't seem to have ar in your PATH...I have no idea how to make a library"
194     exit 1;
195 fi
196 if $ArCmd clqs conftest.a >/dev/null 2>/dev/null; then
197     ArCmd="$ArCmd clqs"
198     NeedRanLib=''
199 elif $ArCmd cqs conftest.a >/dev/null 2>/dev/null; then
200     ArCmd="$ArCmd cqs"
201     NeedRanLib=''
202 elif $ArCmd clq conftest.a >/dev/null 2>/dev/null; then
203     ArCmd="$ArCmd clq"
204     NeedRanLib='YES'
205 elif $ArCmd cq conftest.a >/dev/null 2>/dev/null; then
206     ArCmd="$ArCmd cq"
207     NeedRanLib='YES'
208 elif $ArCmd cq conftest.a 2>&1 | grep 'no archive members specified' >/dev/null 2>/dev/null; then
209     ArCmd="$ArCmd cq"
210     NeedRanLib='YES'
211 else
212     echo "I can't figure out how to use your $ArCmd"
213     exit 1
214 fi
215 rm -rf conftest*
216 test -n "$ArCmd" && test -n "$verbose" && echo "        setting ArCmd to $ArCmd"
217 AC_SUBST(ArCmd)
218 if test -z "$NeedRanLib"; then
219     RANLIB=':'
220     test -n "$verbose" && echo "        setting RANLIB to $RANLIB"
221     AC_SUBST(RANLIB)
222 else
223     AC_PROG_RANLIB
224 fi
225 ])
226
227 dnl
228 dnl AC_SHEBANG_PERL - can we she-bang perl?
229 dnl
230 AC_DEFUN(FPTOOLS_SHEBANG_PERL,
231 [AC_CACHE_CHECK([if your perl works in shell scripts], fptools_cv_shebang_perl,
232 [echo "#!$PerlCmd"'
233 exit $1;
234 ' > conftest
235 chmod u+x conftest
236 (SHELL=/bin/sh; export SHELL; ./conftest 69 > /dev/null)
237 if test $? -ne 69; then
238    fptools_cv_shebang_perl=yes
239 else
240    fptools_cv_shebang_perl=no
241 fi
242 rm -f conftest
243 ])])
244
245 dnl
246 dnl Extra testing of the result AC_PROG_CC, testing the gcc version no.
247 dnl *Must* be called after AC_PROG_CC
248 dnl
249 AC_DEFUN(FPTOOLS_HAVE_GCC,
250 [AC_CACHE_CHECK([whether you have an ok gcc], fptools_cv_have_gcc,
251 [if test -z "$GCC"; then
252     echo ''
253     echo "You would be better off with gcc"
254     echo "Perhaps it is already installed, but not in your PATH?"
255     fptools_cv_have_gcc='no'
256 else
257 changequote(, )dnl
258     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' `"
259 changequote([, ])dnl
260     if test `eval $cmd_string 2>/dev/null` != "1"; then
261         echo ''
262         echo "I'm not sure if your version of gcc will work,"
263         echo "but it's worth a shot, eh?"
264     fi
265     fptools_cv_have_gcc='yes'
266 fi
267 ])
268 HaveGcc=`echo $fptools_cv_have_gcc | sed 'y/yesno/YESNO/'`
269 AC_SUBST(HaveGcc)
270 ])
271
272 dnl
273 dnl FPTOOLS_PROG_GNUCPP gathers the path to the cpp that the
274 dnl gcc driver calls upon.
275 dnl
276 dnl Substitutes: GNUCPP and RAWCPP (latter is 'GNUCPP -traditional')
277 dnl
278 AC_DEFUN(FPTOOLS_PROG_GNUCPP,
279 [AC_CACHE_CHECK([how to invoke GNU cpp directly], fptools_cv_gnu_cpp,
280 [if test "$HaveGcc" = "YES"; then
281         echo > conftest.c
282         gcc -v -E conftest.c >/dev/null 2>conftest.out
283         # \x5c = backslash
284         echo 'tr/\x5c/\//; /(\S+\/)cpp/ && print "[$]{1}cpp -iprefix [$]1";' > conftest.pl
285         fptools_cv_gnu_cpp="`eval $PerlCmd -n conftest.pl conftest.out`"
286         rm -fr conftest*
287  else
288         # We need to be able to invoke CPP directly, preferably
289         # with input from stdin (mkdependHS and hscpp depend on
290         # this at the moment).
291         # Take a guess at what to use, this probably won't work.
292         echo Warning: GNU cpp not found, using $CPP
293         fptools_cv_gnu_cpp = $CPP
294  fi
295 ])
296 GNUCPP=$fptools_cv_gnu_cpp
297 RAWCPP="$GNUCPP -traditional"
298 AC_SUBST(GNUCPP)
299 AC_SUBST(RAWCPP)
300 ])
301
302 dnl Small feature test for perl version. Assumes PerlCmd
303 dnl contains path to perl binary
304 dnl
305 AC_DEFUN(FPTOOLS_CHECK_PERL_VERSION,
306 [$PerlCmd -v >conftest.out 2>&1
307 if grep "version 4" conftest.out >/dev/null 2>&1; then
308    if grep "Patch level: 35" conftest.out >/dev/null 2>&1; then
309       echo "
310 ************************************************************************
311 Uh-oh...looks like you have Perl 4.035.
312
313 Perl version 4.035 has a bug to do with recursion that will bite if
314 you run the lit2texi script, when making Info files from
315 literate files of various sorts.  Either use perl5, the last version of perl4 
316 (4.036), or an older version (e.g., perl 4.019). Failing that, don't create
317 any Info files :-)
318 ************************************************************************
319 "
320    fi
321 else
322    if grep "version 5" conftest.out >/dev/null 2>&1; then
323       :
324    else
325      echo "I'm not sure if your version of perl will work,"
326      echo "but it's worth a shot, eh?"
327    fi
328 fi
329 rm -fr conftest*
330 ])
331
332 dnl ** figure out the alignment restriction of a type
333 dnl    (required SIZEOF test but AC_CHECK_SIZEOF doesn't call PROVIDE
334 dnl     so we can't call REQUIRE)
335
336 dnl FPTOOLS_CHECK_ALIGNMENT(TYPE)
337 AC_DEFUN(FPTOOLS_CHECK_ALIGNMENT,
338 [changequote(<<, >>)dnl
339 dnl The name to #define.
340 define(<<AC_TYPE_NAME>>, translit(alignment_$1, [a-z *], [A-Z_P]))dnl
341 dnl The cache variable name.
342 define(<<AC_CV_NAME>>, translit(ac_cv_alignment_$1, [ *], [_p]))dnl
343 dnl The name of the corresponding size.
344 define(<<AC_CV_SIZEOF_NAME>>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl
345 changequote([, ])dnl
346 AC_MSG_CHECKING(alignment of $1)
347 AC_CACHE_VAL(AC_CV_NAME,
348 [AC_TRY_RUN([
349 #include <stdio.h>
350 #if HAVE_STDDEF_H
351 #include <stddef.h>
352 #endif
353 #ifndef offsetof
354 #define offsetof(ty,field) ((size_t)((char *)&((ty *)0)->field - (char *)(ty *)0))
355 #endif
356 int
357 main()
358 {
359   FILE *f=fopen("conftestval", "w");
360   if (!f) exit(1);
361   fprintf(f, "%d\n", offsetof(struct { char c; $1 ty;},ty));
362   exit(0);
363 }],
364 AC_CV_NAME=`cat conftestval`,
365 AC_CV_NAME=$AC_CV_SIZEOF_NAME,
366 AC_CV_NAME=$AC_CV_SIZEOF_NAME)])
367 AC_MSG_RESULT($AC_CV_NAME)
368 AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME)
369 AC_PROVIDE($AC_TYPE_NAME)
370 undefine([AC_TYPE_NAME])dnl
371 undefine([AC_CV_NAME])dnl
372 undefine([AC_CV_SIZEOF_NAME])dnl
373 ])
374
375 dnl ** figure out whether C compiler supports 'long long's
376 dnl    (Closely based on Andreas Zeller's macro for testing
377 dnl     for this under C++)
378 dnl
379 dnl    If the C compiler supports `long long' types,
380 dnl    define `HAVE_LONG_LONG'.
381 dnl
382 AC_DEFUN(FPTOOLS_C_LONG_LONG,
383 [
384 AC_REQUIRE([AC_PROG_CC])
385 AC_MSG_CHECKING(whether ${CC} supports long long types)
386 AC_CACHE_VAL(fptools_cv_have_long_long,
387 [
388 AC_LANG_SAVE
389 AC_LANG_C
390 AC_TRY_COMPILE(,[long long a;],
391 fptools_cv_have_long_long=yes,
392 fptools_cv_have_long_long=no)
393 AC_LANG_RESTORE
394 ])
395 AC_MSG_RESULT($fptools_cv_have_long_long)
396 if test "$fptools_cv_have_long_long" = yes; then
397 AC_DEFINE(HAVE_LONG_LONG)
398 fi
399 ])
400
401 dnl *** Can we open files in binary mode? ***
402 dnl 
403 AC_DEFUN(FPTOOLS_O_BINARY,
404 [
405 AC_REQUIRE([AC_PROG_CC])
406 AC_MSG_CHECKING(whether we can open files in binary mode)
407 AC_CACHE_VAL(fptools_cv_have_o_binary,
408 [
409 AC_LANG_SAVE
410 AC_LANG_C
411 AC_TRY_COMPILE(,
412 [#ifdef HAVE_FCNTL_H
413 #include <fcntl.h>
414 #endif
415 int x = O_BINARY;],
416 fptools_cv_have_o_binary=yes,
417 fptools_cv_have_o_binary=no)
418 AC_LANG_RESTORE
419 ])
420 AC_MSG_RESULT($fptools_cv_have_o_binary)
421 if test "$fptools_cv_have_o_binary" = yes; then
422 AC_DEFINE(HAVE_O_BINARY)
423 fi
424 ])
425
426 dnl *** Which one comes first, .text or .data? ***
427 dnl 
428 AC_DEFUN(FPTOOLS_CODE_BEFORE_DATA,
429 [AC_CACHE_CHECK([if code section appears before data], fptools_cv_code_bef_data,
430 [AC_TRY_RUN([
431 int f() { return 1; }
432 int i;
433 int main() { return ((char*)&f > (char*)&i); }
434
435 ],
436 fptools_cv_code_bef_data=yes, fptools_cv_code_bef_data=no)])
437 if test "$fptools_cv_code_bef_data" = yes; then
438   AC_DEFINE(CODE_BEFORE_DATA)
439 fi
440 ])
441
442 dnl *** Helper function **
443 dnl 
444 AC_DEFUN(FPTOOLS_IN_SCOPE,AC_TRY_LINK([extern char* $1;],[return (int)&$2], $3=yes, $3=no))
445
446 dnl *** What's the end-of-text-section marker called? ***
447 dnl
448 AC_DEFUN(FPTOOLS_END_TEXT_SECTION,
449 [AC_CACHE_CHECK([for end of text section marker], fptools_cv_end_of_text,
450 [
451 not_done=1
452 for i in etext _etext __etext; do
453   FPTOOLS_IN_SCOPE($i,$i,fptools_cv_end_of_text)
454   if test "$fptools_cv_end_of_text" = yes; then
455    AC_DEFINE(TEXT_SECTION_END_MARKER, $i)
456    not_done=0
457    break
458   fi
459 done
460 if test "$not_done"; then
461 FPTOOLS_IN_SCOPE(etext asm("etext"),etext,fptools_cv_end_of_text);
462 if test "$fptools_cv_end_of_text" = yes; then
463   AC_DEFINE(TEXT_SECTION_END_MARKER, etext asm("etext"))
464 else
465   AC_DEFINE(TEXT_SECTION_END_MARKER, dunno_what_it_is)
466 fi
467 fi
468 ])])
469
470 dnl *** What's the end-of-data-section marker called? ***
471 dnl
472 AC_DEFUN(FPTOOLS_END_DATA_SECTION,
473 [AC_CACHE_CHECK([for end of data section marker], fptools_cv_end_of_data,
474 [
475 not_done=1
476 for i in end _end __end; do
477   FPTOOLS_IN_SCOPE($i,$i,fptools_cv_end_of_data)
478   if test "$fptools_cv_end_of_data" = yes; then
479    AC_DEFINE(DATA_SECTION_END_MARKER, $i)
480    not_done=0
481    break
482   fi
483 done
484 if test "$not_done"; then
485 FPTOOLS_IN_SCOPE(end asm("end"),end,fptools_cv_end_of_data);
486 if test "$fptools_cv_end_of_data" = yes; then
487   AC_DEFINE(DATA_SECTION_END_MARKER, end asm("end"))
488 else
489   AC_DEFINE(DATA_SECTION_END_MARKER, dunno_what_it_is)
490 fi
491 fi
492 ])])