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