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