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