Cope with big endian float word order on little endian machines
[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_FLOAT_WORD_ORDER_BIGENDIAN
8 # ----------------------------------
9 # Little endian Arm on Linux with some ABIs has big endian word order
10 # in doubles. Define FLOAT_WORDS_BIGENDIAN if this is the case.
11 AC_DEFUN([FPTOOLS_FLOAT_WORD_ORDER_BIGENDIAN],
12   [AC_CACHE_CHECK([whether float word order is big endian], [fptools_cv_float_word_order_bigendian],
13     [AC_COMPILE_IFELSE(
14       [AC_LANG_PROGRAM(
15         [#include <endian.h>],
16         [#if defined(__FLOAT_WORD_ORDER) && __FLOAT_WORD_ORDER == BIG_ENDIAN
17              return 0;
18          #else
19              not float word order big endian
20          #endif]
21       )],
22       [fptools_cv_float_word_order_bigendian=yes],
23       [fptools_cv_float_word_order_bigendian=no])
24     ])
25   case $fptools_cv_float_word_order_bigendian in
26       yes)
27           AC_DEFINE([FLOAT_WORDS_BIGENDIAN], 1,
28           [Define to 1 if your processor stores words of floats with
29            the most significant byte first]) ;;
30   esac
31 ])
32
33
34 # FP_EVAL_STDERR(COMMAND)
35 # -----------------------
36 # Eval COMMAND, save its stderr (without lines resulting from shell tracing)
37 # into the file conftest.err and the exit status in the variable fp_status.
38 AC_DEFUN([FP_EVAL_STDERR],
39 [{ (eval $1) 2>conftest.er1
40   fp_status=$?
41   grep -v '^ *+' conftest.er1 >conftest.err
42   rm -f conftest.er1
43   (exit $fp_status); }[]dnl
44 ])# FP_EVAL_STDERR
45
46
47 # FP_CHECK_FLAG(FLAG, [ACTION-IF-SUPPORTED], [ACTION-IF-NOT-SUPPORTED])
48 # ---------------------------------------------------------------------
49 # Check to see whether the compiler for the current language supports a
50 # particular option.
51 #
52 # Implementation note: When given an unkown option, GCC issues an warning on
53 # stderr only, but returns an exit value of 0 nevertheless. Consequently we have
54 # to check stderr *and* the exit value.
55 #
56 # Used by ghc.
57 AC_DEFUN([FP_CHECK_FLAG],
58 [AC_LANG_COMPILER_REQUIRE()dnl
59 AC_LANG_CASE([C],          [fp_compiler="$CC"  m4_pushdef([fp_Flags], [CFLAGS])],
60              [C++],        [fp_compiler="$CXX" m4_pushdef([fp_Flags], [CXXFLAGS])],
61              [Fortran 77], [fp_compiler="$F77" m4_pushdef([fp_Flags], [FFLAGS])])
62 m4_pushdef([fp_Cache], [fp_cv_[]fp_Flags[]AS_TR_SH([$1])])[]dnl
63 AC_CACHE_CHECK([whether $fp_compiler accepts $1], [fp_Cache],
64 [AC_LANG_CONFTEST([AC_LANG_PROGRAM()])
65 fp_save_flags="$fp_Flags"
66 fp_Flags="$fp_Flags $1"
67 fp_Cache=no
68 if FP_EVAL_STDERR([$ac_compile conftest.$ac_ext]) >/dev/null; then
69   test -s conftest.err || fp_Cache=yes
70 fi
71 fp_Flags="$fp_save_flags"
72 rm -f conftest.err conftest.$ac_ext])
73 AS_IF([test $fp_Cache = yes], [$2], [$3])[]dnl
74 m4_popdef([fp_Cache])[]dnl
75 m4_popdef([fp_Flags])[]dnl
76 ])# FP_CHECK_FLAG
77
78
79 # FP_PROG_CONTEXT_DIFF
80 # --------------------
81 # Figure out how to do context diffs. Sets the output variable ContextDiffCmd.
82 #
83 # Note: NeXTStep thinks diff'ing a file against itself is "trouble".
84 #
85 # Used by ghc, glafp-utils/ltx, and glafp-utils/runstdtest.
86 AC_DEFUN([FP_PROG_CONTEXT_DIFF],
87 [AC_CACHE_CHECK([for a working context diff], [fp_cv_context_diff],
88 [echo foo > conftest1
89 echo foo > conftest2
90 fp_cv_context_diff=no
91 for fp_var in '-C 1' '-c1'
92 do
93   if diff $fp_var conftest1 conftest2 > /dev/null 2>&1; then
94     fp_cv_context_diff="diff $fp_var"
95     break
96   fi
97 done])
98 if test x"$fp_cv_context_diff" = xno; then
99    AC_MSG_ERROR([cannot figure out how to do context diffs])
100 fi
101 AC_SUBST(ContextDiffCmd, [$fp_cv_context_diff])
102 ])# FP_PROG_CONTEXT_DIFF
103
104
105 # FP_COMPUTE_INT(EXPRESSION, VARIABLE, INCLUDES, IF-FAILS)
106 # --------------------------------------------------------
107 # Assign VARIABLE the value of the compile-time EXPRESSION using INCLUDES for
108 # compilation. Execute IF-FAILS when unable to determine the value. Works for
109 # cross-compilation, too.
110 #
111 # Implementation note: We are lazy and use an internal autoconf macro, but it
112 # is supported in autoconf versions 2.50 up to the actual 2.57, so there is
113 # little risk.
114 AC_DEFUN([FP_COMPUTE_INT],
115 [_AC_COMPUTE_INT([$1], [$2], [$3], [$4])[]dnl
116 ])# FP_COMPUTE_INT
117
118
119 # FP_CHECK_ALIGNMENT(TYPE, [IGNORED], [INCLUDES = DEFAULT-INCLUDES])
120 # ------------------------------------------------------------------
121 # A variation of AC_CHECK_SIZEOF for computing the alignment restrictions of a
122 # given type. Defines ALIGNMENT_TYPE.
123 AC_DEFUN([FP_CHECK_ALIGNMENT],
124 [AS_LITERAL_IF([$1], [],
125                [AC_FATAL([$0: requires literal arguments])])[]dnl
126 AC_CHECK_TYPE([$1], [], [], [$3])[]dnl
127 m4_pushdef([fp_Cache], [AS_TR_SH([fp_cv_alignment_$1])])[]dnl
128 AC_CACHE_CHECK([alignment of $1], [fp_Cache],
129 [if test "$AS_TR_SH([ac_cv_type_$1])" = yes; then
130   FP_COMPUTE_INT([(long) (&((struct { char c; $1 ty; } *)0)->ty)],
131                  [fp_Cache],
132                  [AC_INCLUDES_DEFAULT([$3])],
133                  [AC_MSG_ERROR([cannot compute alignment ($1)
134 See `config.log' for more details.], [77])])
135 else
136   fp_Cache=0
137 fi])[]dnl
138 AC_DEFINE_UNQUOTED(AS_TR_CPP(alignment_$1), $fp_Cache, [The alignment of a `$1'.])[]dnl
139 m4_popdef([fp_Cache])[]dnl
140 ])# FP_CHECK_ALIGNMENT
141
142
143 # FP_LEADING_UNDERSCORE
144 # ---------------------
145 # Test for determining whether symbol names have a leading underscore. We assume
146 # that they _haven't_ if anything goes wrong. Sets the output variable
147 # LeadingUnderscore to YES or NO and defines LEADING_UNDERSCORE correspondingly.
148 #
149 # Some nlist implementations seem to try to be compatible by ignoring a leading
150 # underscore sometimes (eg. FreeBSD). We therefore have to work around this by
151 # checking for *no* leading underscore first. Sigh.  --SDM
152 #
153 # Similarly on OpenBSD, but this test doesn't help. -- dons
154 AC_DEFUN([FP_LEADING_UNDERSCORE],
155 [AC_CHECK_LIB([elf], [nlist], [LIBS="-lelf $LIBS"])
156 AC_CACHE_CHECK([leading underscore in symbol names], [fptools_cv_leading_underscore], [
157 # Hack!: nlist() under Digital UNIX insist on there being an _,
158 # but symbol table listings shows none. What is going on here?!?
159 #
160 # Another hack: cygwin doesn't come with nlist.h , so we hardwire
161 # the underscoredness of that "platform"
162 case $HostPlatform in
163 *openbsd*) # x86 openbsd is ELF from 3.4 >, meaning no leading uscore
164   case $build in
165     i386-*2\.@<:@0-9@:>@ | i386-*3\.@<:@0-3@:>@ ) fptools_cv_leading_underscore=yes ;;
166     *) fptools_cv_leading_underscore=no ;;
167   esac ;;
168 alpha-dec-osf*) fptools_cv_leading_underscore=no;;
169 *cygwin32) fptools_cv_leading_underscore=yes;;
170 *mingw32) fptools_cv_leading_underscore=yes;;
171 *) AC_RUN_IFELSE([AC_LANG_SOURCE([[#ifdef HAVE_NLIST_H
172 #include <nlist.h>
173 struct nlist xYzzY1[] = {{"xYzzY1", 0},{0}};
174 struct nlist xYzzY2[] = {{"_xYzzY2", 0},{0}};
175 #endif
176
177 int main(argc, argv)
178 int argc;
179 char **argv;
180 {
181 #ifdef HAVE_NLIST_H
182     if(nlist(argv[0], xYzzY1) == 0 && xYzzY1[0].n_value != 0)
183         exit(1);
184     if(nlist(argv[0], xYzzY2) == 0 && xYzzY2[0].n_value != 0)
185         exit(0);
186 #endif
187     exit(1);
188 }]])],[fptools_cv_leading_underscore=yes],[fptools_cv_leading_underscore=no],[fptools_cv_leading_underscore=no])
189 ;;
190 esac]);
191 AC_SUBST([LeadingUnderscore], [`echo $fptools_cv_leading_underscore | sed 'y/yesno/YESNO/'`])
192 if test x"$fptools_cv_leading_underscore" = xyes; then
193    AC_DEFINE([LEADING_UNDERSCORE], [1], [Define to 1 if C symbols have a leading underscore added by the compiler.])
194 fi])# FP_LEADING_UNDERSCORE
195
196
197 # FP_COMPARE_VERSIONS(VERSION1, TEST, VERSION2, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
198 # ----------------------------------------------------------------------------------
199 # Compare dotted version numbers VERSION1 and VERSION2 lexicographically according
200 # to TEST (one of -eq, -ne, -lt, -le, -gt, or -ge).
201 AC_DEFUN([FP_COMPARE_VERSIONS],
202 [fp_version1=$1; fp_version2=$3
203 fp_save_IFS=$IFS; IFS='.'
204 while test x"$fp_version1" != x || test x"$fp_version2" != x
205 do
206
207   set dummy $fp_version1; shift
208   fp_num1=""
209   test $[@%:@] = 0 || { fp_num1="[$]1"; shift; }
210   test x"$fp_num1" = x && fp_num1="0"
211   fp_version1="[$]*"
212
213   set dummy $fp_version2; shift
214   fp_num2=""
215   test $[@%:@] = 0 || { fp_num2="[$]1"; shift; }
216   test x"$fp_num2" = x && fp_num2="0"
217   fp_version2="[$]*"
218
219   test "$fp_num1" = "$fp_num2" || break;
220 done
221 IFS=$fp_save_IFS
222 AS_IF([test "$fp_num1" $2 "$fp_num2"], [$4], [$5])[]dnl
223 ])# FP_COMPARE_VERSIONS
224
225
226 dnl
227 dnl Check for GreenCard and version.
228 dnl
229 AC_DEFUN([FPTOOLS_GREENCARD],
230 [
231 AC_PATH_PROG(GreenCardCmd,greencard)
232 AC_CACHE_CHECK([for version of greencard], fptools_cv_greencard_version,
233 changequote(, )dnl
234 [if test x"$GreenCardCmd" != x; then
235    fptools_cv_greencard_version="`$GreenCardCmd --version |
236                           grep 'version' | sed -e 's/greencard. version \([^ ]*\).*/\1/g'`"
237 else
238    fptools_cv_greencard_version=""
239 fi
240 changequote([, ])dnl
241 ])
242 FP_COMPARE_VERSIONS([$fptools_cv_greencard_version],[-lt],[$1],
243   [AC_MSG_ERROR([greencard version $1 or later is required (found '$fptools_cv_greencard_version')])])[]dnl
244 GreenCardVersion=$fptools_cv_greencard_version
245 AC_SUBST(GreenCardVersion)
246 ])
247
248 dnl
249 dnl Check for Happy and version.  If we're building GHC, then we need
250 dnl at least Happy version 1.14.  If there's no installed Happy, we look
251 dnl for a happy source tree and point the build system at that instead.
252 dnl
253 AC_DEFUN([FPTOOLS_HAPPY],
254 [AC_PATH_PROG(HappyCmd,happy,)
255 AC_CACHE_CHECK([for version of happy], fptools_cv_happy_version,
256 changequote(, )dnl
257 [if test x"$HappyCmd" != x; then
258    fptools_cv_happy_version="`$HappyCmd -v |
259                           grep 'Happy Version' | sed -e 's/Happy Version \([^ ]*\).*/\1/g'`" ;
260 else
261    fptools_cv_happy_version="";
262 fi;
263 changequote([, ])dnl
264 ])
265 if test ! -f compiler/parser/Parser.hs || test ! -f compiler/main/ParsePkgConf.hs || test ! -f compiler/cmm/CmmParse.hs || test ! -f compiler/parser/ParserCore.hs
266 then
267     FP_COMPARE_VERSIONS([$fptools_cv_happy_version],[-lt],[1.15],
268       [AC_MSG_ERROR([Happy version 1.15 or later is required to compile GHC.])])[]dnl
269 fi
270 HappyVersion=$fptools_cv_happy_version;
271 AC_SUBST(HappyVersion)
272 ])
273
274 dnl
275 dnl Check for Haddock and version.  If there's no installed Haddock, we look
276 dnl for a haddock source tree and point the build system at that instead.
277 dnl
278 AC_DEFUN([FPTOOLS_HADDOCK],
279 [AC_PATH_PROG(HaddockCmd,haddock,)
280 dnl Darn, I forgot to make Haddock print out its version number when
281 dnl invoked with -v.  We could try generating some HTML and grepping
282 dnl through that to find the version number, but I think we'll make
283 dnl do without it for now.
284 ])
285
286 dnl
287 dnl Check for Alex and version.  If we're building GHC, then we need
288 dnl at least Alex version 2.0.1.
289 dnl
290 AC_DEFUN([FPTOOLS_ALEX],
291 [
292 AC_PATH_PROG(AlexCmd,alex,)
293 AC_CACHE_CHECK([for version of alex], fptools_cv_alex_version,
294 changequote(, )dnl
295 [if test x"$AlexCmd" != x; then
296    fptools_cv_alex_version="`$AlexCmd -v |
297                           grep 'Alex [Vv]ersion' | sed -e 's/Alex [Vv]ersion \([0-9\.]*\).*/\1/g'`" ;
298 else
299    fptools_cv_alex_version="";
300 fi;
301 changequote([, ])dnl
302 ])
303 if test ! -f compiler/cmm/CmmLex.hs || test ! -f compiler/parser/Lexer.hs
304 then
305     FP_COMPARE_VERSIONS([$fptools_cv_alex_version],[-lt],[2.0.1],
306       [AC_MSG_ERROR([Alex version 2.0.1 or later is required to compile GHC.])])[]dnl
307 fi
308 AlexVersion=$fptools_cv_alex_version;
309 AC_SUBST(AlexVersion)
310 ])
311
312
313 # FP_PROG_LD
314 # ----------
315 # Sets the output variable LdCmd to the (non-Cygwin version of the) full path
316 # of ld. Exits if no ld can be found
317 AC_DEFUN([FP_PROG_LD],
318 [AC_PATH_PROG([fp_prog_ld_raw], [ld])
319 if test -z "$fp_prog_ld_raw"; then
320   AC_MSG_ERROR([cannot find ld in your PATH, no idea how to link])
321 fi
322 LdCmd=$fp_prog_ld_raw
323 case $HostPlatform in
324   *mingw32) if test x${OSTYPE} != xmsys; then
325               LdCmd="`cygpath -w ${fp_prog_ld_raw} | sed -e 's@\\\\@/@g'`"
326               AC_MSG_NOTICE([normalized ld command to $LdCmd])
327             fi
328             # Insist on >= ld-2.15.x, since earlier versions doesn't handle
329             # the generation of relocatable object files with large amounts
330             # of relocations correctly. (cf. HSbase.o splittage-hack)
331             fp_prog_ld_version=`${LdCmd} --version | sed -n '/GNU ld/p' | tr -cd 0-9 | cut -b1-3`
332             FP_COMPARE_VERSIONS([$fp_prog_ld_version],[-lt],[214],
333                                 [AC_MSG_ERROR([GNU ld version later than 2.14 required to compile GHC on Windows.])])[]dnl
334             ;;
335 esac
336 AC_SUBST([LdCmd])
337 ])# FP_PROG_LD
338
339
340 # FP_PROG_LD_X
341 # ------------
342 # Sets the output variable LdXFlag to -x if ld supports this flag, otherwise the
343 # variable's value is empty.
344 AC_DEFUN([FP_PROG_LD_X],
345 [AC_REQUIRE([FP_PROG_LD])
346 AC_CACHE_CHECK([whether ld understands -x], [fp_cv_ld_x],
347 [echo 'foo() {}' > conftest.c
348 ${CC-cc} -c conftest.c
349 if ${LdCmd} -r -x -o conftest2.o conftest.o > /dev/null 2>&1; then
350    fp_cv_ld_x=yes
351 else
352    fp_cv_ld_x=no
353 fi
354 rm -rf conftest*])
355 if test "$fp_cv_ld_x" = yes; then
356   LdXFlag=-x
357 else
358   LdXFlag=
359 fi
360 AC_SUBST([LdXFlag])
361 ])# FP_PROG_LD_X
362
363
364 # FP_PROG_LD_IS_GNU
365 # -----------------
366 # Sets the output variable LdIsGNULd to YES or NO, depending on whether it is
367 # GNU ld or not.
368 AC_DEFUN([FP_PROG_LD_IS_GNU],
369 [AC_REQUIRE([FP_PROG_LD])
370 AC_CACHE_CHECK([whether ld is GNU ld], [fp_cv_gnu_ld],
371 [if ${LdCmd} --version 2> /dev/null | grep "GNU" > /dev/null 2>&1; then
372   fp_cv_gnu_ld=yes
373 else
374   fp_cv_gnu_ld=no
375 fi])
376 AC_SUBST([LdIsGNULd], [`echo $fp_cv_gnu_ld | sed 'y/yesno/YESNO/'`])
377 ])# FP_PROG_LD_IS_GNU
378
379
380 # FP_PROG_AR
381 # ----------
382 # Sets fp_prog_ar_raw to the full path of ar and fp_prog_ar to a non-Cygwin
383 # version of it. Exits if no ar can be found
384 AC_DEFUN([FP_PROG_AR],
385 [AC_PATH_PROG([fp_prog_ar_raw], [ar])
386 if test -z "$fp_prog_ar_raw"; then
387   AC_MSG_ERROR([cannot find ar in your PATH, no idea how to make a library])
388 fi
389 fp_prog_ar=$fp_prog_ar_raw
390 case $HostPlatform in
391   *mingw32) if test x${OSTYPE} != xmsys; then
392               fp_prog_ar="`cygpath -w ${fp_prog_ar_raw} | sed -e 's@\\\\@/@g'`"
393               AC_MSG_NOTICE([normalized ar command to $fp_prog_ar])
394             fi
395             ;;
396 esac
397 ])# FP_PROG_AR
398
399
400 # FP_PROG_AR_IS_GNU
401 # -----------------
402 # Sets fp_prog_ar_is_gnu to yes or no, depending on whether it is GNU ar or not.
403 AC_DEFUN([FP_PROG_AR_IS_GNU],
404 [AC_REQUIRE([FP_PROG_AR])
405 AC_CACHE_CHECK([whether $fp_prog_ar_raw is GNU ar], [fp_cv_prog_ar_is_gnu],
406 [if $fp_prog_ar_raw --version 2> /dev/null | grep "GNU" > /dev/null 2>&1; then
407   fp_cv_prog_ar_is_gnu=yes
408 else
409   fp_cv_prog_ar_is_gnu=no
410 fi])
411 fp_prog_ar_is_gnu=$fp_cv_prog_ar_is_gnu
412 ])# FP_PROG_AR_IS_GNU
413
414
415 # FP_PROG_AR_ARGS
416 # ---------------
417 # Sets fp_prog_ar_args to the arguments for ar and the output variable ArCmd
418 # to a non-Cygwin invocation of ar including these arguments.
419 AC_DEFUN([FP_PROG_AR_ARGS],
420 [AC_REQUIRE([FP_PROG_AR_IS_GNU])
421 AC_CACHE_CHECK([for ar arguments], [fp_cv_prog_ar_args],
422 [
423 # GNU ar needs special treatment: it appears to have problems with
424 # object files with the same name if you use the 's' modifier, but
425 # simple 'ar q' works fine, and doesn't need a separate ranlib.
426 if test $fp_prog_ar_is_gnu = yes; then
427   fp_cv_prog_ar_args="q"
428 else
429   touch conftest.dummy
430   for fp_var in clqsZ clqs cqs clq cq ; do
431      rm -f conftest.a
432      if $fp_prog_ar_raw $fp_var conftest.a conftest.dummy > /dev/null 2> /dev/null; then
433         fp_cv_prog_ar_args=$fp_var
434         break
435      fi
436   done
437   rm -f conftest*
438   if test -z "$fp_cv_prog_ar_args"; then
439     AC_MSG_ERROR([cannot figure out how to use your $fp_prog_ar_raw])
440   fi
441 fi])
442 fp_prog_ar_args=$fp_cv_prog_ar_args
443 AC_SUBST([ArCmd], ["$fp_prog_ar $fp_prog_ar_args"])
444
445 ])# FP_PROG_AR_ARGS
446
447
448 # FP_PROG_AR_NEEDS_RANLIB
449 # -----------------------
450 # Sets the output variable RANLIB to "ranlib" if it is needed and found,
451 # to ":" otherwise.
452 AC_DEFUN([FP_PROG_AR_NEEDS_RANLIB],
453 [AC_REQUIRE([FP_PROG_AR_IS_GNU])
454 AC_REQUIRE([FP_PROG_AR_ARGS])
455 AC_REQUIRE([AC_PROG_CC])
456 AC_CACHE_CHECK([whether ranlib is needed], [fp_cv_prog_ar_needs_ranlib],
457 [if test $fp_prog_ar_is_gnu = yes; then
458   fp_cv_prog_ar_needs_ranlib=no
459 elif echo $TargetPlatform | grep "^.*-apple-darwin$"  > /dev/null 2> /dev/null; then
460   # It's quite tedious to check for Apple's crazy timestamps in .a files,
461   # so we hardcode it.
462   fp_cv_prog_ar_needs_ranlib=yes
463 elif echo $fp_prog_ar_args | grep "s" > /dev/null 2> /dev/null; then
464   fp_cv_prog_ar_needs_ranlib=no
465 else
466   fp_cv_prog_ar_needs_ranlib=yes
467 fi])
468 if test $fp_cv_prog_ar_needs_ranlib = yes; then
469    AC_PROG_RANLIB
470 else
471   RANLIB=":"
472   AC_SUBST([RANLIB])
473 fi
474 ])# FP_PROG_AR_NEEDS_RANLIB
475
476
477 # FP_PROG_AR_SUPPORTS_INPUT
478 # -------------------------
479 # Sets the output variable ArSupportsInput to "-input" or "", depending on
480 # whether ar supports -input flag is supported or not.
481 AC_DEFUN([FP_PROG_AR_SUPPORTS_INPUT],
482 [AC_REQUIRE([FP_PROG_AR_IS_GNU])
483 AC_REQUIRE([FP_PROG_AR_ARGS])
484 AC_CACHE_CHECK([whether $fp_prog_ar_raw supports -input], [fp_cv_prog_ar_supports_input],
485 [fp_cv_prog_ar_supports_input=no
486 if test $fp_prog_ar_is_gnu = no; then
487   rm -f conftest*
488   touch conftest.lst
489   if FP_EVAL_STDERR([$fp_prog_ar_raw $fp_prog_ar_args conftest.a -input conftest.lst]) >/dev/null; then
490     test -s conftest.err || fp_cv_prog_ar_supports_input=yes
491   fi
492   rm -f conftest*
493 fi])
494 if test $fp_cv_prog_ar_supports_input = yes; then
495     ArSupportsInput="-input"
496 else
497     ArSupportsInput=""
498 fi
499 AC_SUBST([ArSupportsInput])
500 ])# FP_PROG_AR_SUPPORTS_INPUT
501
502
503 dnl
504 dnl AC_SHEBANG_PERL - can we she-bang perl?
505 dnl
506 AC_DEFUN([FPTOOLS_SHEBANG_PERL],
507 [AC_CACHE_CHECK([if your perl works in shell scripts], fptools_cv_shebang_perl,
508 [echo "#!$PerlCmd"'
509 exit $1;
510 ' > conftest
511 chmod u+x conftest
512 (SHELL=/bin/sh; export SHELL; ./conftest 69 > /dev/null)
513 if test $? -ne 69; then
514    fptools_cv_shebang_perl=yes
515 else
516    fptools_cv_shebang_perl=no
517 fi
518 rm -f conftest
519 ])])
520
521
522 # FP_HAVE_GCC
523 # -----------
524 # Extra testing of the result AC_PROG_CC, testing the gcc version no. Sets the
525 # output variables HaveGcc and GccVersion.
526 AC_DEFUN([FP_HAVE_GCC],
527 [AC_REQUIRE([AC_PROG_CC])
528 if test -z "$GCC"; then
529    fp_have_gcc=NO
530 else
531    fp_have_gcc=YES
532 fi
533 if test "$fp_have_gcc" = "NO" -a -d $srcdir/ghc; then
534   AC_MSG_ERROR([gcc is required])
535 fi
536 AC_CACHE_CHECK([version of gcc], [fp_gcc_version],
537 [if test "$fp_have_gcc" = "YES"; then
538    fp_gcc_version="`$CC -v 2>&1 | grep 'version ' | sed -e 's/.*version [[^0-9]]*\([[0-9.]]*\).*/\1/g'`"
539    FP_COMPARE_VERSIONS([$fp_gcc_version], [-lt], [2.0],
540      [AC_MSG_ERROR([Need at least gcc version 2.0 (3.4+ recommended)])])
541  else
542    fp_gcc_version="not-installed"
543  fi
544 ])
545 AC_SUBST([HaveGcc], [$fp_have_gcc])
546 AC_SUBST([GccVersion], [$fp_gcc_version])
547 ])# FP_HAVE_GCC
548
549 AC_DEFUN([FP_MINGW_GCC],
550 [
551   case $HostOS_CPP in
552     mingw*)  AC_MSG_CHECKING([whether $CC is a mingw gcc])
553              if $CC -v 2>&1 | grep mingw >/dev/null; then
554                 AC_MSG_RESULT([yes])
555              else
556                 AC_MSG_RESULT([no])
557                 AC_MSG_ERROR([Please use --with-gcc to specify a mingw gcc])
558              fi;;
559     *) ;;       
560   esac
561 ])
562
563 dnl Small feature test for perl version. Assumes PerlCmd
564 dnl contains path to perl binary
565 dnl
566 AC_DEFUN([FPTOOLS_CHECK_PERL_VERSION],
567 [$PerlCmd -v >conftest.out 2>&1
568    if grep "v5.6" conftest.out >/dev/null 2>&1; then
569       :
570    else
571       if grep "v5.8" conftest.out >/dev/null 2>&1; then
572          :
573       else
574          if grep "version 6" conftest.out >/dev/null 2>&1; then
575             :
576          else
577             AC_MSG_ERROR([your version of perl probably won't work, try upgrading it.])
578          fi
579       fi
580    fi
581 rm -fr conftest*
582 ])
583
584
585 # FP_CHECK_PROG(VARIABLE, PROG-TO-CHECK-FOR,
586 #               [VALUE-IF-NOT-FOUND], [PATH], [REJECT])
587 # -----------------------------------------------------
588 # HACK: A small wrapper around AC_CHECK_PROG, setting VARIABLE to the full path
589 # of PROG-TO-CHECK-FOR when found.
590 AC_DEFUN([FP_CHECK_PROG],
591 [AC_CHECK_PROG([$1], [$2], [$as_dir/$ac_word$ac_exec_ext], [$3], [$4], [$5])][]dnl
592 )# FP_CHECK_PROC
593
594
595 # FP_PROG_FIND
596 # ------------
597 # Find a non-WinDoze version of the "find" utility.
598 AC_DEFUN([FP_PROG_FIND],
599 [AC_PATH_PROG([fp_prog_find], [find])
600 echo foo > conftest.txt
601 $fp_prog_find conftest.txt -print > conftest.out 2>&1
602 if grep '^conftest.txt$' conftest.out > /dev/null 2>&1 ; then
603   # OK, looks like a real "find".
604   FindCmd="$fp_prog_find"
605 else
606   # Found a poor WinDoze version of "find", ignore it.
607   AC_MSG_WARN([$fp_prog_find looks like a non-*nix find, ignoring it])
608   FP_CHECK_PROG([FindCmd], [find], [], [], [$fp_prog_find])
609 fi
610 rm -f conftest.txt conftest.out
611 AC_SUBST([FindCmd])[]dnl
612 ])# FP_PROG_FIND
613
614
615 # FP_PROG_SORT
616 # ------------
617 # Find a Unix-like sort
618 AC_DEFUN([FP_PROG_SORT],
619 [AC_PATH_PROG([fp_prog_sort], [sort])
620 echo conwip > conftest.txt
621 $fp_prog_sort -f conftest.txt > conftest.out 2>&1
622 if grep 'conwip' conftest.out > /dev/null 2>&1 ; then
623   # The goods
624   SortCmd="$fp_prog_sort"
625 else
626   # Summink else..pick next one.
627   AC_MSG_WARN([$fp_prog_sort looks like a non-*nix sort, ignoring it])
628   FP_CHECK_PROG([SortCmd], [sort], [], [], [$fp_prog_sort])
629 fi
630 rm -f conftest.txt conftest.out
631 AC_SUBST([SortCmd])[]dnl
632 ])# FP_PROG_SORT
633
634 dnl
635 dnl FPTOOLS_NOCACHE_CHECK prints a message, then sets the
636 dnl values of the second argument to the result of running
637 dnl the commands given by the third. It does not cache its
638 dnl result, so it is suitable for checks which should be
639 dnl run every time.
640 dnl
641 AC_DEFUN([FPTOOLS_NOCACHE_CHECK],
642 [AC_MSG_CHECKING([$1])
643  $3
644  AC_MSG_RESULT([$][$2])
645 ])
646
647 dnl
648 dnl FPTOOLS_GHC_VERSION(version)
649 dnl FPTOOLS_GHC_VERSION(major, minor [, patchlevel])
650 dnl FPTOOLS_GHC_VERSION(version, major, minor, patchlevel)
651 dnl
652 dnl Test for version of installed ghc.  Uses $GHC.
653 dnl [original version pinched from c2hs]
654 dnl
655 AC_DEFUN([FPTOOLS_GHC_VERSION],
656 [FPTOOLS_NOCACHE_CHECK([version of ghc], [fptools_version_of_ghc],
657 ["${WithGhc-ghc}" --version > conftestghc 2>&1
658   cat conftestghc >&AS_MESSAGE_LOG_FD
659 #Useless Use Of cat award...
660   fptools_version_of_ghc=`cat conftestghc | sed -n -e 's/, patchlevel *\([[0-9]]\)/.\1/;s/.* version \([[0-9]][[0-9.]]*\).*/\1/p'`
661   rm -fr conftest*
662   if test "[$]fptools_version_of_ghc" = ""
663   then
664     fptools_version_of_ghc='unknown'
665   fi
666 fptools_version_of_ghc[_major]=`echo [$]fptools_version_of_ghc | sed -e 's/^\([[0-9]]\).*/\1/'`
667 fptools_version_of_ghc[_minor]=`echo [$]fptools_version_of_ghc | sed -e 's/^[[0-9]]\.\([[0-9]]*\).*/\1/'`
668 fptools_version_of_ghc[_pl]=`echo [$]fptools_version_of_ghc | sed -n -e 's/^[[0-9]]\.[[0-9]]*\.\([[0-9]]*\)/\1/p'`
669 #
670 if test "[$]fptools_version_of_ghc[_pl]" = ""
671 then
672   fptools_version_of_ghc[_all]="[$]fptools_version_of_ghc[_major].[$]fptools_version_of_ghc[_minor]"
673   fptools_version_of_ghc[_pl]="0"
674 else
675   fptools_version_of_ghc[_all]="[$]fptools_version_of_ghc[_major].[$]fptools_version_of_ghc[_minor].[$]fptools_version_of_ghc[_pl]"
676 fi
677 #
678 ifelse($#, [1], [dnl
679 [$1]="[$]fptools_version_of_ghc[_all]"
680 ], $#, [2], [dnl
681 [$1]="[$]fptools_version_of_ghc[_major]"
682 [$2]="[$]fptools_version_of_ghc[_minor]"
683 ], $#, [3], [dnl
684 [$1]="[$]fptools_version_of_ghc[_major]"
685 [$2]="[$]fptools_version_of_ghc[_minor]"
686 [$3]="[$]fptools_version_of_ghc[_pl]"
687 ], $#, [4], [dnl
688 [$1]="[$]fptools_version_of_ghc[_all]"
689 [$2]="[$]fptools_version_of_ghc[_major]"
690 [$3]="[$]fptools_version_of_ghc[_minor]"
691 [$4]="[$]fptools_version_of_ghc[_pl]"
692 ])
693 ])
694 ])dnl
695
696
697 # FP_CHECK_FUNC(FUNCTION, PROLOGUE, BODY, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
698 # ---------------------------------------------------------------------------------
699 # A variant of AC_CHECK_FUNCS, limited to a single FUNCTION, but with the
700 # additional flexibility of specifying the PROLOGUE and BODY.
701 AC_DEFUN([FP_CHECK_FUNC],
702 [AS_VAR_PUSHDEF([fp_func], [fp_cv_func_$1])dnl
703 AC_CACHE_CHECK([for $1], fp_func,
704 [AC_LINK_IFELSE([AC_LANG_PROGRAM([$2], [$3])],
705                 [AS_VAR_SET(fp_func, yes)],
706                 [AS_VAR_SET(fp_func, no)])])
707 AS_IF([test AS_VAR_GET(fp_func) = yes],
708       [AC_DEFINE(AS_TR_CPP(HAVE_$1), [1],
709                 [Define to 1 if you have the `]$1[' function.]) $4],
710       [$5])dnl
711 AS_VAR_POPDEF([fp_func])dnl
712 ])# FP_CHECK_FUNC
713
714
715 # FP_GEN_DOCBOOK_XML
716 # ------------------
717 # Generates a DocBook XML V4.2 document in conftest.xml.
718 AC_DEFUN([FP_GEN_DOCBOOK_XML],
719 [rm -f conftest.xml
720 cat > conftest.xml << EOF
721 <?xml version="1.0" encoding="iso-8859-1"?>
722 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
723    "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
724 <book id="test">
725   <title>A DocBook Test Document</title>
726   <chapter id="id-one">
727     <title>A Chapter Title</title>
728     <para>This is a paragraph, referencing <xref linkend="id-two"/>.</para>
729   </chapter>
730   <chapter id="id-two">
731     <title>Another Chapter Title</title>
732     <para>This is another paragraph, referencing <xref linkend="id-one"/>.</para>
733   </chapter>
734 </book>
735 EOF
736 ]) # FP_GEN_DOCBOOK_XML
737
738
739 # FP_PROG_XSLTPROC
740 # ----------------
741 # Sets the output variable XsltprocCmd to the full path of the XSLT processor
742 # xsltproc. XsltprocCmd is empty if xsltproc could not be found.
743 AC_DEFUN([FP_PROG_XSLTPROC],
744 [AC_PATH_PROG([XsltprocCmd], [xsltproc])
745 if test -z "$XsltprocCmd"; then
746   AC_MSG_WARN([cannot find xsltproc in your PATH, you will not be able to build the documentation])
747 fi
748 ])# FP_PROG_XSLTPROC
749
750
751 # FP_DIR_DOCBOOK_XSL(XSL-DIRS)
752 # ----------------------------
753 # Check which of the directories XSL-DIRS contains DocBook XSL stylesheets. The
754 # output variable DIR_DOCBOOK_XSL will contain the first usable directory or
755 # will be empty if none could be found.
756 AC_DEFUN([FP_DIR_DOCBOOK_XSL],
757 [AC_REQUIRE([FP_PROG_XSLTPROC])dnl
758 if test -n "$XsltprocCmd"; then
759   AC_CACHE_CHECK([for DocBook XSL stylesheet directory], fp_cv_dir_docbook_xsl,
760   [FP_GEN_DOCBOOK_XML
761   fp_cv_dir_docbook_xsl=no
762   for fp_var in $1; do
763      if $XsltprocCmd ${fp_var}/html/docbook.xsl conftest.xml > /dev/null 2>&1; then
764         fp_cv_dir_docbook_xsl=$fp_var
765         break
766      fi
767   done
768   rm -rf conftest*])
769 fi
770 if test x"$fp_cv_dir_docbook_xsl" = xno; then
771   AC_MSG_WARN([cannot find DocBook XSL stylesheets, you will not be able to build the documentation])
772   DIR_DOCBOOK_XSL=
773 else
774   DIR_DOCBOOK_XSL=$fp_cv_dir_docbook_xsl
775 fi
776 AC_SUBST([DIR_DOCBOOK_XSL])
777 ])# FP_DIR_DOCBOOK_XSL
778
779
780 # FP_PROG_XMLLINT
781 # ----------------
782 # Sets the output variable XmllintCmd to the full path of the XSLT processor
783 # xmllint. XmllintCmd is empty if xmllint could not be found.
784 AC_DEFUN([FP_PROG_XMLLINT],
785 [AC_PATH_PROG([XmllintCmd], [xmllint])
786 if test -z "$XmllintCmd"; then
787   AC_MSG_WARN([cannot find xmllint in your PATH, you will not be able to validate your documentation])
788 fi
789 ])# FP_PROG_XMLLINT
790
791
792 # FP_CHECK_DOCBOOK_DTD
793 # --------------------
794 AC_DEFUN([FP_CHECK_DOCBOOK_DTD],
795 [AC_REQUIRE([FP_PROG_XMLLINT])dnl
796 if test -n "$XmllintCmd"; then
797   AC_MSG_CHECKING([for DocBook DTD])
798   FP_GEN_DOCBOOK_XML
799   if $XmllintCmd --valid --noout conftest.xml > /dev/null 2>&1; then
800     AC_MSG_RESULT([ok])
801   else
802     AC_MSG_RESULT([failed])
803     AC_MSG_WARN([cannot find a DTD for DocBook XML V4.2, you will not be able to validate your documentation])
804     AC_MSG_WARN([check your XML_CATALOG_FILES environment variable and/or /etc/xml/catalog])
805   fi
806   rm -rf conftest*
807 fi
808 ])# FP_CHECK_DOCBOOK_DTD
809
810
811 # FP_GEN_FO
812 # ------------------
813 # Generates a formatting objects document in conftest.fo.
814 AC_DEFUN([FP_GEN_FO],
815 [rm -f conftest.fo
816 cat > conftest.fo << EOF
817 <?xml version="1.0"?>
818 <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
819   <fo:layout-master-set>
820     <fo:simple-page-master master-name="blank">
821       <fo:region-body/>
822     </fo:simple-page-master>
823   </fo:layout-master-set>
824   <fo:page-sequence master-reference="blank">
825     <fo:flow flow-name="xsl-region-body">
826       <fo:block>
827         Test!
828       </fo:block>
829     </fo:flow>
830   </fo:page-sequence>
831 </fo:root>
832 EOF
833 ]) # FP_GEN_FO
834
835
836 # FP_PROG_FOP
837 # -----------
838 # Set the output variable 'FopCmd' to the first working 'fop' in the current
839 # 'PATH'. Note that /usr/bin/fop is broken in SuSE 9.1 (unpatched), so try
840 # /usr/share/fop/fop.sh in that case (or no 'fop'), too.
841 AC_DEFUN([FP_PROG_FOP],
842 [AC_PATH_PROGS([FopCmd1], [fop fop.sh])
843 if test -n "$FopCmd1"; then
844   AC_CACHE_CHECK([for $FopCmd1 usability], [fp_cv_fop_usability],
845     [FP_GEN_FO
846     if "$FopCmd1" -fo conftest.fo -ps conftest.ps > /dev/null 2>&1; then
847       fp_cv_fop_usability=yes
848     else
849       fp_cv_fop_usability=no
850     fi
851     rm -rf conftest*])
852   if test x"$fp_cv_fop_usability" = xyes; then
853      FopCmd=$FopCmd1
854   fi
855 fi
856 if test -z "$FopCmd"; then
857   AC_PATH_PROGS([FopCmd2], [fop.sh], , [/usr/share/fop])
858   FopCmd=$FopCmd2
859 fi
860 AC_SUBST([FopCmd])
861 ])# FP_PROG_FOP
862
863
864 # FP_PROG_FO_PROCESSOR
865 # --------------------
866 # Try to find an FO processor. PassiveTeX output is sometimes a bit strange, so
867 # try FOP first. Sets the output variables FopCmd, XmltexCmd, DvipsCmd, and
868 # PdfxmltexCmd.
869 AC_DEFUN([FP_PROG_FO_PROCESSOR],
870 [AC_REQUIRE([FP_PROG_FOP])
871 AC_PATH_PROG([XmltexCmd], [xmltex])
872 AC_PATH_PROG([DvipsCmd], [dvips])
873 if test -z "$FopCmd"; then
874   if test -z "$XmltexCmd"; then
875     AC_MSG_WARN([cannot find an FO => DVI converter, you will not be able to build DVI or PostScript documentation])
876   else
877     if test -z "$DvipsCmd"; then
878       AC_MSG_WARN([cannot find a DVI  => PS converter, you will not be able to build PostScript documentation])
879     fi
880   fi
881   AC_PATH_PROG([PdfxmltexCmd], [pdfxmltex])
882   if test -z "$PdfxmltexCmd"; then
883     AC_MSG_WARN([cannot find an FO => PDF converter, you will not be able to build PDF documentation])
884   fi
885 elif test -z "$XmltexCmd"; then
886   AC_MSG_WARN([cannot find an FO => DVI converter, you will not be able to build DVI documentation])
887 fi
888 ])# FP_PROG_FO_PROCESSOR
889
890
891 # FP_PROG_GHC_PKG
892 # ----------------
893 # Try to find a ghc-pkg matching the ghc mentioned in the environment variable
894 # WithGhc. If the latter is unset or no matching ghc-pkg can be found, try to
895 # find a plain ghc-pkg. Sets the output variable GhcPkgCmd.
896 AC_DEFUN([FP_PROG_GHC_PKG],
897 [AC_CACHE_CHECK([for ghc-pkg matching $WithGhc], fp_cv_matching_ghc_pkg,
898 [fp_ghc_pkg_guess=`echo $WithGhc | sed 's,ghc\(@<:@^/\\@:>@*\)$,ghc-pkg\1,'`
899 if "$fp_ghc_pkg_guess" -l > /dev/null 2>&1; then
900   fp_cv_matching_ghc_pkg=$fp_ghc_pkg_guess
901 else
902   fp_cv_matching_ghc_pkg=no
903 fi])
904 if test x"$fp_cv_matching_ghc_pkg" = xno; then
905   AC_PATH_PROG([GhcPkgCmd], [ghc-pkg])
906 else
907   GhcPkgCmd=$fp_cv_matching_ghc_pkg
908 fi])# FP_PROG_GHC_PKG
909
910
911 # FP_GHC_HAS_READLINE
912 # -------------------
913 AC_DEFUN([FP_GHC_HAS_READLINE],
914 [AC_REQUIRE([FP_PROG_GHC_PKG])
915 AC_CACHE_CHECK([whether ghc has readline package], [fp_cv_ghc_has_readline],
916 [if "${GhcPkgCmd-ghc-pkg}" --show-package readline >/dev/null 2>&1; then
917   fp_cv_ghc_has_readline=yes
918 else
919   fp_cv_ghc_has_readline=no
920  fi])
921 AC_SUBST([GhcHasReadline], [`echo $fp_cv_ghc_has_readline | sed 'y/yesno/YESNO/'`])
922 ])# FP_GHC_HAS_READLINE
923
924
925 # FP_GCC_NEEDS_NO_OMIT_LFPTR
926 # --------------------------
927 # Some OSs (Mandrake Linux, in particular) configure GCC with
928 # -momit-leaf-frame-pointer on by default. If this is the case, we need to turn
929 # it off for mangling to work. The test is currently a bit crude, using only the
930 # version number of gcc. Defines HAVE_GCC_MNO_OMIT_LFPTR.
931 AC_DEFUN([FP_GCC_NEEDS_NO_OMIT_LFPTR],
932 [AC_REQUIRE([FP_HAVE_GCC])
933 AC_CACHE_CHECK([whether gcc needs -mno-omit-leaf-frame-pointer], [fp_cv_gcc_needs_no_omit_lfptr],
934 [FP_COMPARE_VERSIONS([$fp_gcc_version], [-ge], [3.2],
935   [fp_cv_gcc_needs_no_omit_lfptr=yes],
936   [fp_cv_gcc_needs_no_omit_lfptr=no])])
937 if test "$fp_cv_gcc_needs_no_omit_lfptr" = "yes"; then
938    AC_DEFINE([HAVE_GCC_MNO_OMIT_LFPTR], [1], [Define to 1 if gcc supports -mno-omit-leaf-frame-pointer.])
939 fi])# FP_GCC_NEEDS_NO_OMIT_LFPTR
940
941 # FP_GCC_HAS_NO_UNIT_AT_A_TIME
942 # --------------------------
943 AC_DEFUN([FP_GCC_HAS_NO_UNIT_AT_A_TIME],
944 [AC_REQUIRE([FP_HAVE_GCC])
945 AC_CACHE_CHECK([whether gcc has -fno-unit-at-a-time], [fp_cv_gcc_has_no_unit_at_a_time],
946 [FP_COMPARE_VERSIONS([$fp_gcc_version], [-ge], [3.4],
947   [fp_cv_gcc_has_no_unit_at_a_time=yes],
948   [fp_cv_gcc_has_no_unit_at_a_time=no])])
949 if test "$fp_cv_gcc_has_no_unit_at_a_time" = "yes"; then
950    AC_DEFINE([HAVE_GCC_HAS_NO_UNIT_AT_A_TIME], [1], [Define to 1 if gcc supports -fno-unit-at-a-time.])
951 fi])
952
953 # FP_SETUP_PROJECT_VERSION
954 # ---------------------
955 AC_DEFUN([FP_SETUP_PROJECT_VERSION],
956 [# Some renamings
957 AC_SUBST([ProjectName], [$PACKAGE_NAME])
958 AC_SUBST([ProjectVersion], [$PACKAGE_VERSION])
959
960 # Split PACKAGE_VERSION into (possibly empty) parts
961 VERSION_MAJOR=`echo $PACKAGE_VERSION | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\1'/`
962 VERSION_TMP=`echo $PACKAGE_VERSION | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\3'/`
963 VERSION_MINOR=`echo $VERSION_TMP | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\1'/`
964 ProjectPatchLevel=`echo $VERSION_TMP | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\3'/`
965
966 # Calculate project version as an integer, using 2 digits for minor version
967 case $VERSION_MINOR in
968   ?) ProjectVersionInt=${VERSION_MAJOR}0${VERSION_MINOR} ;;
969   ??) ProjectVersionInt=${VERSION_MAJOR}${VERSION_MINOR} ;;
970   *) AC_MSG_ERROR([bad minor version in $PACKAGE_VERSION]) ;;
971 esac
972 AC_SUBST([ProjectVersionInt])
973
974 # The project patchlevel is zero unless stated otherwise
975 test -z "$ProjectPatchLevel" && ProjectPatchLevel=0
976
977 # Remove dots from the patch level; this allows us to have versions like 6.4.1.20050508
978 ProjectPatchLevel=`echo $ProjectPatchLevel | sed 's/\.//'`
979
980 AC_SUBST([ProjectPatchLevel])
981 ])# FP_SETUP_PROJECT_VERSION
982
983 # LocalWords:  fi