Merge branch 'master' of dippy:c:/msys/1.0/home/ian/ghc/.
[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=
746 AC_CACHE_CHECK([version of gcc], [fp_cv_gcc_version],
747 [
748     fp_cv_gcc_version="`$CC -v 2>&1 | grep 'version ' | sed -e 's/.*version [[^0-9]]*\([[0-9.]]*\).*/\1/g'`"
749     FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [3.0],
750                         [AC_MSG_ERROR([Need at least gcc version 3.0 (3.4+ recommended)])])
751     # See #2770: gcc 2.95 doesn't work any more, apparently.  There probably
752     # isn't a very good reason for that, but for now just make configure
753     # fail.
754     FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [3.4], GccLT34=YES)
755 ])
756 AC_SUBST([GccVersion], [$fp_cv_gcc_version])
757 AC_SUBST(GccLT34)
758 ])# FP_GCC_VERSION
759
760 dnl Small feature test for perl version. Assumes PerlCmd
761 dnl contains path to perl binary.
762 dnl
763 dnl (Perl versions prior to v5.6 does not contain the string "v5";
764 dnl instead they display version strings such as "version 5.005".)
765 dnl
766 AC_DEFUN([FPTOOLS_CHECK_PERL_VERSION],
767 [$PerlCmd -v >conftest.out 2>&1
768    if grep "v5" conftest.out >/dev/null 2>&1; then
769       :
770    else
771       AC_MSG_ERROR([your version of perl probably won't work, try upgrading it.])
772    fi
773 rm -fr conftest*
774 ])
775
776
777 # FP_CHECK_PROG(VARIABLE, PROG-TO-CHECK-FOR,
778 #               [VALUE-IF-NOT-FOUND], [PATH], [REJECT])
779 # -----------------------------------------------------
780 # HACK: A small wrapper around AC_CHECK_PROG, setting VARIABLE to the full path
781 # of PROG-TO-CHECK-FOR when found.
782 AC_DEFUN([FP_CHECK_PROG],
783 [AC_CHECK_PROG([$1], [$2], [$as_dir/$ac_word$ac_exec_ext], [$3], [$4], [$5])][]dnl
784 )# FP_CHECK_PROC
785
786
787 # FP_PROG_FIND
788 # ------------
789 # Find a non-WinDoze version of the "find" utility.
790 AC_DEFUN([FP_PROG_FIND],
791 [AC_PATH_PROGS([fp_prog_find], [gfind find], find)
792 echo foo > conftest.txt
793 $fp_prog_find conftest.txt -print > conftest.out 2>&1
794 if grep '^conftest.txt$' conftest.out > /dev/null 2>&1 ; then
795   # OK, looks like a real "find".
796   case $HostPlatform in
797     *mingw32)
798       if test x${OSTYPE} != xmsys
799       then
800             fp_prog_find="`cygpath --mixed ${fp_prog_find}`"
801         AC_MSG_NOTICE([normalized find command to $fp_prog_find])
802       fi ;;
803     *) ;;
804   esac
805   FindCmd="$fp_prog_find"
806 else
807   # Found a poor WinDoze version of "find", ignore it.
808   AC_MSG_WARN([$fp_prog_find looks like a non-*nix find, ignoring it])
809   FP_CHECK_PROG([FindCmd], [find], [], [], [$fp_prog_find])
810 fi
811 rm -f conftest.txt conftest.out
812 AC_SUBST([FindCmd])[]dnl
813 ])# FP_PROG_FIND
814
815
816 # FP_PROG_SORT
817 # ------------
818 # Find a Unix-like sort
819 AC_DEFUN([FP_PROG_SORT],
820 [AC_PATH_PROG([fp_prog_sort], [sort])
821 echo conwip > conftest.txt
822 $fp_prog_sort -f conftest.txt > conftest.out 2>&1
823 if grep 'conwip' conftest.out > /dev/null 2>&1 ; then
824   # The goods
825   SortCmd="$fp_prog_sort"
826 else
827   # Summink else..pick next one.
828   AC_MSG_WARN([$fp_prog_sort looks like a non-*nix sort, ignoring it])
829   FP_CHECK_PROG([SortCmd], [sort], [], [], [$fp_prog_sort])
830 fi
831 rm -f conftest.txt conftest.out
832 AC_SUBST([SortCmd])[]dnl
833 ])# FP_PROG_SORT
834
835 dnl
836 dnl FPTOOLS_NOCACHE_CHECK prints a message, then sets the
837 dnl values of the second argument to the result of running
838 dnl the commands given by the third. It does not cache its
839 dnl result, so it is suitable for checks which should be
840 dnl run every time.
841 dnl
842 AC_DEFUN([FPTOOLS_NOCACHE_CHECK],
843 [AC_MSG_CHECKING([$1])
844  $3
845  AC_MSG_RESULT([$][$2])
846 ])
847
848 dnl
849 dnl FPTOOLS_GHC_VERSION(version)
850 dnl FPTOOLS_GHC_VERSION(major, minor [, patchlevel])
851 dnl FPTOOLS_GHC_VERSION(version, major, minor, patchlevel)
852 dnl
853 dnl Test for version of installed ghc.  Uses $GHC.
854 dnl [original version pinched from c2hs]
855 dnl
856 AC_DEFUN([FPTOOLS_GHC_VERSION],
857 [FPTOOLS_NOCACHE_CHECK([version of ghc], [fptools_version_of_ghc],
858 ["${WithGhc-ghc}" --version > conftestghc 2>&1
859   cat conftestghc >&AS_MESSAGE_LOG_FD
860 #Useless Use Of cat award...
861   fptools_version_of_ghc=`cat conftestghc | sed -n -e 's/, patchlevel *\([[0-9]]\)/.\1/;s/.* version \([[0-9]][[0-9.]]*\).*/\1/p'`
862   rm -fr conftest*
863   if test "[$]fptools_version_of_ghc" = ""
864   then
865     fptools_version_of_ghc='unknown'
866   fi
867 fptools_version_of_ghc[_major]=`echo [$]fptools_version_of_ghc | sed -e 's/^\([[0-9]]\).*/\1/'`
868 fptools_version_of_ghc[_minor]=`echo [$]fptools_version_of_ghc | sed -e 's/^[[0-9]]\.\([[0-9]]*\).*/\1/'`
869 fptools_version_of_ghc[_pl]=`echo [$]fptools_version_of_ghc | sed -n -e 's/^[[0-9]]\.[[0-9]]*\.\([[0-9]]*\)/\1/p'`
870 #
871 if test "[$]fptools_version_of_ghc[_pl]" = ""
872 then
873   fptools_version_of_ghc[_all]="[$]fptools_version_of_ghc[_major].[$]fptools_version_of_ghc[_minor]"
874   fptools_version_of_ghc[_pl]="0"
875 else
876   fptools_version_of_ghc[_all]="[$]fptools_version_of_ghc[_major].[$]fptools_version_of_ghc[_minor].[$]fptools_version_of_ghc[_pl]"
877 fi
878 #
879 ifelse($#, [1], [dnl
880 [$1]="[$]fptools_version_of_ghc[_all]"
881 ], $#, [2], [dnl
882 [$1]="[$]fptools_version_of_ghc[_major]"
883 [$2]="[$]fptools_version_of_ghc[_minor]"
884 ], $#, [3], [dnl
885 [$1]="[$]fptools_version_of_ghc[_major]"
886 [$2]="[$]fptools_version_of_ghc[_minor]"
887 [$3]="[$]fptools_version_of_ghc[_pl]"
888 ], $#, [4], [dnl
889 [$1]="[$]fptools_version_of_ghc[_all]"
890 [$2]="[$]fptools_version_of_ghc[_major]"
891 [$3]="[$]fptools_version_of_ghc[_minor]"
892 [$4]="[$]fptools_version_of_ghc[_pl]"
893 ])
894 ])
895 ])dnl
896
897
898 # FP_CHECK_FUNC(FUNCTION, PROLOGUE, BODY, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
899 # ---------------------------------------------------------------------------------
900 # A variant of AC_CHECK_FUNCS, limited to a single FUNCTION, but with the
901 # additional flexibility of specifying the PROLOGUE and BODY.
902 AC_DEFUN([FP_CHECK_FUNC],
903 [AS_VAR_PUSHDEF([fp_func], [fp_cv_func_$1])dnl
904 AC_CACHE_CHECK([for $1], fp_func,
905 [AC_LINK_IFELSE([AC_LANG_PROGRAM([$2], [$3])],
906                 [AS_VAR_SET(fp_func, yes)],
907                 [AS_VAR_SET(fp_func, no)])])
908 AS_IF([test AS_VAR_GET(fp_func) = yes],
909       [AC_DEFINE(AS_TR_CPP(HAVE_$1), [1],
910                 [Define to 1 if you have the `]$1[' function.]) $4],
911       [$5])dnl
912 AS_VAR_POPDEF([fp_func])dnl
913 ])# FP_CHECK_FUNC
914
915
916 # FP_GEN_DOCBOOK_XML
917 # ------------------
918 # Generates a DocBook XML V4.5 document in conftest.xml.
919 #
920 # It took a lot of experimentation to find a document that will cause
921 # xsltproc to fail with an error code when the relevant
922 # stylesheets/DTDs are not found.  I couldn't make xsltproc fail with
923 # a single-file document, it seems a multi-file document is needed.
924 # -- SDM 2009-06-03
925 #
926 AC_DEFUN([FP_GEN_DOCBOOK_XML],
927 [rm -f conftest.xml conftest-book.xml
928 cat > conftest.xml << EOF
929 <?xml version="1.0" encoding="iso-8859-1"?>
930 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
931    "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [[
932 <!ENTITY conftest-book SYSTEM "conftest-book.xml">
933 ]]>
934 <book id="test">
935 &conftest-book;
936 </book>
937 EOF
938 cat >conftest-book.xml << EOF
939 <?xml version="1.0" encoding="iso-8859-1"?>
940   <title>A DocBook &ldquo;Test Document&rdquo;</title>
941   <chapter id="id-one">
942     <title>A Chapter Title</title>
943     <para>This is a paragraph, referencing <xref linkend="id-two"/>.</para>
944   </chapter>
945   <chapter id="id-two">
946     <title>Another Chapter Title</title>
947     <para>This is another paragraph, referencing <xref linkend="id-one"/>.</para>
948   </chapter>
949 EOF
950 ]) # FP_GEN_DOCBOOK_XML
951
952
953 # FP_PROG_DBLATEX
954 # ----------------
955 # Sets the output variable DblatexCmd to the full path of dblatex,
956 # which we use for building PDF and PS docs.
957 # DblatexCmd is empty if dblatex could not be found.
958 AC_DEFUN([FP_PROG_DBLATEX],
959 [AC_PATH_PROG([DblatexCmd], [dblatex])
960 if test -z "$DblatexCmd"; then
961   AC_MSG_WARN([cannot find dblatex in your PATH, you will not be able to build the PDF and PS documentation])
962 fi
963 ])# FP_PROG_DBLATEX
964
965
966 # FP_PROG_XSLTPROC
967 # ----------------
968 # Sets the output variable XsltprocCmd to the full path of the XSLT processor
969 # xsltproc. XsltprocCmd is empty if xsltproc could not be found.
970 AC_DEFUN([FP_PROG_XSLTPROC],
971 [AC_PATH_PROG([XsltprocCmd], [xsltproc])
972 if test -z "$XsltprocCmd"; then
973   AC_MSG_WARN([cannot find xsltproc in your PATH, you will not be able to build the HTML documentation])
974 fi
975 ])# FP_PROG_XSLTPROC
976
977
978 # FP_DOCBOOK_XSL
979 # ----------------------------
980 # Check that we can process a DocBook XML document to HTML using xsltproc.
981 AC_DEFUN([FP_DOCBOOK_XSL],
982 [AC_REQUIRE([FP_PROG_XSLTPROC])dnl
983 if test -n "$XsltprocCmd"; then
984   AC_CACHE_CHECK([for DocBook XSL stylesheet], fp_cv_dir_docbook_xsl,
985   [FP_GEN_DOCBOOK_XML
986   fp_cv_dir_docbook_xsl=no
987   if $XsltprocCmd --nonet http://docbook.sourceforge.net/release/xsl/current/html/chunk.xsl conftest.xml > /dev/null 2>&1; then
988      fp_cv_dir_docbook_xsl=yes
989   fi
990   rm -rf conftest*])
991 fi
992 if test x"$fp_cv_dir_docbook_xsl" = xno; then
993   AC_MSG_WARN([cannot find DocBook XSL stylesheets, you will not be able to build the documentation])
994   HAVE_DOCBOOK_XSL=NO
995 else
996   HAVE_DOCBOOK_XSL=YES
997 fi
998 AC_SUBST([HAVE_DOCBOOK_XSL])
999 ])# FP_DOCBOOK_XSL
1000
1001
1002 # FP_PROG_XMLLINT
1003 # ----------------
1004 # Sets the output variable XmllintCmd to the full path of the XSLT processor
1005 # xmllint. XmllintCmd is empty if xmllint could not be found.
1006 AC_DEFUN([FP_PROG_XMLLINT],
1007 [AC_PATH_PROG([XmllintCmd], [xmllint])
1008 if test -z "$XmllintCmd"; then
1009   AC_MSG_WARN([cannot find xmllint in your PATH, you will not be able to validate your documentation])
1010 fi
1011 ])# FP_PROG_XMLLINT
1012
1013
1014 # FP_CHECK_DOCBOOK_DTD
1015 # --------------------
1016 AC_DEFUN([FP_CHECK_DOCBOOK_DTD],
1017 [AC_REQUIRE([FP_PROG_XMLLINT])dnl
1018 if test -n "$XmllintCmd"; then
1019   AC_MSG_CHECKING([for DocBook DTD])
1020   FP_GEN_DOCBOOK_XML
1021   if $XmllintCmd --nonet --valid --noout conftest.xml ; then
1022     AC_MSG_RESULT([ok])
1023   else
1024     AC_MSG_RESULT([failed])
1025     AC_MSG_WARN([cannot find a DTD for DocBook XML V4.5, you will not be able to validate your documentation])
1026     AC_MSG_WARN([check your XML_CATALOG_FILES environment variable and/or /etc/xml/catalog])
1027   fi
1028   rm -rf conftest*
1029 fi
1030 ])# FP_CHECK_DOCBOOK_DTD
1031
1032
1033 # FP_GEN_FO
1034 # ------------------
1035 # Generates a formatting objects document in conftest.fo.
1036 AC_DEFUN([FP_GEN_FO],
1037 [rm -f conftest.fo
1038 cat > conftest.fo << EOF
1039 <?xml version="1.0"?>
1040 <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
1041   <fo:layout-master-set>
1042     <fo:simple-page-master master-name="blank">
1043       <fo:region-body/>
1044     </fo:simple-page-master>
1045   </fo:layout-master-set>
1046   <fo:page-sequence master-reference="blank">
1047     <fo:flow flow-name="xsl-region-body">
1048       <fo:block>
1049         Test!
1050       </fo:block>
1051     </fo:flow>
1052   </fo:page-sequence>
1053 </fo:root>
1054 EOF
1055 ]) # FP_GEN_FO
1056
1057
1058 # FP_PROG_FOP
1059 # -----------
1060 # Set the output variable 'FopCmd' to the first working 'fop' in the current
1061 # 'PATH'. Note that /usr/bin/fop is broken in SuSE 9.1 (unpatched), so try
1062 # /usr/share/fop/fop.sh in that case (or no 'fop'), too.
1063 AC_DEFUN([FP_PROG_FOP],
1064 [AC_PATH_PROGS([FopCmd1], [fop fop.sh])
1065 if test -n "$FopCmd1"; then
1066   AC_CACHE_CHECK([for $FopCmd1 usability], [fp_cv_fop_usability],
1067     [FP_GEN_FO
1068     if "$FopCmd1" -fo conftest.fo -ps conftest.ps > /dev/null 2>&1; then
1069       fp_cv_fop_usability=yes
1070     else
1071       fp_cv_fop_usability=no
1072     fi
1073     rm -rf conftest*])
1074   if test x"$fp_cv_fop_usability" = xyes; then
1075      FopCmd=$FopCmd1
1076   fi
1077 fi
1078 if test -z "$FopCmd"; then
1079   AC_PATH_PROGS([FopCmd2], [fop.sh], , [/usr/share/fop])
1080   FopCmd=$FopCmd2
1081 fi
1082 AC_SUBST([FopCmd])
1083 ])# FP_PROG_FOP
1084
1085
1086 # FP_PROG_GHC_PKG
1087 # ----------------
1088 # Try to find a ghc-pkg matching the ghc mentioned in the environment variable
1089 # WithGhc. Sets the output variable GhcPkgCmd.
1090 AC_DEFUN([FP_PROG_GHC_PKG],
1091 [AC_CACHE_CHECK([for ghc-pkg matching $WithGhc], fp_cv_matching_ghc_pkg,
1092 [
1093 # If we are told to use ghc-stage2, then we're using an in-tree
1094 # compiler. In this case, we just want ghc-pkg, not ghc-pkg-stage2,
1095 # so we sed off -stage[0-9]$. However, if we are told to use
1096 # ghc-6.12.1 then we want to use ghc-pkg-6.12.1, so we keep any
1097 # other suffix.
1098 fp_ghc_pkg_guess=`echo $WithGhc | sed -e 's/-stage@<:@0-9@:>@$//' -e 's,ghc\(@<:@^/\\@:>@*\)$,ghc-pkg\1,'`
1099 if "$fp_ghc_pkg_guess" list > /dev/null 2>&1; then
1100   fp_cv_matching_ghc_pkg=$fp_ghc_pkg_guess
1101 else
1102   AC_MSG_ERROR([Cannot find matching ghc-pkg])
1103 fi])
1104 GhcPkgCmd=$fp_cv_matching_ghc_pkg
1105 AC_SUBST([GhcPkgCmd])
1106 ])# FP_PROG_GHC_PKG
1107
1108
1109 # FP_GCC_EXTRA_FLAGS
1110 # ------------------
1111 # Determine which extra flags we need to pass gcc when we invoke it
1112 # to compile .hc code.
1113 #
1114 # -fwrapv is needed for gcc to emit well-behaved code in the presence of
1115 # integer wrap around. (Trac #952)
1116 #
1117 AC_DEFUN([FP_GCC_EXTRA_FLAGS],
1118 [AC_REQUIRE([FP_GCC_VERSION])
1119 AC_CACHE_CHECK([for extra options to pass gcc when compiling via C], [fp_cv_gcc_extra_opts],
1120 [fp_cv_gcc_extra_opts=
1121  FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-ge], [3.4],
1122   [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -fwrapv"],
1123   [])
1124 ])
1125 AC_SUBST([GccExtraViaCOpts],$fp_cv_gcc_extra_opts)
1126 ])
1127
1128
1129 # FP_SETUP_PROJECT_VERSION
1130 # ---------------------
1131 AC_DEFUN([FP_SETUP_PROJECT_VERSION],
1132 [
1133 if test "$RELEASE" = "NO"; then
1134     AC_MSG_CHECKING([for GHC version date])
1135     if test -f VERSION_DATE; then
1136         PACKAGE_VERSION=${PACKAGE_VERSION}.`cat VERSION_DATE`
1137         AC_MSG_RESULT(given $PACKAGE_VERSION)
1138     elif test -d .git; then
1139         changequote(, )dnl
1140         ver_date=`git log -n 1 --date=short --pretty=format:%ci | cut -d ' ' -f 1 | tr -d -`
1141         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
1142         changequote([, ])dnl
1143                 AC_MSG_ERROR([failed to detect version date: check that git is in your path])
1144         fi
1145         PACKAGE_VERSION=${PACKAGE_VERSION}.$ver_date
1146         AC_MSG_RESULT(inferred $PACKAGE_VERSION)
1147     elif test -d _darcs; then
1148         # TODO: Remove this branch after conversion to Git
1149         changequote(, )dnl
1150         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`
1151         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
1152         changequote([, ])dnl
1153                 AC_MSG_ERROR([failed to detect version date: check that darcs is in your path])
1154         fi
1155         PACKAGE_VERSION=${PACKAGE_VERSION}.$ver_date
1156         AC_MSG_RESULT(inferred $PACKAGE_VERSION)
1157     elif test -f VERSION; then
1158         PACKAGE_VERSION=`cat VERSION`
1159         AC_MSG_RESULT(given $PACKAGE_VERSION)
1160     else
1161         AC_MSG_WARN([cannot determine snapshot version: no .git or _darcs directory and no VERSION file])
1162     fi
1163 fi
1164
1165 # Some renamings
1166 AC_SUBST([ProjectName], [$PACKAGE_NAME])
1167 AC_SUBST([ProjectVersion], [$PACKAGE_VERSION])
1168
1169 # Split PACKAGE_VERSION into (possibly empty) parts
1170 VERSION_MAJOR=`echo $PACKAGE_VERSION | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\1'/`
1171 VERSION_TMP=`echo $PACKAGE_VERSION | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\3'/`
1172 VERSION_MINOR=`echo $VERSION_TMP | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\1'/`
1173 ProjectPatchLevel=`echo $VERSION_TMP | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\3'/`
1174
1175 # Calculate project version as an integer, using 2 digits for minor version
1176 case $VERSION_MINOR in
1177   ?) ProjectVersionInt=${VERSION_MAJOR}0${VERSION_MINOR} ;;
1178   ??) ProjectVersionInt=${VERSION_MAJOR}${VERSION_MINOR} ;;
1179   *) AC_MSG_ERROR([bad minor version in $PACKAGE_VERSION]) ;;
1180 esac
1181 AC_SUBST([ProjectVersionInt])
1182
1183 # The project patchlevel is zero unless stated otherwise
1184 test -z "$ProjectPatchLevel" && ProjectPatchLevel=0
1185
1186 # Remove dots from the patch level; this allows us to have versions like 6.4.1.20050508
1187 ProjectPatchLevel=`echo $ProjectPatchLevel | sed 's/\.//'`
1188
1189 AC_SUBST([ProjectPatchLevel])
1190 ])# FP_SETUP_PROJECT_VERSION
1191
1192
1193 # Check for a working timer_create().  We need a pretty detailed check
1194 # here, because there exist partially-working implementations of
1195 # timer_create() in certain versions of Linux (see bug #1933).
1196 #
1197 AC_DEFUN([FP_CHECK_TIMER_CREATE],
1198   [AC_CACHE_CHECK([for a working timer_create(CLOCK_REALTIME)], 
1199     [fptools_cv_timer_create_works],
1200     [AC_TRY_RUN([
1201 #include <stdio.h>
1202 #ifdef HAVE_STDLIB_H
1203 #include <stdlib.h>
1204 #endif
1205 #ifdef HAVE_TIME_H
1206 #include <time.h>
1207 #endif
1208 #ifdef HAVE_SIGNAL_H
1209 #include <signal.h>
1210 #endif
1211 #ifdef HAVE_UNISTD_H
1212 #include <unistd.h>
1213 #endif
1214
1215 static volatile int tock = 0;
1216 static void handler(int i)
1217 {
1218    tock = 1;
1219 }
1220
1221 static void timeout(int i)
1222 {
1223   // timer_settime() has been known to hang, so just in case
1224   // we install a 1-second timeout (see #2257)
1225   exit(99);
1226 }
1227
1228 int main(int argc, char *argv[])
1229 {
1230
1231     struct sigevent ev;
1232     timer_t timer;
1233     struct itimerspec it;
1234     struct sigaction action;
1235     int m,n,count = 0;
1236
1237     ev.sigev_notify = SIGEV_SIGNAL;
1238     ev.sigev_signo  = SIGVTALRM;
1239
1240     action.sa_handler = handler;
1241     action.sa_flags = 0;
1242     sigemptyset(&action.sa_mask);
1243     if (sigaction(SIGVTALRM, &action, NULL) == -1) {
1244         fprintf(stderr,"SIGVTALRM problem\n");
1245         exit(3);
1246     }
1247
1248     action.sa_handler = timeout;
1249     action.sa_flags = 0;
1250     sigemptyset(&action.sa_mask);
1251     if (sigaction(SIGALRM, &action, NULL) == -1) {
1252       fprintf(stderr,"SIGALRM problem\n");
1253       exit(3);
1254     }
1255     alarm(1);
1256
1257     if (timer_create(CLOCK_PROCESS_CPUTIME_ID, &ev, &timer) != 0) {
1258         fprintf(stderr,"No CLOCK_PROCESS_CPUTIME_ID timer\n");
1259        exit(1);
1260     }
1261
1262     it.it_value.tv_sec = 0;
1263     it.it_value.tv_nsec = 1;
1264     it.it_interval = it.it_value;
1265     if (timer_settime(timer, 0, &it, NULL) != 0) {
1266         fprintf(stderr,"settime problem\n");
1267         exit(4);
1268     }
1269
1270     tock = 0;
1271
1272     for(n = 3; n < 20000; n++){
1273         for(m = 2; m <= n/2; m++){
1274             if (!(n%m)) count++;
1275             if (tock) goto out;
1276         }
1277     }
1278 out:
1279
1280     if (!tock) {
1281         fprintf(stderr,"no CLOCK_PROCESS_CPUTIME_ID signal\n");
1282         exit(5);
1283     }
1284
1285     timer_delete(timer);
1286
1287     if (timer_create(CLOCK_REALTIME, &ev, &timer) != 0) {
1288         fprintf(stderr,"No CLOCK_REALTIME timer\n");
1289         exit(2);
1290     }
1291
1292     it.it_value.tv_sec = 0;
1293     it.it_value.tv_nsec = 1000000;
1294     it.it_interval = it.it_value;
1295     if (timer_settime(timer, 0, &it, NULL) != 0) {
1296         fprintf(stderr,"settime problem\n");
1297         exit(4);
1298     }
1299
1300     tock = 0;
1301
1302     usleep(3000);
1303
1304     if (!tock) {
1305         fprintf(stderr,"no CLOCK_REALTIME signal\n");
1306         exit(5);
1307     }
1308
1309     timer_delete(timer);
1310
1311     exit(0);
1312 }
1313      ],
1314      [fptools_cv_timer_create_works=yes],
1315      [fptools_cv_timer_create_works=no])
1316   ])
1317 case $fptools_cv_timer_create_works in
1318     yes) AC_DEFINE([USE_TIMER_CREATE], 1, 
1319                    [Define to 1 if we can use timer_create(CLOCK_PROCESS_CPUTIME_ID,...)]);;
1320 esac
1321 ])
1322
1323 # FP_ICONV
1324 # -------------
1325 AC_DEFUN([FP_ICONV],
1326 [
1327   dnl--------------------------------------------------------------------
1328   dnl * Deal with arguments telling us iconv is somewhere odd
1329   dnl--------------------------------------------------------------------
1330
1331   dnl Note: ICONV_LIB_DIRS and ICONV_INCLUDE_DIRS are not predefined
1332   dnl to the empty string to allow them to be overridden from the
1333   dnl environment.
1334
1335   AC_ARG_WITH([iconv-includes],
1336     [AC_HELP_STRING([--with-iconv-includes],
1337       [directory containing iconv.h])],
1338       [ICONV_INCLUDE_DIRS=$withval])
1339
1340   AC_ARG_WITH([iconv-libraries],
1341     [AC_HELP_STRING([--with-iconv-libraries],
1342       [directory containing iconv library])],
1343       [ICONV_LIB_DIRS=$withval])
1344
1345   AC_SUBST(ICONV_INCLUDE_DIRS)
1346   AC_SUBST(ICONV_LIB_DIRS)
1347 ])# FP_ICONV
1348
1349 # FP_GMP
1350 # -------------
1351 AC_DEFUN([FP_GMP],
1352 [
1353   dnl--------------------------------------------------------------------
1354   dnl * Deal with arguments telling us gmp is somewhere odd
1355   dnl--------------------------------------------------------------------
1356
1357   AC_ARG_WITH([gmp-includes],
1358     [AC_HELP_STRING([--with-gmp-includes],
1359       [directory containing gmp.h])],
1360       [GMP_INCLUDE_DIRS=$withval])
1361
1362   AC_ARG_WITH([gmp-libraries],
1363     [AC_HELP_STRING([--with-gmp-libraries],
1364       [directory containing gmp library])],
1365       [GMP_LIB_DIRS=$withval])
1366
1367   AC_SUBST(GMP_INCLUDE_DIRS)
1368   AC_SUBST(GMP_LIB_DIRS)
1369 ])# FP_GMP
1370
1371 # FP_CHECK_MACOSX_DEPLOYMENT_TARGET
1372 # ---------------------------------
1373 AC_DEFUN([FP_CHECK_MACOSX_DEPLOYMENT_TARGET],
1374 [
1375 if test "x$TargetOS_CPP-$TargetVendor_CPP" = "xdarwin-apple"; then
1376   AC_MSG_CHECKING([Mac OS X deployment target])
1377   case $FP_MACOSX_DEPLOYMENT_TARGET in
1378     none)  ;;
1379     10.4)  MACOSX_DEPLOYMENT_VERSION=10.4
1380            MACOSX_DEPLOYMENT_SDK=/Developer/SDKs/MacOSX10.4u.sdk
1381            ;;
1382     10.4u) MACOSX_DEPLOYMENT_VERSION=10.4
1383            MACOSX_DEPLOYMENT_SDK=/Developer/SDKs/MacOSX10.4u.sdk
1384            ;;
1385     *)     MACOSX_DEPLOYMENT_VERSION=$FP_MACOSX_DEPLOYMENT_TARGET
1386            MACOSX_DEPLOYMENT_SDK=/Developer/SDKs/MacOSX${FP_MACOSX_DEPLOYMENT_TARGET}.sdk
1387            ;;
1388   esac
1389   if test "x$FP_MACOSX_DEPLOYMENT_TARGET" = "xnone"; then
1390     AC_MSG_RESULT(none)
1391   else
1392     if test ! -d $MACOSX_DEPLOYMENT_SDK; then
1393       AC_MSG_ERROR([Unknown deployment target $FP_MACOSX_DEPLOYMENT_TARGET])
1394     fi
1395     AC_MSG_RESULT([${MACOSX_DEPLOYMENT_VERSION} (${MACOSX_DEPLOYMENT_SDK})])
1396   fi
1397 fi
1398 ])
1399
1400 # --------------------------------------------------------------
1401 # Calculate absolute path to build tree
1402 # --------------------------------------------------------------
1403
1404 AC_DEFUN([FP_INTREE_GHC_PWD],[
1405 AC_MSG_NOTICE(Building in-tree ghc-pwd)
1406     dnl This would be
1407     dnl     make -C utils/ghc-pwd clean && make -C utils/ghc-pwd
1408     dnl except we don't want to have to know what make is called. Sigh.
1409     rm -rf utils/ghc-pwd/dist-boot
1410     mkdir  utils/ghc-pwd/dist-boot
1411     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
1412     then
1413         AC_MSG_ERROR([Building ghc-pwd failed])
1414     fi
1415
1416     GHC_PWD=utils/ghc-pwd/dist-boot/ghc-pwd
1417 ])
1418
1419 AC_DEFUN([FP_BINDIST_GHC_PWD],[
1420     GHC_PWD=utils/ghc-pwd/dist-install/build/tmp/ghc-pwd
1421 ])
1422
1423 AC_DEFUN([FP_FIND_ROOT],[
1424 AC_MSG_CHECKING(for path to top of build tree)
1425     hardtop=`$GHC_PWD`
1426
1427     dnl Remove common automounter nonsense
1428     hardtop=`echo $hardtop | sed 's|^/tmp_mnt.*\(/local/.*\)$|\1|' | sed 's|^/tmp_mnt/|/|'`
1429
1430     if ! test -d "$hardtop"; then
1431         AC_MSG_ERROR([cannot determine current directory])
1432     fi
1433
1434     dnl We don't support building in directories with spaces.
1435     case "$hardtop" in
1436     *' '*)
1437         AC_MSG_ERROR([
1438         The build system does not support building in a directory
1439         containing space characters.
1440         Suggestion: move the build tree somewhere else.])
1441         ;;
1442     esac
1443
1444     AC_SUBST(hardtop)
1445
1446     AC_MSG_RESULT($hardtop)
1447 ])
1448
1449 # GHC_CONVERT_CPU(cpu, target_var)
1450 # --------------------------------
1451 # converts cpu from gnu to ghc naming, and assigns the result to $target_var
1452 AC_DEFUN([GHC_CONVERT_CPU],[
1453 case "$1" in
1454   alpha*)
1455     $2="alpha"
1456     ;;
1457   arm*)
1458     $2="arm"
1459     ;;
1460   hppa1.1*)
1461     $2="hppa1_1"
1462     ;;
1463   hppa*)
1464     $2="hppa"
1465     ;;
1466   i386|i486|i586|i686)
1467     $2="i386"
1468     ;;
1469   ia64)
1470     $2="ia64"
1471     ;;
1472   m68k*)
1473     $2="m68k"
1474     ;;
1475   mipseb*)
1476     $2="mipseb"
1477     ;;
1478   mipsel*)
1479     $2="mipsel"
1480     ;;
1481   mips*)
1482     $2="mips"
1483     ;;
1484   powerpc64*)
1485     $2="powerpc64"
1486     ;;
1487   powerpc*)
1488     $2="powerpc"
1489     ;;
1490   rs6000)
1491     $2="rs6000"
1492     ;;
1493   s390*)
1494     $2="s390"
1495     ;;
1496   sparc64*)
1497     $2="sparc64"
1498     ;;
1499   sparc*)
1500     $2="sparc"
1501     ;;
1502   vax)
1503     $2="vax"
1504     ;;
1505   x86_64)
1506     $2="x86_64"
1507     ;;
1508   *)
1509     echo "Unknown CPU $1"
1510     exit 1
1511     ;;
1512   esac
1513 ])
1514
1515 # GHC_CONVERT_VENDOR(vendor, target_var)
1516 # --------------------------------
1517 # converts vendor from gnu to ghc naming, and assigns the result to $target_var
1518 AC_DEFUN([GHC_CONVERT_VENDOR],[
1519   case "$1" in
1520   pc|gentoo) # like i686-pc-linux-gnu and i686-gentoo-freebsd8
1521     $2="unknown"
1522     ;;
1523   *)
1524     #pass thru by default
1525     $2="$1"
1526     ;;
1527   esac
1528 ])
1529
1530 # GHC_CONVERT_OS(os, target_var)
1531 # --------------------------------
1532 # converts os from gnu to ghc naming, and assigns the result to $target_var
1533 AC_DEFUN([GHC_CONVERT_OS],[
1534 case "$1" in
1535   linux-*|linux)
1536     $2="linux"
1537     ;;
1538   # As far as I'm aware, none of these have relevant variants
1539   freebsd|netbsd|openbsd|dragonfly|osf1|osf3|hpux|linuxaout|kfreebsdgnu|freebsd2|solaris2|cygwin32|mingw32|darwin|gnu|nextstep2|nextstep3|sunos4|ultrix|irix|aix|haiku)
1540     $2="$1"
1541     ;;
1542   freebsd8) # like i686-gentoo-freebsd8
1543     $2="freebsd"
1544     ;;
1545   *)
1546     echo "Unknown OS $1"
1547     exit 1
1548     ;;
1549   esac
1550 ])
1551
1552 # BOOTSTRAPPING_GHC_INFO_FIELD
1553 # --------------------------------
1554 # If the bootstrapping compiler is >= 7.1, then set the variable
1555 # $1 to the value of the ghc --info field $2. Otherwise, set it to
1556 # $3.
1557 AC_DEFUN([BOOTSTRAPPING_GHC_INFO_FIELD],[
1558 if test $GhcCanonVersion -ge 701
1559 then
1560     $1=`"$WithGhc" --info | grep "^ ,(\"$2\"," | sed -e 's/.*","//' -e 's/")$//'`
1561 else
1562     $1=$3
1563 fi
1564 AC_SUBST($1)
1565 ])
1566
1567 # LIBRARY_VERSION(lib)
1568 # --------------------------------
1569 # Gets the version number of a library.
1570 # If $1 is ghc-prim, then we define LIBRARY_ghc_prim_VERSION as 1.2.3
1571 AC_DEFUN([LIBRARY_VERSION],[
1572 LIBRARY_[]translit([$1], [-], [_])[]_VERSION=`grep -i "^version:" libraries/$1/$1.cabal | sed "s/.* //"`
1573 AC_SUBST(LIBRARY_[]translit([$1], [-], [_])[]_VERSION)
1574 ])
1575
1576 # LocalWords:  fi