Major refactoring of the type inference engine
[ghc-hetmet.git] / aclocal.m4
1 # Extra autoconf macros for the Glasgow fptools
2 #
3 # To be a good autoconf citizen, names of local macros have prefixed with FP_ to
4 # ensure we don't clash with any pre-supplied autoconf ones.
5
6
7 # FPTOOLS_SET_C_LD_FLAGS
8 # ----------------------------------
9 # Set the C and LD flags for a given platform
10 AC_DEFUN([FPTOOLS_SET_C_LD_FLAGS],
11 [
12     AC_MSG_CHECKING([Setting up $2, $3 and $4])
13     case $$1 in
14     i386-apple-darwin)
15         # By default, gcc on OS X will generate SSE
16         # instructions, which need things 16-byte aligned,
17         # but we don't 16-byte align things. Thus drop
18         # back to generic i686 compatibility. Trac #2983.
19         $2="$$2 -march=i686 -m32"
20         $3="$$3 -march=i686 -m32"
21         $4="$$4 -march=i686 -m32"
22         ;;
23     x86_64-apple-darwin)
24         $2="$$2 -m64"
25         $3="$$3 -m64"
26         $4="$$4 -m64"
27         ;;
28     esac
29
30     case $$1 in
31     i386-apple-darwin|x86_64-apple-darwin)
32         # We support back to OS X 10.5
33         $2="$$2 -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5"
34         $3="$$3 -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5"
35         $4="$$4 -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5"
36         ;;
37     esac
38
39     # If gcc knows about the stack protector, turn it off.
40     # Otherwise the stack-smash handler gets triggered.
41     echo 'int main(void) {return 0;}' > conftest.c
42     if $CC -c conftest.c -fno-stack-protector > /dev/null 2>&1
43     then
44         $2="$$2 -fno-stack-protector"
45     fi
46     rm -f conftest.c conftest.o
47     AC_MSG_RESULT([done])
48 ])
49
50
51 # FP_VISIBILITY_HIDDEN
52 # ----------------------------------
53 # Is the visibility hidden attribute supported?
54 AC_DEFUN([FP_VISIBILITY_HIDDEN],
55 [
56     AC_MSG_CHECKING([whether __attribute__((visibility("hidden"))) is supported])
57     echo '__attribute__((visibility("hidden"))) void foo(void) {}' > conftest.c
58     if $CC -Wall -Werror -c conftest.c > /dev/null 2>&1
59     then
60         AC_MSG_RESULT([yes])
61         AC_DEFINE(HAS_VISIBILITY_HIDDEN, 1, [Has visibility hidden])
62     else
63         AC_MSG_RESULT([no])
64     fi
65     rm -f conftest.c conftest.o
66 ])
67
68
69 # FPTOOLS_FLOAT_WORD_ORDER_BIGENDIAN
70 # ----------------------------------
71 # Little endian Arm on Linux with some ABIs has big endian word order
72 # in doubles. Define FLOAT_WORDS_BIGENDIAN if this is the case.
73 AC_DEFUN([FPTOOLS_FLOAT_WORD_ORDER_BIGENDIAN],
74   [AC_CACHE_CHECK([whether float word order is big endian], [fptools_cv_float_word_order_bigendian],
75     [AC_COMPILE_IFELSE(
76       [AC_LANG_PROGRAM(
77         [#include <endian.h>],
78         [#if defined(__FLOAT_WORD_ORDER) && __FLOAT_WORD_ORDER == BIG_ENDIAN
79              return 0;
80          #else
81              not float word order big endian
82          #endif]
83       )],
84       [fptools_cv_float_word_order_bigendian=yes],
85       [fptools_cv_float_word_order_bigendian=no])
86     ])
87   case $fptools_cv_float_word_order_bigendian in
88       yes)
89           AC_DEFINE([FLOAT_WORDS_BIGENDIAN], 1,
90           [Define to 1 if your processor stores words of floats with
91            the most significant byte first]) ;;
92   esac
93 ])
94
95
96 # FP_EVAL_STDERR(COMMAND)
97 # -----------------------
98 # Eval COMMAND, save its stderr (without lines resulting from shell tracing)
99 # into the file conftest.err and the exit status in the variable fp_status.
100 AC_DEFUN([FP_EVAL_STDERR],
101 [{ (eval $1) 2>conftest.er1
102   fp_status=$?
103   grep -v '^ *+' conftest.er1 >conftest.err
104   rm -f conftest.er1
105   (exit $fp_status); }[]dnl
106 ])# FP_EVAL_STDERR
107
108
109 # FP_ARG_WITH_PATH_GNU_PROG
110 # --------------------
111 # XXX
112 #
113 # $1 = the command to look for
114 # $2 = the variable to set
115 #
116 AC_DEFUN([FP_ARG_WITH_PATH_GNU_PROG],
117 [
118 AC_ARG_WITH($2,
119 [AC_HELP_STRING([--with-$2=ARG],
120         [Use ARG as the path to $2 [default=autodetect]])],
121 [
122     if test "$HostOS" = "mingw32"
123     then
124         AC_MSG_WARN([Request to use $withval will be ignored])
125     else
126         $1=$withval
127     fi
128 ],
129 [
130     if test "$HostOS" != "mingw32"
131     then
132         AC_PATH_PROG([$1], [$2])
133         if test -z "$$1"
134         then
135             AC_MSG_ERROR([cannot find $2 in your PATH, no idea how to link])
136         fi
137     fi
138 ]
139 )
140 ]) # FP_ARG_WITH_PATH_GNU_PROG
141
142
143 # FP_PROG_CONTEXT_DIFF
144 # --------------------
145 # Figure out how to do context diffs. Sets the output variable ContextDiffCmd.
146 #
147 # Note: NeXTStep thinks diff'ing a file against itself is "trouble".
148 #
149 # Used by ghc, glafp-utils/ltx, and glafp-utils/runstdtest.
150 AC_DEFUN([FP_PROG_CONTEXT_DIFF],
151 [AC_CACHE_CHECK([for a working context diff], [fp_cv_context_diff],
152 [echo foo > conftest1
153 echo foo > conftest2
154 fp_cv_context_diff=no
155 for fp_var in '-U 1' '-u1' '-C 1' '-c1'
156 do
157   if diff $fp_var conftest1 conftest2 > /dev/null 2>&1; then
158     fp_cv_context_diff="diff $fp_var"
159     break
160   fi
161 done])
162 if test x"$fp_cv_context_diff" = xno; then
163    AC_MSG_ERROR([cannot figure out how to do context diffs])
164 fi
165 AC_SUBST(ContextDiffCmd, [$fp_cv_context_diff])
166 ])# FP_PROG_CONTEXT_DIFF
167
168
169 # FP_COMPUTE_INT(EXPRESSION, VARIABLE, INCLUDES, IF-FAILS)
170 # --------------------------------------------------------
171 # Assign VARIABLE the value of the compile-time EXPRESSION using INCLUDES for
172 # compilation. Execute IF-FAILS when unable to determine the value. Works for
173 # cross-compilation, too.
174 #
175 # Implementation note: We are lazy and use an internal autoconf macro, but it
176 # is supported in autoconf versions 2.50 up to the actual 2.57, so there is
177 # little risk.
178 AC_DEFUN([FP_COMPUTE_INT],
179 [_AC_COMPUTE_INT([$1], [$2], [$3], [$4])[]dnl
180 ])# FP_COMPUTE_INT
181
182
183 # FP_CHECK_ALIGNMENT(TYPE, [IGNORED], [INCLUDES = DEFAULT-INCLUDES])
184 # ------------------------------------------------------------------
185 # A variation of AC_CHECK_SIZEOF for computing the alignment restrictions of a
186 # given type. Defines ALIGNMENT_TYPE.
187 AC_DEFUN([FP_CHECK_ALIGNMENT],
188 [AS_LITERAL_IF(m4_translit([[$1]], [*], [p]), [],
189                [AC_FATAL([$0: requires literal arguments])])[]dnl
190 AC_CHECK_TYPE([$1], [], [], [$3])[]dnl
191 m4_pushdef([fp_Cache], [AS_TR_SH([fp_cv_alignment_$1])])[]dnl
192 AC_CACHE_CHECK([alignment of $1], [fp_Cache],
193 [if test "$AS_TR_SH([ac_cv_type_$1])" = yes; then
194   FP_COMPUTE_INT([(long) (&((struct { char c; $1 ty; } *)0)->ty)],
195                  [fp_Cache],
196                  [AC_INCLUDES_DEFAULT([$3])],
197                  [AC_MSG_ERROR([cannot compute alignment ($1)
198 See `config.log' for more details.], [77])])
199 else
200   fp_Cache=0
201 fi])[]dnl
202 AC_DEFINE_UNQUOTED(AS_TR_CPP(alignment_$1), $fp_Cache, [The alignment of a `$1'.])[]dnl
203 m4_popdef([fp_Cache])[]dnl
204 ])# FP_CHECK_ALIGNMENT
205
206
207 # FP_LEADING_UNDERSCORE
208 # ---------------------
209 # Test for determining whether symbol names have a leading underscore. We assume
210 # that they _haven't_ if anything goes wrong. Sets the output variable
211 # LeadingUnderscore to YES or NO and defines LEADING_UNDERSCORE correspondingly.
212 #
213 # Some nlist implementations seem to try to be compatible by ignoring a leading
214 # underscore sometimes (eg. FreeBSD). We therefore have to work around this by
215 # checking for *no* leading underscore first. Sigh.  --SDM
216 #
217 # Similarly on OpenBSD, but this test doesn't help. -- dons
218 AC_DEFUN([FP_LEADING_UNDERSCORE],
219 [AC_CHECK_LIB([elf], [nlist], [LIBS="-lelf $LIBS"])
220 AC_CACHE_CHECK([leading underscore in symbol names], [fptools_cv_leading_underscore], [
221 # Hack!: nlist() under Digital UNIX insist on there being an _,
222 # but symbol table listings shows none. What is going on here?!?
223 #
224 # Another hack: cygwin doesn't come with nlist.h , so we hardwire
225 # the underscoredness of that "platform"
226 case $HostPlatform in
227 *openbsd*) # x86 openbsd is ELF from 3.4 >, meaning no leading uscore
228   case $build in
229     i386-*2\.@<:@0-9@:>@ | i386-*3\.@<:@0-3@:>@ ) fptools_cv_leading_underscore=yes ;;
230     *) fptools_cv_leading_underscore=no ;;
231   esac ;;
232 alpha-dec-osf*) fptools_cv_leading_underscore=no;;
233 *cygwin32) fptools_cv_leading_underscore=yes;;
234 *mingw32) fptools_cv_leading_underscore=yes;;
235
236     # HACK: Apple doesn't seem to provide nlist in the 64-bit-libraries
237 x86_64-apple-darwin*) fptools_cv_leading_underscore=yes;;
238
239 *) AC_RUN_IFELSE([AC_LANG_SOURCE([[#ifdef HAVE_NLIST_H
240 #include <nlist.h>
241 struct nlist xYzzY1[] = {{"xYzzY1", 0},{0}};
242 struct nlist xYzzY2[] = {{"_xYzzY2", 0},{0}};
243 #endif
244
245 int main(argc, argv)
246 int argc;
247 char **argv;
248 {
249 #ifdef HAVE_NLIST_H
250     if(nlist(argv[0], xYzzY1) == 0 && xYzzY1[0].n_value != 0)
251         exit(1);
252     if(nlist(argv[0], xYzzY2) == 0 && xYzzY2[0].n_value != 0)
253         exit(0);
254 #endif
255     exit(1);
256 }]])],[fptools_cv_leading_underscore=yes],[fptools_cv_leading_underscore=no],[fptools_cv_leading_underscore=no])
257 ;;
258 esac]);
259 AC_SUBST([LeadingUnderscore], [`echo $fptools_cv_leading_underscore | sed 'y/yesno/YESNO/'`])
260 if test x"$fptools_cv_leading_underscore" = xyes; then
261    AC_DEFINE([LEADING_UNDERSCORE], [1], [Define to 1 if C symbols have a leading underscore added by the compiler.])
262 fi])# FP_LEADING_UNDERSCORE
263
264
265 # FP_COMPARE_VERSIONS(VERSION1, TEST, VERSION2, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
266 # ----------------------------------------------------------------------------------
267 # Compare dotted version numbers VERSION1 and VERSION2 lexicographically according
268 # to TEST (one of -eq, -ne, -lt, -le, -gt, or -ge).
269 AC_DEFUN([FP_COMPARE_VERSIONS],
270 [fp_version1=$1; fp_version2=$3
271 fp_save_IFS=$IFS; IFS='.'
272 while test x"$fp_version1" != x || test x"$fp_version2" != x
273 do
274
275   set dummy $fp_version1; shift
276   fp_num1=""
277   test $[@%:@] = 0 || { fp_num1="[$]1"; shift; }
278   test x"$fp_num1" = x && fp_num1="0"
279   fp_version1="[$]*"
280
281   set dummy $fp_version2; shift
282   fp_num2=""
283   test $[@%:@] = 0 || { fp_num2="[$]1"; shift; }
284   test x"$fp_num2" = x && fp_num2="0"
285   fp_version2="[$]*"
286
287   test "$fp_num1" = "$fp_num2" || break;
288 done
289 IFS=$fp_save_IFS
290 AS_IF([test "$fp_num1" $2 "$fp_num2"], [$4], [$5])[]dnl
291 ])# FP_COMPARE_VERSIONS
292
293
294 dnl
295 dnl Check for GreenCard and version.
296 dnl
297 AC_DEFUN([FPTOOLS_GREENCARD],
298 [
299 AC_PATH_PROG(GreenCardCmd,greencard)
300 AC_CACHE_CHECK([for version of greencard], fptools_cv_greencard_version,
301 changequote(, )dnl
302 [if test x"$GreenCardCmd" != x; then
303    fptools_cv_greencard_version="`$GreenCardCmd --version |
304                           grep 'version' | sed -e 's/greencard. version \([^ ]*\).*/\1/g'`"
305 else
306    fptools_cv_greencard_version=""
307 fi
308 changequote([, ])dnl
309 ])
310 FP_COMPARE_VERSIONS([$fptools_cv_greencard_version],[-lt],[$1],
311   [AC_MSG_ERROR([greencard version $1 or later is required (found '$fptools_cv_greencard_version')])])[]dnl
312 GreenCardVersion=$fptools_cv_greencard_version
313 AC_SUBST(GreenCardVersion)
314 ])
315
316 dnl
317 dnl Check for Happy and version.  If we're building GHC, then we need
318 dnl at least Happy version 1.14.  If there's no installed Happy, we look
319 dnl for a happy source tree and point the build system at that instead.
320 dnl
321 AC_DEFUN([FPTOOLS_HAPPY],
322 [AC_PATH_PROG(HappyCmd,happy,)
323 # Happy is passed to Cabal, so we need a native path
324 if test "x$HostPlatform"  = "xi386-unknown-mingw32" && \
325    test "${OSTYPE}"      != "msys"                  && \
326    test "${HappyCmd}"    != ""
327 then
328     # Canonicalise to <drive>:/path/to/gcc
329     HappyCmd=`cygpath -m "${HappyCmd}"`
330     AC_MSG_NOTICE([normalized happy command to $HappyCmd])
331 fi
332
333 AC_CACHE_CHECK([for version of happy], fptools_cv_happy_version,
334 changequote(, )dnl
335 [if test x"$HappyCmd" != x; then
336    fptools_cv_happy_version=`"$HappyCmd" -v |
337                           grep 'Happy Version' | sed -e 's/Happy Version \([^ ]*\).*/\1/g'` ;
338 else
339    fptools_cv_happy_version="";
340 fi;
341 changequote([, ])dnl
342 ])
343 if test ! -f compiler/parser/Parser.hs || test ! -f compiler/cmm/CmmParse.hs || test ! -f compiler/parser/ParserCore.hs
344 then
345     FP_COMPARE_VERSIONS([$fptools_cv_happy_version],[-lt],[1.16],
346       [AC_MSG_ERROR([Happy version 1.16 or later is required to compile GHC.])])[]
347 fi
348 HappyVersion=$fptools_cv_happy_version;
349 AC_SUBST(HappyVersion)
350 ])
351
352 dnl
353 dnl Check for Alex and version.  If we're building GHC, then we need
354 dnl at least Alex version 2.0.1.
355 dnl
356 AC_DEFUN([FPTOOLS_ALEX],
357 [
358 AC_PATH_PROG(AlexCmd,alex,)
359 # Alex is passed to Cabal, so we need a native path
360 if test "x$HostPlatform"  = "xi386-unknown-mingw32" && \
361    test "${OSTYPE}"      != "msys"                  && \
362    test "${AlexCmd}"     != ""
363 then
364     # Canonicalise to <drive>:/path/to/gcc
365     AlexCmd=`cygpath -m "${AlexCmd}"`
366 fi
367
368 AC_CACHE_CHECK([for version of alex], fptools_cv_alex_version,
369 changequote(, )dnl
370 [if test x"$AlexCmd" != x; then
371    fptools_cv_alex_version=`"$AlexCmd" -v |
372                           grep 'Alex [Vv]ersion' | sed -e 's/Alex [Vv]ersion \([0-9\.]*\).*/\1/g'` ;
373 else
374    fptools_cv_alex_version="";
375 fi;
376 changequote([, ])dnl
377 ])
378 if test ! -f compiler/cmm/CmmLex.hs || test ! -f compiler/parser/Lexer.hs
379 then
380     FP_COMPARE_VERSIONS([$fptools_cv_alex_version],[-lt],[2.1.0],
381       [AC_MSG_ERROR([Alex version 2.1.0 or later is required to compile GHC.])])[]
382 fi
383 AlexVersion=$fptools_cv_alex_version;
384 AC_SUBST(AlexVersion)
385 ])
386
387
388 # FP_PROG_LD_X
389 # ------------
390 # Sets the output variable LdXFlag to -x if ld supports this flag, otherwise the
391 # variable's value is empty.
392 AC_DEFUN([FP_PROG_LD_X],
393 [
394 AC_CACHE_CHECK([whether ld understands -x], [fp_cv_ld_x],
395 [echo 'foo() {}' > conftest.c
396 ${CC-cc} -c conftest.c
397 if ${LdCmd} -r -x -o conftest2.o conftest.o > /dev/null 2>&1; then
398    fp_cv_ld_x=yes
399 else
400    fp_cv_ld_x=no
401 fi
402 rm -rf conftest*])
403 if test "$fp_cv_ld_x" = yes; then
404   LdXFlag=-x
405 else
406   LdXFlag=
407 fi
408 AC_SUBST([LdXFlag])
409 ])# FP_PROG_LD_X
410
411
412 # FP_PROG_LD_IS_GNU
413 # -----------------
414 # Sets the output variable LdIsGNULd to YES or NO, depending on whether it is
415 # GNU ld or not.
416 AC_DEFUN([FP_PROG_LD_IS_GNU],
417 [
418 AC_CACHE_CHECK([whether ld is GNU ld], [fp_cv_gnu_ld],
419 [if ${LdCmd} --version 2> /dev/null | grep "GNU" > /dev/null 2>&1; then
420   fp_cv_gnu_ld=yes
421 else
422   fp_cv_gnu_ld=no
423 fi])
424 AC_SUBST([LdIsGNULd], [`echo $fp_cv_gnu_ld | sed 'y/yesno/YESNO/'`])
425 ])# FP_PROG_LD_IS_GNU
426
427
428 # FP_PROG_AR
429 # ----------
430 # Sets fp_prog_ar_raw to the full path of ar and fp_prog_ar to a non-Cygwin
431 # version of it. Exits if no ar can be found
432 AC_DEFUN([FP_PROG_AR],
433 [AC_PATH_PROG([fp_prog_ar_raw], [ar])
434 if test -z "$fp_prog_ar_raw"; then
435   AC_MSG_ERROR([cannot find ar in your PATH, no idea how to make a library])
436 fi
437 fp_prog_ar="$fp_prog_ar_raw"
438 case $HostPlatform in
439   *mingw32) if test x${OSTYPE} != xmsys; then
440               fp_prog_ar="`cygpath -w "${fp_prog_ar_raw}" | sed -e 's@\\\\@/@g'`"
441               AC_MSG_NOTICE([normalized ar command to $fp_prog_ar])
442             fi
443             ;;
444 esac
445 ])# FP_PROG_AR
446
447
448 # FP_PROG_AR_IS_GNU
449 # -----------------
450 # Sets fp_prog_ar_is_gnu to yes or no, depending on whether it is GNU ar or not.
451 AC_DEFUN([FP_PROG_AR_IS_GNU],
452 [AC_REQUIRE([FP_PROG_AR])
453 AC_CACHE_CHECK([whether $fp_prog_ar_raw is GNU ar], [fp_cv_prog_ar_is_gnu],
454 [if "$fp_prog_ar_raw" --version 2> /dev/null | grep "GNU" > /dev/null 2>&1; then
455   fp_cv_prog_ar_is_gnu=yes
456 else
457   fp_cv_prog_ar_is_gnu=no
458 fi])
459 fp_prog_ar_is_gnu=$fp_cv_prog_ar_is_gnu
460 AC_SUBST([ArIsGNUAr], [`echo $fp_prog_ar_is_gnu | tr 'a-z' 'A-Z'`])
461 ])# FP_PROG_AR_IS_GNU
462
463
464 # FP_PROG_AR_SUPPORTS_ATFILE
465 # -----------------
466 # Sets fp_prog_ar_supports_atfile to yes or no, depending on whether
467 # or not it supports the @file syntax
468 AC_DEFUN([FP_PROG_AR_SUPPORTS_ATFILE],
469 [AC_REQUIRE([FP_PROG_AR])
470  AC_REQUIRE([FP_PROG_AR_ARGS])
471 AC_CACHE_CHECK([whether $fp_prog_ar_raw supports @file], [fp_cv_prog_ar_supports_atfile],
472 [
473 rm -f conftest*
474 touch conftest.file
475 echo conftest.file  > conftest.atfile
476 echo conftest.file >> conftest.atfile
477 "$fp_prog_ar_raw" $fp_prog_ar_args conftest.a @conftest.atfile > /dev/null 2>&1
478 fp_prog_ar_supports_atfile_tmp=`"$fp_prog_ar_raw" t conftest.a 2> /dev/null | grep -c conftest.file`
479 rm -f conftest*
480 if test "$fp_prog_ar_supports_atfile_tmp" -eq 2
481 then
482   fp_cv_prog_ar_supports_atfile=yes
483 else
484   fp_cv_prog_ar_supports_atfile=no
485 fi])
486 fp_prog_ar_supports_atfile=$fp_cv_prog_ar_supports_atfile
487 AC_SUBST([ArSupportsAtFile], [`echo $fp_prog_ar_supports_atfile | tr 'a-z' 'A-Z'`])
488 ])# FP_PROG_AR_SUPPORTS_ATFILE
489
490 # FP_PROG_AR_ARGS
491 # ---------------
492 # Sets fp_prog_ar_args to the arguments for ar and the output variable ArCmd
493 # to a non-Cygwin invocation of ar including these arguments.
494 AC_DEFUN([FP_PROG_AR_ARGS],
495 [AC_REQUIRE([FP_PROG_AR_IS_GNU])
496 AC_CACHE_CHECK([for ar arguments], [fp_cv_prog_ar_args],
497 [
498 # GNU ar needs special treatment: it appears to have problems with
499 # object files with the same name if you use the 's' modifier, but
500 # simple 'ar q' works fine, and doesn't need a separate ranlib.
501 if test $fp_prog_ar_is_gnu = yes; then
502   fp_cv_prog_ar_args="q"
503 else
504   touch conftest.dummy
505   for fp_var in clqsZ clqs cqs clq cq ; do
506      rm -f conftest.a
507      if "$fp_prog_ar_raw" $fp_var conftest.a conftest.dummy > /dev/null 2> /dev/null; then
508         fp_cv_prog_ar_args=$fp_var
509         break
510      fi
511   done
512   rm -f conftest*
513   if test -z "$fp_cv_prog_ar_args"; then
514     AC_MSG_ERROR([cannot figure out how to use your $fp_prog_ar_raw])
515   fi
516 fi])
517 fp_prog_ar_args=$fp_cv_prog_ar_args
518 AC_SUBST([ArCmd], ["$fp_prog_ar"])
519 AC_SUBST([ArArgs], ["$fp_prog_ar_args"])
520
521 ])# FP_PROG_AR_ARGS
522
523
524 # FP_PROG_AR_NEEDS_RANLIB
525 # -----------------------
526 # Sets the output variable RANLIB to "ranlib" if it is needed and found,
527 # to ":" otherwise.
528 AC_DEFUN([FP_PROG_AR_NEEDS_RANLIB],
529 [AC_REQUIRE([FP_PROG_AR_IS_GNU])
530 AC_REQUIRE([FP_PROG_AR_ARGS])
531 AC_REQUIRE([AC_PROG_CC])
532 AC_CACHE_CHECK([whether ranlib is needed], [fp_cv_prog_ar_needs_ranlib],
533 [if test $fp_prog_ar_is_gnu = yes; then
534   fp_cv_prog_ar_needs_ranlib=no
535 elif echo $TargetPlatform | grep "^.*-apple-darwin$"  > /dev/null 2> /dev/null; then
536   # It's quite tedious to check for Apple's crazy timestamps in .a files,
537   # so we hardcode it.
538   fp_cv_prog_ar_needs_ranlib=yes
539 elif echo $fp_prog_ar_args | grep "s" > /dev/null 2> /dev/null; then
540   fp_cv_prog_ar_needs_ranlib=no
541 else
542   fp_cv_prog_ar_needs_ranlib=yes
543 fi])
544 if test $fp_cv_prog_ar_needs_ranlib = yes; then
545    AC_PROG_RANLIB
546 else
547   RANLIB=":"
548   AC_SUBST([RANLIB])
549 fi
550 ])# FP_PROG_AR_NEEDS_RANLIB
551
552
553 # FP_PROG_AR_SUPPORTS_INPUT
554 # -------------------------
555 # Sets the output variable ArSupportsInput to "-input" or "", depending on
556 # whether ar supports -input flag is supported or not.
557 AC_DEFUN([FP_PROG_AR_SUPPORTS_INPUT],
558 [AC_REQUIRE([FP_PROG_AR_IS_GNU])
559 AC_REQUIRE([FP_PROG_AR_ARGS])
560 AC_CACHE_CHECK([whether $fp_prog_ar_raw supports -input], [fp_cv_prog_ar_supports_input],
561 [fp_cv_prog_ar_supports_input=no
562 if test $fp_prog_ar_is_gnu = no; then
563   rm -f conftest*
564   touch conftest.lst
565   if FP_EVAL_STDERR(["$fp_prog_ar_raw" $fp_prog_ar_args conftest.a -input conftest.lst]) >/dev/null; then
566     test -s conftest.err || fp_cv_prog_ar_supports_input=yes
567   fi
568   rm -f conftest*
569 fi])
570 if test $fp_cv_prog_ar_supports_input = yes; then
571     ArSupportsInput="-input"
572 else
573     ArSupportsInput=""
574 fi
575 AC_SUBST([ArSupportsInput])
576 ])# FP_PROG_AR_SUPPORTS_INPUT
577
578
579 dnl
580 dnl AC_SHEBANG_PERL - can we she-bang perl?
581 dnl
582 AC_DEFUN([FPTOOLS_SHEBANG_PERL],
583 [AC_CACHE_CHECK([if your perl works in shell scripts], fptools_cv_shebang_perl,
584 [echo "#!$PerlCmd"'
585 exit $1;
586 ' > conftest
587 chmod u+x conftest
588 (SHELL=/bin/sh; export SHELL; ./conftest 69 > /dev/null)
589 if test $? -ne 69; then
590    fptools_cv_shebang_perl=yes
591 else
592    fptools_cv_shebang_perl=no
593 fi
594 rm -f conftest
595 ])])
596
597
598 # FP_HAVE_GCC
599 # -----------
600 # Extra testing of the result AC_PROG_CC, testing the gcc version no. Sets the
601 # output variables HaveGcc and GccVersion.
602 AC_DEFUN([FP_HAVE_GCC],
603 [AC_REQUIRE([AC_PROG_CC])
604 if test -z "$GCC"; then
605    fp_have_gcc=NO
606 else
607    fp_have_gcc=YES
608 fi
609 if test "$fp_have_gcc" = "NO" -a -d $srcdir/ghc; then
610   AC_MSG_ERROR([gcc is required])
611 fi
612 GccLT34=
613 AC_CACHE_CHECK([version of gcc], [fp_cv_gcc_version],
614 [if test "$fp_have_gcc" = "YES"; then
615    fp_cv_gcc_version="`$CC -v 2>&1 | grep 'version ' | sed -e 's/.*version [[^0-9]]*\([[0-9.]]*\).*/\1/g'`"
616    FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [3.0],
617      [AC_MSG_ERROR([Need at least gcc version 3.0 (3.4+ recommended)])])
618    # See #2770: gcc 2.95 doesn't work any more, apparently.  There probably
619    # isn't a very good reason for that, but for now just make configure
620    # fail.
621    FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [3.4], GccLT34=YES)
622  else
623    fp_cv_gcc_version="not-installed"
624  fi
625 ])
626 AC_SUBST([HaveGcc], [$fp_have_gcc])
627 AC_SUBST([GccVersion], [$fp_cv_gcc_version])
628 AC_SUBST(GccLT34)
629 ])# FP_HAVE_GCC
630
631 dnl Small feature test for perl version. Assumes PerlCmd
632 dnl contains path to perl binary.
633 dnl
634 dnl (Perl versions prior to v5.6 does not contain the string "v5";
635 dnl instead they display version strings such as "version 5.005".)
636 dnl
637 AC_DEFUN([FPTOOLS_CHECK_PERL_VERSION],
638 [$PerlCmd -v >conftest.out 2>&1
639    if grep "v5" conftest.out >/dev/null 2>&1; then
640       :
641    else
642       AC_MSG_ERROR([your version of perl probably won't work, try upgrading it.])
643    fi
644 rm -fr conftest*
645 ])
646
647
648 # FP_CHECK_PROG(VARIABLE, PROG-TO-CHECK-FOR,
649 #               [VALUE-IF-NOT-FOUND], [PATH], [REJECT])
650 # -----------------------------------------------------
651 # HACK: A small wrapper around AC_CHECK_PROG, setting VARIABLE to the full path
652 # of PROG-TO-CHECK-FOR when found.
653 AC_DEFUN([FP_CHECK_PROG],
654 [AC_CHECK_PROG([$1], [$2], [$as_dir/$ac_word$ac_exec_ext], [$3], [$4], [$5])][]dnl
655 )# FP_CHECK_PROC
656
657
658 # FP_PROG_FIND
659 # ------------
660 # Find a non-WinDoze version of the "find" utility.
661 AC_DEFUN([FP_PROG_FIND],
662 [AC_PATH_PROGS([fp_prog_find], [gfind find], find)
663 echo foo > conftest.txt
664 $fp_prog_find conftest.txt -print > conftest.out 2>&1
665 if grep '^conftest.txt$' conftest.out > /dev/null 2>&1 ; then
666   # OK, looks like a real "find".
667   case $HostPlatform in
668     *mingw32)
669       if test x${OSTYPE} != xmsys
670       then
671             fp_prog_find="`cygpath --mixed ${fp_prog_find}`"
672         AC_MSG_NOTICE([normalized find command to $fp_prog_find])
673       fi ;;
674     *) ;;
675   esac
676   FindCmd="$fp_prog_find"
677 else
678   # Found a poor WinDoze version of "find", ignore it.
679   AC_MSG_WARN([$fp_prog_find looks like a non-*nix find, ignoring it])
680   FP_CHECK_PROG([FindCmd], [find], [], [], [$fp_prog_find])
681 fi
682 rm -f conftest.txt conftest.out
683 AC_SUBST([FindCmd])[]dnl
684 ])# FP_PROG_FIND
685
686
687 # FP_PROG_SORT
688 # ------------
689 # Find a Unix-like sort
690 AC_DEFUN([FP_PROG_SORT],
691 [AC_PATH_PROG([fp_prog_sort], [sort])
692 echo conwip > conftest.txt
693 $fp_prog_sort -f conftest.txt > conftest.out 2>&1
694 if grep 'conwip' conftest.out > /dev/null 2>&1 ; then
695   # The goods
696   SortCmd="$fp_prog_sort"
697 else
698   # Summink else..pick next one.
699   AC_MSG_WARN([$fp_prog_sort looks like a non-*nix sort, ignoring it])
700   FP_CHECK_PROG([SortCmd], [sort], [], [], [$fp_prog_sort])
701 fi
702 rm -f conftest.txt conftest.out
703 AC_SUBST([SortCmd])[]dnl
704 ])# FP_PROG_SORT
705
706 dnl
707 dnl FPTOOLS_NOCACHE_CHECK prints a message, then sets the
708 dnl values of the second argument to the result of running
709 dnl the commands given by the third. It does not cache its
710 dnl result, so it is suitable for checks which should be
711 dnl run every time.
712 dnl
713 AC_DEFUN([FPTOOLS_NOCACHE_CHECK],
714 [AC_MSG_CHECKING([$1])
715  $3
716  AC_MSG_RESULT([$][$2])
717 ])
718
719 dnl
720 dnl FPTOOLS_GHC_VERSION(version)
721 dnl FPTOOLS_GHC_VERSION(major, minor [, patchlevel])
722 dnl FPTOOLS_GHC_VERSION(version, major, minor, patchlevel)
723 dnl
724 dnl Test for version of installed ghc.  Uses $GHC.
725 dnl [original version pinched from c2hs]
726 dnl
727 AC_DEFUN([FPTOOLS_GHC_VERSION],
728 [FPTOOLS_NOCACHE_CHECK([version of ghc], [fptools_version_of_ghc],
729 ["${WithGhc-ghc}" --version > conftestghc 2>&1
730   cat conftestghc >&AS_MESSAGE_LOG_FD
731 #Useless Use Of cat award...
732   fptools_version_of_ghc=`cat conftestghc | sed -n -e 's/, patchlevel *\([[0-9]]\)/.\1/;s/.* version \([[0-9]][[0-9.]]*\).*/\1/p'`
733   rm -fr conftest*
734   if test "[$]fptools_version_of_ghc" = ""
735   then
736     fptools_version_of_ghc='unknown'
737   fi
738 fptools_version_of_ghc[_major]=`echo [$]fptools_version_of_ghc | sed -e 's/^\([[0-9]]\).*/\1/'`
739 fptools_version_of_ghc[_minor]=`echo [$]fptools_version_of_ghc | sed -e 's/^[[0-9]]\.\([[0-9]]*\).*/\1/'`
740 fptools_version_of_ghc[_pl]=`echo [$]fptools_version_of_ghc | sed -n -e 's/^[[0-9]]\.[[0-9]]*\.\([[0-9]]*\)/\1/p'`
741 #
742 if test "[$]fptools_version_of_ghc[_pl]" = ""
743 then
744   fptools_version_of_ghc[_all]="[$]fptools_version_of_ghc[_major].[$]fptools_version_of_ghc[_minor]"
745   fptools_version_of_ghc[_pl]="0"
746 else
747   fptools_version_of_ghc[_all]="[$]fptools_version_of_ghc[_major].[$]fptools_version_of_ghc[_minor].[$]fptools_version_of_ghc[_pl]"
748 fi
749 #
750 ifelse($#, [1], [dnl
751 [$1]="[$]fptools_version_of_ghc[_all]"
752 ], $#, [2], [dnl
753 [$1]="[$]fptools_version_of_ghc[_major]"
754 [$2]="[$]fptools_version_of_ghc[_minor]"
755 ], $#, [3], [dnl
756 [$1]="[$]fptools_version_of_ghc[_major]"
757 [$2]="[$]fptools_version_of_ghc[_minor]"
758 [$3]="[$]fptools_version_of_ghc[_pl]"
759 ], $#, [4], [dnl
760 [$1]="[$]fptools_version_of_ghc[_all]"
761 [$2]="[$]fptools_version_of_ghc[_major]"
762 [$3]="[$]fptools_version_of_ghc[_minor]"
763 [$4]="[$]fptools_version_of_ghc[_pl]"
764 ])
765 ])
766 ])dnl
767
768
769 # FP_CHECK_FUNC(FUNCTION, PROLOGUE, BODY, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
770 # ---------------------------------------------------------------------------------
771 # A variant of AC_CHECK_FUNCS, limited to a single FUNCTION, but with the
772 # additional flexibility of specifying the PROLOGUE and BODY.
773 AC_DEFUN([FP_CHECK_FUNC],
774 [AS_VAR_PUSHDEF([fp_func], [fp_cv_func_$1])dnl
775 AC_CACHE_CHECK([for $1], fp_func,
776 [AC_LINK_IFELSE([AC_LANG_PROGRAM([$2], [$3])],
777                 [AS_VAR_SET(fp_func, yes)],
778                 [AS_VAR_SET(fp_func, no)])])
779 AS_IF([test AS_VAR_GET(fp_func) = yes],
780       [AC_DEFINE(AS_TR_CPP(HAVE_$1), [1],
781                 [Define to 1 if you have the `]$1[' function.]) $4],
782       [$5])dnl
783 AS_VAR_POPDEF([fp_func])dnl
784 ])# FP_CHECK_FUNC
785
786
787 # FP_GEN_DOCBOOK_XML
788 # ------------------
789 # Generates a DocBook XML V4.5 document in conftest.xml.
790 #
791 # It took a lot of experimentation to find a document that will cause
792 # xsltproc to fail with an error code when the relevant
793 # stylesheets/DTDs are not found.  I couldn't make xsltproc fail with
794 # a single-file document, it seems a multi-file document is needed.
795 # -- SDM 2009-06-03
796 #
797 AC_DEFUN([FP_GEN_DOCBOOK_XML],
798 [rm -f conftest.xml conftest-book.xml
799 cat > conftest.xml << EOF
800 <?xml version="1.0" encoding="iso-8859-1"?>
801 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
802    "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [[
803 <!ENTITY conftest-book SYSTEM "conftest-book.xml">
804 ]]>
805 <book id="test">
806 &conftest-book;
807 </book>
808 EOF
809 cat >conftest-book.xml << EOF
810 <?xml version="1.0" encoding="iso-8859-1"?>
811   <title>A DocBook &ldquo;Test Document&rdquo;</title>
812   <chapter id="id-one">
813     <title>A Chapter Title</title>
814     <para>This is a paragraph, referencing <xref linkend="id-two"/>.</para>
815   </chapter>
816   <chapter id="id-two">
817     <title>Another Chapter Title</title>
818     <para>This is another paragraph, referencing <xref linkend="id-one"/>.</para>
819   </chapter>
820 EOF
821 ]) # FP_GEN_DOCBOOK_XML
822
823
824 # FP_PROG_DBLATEX
825 # ----------------
826 # Sets the output variable DblatexCmd to the full path of dblatex,
827 # which we use for building PDF and PS docs.
828 # DblatexCmd is empty if dblatex could not be found.
829 AC_DEFUN([FP_PROG_DBLATEX],
830 [AC_PATH_PROG([DblatexCmd], [dblatex])
831 if test -z "$DblatexCmd"; then
832   AC_MSG_WARN([cannot find dblatex in your PATH, you will not be able to build the PDF and PS documentation])
833 fi
834 ])# FP_PROG_DBLATEX
835
836
837 # FP_PROG_XSLTPROC
838 # ----------------
839 # Sets the output variable XsltprocCmd to the full path of the XSLT processor
840 # xsltproc. XsltprocCmd is empty if xsltproc could not be found.
841 AC_DEFUN([FP_PROG_XSLTPROC],
842 [AC_PATH_PROG([XsltprocCmd], [xsltproc])
843 if test -z "$XsltprocCmd"; then
844   AC_MSG_WARN([cannot find xsltproc in your PATH, you will not be able to build the HTML documentation])
845 fi
846 ])# FP_PROG_XSLTPROC
847
848
849 # FP_DOCBOOK_XSL
850 # ----------------------------
851 # Check that we can process a DocBook XML document to HTML using xsltproc.
852 AC_DEFUN([FP_DOCBOOK_XSL],
853 [AC_REQUIRE([FP_PROG_XSLTPROC])dnl
854 if test -n "$XsltprocCmd"; then
855   AC_CACHE_CHECK([for DocBook XSL stylesheet], fp_cv_dir_docbook_xsl,
856   [FP_GEN_DOCBOOK_XML
857   fp_cv_dir_docbook_xsl=no
858   if $XsltprocCmd --nonet http://docbook.sourceforge.net/release/xsl/current/html/chunk.xsl conftest.xml > /dev/null 2>&1; then
859      fp_cv_dir_docbook_xsl=yes
860   fi
861   rm -rf conftest*])
862 fi
863 if test x"$fp_cv_dir_docbook_xsl" = xno; then
864   AC_MSG_WARN([cannot find DocBook XSL stylesheets, you will not be able to build the documentation])
865   HAVE_DOCBOOK_XSL=NO
866 else
867   HAVE_DOCBOOK_XSL=YES
868 fi
869 AC_SUBST([HAVE_DOCBOOK_XSL])
870 ])# FP_DOCBOOK_XSL
871
872
873 # FP_PROG_XMLLINT
874 # ----------------
875 # Sets the output variable XmllintCmd to the full path of the XSLT processor
876 # xmllint. XmllintCmd is empty if xmllint could not be found.
877 AC_DEFUN([FP_PROG_XMLLINT],
878 [AC_PATH_PROG([XmllintCmd], [xmllint])
879 if test -z "$XmllintCmd"; then
880   AC_MSG_WARN([cannot find xmllint in your PATH, you will not be able to validate your documentation])
881 fi
882 ])# FP_PROG_XMLLINT
883
884
885 # FP_CHECK_DOCBOOK_DTD
886 # --------------------
887 AC_DEFUN([FP_CHECK_DOCBOOK_DTD],
888 [AC_REQUIRE([FP_PROG_XMLLINT])dnl
889 if test -n "$XmllintCmd"; then
890   AC_MSG_CHECKING([for DocBook DTD])
891   FP_GEN_DOCBOOK_XML
892   if $XmllintCmd --nonet --valid --noout conftest.xml ; then
893     AC_MSG_RESULT([ok])
894   else
895     AC_MSG_RESULT([failed])
896     AC_MSG_WARN([cannot find a DTD for DocBook XML V4.5, you will not be able to validate your documentation])
897     AC_MSG_WARN([check your XML_CATALOG_FILES environment variable and/or /etc/xml/catalog])
898   fi
899   rm -rf conftest*
900 fi
901 ])# FP_CHECK_DOCBOOK_DTD
902
903
904 # FP_GEN_FO
905 # ------------------
906 # Generates a formatting objects document in conftest.fo.
907 AC_DEFUN([FP_GEN_FO],
908 [rm -f conftest.fo
909 cat > conftest.fo << EOF
910 <?xml version="1.0"?>
911 <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
912   <fo:layout-master-set>
913     <fo:simple-page-master master-name="blank">
914       <fo:region-body/>
915     </fo:simple-page-master>
916   </fo:layout-master-set>
917   <fo:page-sequence master-reference="blank">
918     <fo:flow flow-name="xsl-region-body">
919       <fo:block>
920         Test!
921       </fo:block>
922     </fo:flow>
923   </fo:page-sequence>
924 </fo:root>
925 EOF
926 ]) # FP_GEN_FO
927
928
929 # FP_PROG_FOP
930 # -----------
931 # Set the output variable 'FopCmd' to the first working 'fop' in the current
932 # 'PATH'. Note that /usr/bin/fop is broken in SuSE 9.1 (unpatched), so try
933 # /usr/share/fop/fop.sh in that case (or no 'fop'), too.
934 AC_DEFUN([FP_PROG_FOP],
935 [AC_PATH_PROGS([FopCmd1], [fop fop.sh])
936 if test -n "$FopCmd1"; then
937   AC_CACHE_CHECK([for $FopCmd1 usability], [fp_cv_fop_usability],
938     [FP_GEN_FO
939     if "$FopCmd1" -fo conftest.fo -ps conftest.ps > /dev/null 2>&1; then
940       fp_cv_fop_usability=yes
941     else
942       fp_cv_fop_usability=no
943     fi
944     rm -rf conftest*])
945   if test x"$fp_cv_fop_usability" = xyes; then
946      FopCmd=$FopCmd1
947   fi
948 fi
949 if test -z "$FopCmd"; then
950   AC_PATH_PROGS([FopCmd2], [fop.sh], , [/usr/share/fop])
951   FopCmd=$FopCmd2
952 fi
953 AC_SUBST([FopCmd])
954 ])# FP_PROG_FOP
955
956
957 # FP_PROG_HSTAGS
958 # ----------------
959 # Sets the output variable HstagsCmd to the full Haskell tags program path.
960 # HstagsCmd is empty if no such program could be found.
961 AC_DEFUN([FP_PROG_HSTAGS],
962 [AC_PATH_PROG([HstagsCmd], [hasktags])
963 if test -z "$HstagsCmd"; then
964   AC_MSG_WARN([cannot find hasktags in your PATH, you will not be able to build the tags])
965 fi
966 ])# FP_PROG_HSTAGS
967
968
969 # FP_PROG_GHC_PKG
970 # ----------------
971 # Try to find a ghc-pkg matching the ghc mentioned in the environment variable
972 # WithGhc. Sets the output variable GhcPkgCmd.
973 AC_DEFUN([FP_PROG_GHC_PKG],
974 [AC_CACHE_CHECK([for ghc-pkg matching $WithGhc], fp_cv_matching_ghc_pkg,
975 [
976 # If we are told to use ghc-stage2, then we're using an in-tree
977 # compiler. In this case, we just want ghc-pkg, not ghc-pkg-stage2,
978 # so we sed off -stage[0-9]$. However, if we are told to use
979 # ghc-6.12.1 then we want to use ghc-pkg-6.12.1, so we keep any
980 # other suffix.
981 fp_ghc_pkg_guess=`echo $WithGhc | sed -e 's/-stage@<:@0-9@:>@$//' -e 's,ghc\(@<:@^/\\@:>@*\)$,ghc-pkg\1,'`
982 if "$fp_ghc_pkg_guess" list > /dev/null 2>&1; then
983   fp_cv_matching_ghc_pkg=$fp_ghc_pkg_guess
984 else
985   AC_MSG_ERROR([Cannot find matching ghc-pkg])
986 fi])
987 GhcPkgCmd=$fp_cv_matching_ghc_pkg
988 AC_SUBST([GhcPkgCmd])
989 ])# FP_PROG_GHC_PKG
990
991
992 # FP_GCC_EXTRA_FLAGS
993 # ------------------
994 # Determine which extra flags we need to pass gcc when we invoke it
995 # to compile .hc code.
996 #
997 # Some OSs (Mandrake Linux, in particular) configure GCC with
998 # -momit-leaf-frame-pointer on by default. If this is the case, we
999 # need to turn it off for mangling to work. The test is currently a
1000 # bit crude, using only the version number of gcc.
1001
1002 # -fwrapv is needed for gcc to emit well-behaved code in the presence of
1003 # integer wrap around. (Trac #952)
1004 #
1005 # -fno-unit-at-a-time or -fno-toplevel-reoder is necessary to avoid gcc
1006 # reordering things in the module and confusing the manger and/or splitter.
1007 # (eg. Trac #1427)
1008 #
1009 AC_DEFUN([FP_GCC_EXTRA_FLAGS],
1010 [AC_REQUIRE([FP_HAVE_GCC])
1011 AC_CACHE_CHECK([for extra options to pass gcc when compiling via C], [fp_cv_gcc_extra_opts],
1012 [fp_cv_gcc_extra_opts=
1013  FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-ge], [3.4],
1014   [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -fwrapv"],
1015   [])
1016  case $TargetPlatform in
1017   i386-*|x86_64-*) 
1018      FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-ge], [3.2],
1019       [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -mno-omit-leaf-frame-pointer"],
1020       [])
1021     FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-ge], [3.4],
1022      [FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-ge], [4.2],
1023        [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -fno-toplevel-reorder"],
1024        [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -fno-unit-at-a-time"]
1025      )],
1026      [])
1027   ;;
1028   sparc-*-solaris2) 
1029     FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-ge], [4.2],
1030       [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -fno-toplevel-reorder"],
1031       [])
1032   ;;
1033  esac
1034 ])
1035 AC_SUBST([GccExtraViaCOpts],$fp_cv_gcc_extra_opts)
1036 ])
1037
1038
1039 # FP_SETUP_PROJECT_VERSION
1040 # ---------------------
1041 AC_DEFUN([FP_SETUP_PROJECT_VERSION],
1042 [
1043 if test "$RELEASE" = "NO"; then
1044     AC_MSG_CHECKING([for GHC version date])
1045     if test -f VERSION_DATE; then
1046         PACKAGE_VERSION=${PACKAGE_VERSION}.`cat VERSION_DATE`
1047         AC_MSG_RESULT(given $PACKAGE_VERSION)
1048     elif test -d .git; then
1049         changequote(, )dnl
1050         ver_date=`git log -n 1 --date=short --pretty=format:%ci | sed "s/^.*\([0-9][0-9][0-9][0-9]\)-\([0-9][0-9]\)-\([0-9][0-9]\).*$/\1\2\3/"`
1051         if echo $ver_date | grep '^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$' 2>&1 >/dev/null; then true; else
1052         changequote([, ])dnl
1053                 AC_MSG_ERROR([failed to detect version date: check that git is in your path])
1054         fi
1055         PACKAGE_VERSION=${PACKAGE_VERSION}.$ver_date
1056         AC_MSG_RESULT(inferred $PACKAGE_VERSION)
1057     elif test -d _darcs; then
1058         # TODO: Remove this branch after conversion to Git
1059         changequote(, )dnl
1060         ver_date=`darcs changes --quiet --no-summary --xml | head -500 | grep 'date=' | sed "s/^.*date='\([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\).*$/\1/g" | ${SortCmd} -n | tail -1`
1061         if echo $ver_date | grep '^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$' 2>&1 >/dev/null; then true; else
1062         changequote([, ])dnl
1063                 AC_MSG_ERROR([failed to detect version date: check that darcs is in your path])
1064         fi
1065         PACKAGE_VERSION=${PACKAGE_VERSION}.$ver_date
1066         AC_MSG_RESULT(inferred $PACKAGE_VERSION)
1067     elif test -f VERSION; then
1068         PACKAGE_VERSION=`cat VERSION`
1069         AC_MSG_RESULT(given $PACKAGE_VERSION)
1070     else
1071         AC_MSG_WARN([cannot determine snapshot version: no .git or _darcs directory and no VERSION file])
1072     fi
1073 fi
1074
1075 # Some renamings
1076 AC_SUBST([ProjectName], [$PACKAGE_NAME])
1077 AC_SUBST([ProjectVersion], [$PACKAGE_VERSION])
1078
1079 # Split PACKAGE_VERSION into (possibly empty) parts
1080 VERSION_MAJOR=`echo $PACKAGE_VERSION | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\1'/`
1081 VERSION_TMP=`echo $PACKAGE_VERSION | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\3'/`
1082 VERSION_MINOR=`echo $VERSION_TMP | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\1'/`
1083 ProjectPatchLevel=`echo $VERSION_TMP | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\3'/`
1084
1085 # Calculate project version as an integer, using 2 digits for minor version
1086 case $VERSION_MINOR in
1087   ?) ProjectVersionInt=${VERSION_MAJOR}0${VERSION_MINOR} ;;
1088   ??) ProjectVersionInt=${VERSION_MAJOR}${VERSION_MINOR} ;;
1089   *) AC_MSG_ERROR([bad minor version in $PACKAGE_VERSION]) ;;
1090 esac
1091 AC_SUBST([ProjectVersionInt])
1092
1093 # The project patchlevel is zero unless stated otherwise
1094 test -z "$ProjectPatchLevel" && ProjectPatchLevel=0
1095
1096 # Remove dots from the patch level; this allows us to have versions like 6.4.1.20050508
1097 ProjectPatchLevel=`echo $ProjectPatchLevel | sed 's/\.//'`
1098
1099 AC_SUBST([ProjectPatchLevel])
1100 ])# FP_SETUP_PROJECT_VERSION
1101
1102
1103 # Check for a working timer_create().  We need a pretty detailed check
1104 # here, because there exist partially-working implementations of
1105 # timer_create() in certain versions of Linux (see bug #1933).
1106 #
1107 AC_DEFUN([FP_CHECK_TIMER_CREATE],
1108   [AC_CACHE_CHECK([for a working timer_create(CLOCK_REALTIME)], 
1109     [fptools_cv_timer_create_works],
1110     [AC_TRY_RUN([
1111 #include <stdio.h>
1112 #ifdef HAVE_STDLIB_H
1113 #include <stdlib.h>
1114 #endif
1115 #ifdef HAVE_TIME_H
1116 #include <time.h>
1117 #endif
1118 #ifdef HAVE_SIGNAL_H
1119 #include <signal.h>
1120 #endif
1121 #ifdef HAVE_UNISTD_H
1122 #include <unistd.h>
1123 #endif
1124
1125 static volatile int tock = 0;
1126 static void handler(int i)
1127 {
1128    tock = 1;
1129 }
1130
1131 static void timeout(int i)
1132 {
1133   // timer_settime() has been known to hang, so just in case
1134   // we install a 1-second timeout (see #2257)
1135   exit(99);
1136 }
1137
1138 int main(int argc, char *argv[])
1139 {
1140
1141     struct sigevent ev;
1142     timer_t timer;
1143     struct itimerspec it;
1144     struct sigaction action;
1145     int m,n,count = 0;
1146
1147     ev.sigev_notify = SIGEV_SIGNAL;
1148     ev.sigev_signo  = SIGVTALRM;
1149
1150     action.sa_handler = handler;
1151     action.sa_flags = 0;
1152     sigemptyset(&action.sa_mask);
1153     if (sigaction(SIGVTALRM, &action, NULL) == -1) {
1154         fprintf(stderr,"SIGVTALRM problem\n");
1155         exit(3);
1156     }
1157
1158     action.sa_handler = timeout;
1159     action.sa_flags = 0;
1160     sigemptyset(&action.sa_mask);
1161     if (sigaction(SIGALRM, &action, NULL) == -1) {
1162       fprintf(stderr,"SIGALRM problem\n");
1163       exit(3);
1164     }
1165     alarm(1);
1166
1167     if (timer_create(CLOCK_PROCESS_CPUTIME_ID, &ev, &timer) != 0) {
1168         fprintf(stderr,"No CLOCK_PROCESS_CPUTIME_ID timer\n");
1169        exit(1);
1170     }
1171
1172     it.it_value.tv_sec = 0;
1173     it.it_value.tv_nsec = 1;
1174     it.it_interval = it.it_value;
1175     if (timer_settime(timer, 0, &it, NULL) != 0) {
1176         fprintf(stderr,"settime problem\n");
1177         exit(4);
1178     }
1179
1180     tock = 0;
1181
1182     for(n = 3; n < 20000; n++){
1183         for(m = 2; m <= n/2; m++){
1184             if (!(n%m)) count++;
1185             if (tock) goto out;
1186         }
1187     }
1188 out:
1189
1190     if (!tock) {
1191         fprintf(stderr,"no CLOCK_PROCESS_CPUTIME_ID signal\n");
1192         exit(5);
1193     }
1194
1195     timer_delete(timer);
1196
1197     if (timer_create(CLOCK_REALTIME, &ev, &timer) != 0) {
1198         fprintf(stderr,"No CLOCK_REALTIME timer\n");
1199         exit(2);
1200     }
1201
1202     it.it_value.tv_sec = 0;
1203     it.it_value.tv_nsec = 1000000;
1204     it.it_interval = it.it_value;
1205     if (timer_settime(timer, 0, &it, NULL) != 0) {
1206         fprintf(stderr,"settime problem\n");
1207         exit(4);
1208     }
1209
1210     tock = 0;
1211
1212     usleep(3000);
1213
1214     if (!tock) {
1215         fprintf(stderr,"no CLOCK_REALTIME signal\n");
1216         exit(5);
1217     }
1218
1219     timer_delete(timer);
1220
1221     exit(0);
1222 }
1223      ],
1224      [fptools_cv_timer_create_works=yes],
1225      [fptools_cv_timer_create_works=no])
1226   ])
1227 case $fptools_cv_timer_create_works in
1228     yes) AC_DEFINE([USE_TIMER_CREATE], 1, 
1229                    [Define to 1 if we can use timer_create(CLOCK_PROCESS_CPUTIME_ID,...)]);;
1230 esac
1231 ])
1232
1233 # FP_ICONV
1234 # -------------
1235 AC_DEFUN([FP_ICONV],
1236 [
1237   dnl--------------------------------------------------------------------
1238   dnl * Deal with arguments telling us iconv is somewhere odd
1239   dnl--------------------------------------------------------------------
1240
1241   dnl Note: ICONV_LIB_DIRS and ICONV_INCLUDE_DIRS are not predefined
1242   dnl to the empty string to allow them to be overridden from the
1243   dnl environment.
1244
1245   AC_ARG_WITH([iconv-includes],
1246     [AC_HELP_STRING([--with-iconv-includes],
1247       [directory containing iconv.h])],
1248       [ICONV_INCLUDE_DIRS=$withval])
1249
1250   AC_ARG_WITH([iconv-libraries],
1251     [AC_HELP_STRING([--with-iconv-libraries],
1252       [directory containing iconv library])],
1253       [ICONV_LIB_DIRS=$withval])
1254
1255   AC_SUBST(ICONV_INCLUDE_DIRS)
1256   AC_SUBST(ICONV_LIB_DIRS)
1257 ])# FP_ICONV
1258
1259 # FP_GMP
1260 # -------------
1261 AC_DEFUN([FP_GMP],
1262 [
1263   dnl--------------------------------------------------------------------
1264   dnl * Deal with arguments telling us gmp is somewhere odd
1265   dnl--------------------------------------------------------------------
1266
1267   AC_ARG_WITH([gmp-includes],
1268     [AC_HELP_STRING([--with-gmp-includes],
1269       [directory containing gmp.h])],
1270       [GMP_INCLUDE_DIRS=$withval])
1271
1272   AC_ARG_WITH([gmp-libraries],
1273     [AC_HELP_STRING([--with-gmp-libraries],
1274       [directory containing gmp library])],
1275       [GMP_LIB_DIRS=$withval])
1276
1277   AC_SUBST(GMP_INCLUDE_DIRS)
1278   AC_SUBST(GMP_LIB_DIRS)
1279 ])# FP_GMP
1280
1281 # FP_CHECK_MACOSX_DEPLOYMENT_TARGET
1282 # ---------------------------------
1283 AC_DEFUN([FP_CHECK_MACOSX_DEPLOYMENT_TARGET],
1284 [
1285 if test "x$TargetOS_CPP-$TargetVendor_CPP" = "xdarwin-apple"; then
1286   AC_MSG_CHECKING([Mac OS X deployment target])
1287   case $FP_MACOSX_DEPLOYMENT_TARGET in
1288     none)  ;;
1289     10.4)  MACOSX_DEPLOYMENT_VERSION=10.4
1290            MACOSX_DEPLOYMENT_SDK=/Developer/SDKs/MacOSX10.4u.sdk
1291            ;;
1292     10.4u) MACOSX_DEPLOYMENT_VERSION=10.4
1293            MACOSX_DEPLOYMENT_SDK=/Developer/SDKs/MacOSX10.4u.sdk
1294            ;;
1295     *)     MACOSX_DEPLOYMENT_VERSION=$FP_MACOSX_DEPLOYMENT_TARGET
1296            MACOSX_DEPLOYMENT_SDK=/Developer/SDKs/MacOSX${FP_MACOSX_DEPLOYMENT_TARGET}.sdk
1297            ;;
1298   esac
1299   if test "x$FP_MACOSX_DEPLOYMENT_TARGET" = "xnone"; then
1300     AC_MSG_RESULT(none)
1301   else
1302     if test ! -d $MACOSX_DEPLOYMENT_SDK; then
1303       AC_MSG_ERROR([Unknown deployment target $FP_MACOSX_DEPLOYMENT_TARGET])
1304     fi
1305     AC_MSG_RESULT([${MACOSX_DEPLOYMENT_VERSION} (${MACOSX_DEPLOYMENT_SDK})])
1306   fi
1307 fi
1308 ])
1309
1310 # --------------------------------------------------------------
1311 # Calculate absolute path to build tree
1312 # --------------------------------------------------------------
1313
1314 AC_DEFUN([FP_INTREE_GHC_PWD],[
1315 AC_MSG_NOTICE(Building in-tree ghc-pwd)
1316     dnl This would be
1317     dnl     make -C utils/ghc-pwd clean && make -C utils/ghc-pwd
1318     dnl except we don't want to have to know what make is called. Sigh.
1319     rm -rf utils/ghc-pwd/dist-boot
1320     mkdir  utils/ghc-pwd/dist-boot
1321     if ! "$WithGhc" -v0 -no-user-package-conf -hidir utils/ghc-pwd/dist-boot -odir utils/ghc-pwd/dist-boot -stubdir utils/ghc-pwd/dist-boot --make utils/ghc-pwd/Main.hs -o utils/ghc-pwd/dist-boot/ghc-pwd
1322     then
1323         AC_MSG_ERROR([Building ghc-pwd failed])
1324     fi
1325
1326     GHC_PWD=utils/ghc-pwd/dist-boot/ghc-pwd
1327 ])
1328
1329 AC_DEFUN([FP_BINDIST_GHC_PWD],[
1330     GHC_PWD=utils/ghc-pwd/dist/build/tmp/ghc-pwd
1331 ])
1332
1333 AC_DEFUN([FP_FIND_ROOT],[
1334 AC_MSG_CHECKING(for path to top of build tree)
1335     hardtop=`$GHC_PWD`
1336
1337     dnl Remove common automounter nonsense
1338     hardtop=`echo $hardtop | sed 's|^/tmp_mnt.*\(/local/.*\)$|\1|' | sed 's|^/tmp_mnt/|/|'`
1339
1340     if ! test -d "$hardtop"; then
1341         AC_MSG_ERROR([cannot determine current directory])
1342     fi
1343
1344     dnl We don't support building in directories with spaces.
1345     case "$hardtop" in
1346     *' '*)
1347         AC_MSG_ERROR([
1348         The build system does not support building in a directory
1349         containing space characters.
1350         Suggestion: move the build tree somewhere else.])
1351         ;;
1352     esac
1353
1354     AC_SUBST(hardtop)
1355
1356     AC_MSG_RESULT($hardtop)
1357 ])
1358
1359 # GHC_CONVERT_CPU(cpu, target_var)
1360 # --------------------------------
1361 # converts cpu from gnu to ghc naming, and assigns the result to $target_var
1362 AC_DEFUN([GHC_CONVERT_CPU],[
1363 case "$1" in
1364   alpha*)
1365     $2="alpha"
1366     ;;
1367   arm*)
1368     $2="arm"
1369     ;;
1370   hppa1.1*)
1371     $2="hppa1_1"
1372     ;;
1373   hppa*)
1374     $2="hppa"
1375     ;;
1376   i386)
1377     $2="i386"
1378     ;;
1379   ia64)
1380     $2="ia64"
1381     ;;
1382   m68k*)
1383     $2="m68k"
1384     ;;
1385   mipseb*)
1386     $2="mipseb"
1387     ;;
1388   mipsel*)
1389     $2="mipsel"
1390     ;;
1391   mips*)
1392     $2="mips"
1393     ;;
1394   powerpc64*)
1395     $2="powerpc64"
1396     ;;
1397   powerpc*)
1398     $2="powerpc"
1399     ;;
1400   rs6000)
1401     $2="rs6000"
1402     ;;
1403   s390*)
1404     $2="s390"
1405     ;;
1406   sparc64*)
1407     $2="sparc64"
1408     ;;
1409   sparc*)
1410     $2="sparc"
1411     ;;
1412   vax)
1413     $2="vax"
1414     ;;
1415   x86_64)
1416     $2="x86_64"
1417     ;;
1418   *)
1419     echo "Unknown CPU $1"
1420     exit 1
1421     ;;
1422   esac
1423 ])
1424
1425 # GHC_CONVERT_VENDOR(vendor, target_var)
1426 # --------------------------------
1427 # converts vendor from gnu to ghc naming, and assigns the result to $target_var
1428 AC_DEFUN([GHC_CONVERT_VENDOR],[
1429 $2="$1"
1430 ])
1431
1432 # GHC_CONVERT_OS(os, target_var)
1433 # --------------------------------
1434 # converts os from gnu to ghc naming, and assigns the result to $target_var
1435 AC_DEFUN([GHC_CONVERT_OS],[
1436 case "$1" in
1437   linux-*|linux)
1438     $2="linux"
1439     ;;
1440   # As far as I'm aware, none of these have relevant variants
1441   freebsd|netbsd|openbsd|dragonfly|osf1|osf3|hpux|linuxaout|kfreebsdgnu|freebsd2|solaris2|cygwin32|mingw32|darwin|gnu|nextstep2|nextstep3|sunos4|ultrix|irix|aix|haiku)
1442     $2="$1"
1443     ;;
1444   *)
1445     echo "Unknown OS $1"
1446     exit 1
1447     ;;
1448   esac
1449 ])
1450
1451 # LIBRARY_VERSION(lib)
1452 # --------------------------------
1453 # Gets the version number of a library.
1454 # If $1 is ghc-prim, then we define LIBRARY_ghc_prim_VERSION as 1.2.3
1455 AC_DEFUN([LIBRARY_VERSION],[
1456 LIBRARY_[]translit([$1], [-], [_])[]_VERSION=`grep -i "^version:" libraries/$1/$1.cabal | sed "s/.* //"`
1457 AC_SUBST(LIBRARY_[]translit([$1], [-], [_])[]_VERSION)
1458 ])
1459
1460 # LocalWords:  fi