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