Update to work with Alex 3.0: basically disabling Alex's new Unicode
[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     FP_COMPARE_VERSIONS([$fptools_cv_alex_version],[-ge],[3.0],
521       [Alex3=YES],[Alex3=NO])
522 fi
523 AlexVersion=$fptools_cv_alex_version;
524 AC_SUBST(AlexVersion)
525 AC_SUBST(Alex3)
526 ])
527
528
529 # FP_PROG_LD_X
530 # ------------
531 # Sets the output variable LdXFlag to -x if ld supports this flag, otherwise the
532 # variable's value is empty.
533 AC_DEFUN([FP_PROG_LD_X],
534 [
535 AC_CACHE_CHECK([whether ld understands -x], [fp_cv_ld_x],
536 [echo 'foo() {}' > conftest.c
537 ${CC-cc} -c conftest.c
538 if ${LdCmd} -r -x -o conftest2.o conftest.o > /dev/null 2>&1; then
539    fp_cv_ld_x=yes
540 else
541    fp_cv_ld_x=no
542 fi
543 rm -rf conftest*])
544 if test "$fp_cv_ld_x" = yes; then
545   LdXFlag=-x
546 else
547   LdXFlag=
548 fi
549 AC_SUBST([LdXFlag])
550 ])# FP_PROG_LD_X
551
552
553 # FP_PROG_LD_BUILD_ID
554 # ------------
555
556 # Sets the output variable LdHasBuildId to YES if ld supports
557 # --build-id, or NO otherwise.
558 AC_DEFUN([FP_PROG_LD_BUILD_ID],
559 [
560 AC_CACHE_CHECK([whether ld understands --build-id], [fp_cv_ld_build_id],
561 [echo 'foo() {}' > conftest.c
562 ${CC-cc} -c conftest.c
563 if ${LdCmd} -r --build-id=none -o conftest2.o conftest.o > /dev/null 2>&1; then
564    fp_cv_ld_build_id=yes
565 else
566    fp_cv_ld_build_id=no
567 fi
568 rm -rf conftest*])
569 if test "$fp_cv_ld_build_id" = yes; then
570   LdHasBuildId=YES
571 else
572   LdHasBuildId=NO
573 fi
574 AC_SUBST([LdHasBuildId])
575 ])# FP_PROG_LD_BUILD_ID
576
577
578 # FP_PROG_LD_IS_GNU
579 # -----------------
580 # Sets the output variable LdIsGNULd to YES or NO, depending on whether it is
581 # GNU ld or not.
582 AC_DEFUN([FP_PROG_LD_IS_GNU],
583 [
584 AC_CACHE_CHECK([whether ld is GNU ld], [fp_cv_gnu_ld],
585 [if ${LdCmd} --version 2> /dev/null | grep "GNU" > /dev/null 2>&1; then
586   fp_cv_gnu_ld=yes
587 else
588   fp_cv_gnu_ld=no
589 fi])
590 AC_SUBST([LdIsGNULd], [`echo $fp_cv_gnu_ld | sed 'y/yesno/YESNO/'`])
591 ])# FP_PROG_LD_IS_GNU
592
593
594 # FP_PROG_AR
595 # ----------
596 # Sets fp_prog_ar_raw to the full path of ar and fp_prog_ar to a non-Cygwin
597 # version of it. Exits if no ar can be found
598 AC_DEFUN([FP_PROG_AR],
599 [AC_PATH_PROG([fp_prog_ar_raw], [ar])
600 if test -z "$fp_prog_ar_raw"; then
601   AC_MSG_ERROR([cannot find ar in your PATH, no idea how to make a library])
602 fi
603 fp_prog_ar="$fp_prog_ar_raw"
604 case $HostPlatform in
605   *mingw32) if test x${OSTYPE} != xmsys; then
606               fp_prog_ar="`cygpath -w "${fp_prog_ar_raw}" | sed -e 's@\\\\@/@g'`"
607               AC_MSG_NOTICE([normalized ar command to $fp_prog_ar])
608             fi
609             ;;
610 esac
611 ])# FP_PROG_AR
612
613
614 # FP_PROG_AR_IS_GNU
615 # -----------------
616 # Sets fp_prog_ar_is_gnu to yes or no, depending on whether it is GNU ar or not.
617 AC_DEFUN([FP_PROG_AR_IS_GNU],
618 [AC_REQUIRE([FP_PROG_AR])
619 AC_CACHE_CHECK([whether $fp_prog_ar_raw is GNU ar], [fp_cv_prog_ar_is_gnu],
620 [if "$fp_prog_ar_raw" --version 2> /dev/null | grep "GNU" > /dev/null 2>&1; then
621   fp_cv_prog_ar_is_gnu=yes
622 else
623   fp_cv_prog_ar_is_gnu=no
624 fi])
625 fp_prog_ar_is_gnu=$fp_cv_prog_ar_is_gnu
626 AC_SUBST([ArIsGNUAr], [`echo $fp_prog_ar_is_gnu | tr 'a-z' 'A-Z'`])
627 ])# FP_PROG_AR_IS_GNU
628
629
630 # FP_PROG_AR_SUPPORTS_ATFILE
631 # -----------------
632 # Sets fp_prog_ar_supports_atfile to yes or no, depending on whether
633 # or not it supports the @file syntax
634 AC_DEFUN([FP_PROG_AR_SUPPORTS_ATFILE],
635 [AC_REQUIRE([FP_PROG_AR])
636  AC_REQUIRE([FP_PROG_AR_ARGS])
637 AC_CACHE_CHECK([whether $fp_prog_ar_raw supports @file], [fp_cv_prog_ar_supports_atfile],
638 [
639 rm -f conftest*
640 touch conftest.file
641 echo conftest.file  > conftest.atfile
642 echo conftest.file >> conftest.atfile
643 "$fp_prog_ar_raw" $fp_prog_ar_args conftest.a @conftest.atfile > /dev/null 2>&1
644 fp_prog_ar_supports_atfile_tmp=`"$fp_prog_ar_raw" t conftest.a 2> /dev/null | grep -c conftest.file`
645 rm -f conftest*
646 if test "$fp_prog_ar_supports_atfile_tmp" -eq 2
647 then
648   fp_cv_prog_ar_supports_atfile=yes
649 else
650   fp_cv_prog_ar_supports_atfile=no
651 fi])
652 fp_prog_ar_supports_atfile=$fp_cv_prog_ar_supports_atfile
653 AC_SUBST([ArSupportsAtFile], [`echo $fp_prog_ar_supports_atfile | tr 'a-z' 'A-Z'`])
654 ])# FP_PROG_AR_SUPPORTS_ATFILE
655
656 # FP_PROG_AR_ARGS
657 # ---------------
658 # Sets fp_prog_ar_args to the arguments for ar and the output variable ArCmd
659 # to a non-Cygwin invocation of ar including these arguments.
660 AC_DEFUN([FP_PROG_AR_ARGS],
661 [AC_REQUIRE([FP_PROG_AR_IS_GNU])
662 AC_CACHE_CHECK([for ar arguments], [fp_cv_prog_ar_args],
663 [
664 # GNU ar needs special treatment: it appears to have problems with
665 # object files with the same name if you use the 's' modifier, but
666 # simple 'ar q' works fine, and doesn't need a separate ranlib.
667 if test $fp_prog_ar_is_gnu = yes; then
668   fp_cv_prog_ar_args="q"
669 else
670   touch conftest.dummy
671   for fp_var in clqsZ clqs cqs clq cq ; do
672      rm -f conftest.a
673      if "$fp_prog_ar_raw" $fp_var conftest.a conftest.dummy > /dev/null 2> /dev/null; then
674         fp_cv_prog_ar_args=$fp_var
675         break
676      fi
677   done
678   rm -f conftest*
679   if test -z "$fp_cv_prog_ar_args"; then
680     AC_MSG_ERROR([cannot figure out how to use your $fp_prog_ar_raw])
681   fi
682 fi])
683 fp_prog_ar_args=$fp_cv_prog_ar_args
684 AC_SUBST([ArCmd], ["$fp_prog_ar"])
685 AC_SUBST([ArArgs], ["$fp_prog_ar_args"])
686
687 ])# FP_PROG_AR_ARGS
688
689
690 # FP_PROG_AR_NEEDS_RANLIB
691 # -----------------------
692 # Sets the output variable RANLIB to "ranlib" if it is needed and found,
693 # to "true" otherwise.
694 AC_DEFUN([FP_PROG_AR_NEEDS_RANLIB],
695 [AC_REQUIRE([FP_PROG_AR_IS_GNU])
696 AC_REQUIRE([FP_PROG_AR_ARGS])
697 AC_REQUIRE([AC_PROG_CC])
698 AC_CACHE_CHECK([whether ranlib is needed], [fp_cv_prog_ar_needs_ranlib],
699 [if test $fp_prog_ar_is_gnu = yes; then
700   fp_cv_prog_ar_needs_ranlib=no
701 elif echo $TargetPlatform | grep "^.*-apple-darwin$"  > /dev/null 2> /dev/null; then
702   # It's quite tedious to check for Apple's crazy timestamps in .a files,
703   # so we hardcode it.
704   fp_cv_prog_ar_needs_ranlib=yes
705 elif echo $fp_prog_ar_args | grep "s" > /dev/null 2> /dev/null; then
706   fp_cv_prog_ar_needs_ranlib=no
707 else
708   fp_cv_prog_ar_needs_ranlib=yes
709 fi])
710 if test $fp_cv_prog_ar_needs_ranlib = yes; then
711    AC_PROG_RANLIB
712 else
713   RANLIB="true"
714   AC_SUBST([RANLIB])
715 fi
716 ])# FP_PROG_AR_NEEDS_RANLIB
717
718
719 dnl
720 dnl AC_SHEBANG_PERL - can we she-bang perl?
721 dnl
722 AC_DEFUN([FPTOOLS_SHEBANG_PERL],
723 [AC_CACHE_CHECK([if your perl works in shell scripts], fptools_cv_shebang_perl,
724 [echo "#!$PerlCmd"'
725 exit $1;
726 ' > conftest
727 chmod u+x conftest
728 (SHELL=/bin/sh; export SHELL; ./conftest 69 > /dev/null)
729 if test $? -ne 69; then
730    fptools_cv_shebang_perl=yes
731 else
732    fptools_cv_shebang_perl=no
733 fi
734 rm -f conftest
735 ])])
736
737
738 # FP_GCC_VERSION
739 # -----------
740 # Extra testing of the result AC_PROG_CC, testing the gcc version no. Sets the
741 # output variable GccVersion.
742 AC_DEFUN([FP_GCC_VERSION],
743 [AC_REQUIRE([AC_PROG_CC])
744 if test -z "$GCC"
745 then
746   AC_MSG_ERROR([gcc is required])
747 fi
748 GccLT34=NO
749 GccLT46=NO
750 AC_CACHE_CHECK([version of gcc], [fp_cv_gcc_version],
751 [
752     fp_cv_gcc_version="`$CC -v 2>&1 | grep 'version ' | sed -e 's/.*version [[^0-9]]*\([[0-9.]]*\).*/\1/g'`"
753     FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [3.0],
754                         [AC_MSG_ERROR([Need at least gcc version 3.0 (3.4+ recommended)])])
755     # See #2770: gcc 2.95 doesn't work any more, apparently.  There probably
756     # isn't a very good reason for that, but for now just make configure
757     # fail.
758     FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [3.4], GccLT34=YES)
759     FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-lt], [4.6], GccLT46=YES)
760 ])
761 AC_SUBST([GccVersion], [$fp_cv_gcc_version])
762 AC_SUBST(GccLT34)
763 AC_SUBST(GccLT46)
764 ])# FP_GCC_VERSION
765
766 dnl Small feature test for perl version. Assumes PerlCmd
767 dnl contains path to perl binary.
768 dnl
769 dnl (Perl versions prior to v5.6 does not contain the string "v5";
770 dnl instead they display version strings such as "version 5.005".)
771 dnl
772 AC_DEFUN([FPTOOLS_CHECK_PERL_VERSION],
773 [$PerlCmd -v >conftest.out 2>&1
774    if grep "v5" conftest.out >/dev/null 2>&1; then
775       :
776    else
777       AC_MSG_ERROR([your version of perl probably won't work, try upgrading it.])
778    fi
779 rm -fr conftest*
780 ])
781
782
783 # FP_CHECK_PROG(VARIABLE, PROG-TO-CHECK-FOR,
784 #               [VALUE-IF-NOT-FOUND], [PATH], [REJECT])
785 # -----------------------------------------------------
786 # HACK: A small wrapper around AC_CHECK_PROG, setting VARIABLE to the full path
787 # of PROG-TO-CHECK-FOR when found.
788 AC_DEFUN([FP_CHECK_PROG],
789 [AC_CHECK_PROG([$1], [$2], [$as_dir/$ac_word$ac_exec_ext], [$3], [$4], [$5])][]dnl
790 )# FP_CHECK_PROC
791
792
793 # FP_PROG_FIND
794 # ------------
795 # Find a non-WinDoze version of the "find" utility.
796 AC_DEFUN([FP_PROG_FIND],
797 [AC_PATH_PROGS([fp_prog_find], [gfind find], find)
798 echo foo > conftest.txt
799 $fp_prog_find conftest.txt -print > conftest.out 2>&1
800 if grep '^conftest.txt$' conftest.out > /dev/null 2>&1 ; then
801   # OK, looks like a real "find".
802   case $HostPlatform in
803     *mingw32)
804       if test x${OSTYPE} != xmsys
805       then
806             fp_prog_find="`cygpath --mixed ${fp_prog_find}`"
807         AC_MSG_NOTICE([normalized find command to $fp_prog_find])
808       fi ;;
809     *) ;;
810   esac
811   FindCmd="$fp_prog_find"
812 else
813   # Found a poor WinDoze version of "find", ignore it.
814   AC_MSG_WARN([$fp_prog_find looks like a non-*nix find, ignoring it])
815   FP_CHECK_PROG([FindCmd], [find], [], [], [$fp_prog_find])
816 fi
817 rm -f conftest.txt conftest.out
818 AC_SUBST([FindCmd])[]dnl
819 ])# FP_PROG_FIND
820
821
822 # FP_PROG_SORT
823 # ------------
824 # Find a Unix-like sort
825 AC_DEFUN([FP_PROG_SORT],
826 [AC_PATH_PROG([fp_prog_sort], [sort])
827 echo conwip > conftest.txt
828 $fp_prog_sort -f conftest.txt > conftest.out 2>&1
829 if grep 'conwip' conftest.out > /dev/null 2>&1 ; then
830   # The goods
831   SortCmd="$fp_prog_sort"
832 else
833   # Summink else..pick next one.
834   AC_MSG_WARN([$fp_prog_sort looks like a non-*nix sort, ignoring it])
835   FP_CHECK_PROG([SortCmd], [sort], [], [], [$fp_prog_sort])
836 fi
837 rm -f conftest.txt conftest.out
838 AC_SUBST([SortCmd])[]dnl
839 ])# FP_PROG_SORT
840
841 dnl
842 dnl FPTOOLS_NOCACHE_CHECK prints a message, then sets the
843 dnl values of the second argument to the result of running
844 dnl the commands given by the third. It does not cache its
845 dnl result, so it is suitable for checks which should be
846 dnl run every time.
847 dnl
848 AC_DEFUN([FPTOOLS_NOCACHE_CHECK],
849 [AC_MSG_CHECKING([$1])
850  $3
851  AC_MSG_RESULT([$][$2])
852 ])
853
854 dnl
855 dnl FPTOOLS_GHC_VERSION(version)
856 dnl FPTOOLS_GHC_VERSION(major, minor [, patchlevel])
857 dnl FPTOOLS_GHC_VERSION(version, major, minor, patchlevel)
858 dnl
859 dnl Test for version of installed ghc.  Uses $GHC.
860 dnl [original version pinched from c2hs]
861 dnl
862 AC_DEFUN([FPTOOLS_GHC_VERSION],
863 [FPTOOLS_NOCACHE_CHECK([version of ghc], [fptools_version_of_ghc],
864 ["${WithGhc-ghc}" --version > conftestghc 2>&1
865   cat conftestghc >&AS_MESSAGE_LOG_FD
866 #Useless Use Of cat award...
867   fptools_version_of_ghc=`cat conftestghc | sed -n -e 's/, patchlevel *\([[0-9]]\)/.\1/;s/.* version \([[0-9]][[0-9.]]*\).*/\1/p'`
868   rm -fr conftest*
869   if test "[$]fptools_version_of_ghc" = ""
870   then
871     fptools_version_of_ghc='unknown'
872   fi
873 fptools_version_of_ghc[_major]=`echo [$]fptools_version_of_ghc | sed -e 's/^\([[0-9]]\).*/\1/'`
874 fptools_version_of_ghc[_minor]=`echo [$]fptools_version_of_ghc | sed -e 's/^[[0-9]]\.\([[0-9]]*\).*/\1/'`
875 fptools_version_of_ghc[_pl]=`echo [$]fptools_version_of_ghc | sed -n -e 's/^[[0-9]]\.[[0-9]]*\.\([[0-9]]*\)/\1/p'`
876 #
877 if test "[$]fptools_version_of_ghc[_pl]" = ""
878 then
879   fptools_version_of_ghc[_all]="[$]fptools_version_of_ghc[_major].[$]fptools_version_of_ghc[_minor]"
880   fptools_version_of_ghc[_pl]="0"
881 else
882   fptools_version_of_ghc[_all]="[$]fptools_version_of_ghc[_major].[$]fptools_version_of_ghc[_minor].[$]fptools_version_of_ghc[_pl]"
883 fi
884 #
885 ifelse($#, [1], [dnl
886 [$1]="[$]fptools_version_of_ghc[_all]"
887 ], $#, [2], [dnl
888 [$1]="[$]fptools_version_of_ghc[_major]"
889 [$2]="[$]fptools_version_of_ghc[_minor]"
890 ], $#, [3], [dnl
891 [$1]="[$]fptools_version_of_ghc[_major]"
892 [$2]="[$]fptools_version_of_ghc[_minor]"
893 [$3]="[$]fptools_version_of_ghc[_pl]"
894 ], $#, [4], [dnl
895 [$1]="[$]fptools_version_of_ghc[_all]"
896 [$2]="[$]fptools_version_of_ghc[_major]"
897 [$3]="[$]fptools_version_of_ghc[_minor]"
898 [$4]="[$]fptools_version_of_ghc[_pl]"
899 ])
900 ])
901 ])dnl
902
903
904 # FP_CHECK_FUNC(FUNCTION, PROLOGUE, BODY, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
905 # ---------------------------------------------------------------------------------
906 # A variant of AC_CHECK_FUNCS, limited to a single FUNCTION, but with the
907 # additional flexibility of specifying the PROLOGUE and BODY.
908 AC_DEFUN([FP_CHECK_FUNC],
909 [AS_VAR_PUSHDEF([fp_func], [fp_cv_func_$1])dnl
910 AC_CACHE_CHECK([for $1], fp_func,
911 [AC_LINK_IFELSE([AC_LANG_PROGRAM([$2], [$3])],
912                 [AS_VAR_SET(fp_func, yes)],
913                 [AS_VAR_SET(fp_func, no)])])
914 AS_IF([test AS_VAR_GET(fp_func) = yes],
915       [AC_DEFINE(AS_TR_CPP(HAVE_$1), [1],
916                 [Define to 1 if you have the `]$1[' function.]) $4],
917       [$5])dnl
918 AS_VAR_POPDEF([fp_func])dnl
919 ])# FP_CHECK_FUNC
920
921
922 # FP_GEN_DOCBOOK_XML
923 # ------------------
924 # Generates a DocBook XML V4.5 document in conftest.xml.
925 #
926 # It took a lot of experimentation to find a document that will cause
927 # xsltproc to fail with an error code when the relevant
928 # stylesheets/DTDs are not found.  I couldn't make xsltproc fail with
929 # a single-file document, it seems a multi-file document is needed.
930 # -- SDM 2009-06-03
931 #
932 AC_DEFUN([FP_GEN_DOCBOOK_XML],
933 [rm -f conftest.xml conftest-book.xml
934 cat > conftest.xml << EOF
935 <?xml version="1.0" encoding="iso-8859-1"?>
936 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
937    "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [[
938 <!ENTITY conftest-book SYSTEM "conftest-book.xml">
939 ]]>
940 <book id="test">
941 &conftest-book;
942 </book>
943 EOF
944 cat >conftest-book.xml << EOF
945 <?xml version="1.0" encoding="iso-8859-1"?>
946   <title>A DocBook &ldquo;Test Document&rdquo;</title>
947   <chapter id="id-one">
948     <title>A Chapter Title</title>
949     <para>This is a paragraph, referencing <xref linkend="id-two"/>.</para>
950   </chapter>
951   <chapter id="id-two">
952     <title>Another Chapter Title</title>
953     <para>This is another paragraph, referencing <xref linkend="id-one"/>.</para>
954   </chapter>
955 EOF
956 ]) # FP_GEN_DOCBOOK_XML
957
958
959 # FP_PROG_DBLATEX
960 # ----------------
961 # Sets the output variable DblatexCmd to the full path of dblatex,
962 # which we use for building PDF and PS docs.
963 # DblatexCmd is empty if dblatex could not be found.
964 AC_DEFUN([FP_PROG_DBLATEX],
965 [AC_PATH_PROG([DblatexCmd], [dblatex])
966 if test -z "$DblatexCmd"; then
967   AC_MSG_WARN([cannot find dblatex in your PATH, you will not be able to build the PDF and PS documentation])
968 fi
969 ])# FP_PROG_DBLATEX
970
971
972 # FP_PROG_XSLTPROC
973 # ----------------
974 # Sets the output variable XsltprocCmd to the full path of the XSLT processor
975 # xsltproc. XsltprocCmd is empty if xsltproc could not be found.
976 AC_DEFUN([FP_PROG_XSLTPROC],
977 [AC_PATH_PROG([XsltprocCmd], [xsltproc])
978 if test -z "$XsltprocCmd"; then
979   AC_MSG_WARN([cannot find xsltproc in your PATH, you will not be able to build the HTML documentation])
980 fi
981 ])# FP_PROG_XSLTPROC
982
983
984 # FP_DOCBOOK_XSL
985 # ----------------------------
986 # Check that we can process a DocBook XML document to HTML using xsltproc.
987 AC_DEFUN([FP_DOCBOOK_XSL],
988 [AC_REQUIRE([FP_PROG_XSLTPROC])dnl
989 if test -n "$XsltprocCmd"; then
990   AC_CACHE_CHECK([for DocBook XSL stylesheet], fp_cv_dir_docbook_xsl,
991   [FP_GEN_DOCBOOK_XML
992   fp_cv_dir_docbook_xsl=no
993   if $XsltprocCmd --nonet http://docbook.sourceforge.net/release/xsl/current/html/chunk.xsl conftest.xml > /dev/null 2>&1; then
994      fp_cv_dir_docbook_xsl=yes
995   fi
996   rm -rf conftest*])
997 fi
998 if test x"$fp_cv_dir_docbook_xsl" = xno; then
999   AC_MSG_WARN([cannot find DocBook XSL stylesheets, you will not be able to build the documentation])
1000   HAVE_DOCBOOK_XSL=NO
1001 else
1002   HAVE_DOCBOOK_XSL=YES
1003 fi
1004 AC_SUBST([HAVE_DOCBOOK_XSL])
1005 ])# FP_DOCBOOK_XSL
1006
1007
1008 # FP_PROG_XMLLINT
1009 # ----------------
1010 # Sets the output variable XmllintCmd to the full path of the XSLT processor
1011 # xmllint. XmllintCmd is empty if xmllint could not be found.
1012 AC_DEFUN([FP_PROG_XMLLINT],
1013 [AC_PATH_PROG([XmllintCmd], [xmllint])
1014 if test -z "$XmllintCmd"; then
1015   AC_MSG_WARN([cannot find xmllint in your PATH, you will not be able to validate your documentation])
1016 fi
1017 ])# FP_PROG_XMLLINT
1018
1019
1020 # FP_CHECK_DOCBOOK_DTD
1021 # --------------------
1022 AC_DEFUN([FP_CHECK_DOCBOOK_DTD],
1023 [AC_REQUIRE([FP_PROG_XMLLINT])dnl
1024 if test -n "$XmllintCmd"; then
1025   AC_MSG_CHECKING([for DocBook DTD])
1026   FP_GEN_DOCBOOK_XML
1027   if $XmllintCmd --nonet --valid --noout conftest.xml ; then
1028     AC_MSG_RESULT([ok])
1029   else
1030     AC_MSG_RESULT([failed])
1031     AC_MSG_WARN([cannot find a DTD for DocBook XML V4.5, you will not be able to validate your documentation])
1032     AC_MSG_WARN([check your XML_CATALOG_FILES environment variable and/or /etc/xml/catalog])
1033   fi
1034   rm -rf conftest*
1035 fi
1036 ])# FP_CHECK_DOCBOOK_DTD
1037
1038
1039 # FP_GEN_FO
1040 # ------------------
1041 # Generates a formatting objects document in conftest.fo.
1042 AC_DEFUN([FP_GEN_FO],
1043 [rm -f conftest.fo
1044 cat > conftest.fo << EOF
1045 <?xml version="1.0"?>
1046 <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
1047   <fo:layout-master-set>
1048     <fo:simple-page-master master-name="blank">
1049       <fo:region-body/>
1050     </fo:simple-page-master>
1051   </fo:layout-master-set>
1052   <fo:page-sequence master-reference="blank">
1053     <fo:flow flow-name="xsl-region-body">
1054       <fo:block>
1055         Test!
1056       </fo:block>
1057     </fo:flow>
1058   </fo:page-sequence>
1059 </fo:root>
1060 EOF
1061 ]) # FP_GEN_FO
1062
1063
1064 # FP_PROG_FOP
1065 # -----------
1066 # Set the output variable 'FopCmd' to the first working 'fop' in the current
1067 # 'PATH'. Note that /usr/bin/fop is broken in SuSE 9.1 (unpatched), so try
1068 # /usr/share/fop/fop.sh in that case (or no 'fop'), too.
1069 AC_DEFUN([FP_PROG_FOP],
1070 [AC_PATH_PROGS([FopCmd1], [fop fop.sh])
1071 if test -n "$FopCmd1"; then
1072   AC_CACHE_CHECK([for $FopCmd1 usability], [fp_cv_fop_usability],
1073     [FP_GEN_FO
1074     if "$FopCmd1" -fo conftest.fo -ps conftest.ps > /dev/null 2>&1; then
1075       fp_cv_fop_usability=yes
1076     else
1077       fp_cv_fop_usability=no
1078     fi
1079     rm -rf conftest*])
1080   if test x"$fp_cv_fop_usability" = xyes; then
1081      FopCmd=$FopCmd1
1082   fi
1083 fi
1084 if test -z "$FopCmd"; then
1085   AC_PATH_PROGS([FopCmd2], [fop.sh], , [/usr/share/fop])
1086   FopCmd=$FopCmd2
1087 fi
1088 AC_SUBST([FopCmd])
1089 ])# FP_PROG_FOP
1090
1091
1092 # FP_PROG_GHC_PKG
1093 # ----------------
1094 # Try to find a ghc-pkg matching the ghc mentioned in the environment variable
1095 # WithGhc. Sets the output variable GhcPkgCmd.
1096 AC_DEFUN([FP_PROG_GHC_PKG],
1097 [AC_CACHE_CHECK([for ghc-pkg matching $WithGhc], fp_cv_matching_ghc_pkg,
1098 [
1099 # If we are told to use ghc-stage2, then we're using an in-tree
1100 # compiler. In this case, we just want ghc-pkg, not ghc-pkg-stage2,
1101 # so we sed off -stage[0-9]$. However, if we are told to use
1102 # ghc-6.12.1 then we want to use ghc-pkg-6.12.1, so we keep any
1103 # other suffix.
1104 fp_ghc_pkg_guess=`echo $WithGhc | sed -e 's/-stage@<:@0-9@:>@$//' -e 's,ghc\(@<:@^/\\@:>@*\)$,ghc-pkg\1,'`
1105 if "$fp_ghc_pkg_guess" list > /dev/null 2>&1; then
1106   fp_cv_matching_ghc_pkg=$fp_ghc_pkg_guess
1107 else
1108   AC_MSG_ERROR([Cannot find matching ghc-pkg])
1109 fi])
1110 GhcPkgCmd=$fp_cv_matching_ghc_pkg
1111 AC_SUBST([GhcPkgCmd])
1112 ])# FP_PROG_GHC_PKG
1113
1114
1115 # FP_GCC_EXTRA_FLAGS
1116 # ------------------
1117 # Determine which extra flags we need to pass gcc when we invoke it
1118 # to compile .hc code.
1119 #
1120 # -fwrapv is needed for gcc to emit well-behaved code in the presence of
1121 # integer wrap around. (Trac #952)
1122 #
1123 AC_DEFUN([FP_GCC_EXTRA_FLAGS],
1124 [AC_REQUIRE([FP_GCC_VERSION])
1125 AC_CACHE_CHECK([for extra options to pass gcc when compiling via C], [fp_cv_gcc_extra_opts],
1126 [fp_cv_gcc_extra_opts=
1127  FP_COMPARE_VERSIONS([$fp_cv_gcc_version], [-ge], [3.4],
1128   [fp_cv_gcc_extra_opts="$fp_cv_gcc_extra_opts -fwrapv"],
1129   [])
1130 ])
1131 AC_SUBST([GccExtraViaCOpts],$fp_cv_gcc_extra_opts)
1132 ])
1133
1134
1135 # FP_SETUP_PROJECT_VERSION
1136 # ---------------------
1137 AC_DEFUN([FP_SETUP_PROJECT_VERSION],
1138 [
1139 if test "$RELEASE" = "NO"; then
1140     AC_MSG_CHECKING([for GHC version date])
1141     if test -f VERSION_DATE; then
1142         PACKAGE_VERSION=${PACKAGE_VERSION}.`cat VERSION_DATE`
1143         AC_MSG_RESULT(given $PACKAGE_VERSION)
1144     elif test -d .git; then
1145         changequote(, )dnl
1146         ver_date=`git log -n 1 --date=short --pretty=format:%ci | cut -d ' ' -f 1 | tr -d -`
1147         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
1148         changequote([, ])dnl
1149                 AC_MSG_ERROR([failed to detect version date: check that git is in your path])
1150         fi
1151         PACKAGE_VERSION=${PACKAGE_VERSION}.$ver_date
1152         AC_MSG_RESULT(inferred $PACKAGE_VERSION)
1153     elif test -d _darcs; then
1154         # TODO: Remove this branch after conversion to Git
1155         changequote(, )dnl
1156         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`
1157         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
1158         changequote([, ])dnl
1159                 AC_MSG_ERROR([failed to detect version date: check that darcs is in your path])
1160         fi
1161         PACKAGE_VERSION=${PACKAGE_VERSION}.$ver_date
1162         AC_MSG_RESULT(inferred $PACKAGE_VERSION)
1163     elif test -f VERSION; then
1164         PACKAGE_VERSION=`cat VERSION`
1165         AC_MSG_RESULT(given $PACKAGE_VERSION)
1166     else
1167         AC_MSG_WARN([cannot determine snapshot version: no .git or _darcs directory and no VERSION file])
1168     fi
1169 fi
1170
1171 # Some renamings
1172 AC_SUBST([ProjectName], [$PACKAGE_NAME])
1173 AC_SUBST([ProjectVersion], [$PACKAGE_VERSION])
1174
1175 # Split PACKAGE_VERSION into (possibly empty) parts
1176 VERSION_MAJOR=`echo $PACKAGE_VERSION | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\1'/`
1177 VERSION_TMP=`echo $PACKAGE_VERSION | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\3'/`
1178 VERSION_MINOR=`echo $VERSION_TMP | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\1'/`
1179 ProjectPatchLevel=`echo $VERSION_TMP | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\3'/`
1180
1181 # Calculate project version as an integer, using 2 digits for minor version
1182 case $VERSION_MINOR in
1183   ?) ProjectVersionInt=${VERSION_MAJOR}0${VERSION_MINOR} ;;
1184   ??) ProjectVersionInt=${VERSION_MAJOR}${VERSION_MINOR} ;;
1185   *) AC_MSG_ERROR([bad minor version in $PACKAGE_VERSION]) ;;
1186 esac
1187 AC_SUBST([ProjectVersionInt])
1188
1189 # The project patchlevel is zero unless stated otherwise
1190 test -z "$ProjectPatchLevel" && ProjectPatchLevel=0
1191
1192 # Remove dots from the patch level; this allows us to have versions like 6.4.1.20050508
1193 ProjectPatchLevel=`echo $ProjectPatchLevel | sed 's/\.//'`
1194
1195 AC_SUBST([ProjectPatchLevel])
1196 ])# FP_SETUP_PROJECT_VERSION
1197
1198
1199 # Check for a working timer_create().  We need a pretty detailed check
1200 # here, because there exist partially-working implementations of
1201 # timer_create() in certain versions of Linux (see bug #1933).
1202 #
1203 AC_DEFUN([FP_CHECK_TIMER_CREATE],
1204   [AC_CACHE_CHECK([for a working timer_create(CLOCK_REALTIME)], 
1205     [fptools_cv_timer_create_works],
1206     [AC_TRY_RUN([
1207 #include <stdio.h>
1208 #ifdef HAVE_STDLIB_H
1209 #include <stdlib.h>
1210 #endif
1211 #ifdef HAVE_TIME_H
1212 #include <time.h>
1213 #endif
1214 #ifdef HAVE_SIGNAL_H
1215 #include <signal.h>
1216 #endif
1217 #ifdef HAVE_UNISTD_H
1218 #include <unistd.h>
1219 #endif
1220
1221 static volatile int tock = 0;
1222 static void handler(int i)
1223 {
1224    tock = 1;
1225 }
1226
1227 static void timeout(int i)
1228 {
1229   // timer_settime() has been known to hang, so just in case
1230   // we install a 1-second timeout (see #2257)
1231   exit(99);
1232 }
1233
1234 int main(int argc, char *argv[])
1235 {
1236
1237     struct sigevent ev;
1238     timer_t timer;
1239     struct itimerspec it;
1240     struct sigaction action;
1241     int m,n,count = 0;
1242
1243     ev.sigev_notify = SIGEV_SIGNAL;
1244     ev.sigev_signo  = SIGVTALRM;
1245
1246     action.sa_handler = handler;
1247     action.sa_flags = 0;
1248     sigemptyset(&action.sa_mask);
1249     if (sigaction(SIGVTALRM, &action, NULL) == -1) {
1250         fprintf(stderr,"SIGVTALRM problem\n");
1251         exit(3);
1252     }
1253
1254     action.sa_handler = timeout;
1255     action.sa_flags = 0;
1256     sigemptyset(&action.sa_mask);
1257     if (sigaction(SIGALRM, &action, NULL) == -1) {
1258       fprintf(stderr,"SIGALRM problem\n");
1259       exit(3);
1260     }
1261     alarm(1);
1262
1263     if (timer_create(CLOCK_PROCESS_CPUTIME_ID, &ev, &timer) != 0) {
1264         fprintf(stderr,"No CLOCK_PROCESS_CPUTIME_ID timer\n");
1265        exit(1);
1266     }
1267
1268     it.it_value.tv_sec = 0;
1269     it.it_value.tv_nsec = 1;
1270     it.it_interval = it.it_value;
1271     if (timer_settime(timer, 0, &it, NULL) != 0) {
1272         fprintf(stderr,"settime problem\n");
1273         exit(4);
1274     }
1275
1276     tock = 0;
1277
1278     for(n = 3; n < 20000; n++){
1279         for(m = 2; m <= n/2; m++){
1280             if (!(n%m)) count++;
1281             if (tock) goto out;
1282         }
1283     }
1284 out:
1285
1286     if (!tock) {
1287         fprintf(stderr,"no CLOCK_PROCESS_CPUTIME_ID signal\n");
1288         exit(5);
1289     }
1290
1291     timer_delete(timer);
1292
1293     if (timer_create(CLOCK_REALTIME, &ev, &timer) != 0) {
1294         fprintf(stderr,"No CLOCK_REALTIME timer\n");
1295         exit(2);
1296     }
1297
1298     it.it_value.tv_sec = 0;
1299     it.it_value.tv_nsec = 1000000;
1300     it.it_interval = it.it_value;
1301     if (timer_settime(timer, 0, &it, NULL) != 0) {
1302         fprintf(stderr,"settime problem\n");
1303         exit(4);
1304     }
1305
1306     tock = 0;
1307
1308     usleep(3000);
1309
1310     if (!tock) {
1311         fprintf(stderr,"no CLOCK_REALTIME signal\n");
1312         exit(5);
1313     }
1314
1315     timer_delete(timer);
1316
1317     exit(0);
1318 }
1319      ],
1320      [fptools_cv_timer_create_works=yes],
1321      [fptools_cv_timer_create_works=no])
1322   ])
1323 case $fptools_cv_timer_create_works in
1324     yes) AC_DEFINE([USE_TIMER_CREATE], 1, 
1325                    [Define to 1 if we can use timer_create(CLOCK_PROCESS_CPUTIME_ID,...)]);;
1326 esac
1327 ])
1328
1329 # FP_ICONV
1330 # -------------
1331 AC_DEFUN([FP_ICONV],
1332 [
1333   dnl--------------------------------------------------------------------
1334   dnl * Deal with arguments telling us iconv is somewhere odd
1335   dnl--------------------------------------------------------------------
1336
1337   dnl Note: ICONV_LIB_DIRS and ICONV_INCLUDE_DIRS are not predefined
1338   dnl to the empty string to allow them to be overridden from the
1339   dnl environment.
1340
1341   AC_ARG_WITH([iconv-includes],
1342     [AC_HELP_STRING([--with-iconv-includes],
1343       [directory containing iconv.h])],
1344       [ICONV_INCLUDE_DIRS=$withval])
1345
1346   AC_ARG_WITH([iconv-libraries],
1347     [AC_HELP_STRING([--with-iconv-libraries],
1348       [directory containing iconv library])],
1349       [ICONV_LIB_DIRS=$withval])
1350
1351   AC_SUBST(ICONV_INCLUDE_DIRS)
1352   AC_SUBST(ICONV_LIB_DIRS)
1353 ])# FP_ICONV
1354
1355 # FP_GMP
1356 # -------------
1357 AC_DEFUN([FP_GMP],
1358 [
1359   dnl--------------------------------------------------------------------
1360   dnl * Deal with arguments telling us gmp is somewhere odd
1361   dnl--------------------------------------------------------------------
1362
1363   AC_ARG_WITH([gmp-includes],
1364     [AC_HELP_STRING([--with-gmp-includes],
1365       [directory containing gmp.h])],
1366       [GMP_INCLUDE_DIRS=$withval])
1367
1368   AC_ARG_WITH([gmp-libraries],
1369     [AC_HELP_STRING([--with-gmp-libraries],
1370       [directory containing gmp library])],
1371       [GMP_LIB_DIRS=$withval])
1372
1373   AC_SUBST(GMP_INCLUDE_DIRS)
1374   AC_SUBST(GMP_LIB_DIRS)
1375 ])# FP_GMP
1376
1377 # FP_CHECK_MACOSX_DEPLOYMENT_TARGET
1378 # ---------------------------------
1379 AC_DEFUN([FP_CHECK_MACOSX_DEPLOYMENT_TARGET],
1380 [
1381 if test "x$TargetOS_CPP-$TargetVendor_CPP" = "xdarwin-apple"; then
1382   AC_MSG_CHECKING([Mac OS X deployment target])
1383   case $FP_MACOSX_DEPLOYMENT_TARGET in
1384     none)  ;;
1385     10.4)  MACOSX_DEPLOYMENT_VERSION=10.4
1386            MACOSX_DEPLOYMENT_SDK=/Developer/SDKs/MacOSX10.4u.sdk
1387            ;;
1388     10.4u) MACOSX_DEPLOYMENT_VERSION=10.4
1389            MACOSX_DEPLOYMENT_SDK=/Developer/SDKs/MacOSX10.4u.sdk
1390            ;;
1391     *)     MACOSX_DEPLOYMENT_VERSION=$FP_MACOSX_DEPLOYMENT_TARGET
1392            MACOSX_DEPLOYMENT_SDK=/Developer/SDKs/MacOSX${FP_MACOSX_DEPLOYMENT_TARGET}.sdk
1393            ;;
1394   esac
1395   if test "x$FP_MACOSX_DEPLOYMENT_TARGET" = "xnone"; then
1396     AC_MSG_RESULT(none)
1397   else
1398     if test ! -d $MACOSX_DEPLOYMENT_SDK; then
1399       AC_MSG_ERROR([Unknown deployment target $FP_MACOSX_DEPLOYMENT_TARGET])
1400     fi
1401     AC_MSG_RESULT([${MACOSX_DEPLOYMENT_VERSION} (${MACOSX_DEPLOYMENT_SDK})])
1402   fi
1403 fi
1404 ])
1405
1406 # --------------------------------------------------------------
1407 # Calculate absolute path to build tree
1408 # --------------------------------------------------------------
1409
1410 AC_DEFUN([FP_INTREE_GHC_PWD],[
1411 AC_MSG_NOTICE(Building in-tree ghc-pwd)
1412     dnl This would be
1413     dnl     make -C utils/ghc-pwd clean && make -C utils/ghc-pwd
1414     dnl except we don't want to have to know what make is called. Sigh.
1415     rm -rf utils/ghc-pwd/dist-boot
1416     mkdir  utils/ghc-pwd/dist-boot
1417     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
1418     then
1419         AC_MSG_ERROR([Building ghc-pwd failed])
1420     fi
1421
1422     GHC_PWD=utils/ghc-pwd/dist-boot/ghc-pwd
1423 ])
1424
1425 AC_DEFUN([FP_BINDIST_GHC_PWD],[
1426     GHC_PWD=utils/ghc-pwd/dist-install/build/tmp/ghc-pwd
1427 ])
1428
1429 AC_DEFUN([FP_FIND_ROOT],[
1430 AC_MSG_CHECKING(for path to top of build tree)
1431     hardtop=`$GHC_PWD`
1432
1433     dnl Remove common automounter nonsense
1434     hardtop=`echo $hardtop | sed 's|^/tmp_mnt.*\(/local/.*\)$|\1|' | sed 's|^/tmp_mnt/|/|'`
1435
1436     if ! test -d "$hardtop"; then
1437         AC_MSG_ERROR([cannot determine current directory])
1438     fi
1439
1440     dnl We don't support building in directories with spaces.
1441     case "$hardtop" in
1442     *' '*)
1443         AC_MSG_ERROR([
1444         The build system does not support building in a directory
1445         containing space characters.
1446         Suggestion: move the build tree somewhere else.])
1447         ;;
1448     esac
1449
1450     AC_SUBST(hardtop)
1451
1452     AC_MSG_RESULT($hardtop)
1453 ])
1454
1455 # GHC_CONVERT_CPU(cpu, target_var)
1456 # --------------------------------
1457 # converts cpu from gnu to ghc naming, and assigns the result to $target_var
1458 AC_DEFUN([GHC_CONVERT_CPU],[
1459 case "$1" in
1460   alpha*)
1461     $2="alpha"
1462     ;;
1463   arm*)
1464     $2="arm"
1465     ;;
1466   hppa1.1*)
1467     $2="hppa1_1"
1468     ;;
1469   hppa*)
1470     $2="hppa"
1471     ;;
1472   i386|i486|i586|i686)
1473     $2="i386"
1474     ;;
1475   ia64)
1476     $2="ia64"
1477     ;;
1478   m68k*)
1479     $2="m68k"
1480     ;;
1481   mipseb*)
1482     $2="mipseb"
1483     ;;
1484   mipsel*)
1485     $2="mipsel"
1486     ;;
1487   mips*)
1488     $2="mips"
1489     ;;
1490   powerpc64*)
1491     $2="powerpc64"
1492     ;;
1493   powerpc*)
1494     $2="powerpc"
1495     ;;
1496   rs6000)
1497     $2="rs6000"
1498     ;;
1499   s390*)
1500     $2="s390"
1501     ;;
1502   sparc64*)
1503     $2="sparc64"
1504     ;;
1505   sparc*)
1506     $2="sparc"
1507     ;;
1508   vax)
1509     $2="vax"
1510     ;;
1511   x86_64)
1512     $2="x86_64"
1513     ;;
1514   *)
1515     echo "Unknown CPU $1"
1516     exit 1
1517     ;;
1518   esac
1519 ])
1520
1521 # GHC_CONVERT_VENDOR(vendor, target_var)
1522 # --------------------------------
1523 # converts vendor from gnu to ghc naming, and assigns the result to $target_var
1524 AC_DEFUN([GHC_CONVERT_VENDOR],[
1525   case "$1" in
1526   pc|gentoo) # like i686-pc-linux-gnu and i686-gentoo-freebsd8
1527     $2="unknown"
1528     ;;
1529   softfloat) # like armv5tel-softfloat-linux-gnueabi
1530     $2="unknown"
1531     ;;
1532   *)
1533     #pass thru by default
1534     $2="$1"
1535     ;;
1536   esac
1537 ])
1538
1539 # GHC_CONVERT_OS(os, target_var)
1540 # --------------------------------
1541 # converts os from gnu to ghc naming, and assigns the result to $target_var
1542 AC_DEFUN([GHC_CONVERT_OS],[
1543 case "$1" in
1544   linux-*|linux)
1545     $2="linux"
1546     ;;
1547   # As far as I'm aware, none of these have relevant variants
1548   freebsd|netbsd|openbsd|dragonfly|osf1|osf3|hpux|linuxaout|kfreebsdgnu|freebsd2|solaris2|cygwin32|mingw32|darwin|gnu|nextstep2|nextstep3|sunos4|ultrix|irix|aix|haiku)
1549     $2="$1"
1550     ;;
1551   freebsd8) # like i686-gentoo-freebsd8
1552     $2="freebsd"
1553     ;;
1554   *)
1555     echo "Unknown OS $1"
1556     exit 1
1557     ;;
1558   esac
1559 ])
1560
1561 # BOOTSTRAPPING_GHC_INFO_FIELD
1562 # --------------------------------
1563 # If the bootstrapping compiler is >= 7.1, then set the variable
1564 # $1 to the value of the ghc --info field $2. Otherwise, set it to
1565 # $3.
1566 AC_DEFUN([BOOTSTRAPPING_GHC_INFO_FIELD],[
1567 if test $GhcCanonVersion -ge 701
1568 then
1569     $1=`"$WithGhc" --info | grep "^ ,(\"$2\"," | sed -e 's/.*","//' -e 's/")$//'`
1570 else
1571     $1=$3
1572 fi
1573 AC_SUBST($1)
1574 ])
1575
1576 # LIBRARY_VERSION(lib, [dir])
1577 # --------------------------------
1578 # Gets the version number of a library.
1579 # If $1 is ghc-prim, then we define LIBRARY_ghc_prim_VERSION as 1.2.3
1580 # $2 points to the directory under libraries/
1581 AC_DEFUN([LIBRARY_VERSION],[
1582 dir=m4_default([$2],[$1])
1583 LIBRARY_[]translit([$1], [-], [_])[]_VERSION=`grep -i "^version:" libraries/${dir}/$1.cabal | sed "s/.* //"`
1584 AC_SUBST(LIBRARY_[]translit([$1], [-], [_])[]_VERSION)
1585 ])
1586
1587 # XCODE_VERSION()
1588 # --------------------------------
1589 # Gets the version number of XCode, if on a Mac
1590 AC_DEFUN([XCODE_VERSION],[
1591     if test "$TargetOS_CPP" = "darwin"
1592     then
1593         AC_MSG_CHECKING(XCode version)
1594         XCodeVersion=`xcodebuild -version | grep Xcode | sed "s/Xcode //"`
1595         # Old XCode versions don't actually give the XCode version
1596         if test "$XCodeVersion" = ""
1597         then
1598             AC_MSG_RESULT(not found (too old?))
1599             XCodeVersion1=0
1600             XCodeVersion2=0
1601         else
1602             AC_MSG_RESULT($XCodeVersion)
1603             XCodeVersion1=`echo "$XCodeVersion" | sed 's/\..*//'`
1604             changequote(, )dnl
1605             XCodeVersion2=`echo "$XCodeVersion" | sed 's/[^.]*\.\([^.]*\).*/\1/'`
1606             changequote([, ])dnl
1607             AC_MSG_NOTICE(XCode version component 1: $XCodeVersion1)
1608             AC_MSG_NOTICE(XCode version component 2: $XCodeVersion2)
1609         fi
1610     fi
1611 ])
1612
1613 # FIND_GCC()
1614 # --------------------------------
1615 # Finds where gcc is
1616 AC_DEFUN([FIND_GCC],[
1617     if test "$TargetOS_CPP" = "darwin" &&
1618         test "$XCodeVersion1" -ge 4
1619     then
1620         # From Xcode 4, use 'gcc-4.2' to force the use of the gcc legacy
1621         # backend (instead of the LLVM backend)
1622         FP_ARG_WITH_PATH_GNU_PROG([CC], [gcc-4.2])
1623     else
1624         FP_ARG_WITH_PATH_GNU_PROG([CC], [gcc])
1625     fi
1626     export CC
1627     WhatGccIsCalled="$CC"
1628     AC_SUBST(WhatGccIsCalled)
1629 ])
1630
1631 # LocalWords:  fi