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