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