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