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