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