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