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