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