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