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