OSDN Git Service

* gcc-interface/trans.c (build_binary_op_trapv): Avoid emitting
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / acinclude.m4
1
2 dnl
3 dnl GLIBCXX_CONDITIONAL (NAME, SHELL-TEST)
4 dnl
5 dnl Exactly like AM_CONDITIONAL, but delays evaluation of the test until the
6 dnl end of configure.  This lets tested variables be reassigned, and the
7 dnl conditional will depend on the final state of the variable.  For a simple
8 dnl example of why this is needed, see GLIBCXX_ENABLE_HOSTED.
9 dnl
10 m4_define([_m4_divert(glibcxx_diversion)], 8000)dnl
11 AC_DEFUN([GLIBCXX_CONDITIONAL], [dnl
12   m4_divert_text([glibcxx_diversion],dnl
13    AM_CONDITIONAL([$1],[$2])
14   )dnl
15 ])dnl
16 AC_DEFUN([GLIBCXX_EVALUATE_CONDITIONALS], [m4_undivert([glibcxx_diversion])])dnl
17
18
19 dnl
20 dnl Check to see what architecture and operating system we are compiling
21 dnl for.  Also, if architecture- or OS-specific flags are required for
22 dnl compilation, pick them up here.
23 dnl
24 AC_DEFUN([GLIBCXX_CHECK_HOST], [
25   . $glibcxx_srcdir/configure.host
26   AC_MSG_NOTICE([CPU config directory is $cpu_include_dir])
27   AC_MSG_NOTICE([OS config directory is $os_include_dir])
28 ])
29
30 dnl
31 dnl Initialize the rest of the library configury.  At this point we have
32 dnl variables like $host.
33 dnl
34 dnl Sets:
35 dnl  SUBDIRS
36 dnl Substs:
37 dnl  glibcxx_builddir     (absolute path)
38 dnl  glibcxx_srcdir       (absolute path)
39 dnl  toplevel_srcdir      (absolute path)
40 dnl  with_cross_host
41 dnl  with_newlib
42 dnl  with_target_subdir
43 dnl plus
44 dnl  - the variables in GLIBCXX_CHECK_HOST / configure.host
45 dnl  - default settings for all AM_CONFITIONAL test variables
46 dnl  - lots of tools, like CC and CXX
47 dnl
48 AC_DEFUN([GLIBCXX_CONFIGURE], [
49   # Keep these sync'd with the list in Makefile.am.  The first provides an
50   # expandable list at autoconf time; the second provides an expandable list
51   # (i.e., shell variable) at configure time.
52   m4_define([glibcxx_SUBDIRS],[include libmath libsupc++ src doc po testsuite])
53   SUBDIRS='glibcxx_SUBDIRS'
54
55   # These need to be absolute paths, yet at the same time need to
56   # canonicalize only relative paths, because then amd will not unmount
57   # drives. Thus the use of PWDCMD: set it to 'pawd' or 'amq -w' if using amd.
58   glibcxx_builddir=`${PWDCMD-pwd}`
59   case $srcdir in
60     [\\/$]* | ?:[\\/]*) glibcxx_srcdir=${srcdir} ;;
61     *) glibcxx_srcdir=`cd "$srcdir" && ${PWDCMD-pwd} || echo "$srcdir"` ;;
62   esac
63   toplevel_srcdir=${glibcxx_srcdir}/..
64   AC_SUBST(glibcxx_builddir)
65   AC_SUBST(glibcxx_srcdir)
66   AC_SUBST(toplevel_srcdir)
67
68   # We use these options to decide which functions to include.  They are
69   # set from the top level.
70   AC_ARG_WITH([target-subdir],
71     AC_HELP_STRING([--with-target-subdir=SUBDIR],
72                    [configuring in a subdirectory]))
73
74   AC_ARG_WITH([cross-host],
75     AC_HELP_STRING([--with-cross-host=HOST],
76                    [configuring with a cross compiler]))
77
78   AC_ARG_WITH([newlib],
79     AC_HELP_STRING([--with-newlib],
80                    [assume newlib as a system C library]))
81
82   # We're almost certainly being configured before anything else which uses
83   # C++, so all of our AC_PROG_* discoveries will be cached.  It's vital that
84   # we not cache the value of CXX that we "discover" here, because it's set
85   # to something unique for us and libjava.  Other target libraries need to
86   # find CXX for themselves.  We yank the rug out from under the normal AC_*
87   # process by sneakily renaming the cache variable.  This also lets us debug
88   # the value of "our" CXX in postmortems.
89   #
90   # We must also force CXX to /not/ be a precious variable, otherwise the
91   # wrong (non-multilib-adjusted) value will be used in multilibs.  This
92   # little trick also affects CPPFLAGS, CXXFLAGS, and LDFLAGS.  And as a side
93   # effect, CXXFLAGS is no longer automagically subst'd, so we have to do
94   # that ourselves.  Un-preciousing AC_PROG_CC also affects CC and CFLAGS.
95   #
96   # -fno-builtin must be present here so that a non-conflicting form of
97   # std::exit can be guessed by AC_PROG_CXX, and used in later tests.
98
99   m4_define([ac_cv_prog_CXX],[glibcxx_cv_prog_CXX])
100   m4_rename([_AC_ARG_VAR_PRECIOUS],[glibcxx_PRECIOUS])
101   m4_define([_AC_ARG_VAR_PRECIOUS],[])
102   save_CXXFLAGS="$CXXFLAGS"
103   CXXFLAGS="$CXXFLAGS -fno-builtin"
104   AC_PROG_CC
105   AC_PROG_CXX
106   CXXFLAGS="$save_CXXFLAGS"
107   m4_rename([glibcxx_PRECIOUS],[_AC_ARG_VAR_PRECIOUS])
108   AC_SUBST(CFLAGS)
109   AC_SUBST(CXXFLAGS)
110
111   # Will set LN_S to either 'ln -s', 'ln', or 'cp -p' (if linking isn't
112   # available).  Uncomment the next line to force a particular method.
113   AC_PROG_LN_S
114   #LN_S='cp -p'
115
116   AC_CHECK_TOOL(AS, as)
117   AC_CHECK_TOOL(AR, ar)
118   AC_CHECK_TOOL(RANLIB, ranlib, ranlib-not-found-in-path-error)
119
120   AM_MAINTAINER_MODE
121
122   # Set up safe default values for all subsequent AM_CONDITIONAL tests
123   # which are themselves conditionally expanded.
124   ## (Right now, this only matters for enable_wchar_t, but nothing prevents
125   ## other macros from doing the same.  This should be automated.)  -pme
126   need_libmath=no
127
128   # Check for uClibc since Linux platforms use different configuration
129   # directories depending on the C library in use.
130   AC_EGREP_CPP([_using_uclibc], [
131   #include <stdio.h>
132   #if __UCLIBC__
133     _using_uclibc
134   #endif
135   ], uclibc=yes, uclibc=no)
136
137   # Find platform-specific directories containing configuration info.
138   # Also possibly modify flags used elsewhere, as needed by the platform.
139   GLIBCXX_CHECK_HOST
140 ])
141
142
143 dnl
144 dnl Tests for newer compiler features, or features that are present in newer
145 dnl compiler versions but not older compiler versions still in use, should
146 dnl be placed here.
147 dnl
148 dnl Defines:
149 dnl  WERROR='-Werror' if requested and possible; g++'s that lack the
150 dnl   new inlining code or the new system_header pragma will die on -Werror.
151 dnl   Leave it out by default and use maint-mode to use it.
152 dnl  SECTION_FLAGS='-ffunction-sections -fdata-sections' if
153 dnl   compiler supports it and the user has not requested debug mode.
154 dnl
155 AC_DEFUN([GLIBCXX_CHECK_COMPILER_FEATURES], [
156   # All these tests are for C++; save the language and the compiler flags.
157   # The CXXFLAGS thing is suspicious, but based on similar bits previously
158   # found in GLIBCXX_CONFIGURE.
159   AC_LANG_SAVE
160   AC_LANG_CPLUSPLUS
161   ac_test_CXXFLAGS="${CXXFLAGS+set}"
162   ac_save_CXXFLAGS="$CXXFLAGS"
163
164   # Check for maintainer-mode bits.
165   if test x"$USE_MAINTAINER_MODE" = xno; then
166     WERROR=''
167   else
168     WERROR='-Werror'
169   fi
170
171   # Check for -ffunction-sections -fdata-sections
172   AC_MSG_CHECKING([for g++ that supports -ffunction-sections -fdata-sections])
173   CXXFLAGS='-g -Werror -ffunction-sections -fdata-sections'
174   AC_TRY_COMPILE([int foo; void bar() { };],, [ac_fdsections=yes], [ac_fdsections=no])
175   if test "$ac_test_CXXFLAGS" = set; then
176     CXXFLAGS="$ac_save_CXXFLAGS"
177   else
178     # this is the suspicious part
179     CXXFLAGS=''
180   fi
181   if test x"$ac_fdsections" = x"yes"; then
182     SECTION_FLAGS='-ffunction-sections -fdata-sections'
183   fi
184   AC_MSG_RESULT($ac_fdsections)
185
186   AC_LANG_RESTORE
187   AC_SUBST(WERROR)
188   AC_SUBST(SECTION_FLAGS)
189 ])
190
191
192 dnl
193 dnl If GNU ld is in use, check to see if tricky linker opts can be used.  If
194 dnl the native linker is in use, all variables will be defined to something
195 dnl safe (like an empty string).
196 dnl
197 dnl Defines:
198 dnl  SECTION_LDFLAGS='-Wl,--gc-sections' if possible
199 dnl  OPT_LDFLAGS='-Wl,-O1' and '-z,relro' if possible
200 dnl  LD (as a side effect of testing)
201 dnl Sets:
202 dnl  with_gnu_ld
203 dnl  glibcxx_ld_is_gold (set to "no" or "yes")
204 dnl  glibcxx_gnu_ld_version (possibly)
205 dnl
206 dnl The last will be a single integer, e.g., version 1.23.45.0.67.89 will
207 dnl set glibcxx_gnu_ld_version to 12345.  Zeros cause problems.
208 dnl
209 AC_DEFUN([GLIBCXX_CHECK_LINKER_FEATURES], [
210   # If we're not using GNU ld, then there's no point in even trying these
211   # tests.  Check for that first.  We should have already tested for gld
212   # by now (in libtool), but require it now just to be safe...
213   test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS=''
214   test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''
215   AC_REQUIRE([AC_PROG_LD])
216   AC_REQUIRE([AC_PROG_AWK])
217
218   # The name set by libtool depends on the version of libtool.  Shame on us
219   # for depending on an impl detail, but c'est la vie.  Older versions used
220   # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
221   # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
222   # makes sense).  We'll test with_gnu_ld everywhere else, so if that isn't
223   # set (hence we're using an older libtool), then set it.
224   if test x${with_gnu_ld+set} != xset; then
225     if test x${ac_cv_prog_gnu_ld+set} != xset; then
226       # We got through "ac_require(ac_prog_ld)" and still not set?  Huh?
227       with_gnu_ld=no
228     else
229       with_gnu_ld=$ac_cv_prog_gnu_ld
230     fi
231   fi
232
233   # Start by getting the version number.  I think the libtool test already
234   # does some of this, but throws away the result.
235   glibcxx_ld_is_gold=no
236   if test x"$with_gnu_ld" = x"yes"; then
237     AC_MSG_CHECKING([for ld version])
238     changequote(,)
239     if $LD --version 2>/dev/null | grep 'GNU gold' >/dev/null 2>&1; then
240       glibcxx_ld_is_gold=yes
241     fi
242     ldver=`$LD --version 2>/dev/null | head -1 | \
243            sed -e 's/GNU \(go\)\{0,1\}ld \(version \)\{0,1\}\(([^)]*) \)\{0,1\}\([0-9.][0-9.]*\).*/\4/'`
244     changequote([,])
245     glibcxx_gnu_ld_version=`echo $ldver | \
246            $AWK -F. '{ if (NF<3) [$]3=0; print ([$]1*100+[$]2)*100+[$]3 }'`
247     AC_MSG_RESULT($glibcxx_gnu_ld_version)
248   fi
249
250   # Set --gc-sections.
251   glibcxx_have_gc_sections=no
252   if test "$glibcxx_ld_is_gold" = "yes"; then
253     if $LD --help 2>/dev/null | grep gc-sections >/dev/null 2>&1; then
254       glibcxx_have_gc_sections=yes
255     fi
256   else
257     glibcxx_gcsections_min_ld=21602
258     if test x"$with_gnu_ld" = x"yes" && 
259         test $glibcxx_gnu_ld_version -gt $glibcxx_gcsections_min_ld ; then
260       glibcxx_have_gc_sections=yes
261     fi
262   fi
263   if test "$glibcxx_have_gc_sections" = "yes"; then
264     # Sufficiently young GNU ld it is!  Joy and bunny rabbits!
265     # NB: This flag only works reliably after 2.16.1. Configure tests
266     # for this are difficult, so hard wire a value that should work.
267
268     ac_test_CFLAGS="${CFLAGS+set}"
269     ac_save_CFLAGS="$CFLAGS"
270     CFLAGS='-Wl,--gc-sections'
271
272     # Check for -Wl,--gc-sections
273     AC_MSG_CHECKING([for ld that supports -Wl,--gc-sections])
274     AC_TRY_LINK([ int one(void) { return 1; }
275      int two(void) { return 2; }
276         ], [ two(); ] , [ac_gcsections=yes], [ac_gcsections=no])
277     if test "$ac_gcsections" = "yes"; then
278       rm -f conftest.c
279       touch conftest.c
280       if $CC -c conftest.c; then
281         if $LD --gc-sections -o conftest conftest.o 2>&1 | \
282            grep "Warning: gc-sections option ignored" > /dev/null; then
283           ac_gcsections=no
284         fi
285       fi
286       rm -f conftest.c conftest.o conftest
287     fi
288     if test "$ac_gcsections" = "yes"; then
289       SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS"
290     fi
291     AC_MSG_RESULT($ac_gcsections)
292
293     if test "$ac_test_CFLAGS" = set; then
294       CFLAGS="$ac_save_CFLAGS"
295     else
296       # this is the suspicious part
297       CFLAGS=''
298     fi
299   fi
300
301   # Set -z,relro.
302   # Note this is only for shared objects.
303   ac_ld_relro=no
304   if test x"$with_gnu_ld" = x"yes"; then
305     AC_MSG_CHECKING([for ld that supports -Wl,-z,relro])
306     cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"`
307     if test -n "$cxx_z_relo"; then
308       OPT_LDFLAGS="-Wl,-z,relro"
309       ac_ld_relro=yes
310     fi
311     AC_MSG_RESULT($ac_ld_relro)
312   fi
313
314   # Set linker optimization flags.
315   if test x"$with_gnu_ld" = x"yes"; then
316     OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
317   fi
318
319   AC_SUBST(SECTION_LDFLAGS)
320   AC_SUBST(OPT_LDFLAGS)
321 ])
322
323
324 dnl
325 dnl Check for headers for, and arguments to, the setrlimit() function.
326 dnl Used only in testsuite_hooks.h.  Called from GLIBCXX_CONFIGURE_TESTSUITE.
327 dnl
328 dnl Defines:
329 dnl  _GLIBCXX_RES_LIMITS if we can set artificial resource limits 
330 dnl  various HAVE_LIMIT_* for individual limit names
331 dnl
332 AC_DEFUN([GLIBCXX_CHECK_SETRLIMIT_ancilliary], [
333   AC_MSG_CHECKING([for RLIMIT_$1])
334   AC_TRY_COMPILE(
335     [#include <unistd.h>
336      #include <sys/time.h>
337      #include <sys/resource.h>
338     ],
339     [ int f = RLIMIT_$1 ; ],
340     [glibcxx_mresult=1], [glibcxx_mresult=0])
341   AC_DEFINE_UNQUOTED(HAVE_LIMIT_$1, $glibcxx_mresult,
342                      [Only used in build directory testsuite_hooks.h.])
343   if test $glibcxx_mresult = 1 ; then res=yes ; else res=no ; fi
344   AC_MSG_RESULT($res)
345 ])
346
347 AC_DEFUN([GLIBCXX_CHECK_SETRLIMIT], [
348   setrlimit_have_headers=yes
349   AC_CHECK_HEADERS(unistd.h sys/time.h sys/resource.h,
350                    [],
351                    [setrlimit_have_headers=no])
352   # If don't have the headers, then we can't run the tests now, and we
353   # won't be seeing any of these during testsuite compilation.
354   if test $setrlimit_have_headers = yes; then
355     # Can't do these in a loop, else the resulting syntax is wrong.
356     GLIBCXX_CHECK_SETRLIMIT_ancilliary(DATA)
357     GLIBCXX_CHECK_SETRLIMIT_ancilliary(RSS)
358     GLIBCXX_CHECK_SETRLIMIT_ancilliary(VMEM)
359     GLIBCXX_CHECK_SETRLIMIT_ancilliary(AS)
360     GLIBCXX_CHECK_SETRLIMIT_ancilliary(FSIZE)
361
362     # Check for rlimit, setrlimit.
363     AC_CACHE_VAL(glibcxx_cv_setrlimit, [
364       AC_TRY_COMPILE(
365         [#include <unistd.h>
366          #include <sys/time.h>
367          #include <sys/resource.h>
368         ],
369         [struct rlimit r;
370          setrlimit(0, &r);],
371         [glibcxx_cv_setrlimit=yes], [glibcxx_cv_setrlimit=no])
372     ])
373   fi
374
375   AC_MSG_CHECKING([for testsuite resource limits support])
376   if test $setrlimit_have_headers = yes && test $glibcxx_cv_setrlimit = yes; then
377     ac_res_limits=yes
378     AC_DEFINE(_GLIBCXX_RES_LIMITS, 1,
379               [Define if using setrlimit to set resource limits during
380               "make check"])
381   else
382     ac_res_limits=no
383   fi
384   AC_MSG_RESULT($ac_res_limits)
385 ])
386
387
388 dnl
389 dnl Check whether S_ISREG (Posix) or S_IFREG is available in <sys/stat.h>.
390 dnl Define HAVE_S_ISREG / HAVE_S_IFREG appropriately.
391 dnl
392 AC_DEFUN([GLIBCXX_CHECK_S_ISREG_OR_S_IFREG], [
393
394   AC_LANG_SAVE
395   AC_LANG_CPLUSPLUS
396   ac_save_CXXFLAGS="$CXXFLAGS"
397   CXXFLAGS="$CXXFLAGS -fno-exceptions"
398
399   AC_MSG_CHECKING([for S_ISREG or S_IFREG])
400   AC_CACHE_VAL(glibcxx_cv_S_ISREG, [
401     GCC_TRY_COMPILE_OR_LINK(
402       [#include <sys/stat.h>],
403       [struct stat buffer;
404        fstat(0, &buffer);
405        S_ISREG(buffer.st_mode);],
406       [glibcxx_cv_S_ISREG=yes],
407       [glibcxx_cv_S_ISREG=no])
408   ])
409   AC_CACHE_VAL(glibcxx_cv_S_IFREG, [
410     GCC_TRY_COMPILE_OR_LINK(
411       [#include <sys/stat.h>],
412       [struct stat buffer;
413        fstat(0, &buffer);
414        S_IFREG & buffer.st_mode;],
415       [glibcxx_cv_S_IFREG=yes],
416       [glibcxx_cv_S_IFREG=no])
417   ])
418   res=no
419   if test $glibcxx_cv_S_ISREG = yes; then
420     AC_DEFINE(HAVE_S_ISREG, 1, 
421               [Define if S_IFREG is available in <sys/stat.h>.])
422     res=S_ISREG
423   elif test $glibcxx_cv_S_IFREG = yes; then
424     AC_DEFINE(HAVE_S_IFREG, 1,
425               [Define if S_IFREG is available in <sys/stat.h>.])
426     res=S_IFREG
427   fi
428   AC_MSG_RESULT($res)
429
430   CXXFLAGS="$ac_save_CXXFLAGS"
431   AC_LANG_RESTORE
432 ])
433
434
435 dnl
436 dnl Check whether poll is available in <poll.h>, and define HAVE_POLL.
437 dnl
438 AC_DEFUN([GLIBCXX_CHECK_POLL], [
439
440   AC_LANG_SAVE
441   AC_LANG_CPLUSPLUS
442   ac_save_CXXFLAGS="$CXXFLAGS"
443   CXXFLAGS="$CXXFLAGS -fno-exceptions"
444
445   AC_MSG_CHECKING([for poll])
446   AC_CACHE_VAL(glibcxx_cv_POLL, [
447     GCC_TRY_COMPILE_OR_LINK(
448       [#include <poll.h>],
449       [struct pollfd pfd[1];
450        pfd[0].events = POLLIN;
451        poll(pfd, 1, 0);],
452       [glibcxx_cv_POLL=yes],
453       [glibcxx_cv_POLL=no])
454   ])
455   if test $glibcxx_cv_POLL = yes; then
456     AC_DEFINE(HAVE_POLL, 1, [Define if poll is available in <poll.h>.])
457   fi
458   AC_MSG_RESULT($glibcxx_cv_POLL)
459
460   CXXFLAGS="$ac_save_CXXFLAGS"
461   AC_LANG_RESTORE
462 ])
463
464
465 dnl
466 dnl Check whether writev is available in <sys/uio.h>, and define HAVE_WRITEV.
467 dnl
468 AC_DEFUN([GLIBCXX_CHECK_WRITEV], [
469
470   AC_LANG_SAVE
471   AC_LANG_CPLUSPLUS
472   ac_save_CXXFLAGS="$CXXFLAGS"
473   CXXFLAGS="$CXXFLAGS -fno-exceptions"
474
475   AC_MSG_CHECKING([for writev])
476   AC_CACHE_VAL(glibcxx_cv_WRITEV, [
477     GCC_TRY_COMPILE_OR_LINK(
478       [#include <sys/uio.h>],
479       [struct iovec iov[2];
480        writev(0, iov, 0);],
481       [glibcxx_cv_WRITEV=yes],
482       [glibcxx_cv_WRITEV=no])
483   ])
484   if test $glibcxx_cv_WRITEV = yes; then
485     AC_DEFINE(HAVE_WRITEV, 1, [Define if writev is available in <sys/uio.h>.])
486   fi
487   AC_MSG_RESULT($glibcxx_cv_WRITEV)
488
489   CXXFLAGS="$ac_save_CXXFLAGS"
490   AC_LANG_RESTORE
491 ])
492
493
494 dnl
495 dnl Check whether int64_t is available in <stdint.h>, and define HAVE_INT64_T.
496 dnl Also check whether int64_t is actually a typedef to long or long long.
497 dnl
498 AC_DEFUN([GLIBCXX_CHECK_INT64_T], [
499
500   AC_LANG_SAVE
501   AC_LANG_CPLUSPLUS
502
503   AC_MSG_CHECKING([for int64_t])
504   AC_CACHE_VAL(glibcxx_cv_INT64_T, [
505     AC_TRY_COMPILE(
506       [#include <stdint.h>],
507       [int64_t var;],
508       [glibcxx_cv_INT64_T=yes],
509       [glibcxx_cv_INT64_T=no])
510   ])
511
512   if test $glibcxx_cv_INT64_T = yes; then
513     AC_DEFINE(HAVE_INT64_T, 1, [Define if int64_t is available in <stdint.h>.])
514     AC_MSG_RESULT($glibcxx_cv_INT64_T)
515
516     AC_MSG_CHECKING([for int64_t as long])
517     AC_CACHE_VAL(glibcxx_cv_int64_t_long, [
518       AC_TRY_COMPILE(
519         [#include <stdint.h>
520         template<typename, typename> struct same { enum { value = -1 }; };
521         template<typename Tp> struct same<Tp, Tp> { enum { value = 1 }; };
522         int array[same<int64_t, long>::value];], [],
523         [glibcxx_cv_int64_t_long=yes], [glibcxx_cv_int64_t_long=no])
524     ])
525
526     if test $glibcxx_cv_int64_t_long = yes; then
527       AC_DEFINE(HAVE_INT64_T_LONG, 1, [Define if int64_t is a long.])
528       AC_MSG_RESULT($glibcxx_cv_int64_t_long)
529     fi
530
531     AC_MSG_CHECKING([for int64_t as long long])
532     AC_CACHE_VAL(glibcxx_cv_int64_t_long_long, [
533       AC_TRY_COMPILE(
534         [#include <stdint.h>
535         template<typename, typename> struct same { enum { value = -1 }; };
536         template<typename Tp> struct same<Tp, Tp> { enum { value = 1 }; };
537         int array[same<int64_t, long long>::value];], [],
538         [glibcxx_cv_int64_t_long_long=yes], [glibcxx_cv_int64_t_long_long=no])
539     ])
540
541     if test $glibcxx_cv_int64_t_long_long = yes; then
542       AC_DEFINE(HAVE_INT64_T_LONG_LONG, 1, [Define if int64_t is a long long.])
543       AC_MSG_RESULT($glibcxx_cv_int64_t_long_long)
544     fi
545   fi
546
547   AC_LANG_RESTORE
548 ])
549
550
551 dnl
552 dnl Check whether LFS support is available.
553 dnl
554 AC_DEFUN([GLIBCXX_CHECK_LFS], [
555   AC_LANG_SAVE
556   AC_LANG_CPLUSPLUS
557   ac_save_CXXFLAGS="$CXXFLAGS"
558   CXXFLAGS="$CXXFLAGS -fno-exceptions"  
559   AC_MSG_CHECKING([for LFS support])
560   AC_CACHE_VAL(glibcxx_cv_LFS, [
561     GCC_TRY_COMPILE_OR_LINK(
562       [#include <unistd.h>
563        #include <stdio.h>
564        #include <sys/stat.h>
565       ],
566       [FILE* fp;
567        fopen64("t", "w");
568        fseeko64(fp, 0, SEEK_CUR);
569        ftello64(fp);
570        lseek64(1, 0, SEEK_CUR);
571        struct stat64 buf;
572        fstat64(1, &buf);],
573       [glibcxx_cv_LFS=yes],
574       [glibcxx_cv_LFS=no])
575   ])
576   if test $glibcxx_cv_LFS = yes; then
577     AC_DEFINE(_GLIBCXX_USE_LFS, 1, [Define if LFS support is available.])
578   fi
579   AC_MSG_RESULT($glibcxx_cv_LFS)
580   CXXFLAGS="$ac_save_CXXFLAGS"
581   AC_LANG_RESTORE
582 ])
583
584
585 dnl
586 dnl Check for whether a fully dynamic basic_string implementation should
587 dnl be turned on, that does not put empty objects in per-process static
588 dnl memory (mostly useful together with shared memory allocators, see PR
589 dnl libstdc++/16612 for details).
590 dnl
591 dnl --enable-fully-dynamic-string defines _GLIBCXX_FULLY_DYNAMIC_STRING
592 dnl --disable-fully-dynamic-string leaves _GLIBCXX_FULLY_DYNAMIC_STRING undefined
593 dnl  +  Usage:  GLIBCXX_ENABLE_FULLY_DYNAMIC_STRING[(DEFAULT)]
594 dnl       Where DEFAULT is either `yes' or `no'.
595 dnl
596 AC_DEFUN([GLIBCXX_ENABLE_FULLY_DYNAMIC_STRING], [
597   GLIBCXX_ENABLE(fully-dynamic-string,$1,,[do not put empty strings in per-process static memory])
598   if test $enable_fully_dynamic_string = yes; then
599     AC_DEFINE(_GLIBCXX_FULLY_DYNAMIC_STRING, 1,
600               [Define if a fully dynamic basic_string is wanted.])
601   fi
602 ])
603
604
605 dnl
606 dnl Does any necessary configuration of the testsuite directory.  Generates
607 dnl the testsuite_hooks.h header.
608 dnl
609 dnl GLIBCXX_ENABLE_SYMVERS and GLIBCXX_IS_NATIVE must be done before this.
610 dnl
611 dnl Sets:
612 dnl  enable_abi_check 
613 dnl  GLIBCXX_TEST_WCHAR_T
614 dnl  GLIBCXX_TEST_THREAD
615 dnl Substs:
616 dnl  baseline_dir
617 dnl
618 AC_DEFUN([GLIBCXX_CONFIGURE_TESTSUITE], [
619   if $GLIBCXX_IS_NATIVE ; then
620     # Do checks for resource limit functions.
621     GLIBCXX_CHECK_SETRLIMIT
622
623     # Look for setenv, so that extended locale tests can be performed.
624     GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_3(setenv)
625   fi
626
627   if $GLIBCXX_IS_NATIVE && test $is_hosted = yes &&
628      test $enable_symvers != no; then
629     case "$host" in
630       *-*-cygwin*)
631         enable_abi_check=no ;;
632       *)
633         enable_abi_check=yes ;;
634     esac
635   else
636     # Only build this as native, since automake does not understand
637     # CXX_FOR_BUILD.
638     enable_abi_check=no
639   fi
640   
641   # Export file names for ABI checking.
642   baseline_dir="$glibcxx_srcdir/config/abi/post/${abi_baseline_pair}\$(MULTISUBDIR)"
643   AC_SUBST(baseline_dir)
644 ])
645
646
647 dnl
648 dnl Set up *_INCLUDES variables for all sundry Makefile.am's.
649 dnl
650 dnl Substs:
651 dnl  GLIBCXX_INCLUDES
652 dnl  TOPLEVEL_INCLUDES
653 dnl
654 AC_DEFUN([GLIBCXX_EXPORT_INCLUDES], [
655   # Used for every C++ compile we perform.
656   GLIBCXX_INCLUDES="\
657 -I$glibcxx_builddir/include/$host_alias \
658 -I$glibcxx_builddir/include \
659 -I$glibcxx_srcdir/libsupc++"
660
661   # For Canadian crosses, pick this up too.
662   if test $CANADIAN = yes; then
663     GLIBCXX_INCLUDES="$GLIBCXX_INCLUDES -I\${includedir}"
664   fi
665
666   # Stuff in the actual top level.  Currently only used by libsupc++ to
667   # get unwind* headers from the gcc dir.
668   #TOPLEVEL_INCLUDES='-I$(toplevel_srcdir)/gcc -I$(toplevel_srcdir)/include'
669   TOPLEVEL_INCLUDES='-I$(toplevel_srcdir)/gcc'
670
671   # Now, export this to all the little Makefiles....
672   AC_SUBST(GLIBCXX_INCLUDES)
673   AC_SUBST(TOPLEVEL_INCLUDES)
674 ])
675
676
677 dnl
678 dnl Set up *_FLAGS and *FLAGS variables for all sundry Makefile.am's.
679 dnl (SECTION_FLAGS is done under CHECK_COMPILER_FEATURES.)
680 dnl
681 dnl Substs:
682 dnl  OPTIMIZE_CXXFLAGS
683 dnl  WARN_FLAGS
684 dnl
685 AC_DEFUN([GLIBCXX_EXPORT_FLAGS], [
686   # Optimization flags that are probably a good idea for thrill-seekers. Just
687   # uncomment the lines below and make, everything else is ready to go...
688   # Alternatively OPTIMIZE_CXXFLAGS can be set in configure.host.
689   # OPTIMIZE_CXXFLAGS = -O3 -fstrict-aliasing -fvtable-gc
690   AC_SUBST(OPTIMIZE_CXXFLAGS)
691
692   WARN_FLAGS='-Wall -Wextra -Wwrite-strings -Wcast-qual'
693   AC_SUBST(WARN_FLAGS)
694 ])
695
696
697 dnl
698 dnl All installation directory information is determined here.
699 dnl
700 dnl Substs:
701 dnl  gxx_install_dir
702 dnl  glibcxx_prefixdir
703 dnl  glibcxx_toolexecdir
704 dnl  glibcxx_toolexeclibdir
705 dnl
706 dnl Assumes cross_compiling bits already done, and with_cross_host in
707 dnl particular.
708 dnl
709 dnl This logic must match gcc/configure.ac's setting of gcc_gxx_include_dir.
710 dnl config/gxx-include-dir.m4 must be kept consistant with this as well.
711 AC_DEFUN([GLIBCXX_EXPORT_INSTALL_INFO], [
712   glibcxx_toolexecdir=no
713   glibcxx_toolexeclibdir=no
714   glibcxx_prefixdir=$prefix
715
716   AC_MSG_CHECKING([for gxx-include-dir])
717   AC_ARG_WITH([gxx-include-dir],
718     AC_HELP_STRING([--with-gxx-include-dir=DIR],
719                    [installation directory for include files]),
720     [case "$withval" in
721       yes) AC_MSG_ERROR([Missing directory for --with-gxx-include-dir]) ;;
722       no)  gxx_include_dir=no ;;
723       *)   gxx_include_dir=$withval ;;
724      esac],
725     [gxx_include_dir=no])
726   AC_MSG_RESULT($gxx_include_dir)
727
728   AC_MSG_CHECKING([for --enable-version-specific-runtime-libs])
729   AC_ARG_ENABLE([version-specific-runtime-libs],
730     AC_HELP_STRING([--enable-version-specific-runtime-libs],
731                    [Specify that runtime libraries should be installed in a compiler-specific directory]),
732     [case "$enableval" in
733       yes) version_specific_libs=yes ;;
734       no)  version_specific_libs=no ;;
735       *)   AC_MSG_ERROR([Unknown argument to enable/disable version-specific libs]);;
736      esac],
737     [version_specific_libs=no])
738   AC_MSG_RESULT($version_specific_libs)
739
740   # Default case for install directory for include files.
741   if test $version_specific_libs = no && test $gxx_include_dir = no; then
742     gxx_include_dir='include/c++/${gcc_version}'
743     if test -n "$with_cross_host" && 
744        test x"$with_cross_host" != x"no"; then  
745       gxx_include_dir='${prefix}/${target_alias}/'"$gxx_include_dir"
746     else
747       gxx_include_dir='${prefix}/'"$gxx_include_dir"
748     fi
749   fi
750
751   # Version-specific runtime libs processing.
752   if test $version_specific_libs = yes; then
753     # Need the gcc compiler version to know where to install libraries
754     # and header files if --enable-version-specific-runtime-libs option
755     # is selected.  FIXME: these variables are misnamed, there are
756     # no executables installed in _toolexecdir or _toolexeclibdir.
757     if test x"$gxx_include_dir" = x"no"; then
758       gxx_include_dir='${libdir}/gcc/${host_alias}/${gcc_version}/include/c++'
759     fi
760     glibcxx_toolexecdir='${libdir}/gcc/${host_alias}'
761     glibcxx_toolexeclibdir='${toolexecdir}/${gcc_version}$(MULTISUBDIR)'
762   fi
763
764   # Calculate glibcxx_toolexecdir, glibcxx_toolexeclibdir
765   # Install a library built with a cross compiler in tooldir, not libdir.
766   if test x"$glibcxx_toolexecdir" = x"no"; then
767     if test -n "$with_cross_host" &&
768        test x"$with_cross_host" != x"no"; then
769       glibcxx_toolexecdir='${exec_prefix}/${host_alias}'
770       glibcxx_toolexeclibdir='${toolexecdir}/lib'
771     else
772       glibcxx_toolexecdir='${libdir}/gcc/${host_alias}'
773       glibcxx_toolexeclibdir='${libdir}'
774     fi
775     multi_os_directory=`$CXX -print-multi-os-directory`
776     case $multi_os_directory in
777       .) ;; # Avoid trailing /.
778       *) glibcxx_toolexeclibdir=$glibcxx_toolexeclibdir/$multi_os_directory ;;
779     esac
780   fi
781
782   AC_MSG_CHECKING([for install location])
783   AC_MSG_RESULT($gxx_include_dir)
784
785   AC_SUBST(glibcxx_prefixdir)
786   AC_SUBST(gxx_include_dir)
787   AC_SUBST(glibcxx_toolexecdir)
788   AC_SUBST(glibcxx_toolexeclibdir)
789 ])
790
791
792 dnl
793 dnl GLIBCXX_ENABLE
794 dnl    (FEATURE, DEFAULT, HELP-ARG, HELP-STRING)
795 dnl    (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, permit a|b|c)
796 dnl    (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, SHELL-CODE-HANDLER)
797 dnl
798 dnl See docs/html/17_intro/configury.html#enable for documentation.
799 dnl
800 m4_define([GLIBCXX_ENABLE],[dnl
801 m4_define([_g_switch],[--enable-$1])dnl
802 m4_define([_g_help],[AC_HELP_STRING(_g_switch$3,[$4 @<:@default=$2@:>@])])dnl
803  AC_ARG_ENABLE($1,_g_help,
804   m4_bmatch([$5],
805    [^permit ],
806      [[
807       case "$enableval" in
808        m4_bpatsubst([$5],[permit ])) ;;
809        *) AC_MSG_ERROR(Unknown argument to enable/disable $1) ;;
810           dnl Idea for future:  generate a URL pointing to
811           dnl "onlinedocs/configopts.html#whatever"
812       esac
813      ]],
814    [^$],
815      [[
816       case "$enableval" in
817        yes|no) ;;
818        *) AC_MSG_ERROR(Argument to enable/disable $1 must be yes or no) ;;
819       esac
820      ]],
821    [[$5]]),
822   [enable_]m4_bpatsubst([$1],-,_)[=][$2])
823 m4_undefine([_g_switch])dnl
824 m4_undefine([_g_help])dnl
825 ])
826
827
828 dnl
829 dnl Check for ISO/IEC 9899:1999 "C99" support.
830 dnl
831 dnl --enable-c99 defines _GLIBCXX_USE_C99
832 dnl --disable-c99 leaves _GLIBCXX_USE_C99 undefined
833 dnl  +  Usage:  GLIBCXX_ENABLE_C99[(DEFAULT)]
834 dnl       Where DEFAULT is either `yes' or `no'.
835 dnl  +  If 'C99' stuff is not available, ignores DEFAULT and sets `no'.
836 dnl
837 AC_DEFUN([GLIBCXX_ENABLE_C99], [
838   GLIBCXX_ENABLE(c99,$1,,[turns on ISO/IEC 9899:1999 support])
839
840   if test x"$enable_c99" = x"yes"; then
841
842   AC_LANG_SAVE
843   AC_LANG_CPLUSPLUS
844
845   # Use -std=c++98 because the default (-std=gnu++98) leaves __STRICT_ANSI__
846   # undefined and fake C99 facilities - like pre-standard snprintf - may be
847   # spuriously enabled.
848   # Long term, -std=c++0x could be even better, could manage to explicitely
849   # request C99 facilities to the underlying C headers.
850   ac_save_CXXFLAGS="$CXXFLAGS"
851   CXXFLAGS="$CXXFLAGS -std=c++98"
852   ac_save_LIBS="$LIBS"
853   ac_save_gcc_no_link="$gcc_no_link"
854
855   if test x$gcc_no_link != xyes; then
856     # Use -fno-exceptions to that the C driver can link these tests without
857     # hitting undefined references to personality routines.
858     CXXFLAGS="$CXXFLAGS -fno-exceptions"
859     AC_CHECK_LIB(m, sin, [
860       LIBS="$LIBS -lm"
861     ], [
862       # Use the default compile-only tests in GCC_TRY_COMPILE_OR_LINK
863       gcc_no_link=yes
864     ])
865   fi
866
867   # Check for the existence of <math.h> functions used if C99 is enabled.
868   AC_MSG_CHECKING([for ISO C99 support in <math.h>])
869   AC_CACHE_VAL(glibcxx_cv_c99_math, [
870   GCC_TRY_COMPILE_OR_LINK(
871      [#include <math.h>
872       volatile double d1, d2;
873       volatile int i;],
874      [i = fpclassify(d1);
875       i = isfinite(d1);
876       i = isinf(d1);
877       i = isnan(d1);
878       i = isnormal(d1);
879       i = signbit(d1);
880       i = isgreater(d1, d2);
881       i = isgreaterequal(d1, d2);
882       i = isless(d1, d2);
883       i = islessequal(d1, d2);
884       i = islessgreater(d1, d2);
885       i = islessgreater(d1, d2);
886       i = isunordered(d1, d2);
887      ],[glibcxx_cv_c99_math=yes], [glibcxx_cv_c99_math=no])
888   ])
889   AC_MSG_RESULT($glibcxx_cv_c99_math)
890   if test x"$glibcxx_cv_c99_math" = x"yes"; then
891     AC_DEFINE(_GLIBCXX_USE_C99_MATH, 1,
892               [Define if C99 functions or macros in <math.h> should be imported
893               in <cmath> in namespace std.])
894   fi
895
896   # Check for the existence of <complex.h> complex math functions.
897   # This is necessary even though libstdc++ uses the builtin versions
898   # of these functions, because if the builtin cannot be used, a reference
899   # to the library function is emitted.
900   AC_CHECK_HEADERS(tgmath.h, ac_has_tgmath_h=yes, ac_has_tgmath_h=no)
901   AC_CHECK_HEADERS(complex.h, ac_has_complex_h=yes, ac_has_complex_h=no)
902   glibcxx_cv_c99_complex=no;
903   if test x"$ac_has_complex_h" = x"yes"; then
904     AC_MSG_CHECKING([for ISO C99 support in <complex.h>])
905     GCC_TRY_COMPILE_OR_LINK(
906        [#include <complex.h>
907         typedef __complex__ float float_type;
908         typedef __complex__ double double_type;
909         typedef __complex__ long double ld_type;
910         volatile float_type tmpf;
911         volatile double_type tmpd;
912         volatile ld_type tmpld;
913         volatile float f;
914         volatile double d;
915         volatile long double ld;],
916        [f = cabsf(tmpf);
917         f = cargf(tmpf);
918         tmpf = ccosf(tmpf);
919         tmpf = ccoshf(tmpf);
920         tmpf = cexpf(tmpf);
921         tmpf = clogf(tmpf);
922         tmpf = csinf(tmpf);
923         tmpf = csinhf(tmpf);
924         tmpf = csqrtf(tmpf);
925         tmpf = ctanf(tmpf);
926         tmpf = ctanhf(tmpf);
927         tmpf = cpowf(tmpf, tmpf);
928         tmpf = cprojf(tmpf);
929         d = cabs(tmpd);
930         d = carg(tmpd);
931         tmpd = ccos(tmpd);
932         tmpd = ccosh(tmpd);
933         tmpd = cexp(tmpd);
934         tmpd = clog(tmpd);
935         tmpd = csin(tmpd);
936         tmpd = csinh(tmpd);
937         tmpd = csqrt(tmpd);
938         tmpd = ctan(tmpd);
939         tmpd = ctanh(tmpd);
940         tmpd = cpow(tmpd, tmpd);
941         tmpd = cproj(tmpd);
942         ld = cabsl(tmpld);
943         ld = cargl(tmpld);
944         tmpld = ccosl(tmpld);
945         tmpld = ccoshl(tmpld);
946         tmpld = cexpl(tmpld);
947         tmpld = clogl(tmpld);
948         tmpld = csinl(tmpld);
949         tmpld = csinhl(tmpld);
950         tmpld = csqrtl(tmpld);
951         tmpld = ctanl(tmpld);
952         tmpld = ctanhl(tmpld);
953         tmpld = cpowl(tmpld, tmpld);
954         tmpld = cprojl(tmpld);
955        ],[glibcxx_cv_c99_complex=yes], [glibcxx_cv_c99_complex=no])
956   fi
957   AC_MSG_RESULT($glibcxx_cv_c99_complex)
958   if test x"$glibcxx_cv_c99_complex" = x"yes"; then
959     AC_DEFINE(_GLIBCXX_USE_C99_COMPLEX, 1,
960               [Define if C99 functions in <complex.h> should be used in
961               <complex>. Using compiler builtins for these functions requires
962               corresponding C99 library functions to be present.])
963   fi
964
965   # Check for the existence in <stdio.h> of vscanf, et. al.
966   AC_MSG_CHECKING([for ISO C99 support in <stdio.h>])
967   AC_CACHE_VAL(glibcxx_cv_c99_stdio, [
968   GCC_TRY_COMPILE_OR_LINK(
969      [#include <stdio.h>
970       #include <stdarg.h>
971       void foo(char* fmt, ...)
972       {
973         va_list args; va_start(args, fmt);
974         vfscanf(stderr, "%i", args); 
975         vscanf("%i", args);
976         vsnprintf(fmt, 0, "%i", args);
977         vsscanf(fmt, "%i", args);
978       }],
979      [snprintf("12", 0, "%i");],
980      [glibcxx_cv_c99_stdio=yes], [glibcxx_cv_c99_stdio=no])
981   ])
982   AC_MSG_RESULT($glibcxx_cv_c99_stdio)
983
984   # Check for the existence in <stdlib.h> of lldiv_t, et. al.
985   AC_MSG_CHECKING([for ISO C99 support in <stdlib.h>])
986   AC_CACHE_VAL(glibcxx_cv_c99_stdlib, [
987   GCC_TRY_COMPILE_OR_LINK(
988      [#include <stdlib.h>
989       volatile float f;
990       volatile long double ld;
991       volatile unsigned long long ll;
992       lldiv_t mydivt;],
993      [char* tmp;
994       f = strtof("gnu", &tmp);
995       ld = strtold("gnu", &tmp);
996       ll = strtoll("gnu", &tmp, 10);
997       ll = strtoull("gnu", &tmp, 10);
998       ll = llabs(10);
999       mydivt = lldiv(10,1);
1000       ll = mydivt.quot;
1001       ll = mydivt.rem;
1002       ll = atoll("10");
1003       _Exit(0);
1004       ],[glibcxx_cv_c99_stdlib=yes], [glibcxx_cv_c99_stdlib=no])
1005   ])
1006   AC_MSG_RESULT($glibcxx_cv_c99_stdlib)
1007
1008   # Check for the existence in <wchar.h> of wcstold, etc.
1009   glibcxx_cv_c99_wchar=no;
1010   if test x"$ac_has_wchar_h" = xyes &&
1011      test x"$ac_has_wctype_h" = xyes; then
1012     AC_MSG_CHECKING([for ISO C99 support in <wchar.h>]) 
1013     AC_TRY_COMPILE([#include <wchar.h>
1014                     namespace test
1015                     {
1016                       using ::wcstold;
1017                       using ::wcstoll;
1018                       using ::wcstoull;
1019                     }
1020                    ],[],[glibcxx_cv_c99_wchar=yes], [glibcxx_cv_c99_wchar=no])
1021
1022     # Checks for wide character functions that may not be present.
1023     # Injection of these is wrapped with guard macros.
1024     # NB: only put functions here, instead of immediately above, if
1025     # absolutely necessary.
1026     AC_TRY_COMPILE([#include <wchar.h>
1027                     namespace test { using ::vfwscanf; } ], [],
1028                    [AC_DEFINE(HAVE_VFWSCANF,1,
1029                         [Defined if vfwscanf exists.])],[])
1030
1031     AC_TRY_COMPILE([#include <wchar.h>
1032                     namespace test { using ::vswscanf; } ], [],
1033                    [AC_DEFINE(HAVE_VSWSCANF,1,
1034                         [Defined if vswscanf exists.])],[])
1035
1036     AC_TRY_COMPILE([#include <wchar.h>
1037                     namespace test { using ::vwscanf; } ], [],
1038                    [AC_DEFINE(HAVE_VWSCANF,1,[Defined if vwscanf exists.])],[])
1039
1040     AC_TRY_COMPILE([#include <wchar.h>
1041                     namespace test { using ::wcstof; } ], [],
1042                    [AC_DEFINE(HAVE_WCSTOF,1,[Defined if wcstof exists.])],[])
1043
1044     AC_TRY_COMPILE([#include <wctype.h>],
1045                    [ wint_t t; int i = iswblank(t);], 
1046                    [AC_DEFINE(HAVE_ISWBLANK,1,
1047                         [Defined if iswblank exists.])],[])
1048
1049     AC_MSG_RESULT($glibcxx_cv_c99_wchar)
1050   fi
1051
1052   # Option parsed, now set things appropriately.
1053   if test x"$glibcxx_cv_c99_math" = x"no" ||
1054      test x"$glibcxx_cv_c99_complex" = x"no" ||
1055      test x"$glibcxx_cv_c99_stdio" = x"no" ||
1056      test x"$glibcxx_cv_c99_stdlib" = x"no" ||
1057      test x"$glibcxx_cv_c99_wchar" = x"no"; then
1058     enable_c99=no;
1059   else
1060     AC_DEFINE(_GLIBCXX_USE_C99, 1,
1061     [Define if C99 functions or macros from <wchar.h>, <math.h>,
1062     <complex.h>, <stdio.h>, and <stdlib.h> can be used or exposed.])
1063   fi
1064
1065   gcc_no_link="$ac_save_gcc_no_link"
1066   LIBS="$ac_save_LIBS"
1067   CXXFLAGS="$ac_save_CXXFLAGS"
1068   AC_LANG_RESTORE
1069   fi    
1070
1071   AC_MSG_CHECKING([for fully enabled ISO C99 support])
1072   AC_MSG_RESULT($enable_c99)
1073 ])
1074
1075
1076 dnl
1077 dnl Check for clock_gettime clocks, used in the implementation of 20.8.5
1078 dnl [time.clock] in the current C++0x working draft.
1079 dnl
1080 dnl --enable-clock-gettime
1081 dnl --enable-clock-gettime=yes
1082 dnl        checks for the availability of monotonic and realtime clocks
1083 dnl        in libc and libposix4 and in case links the latter
1084 dnl --enable-clock-gettime=rt
1085 dnl        also searches (and, in case, links) librt.  Note that this is
1086 dnl        not always desirable because, in glibc, for example, in turn it
1087 dnl        triggers the linking of libpthread too, which activates locking,
1088 dnl        a large overhead for single-thread programs.
1089 dnl --enable-clock-gettime=no
1090 dnl --disable-clock-gettime
1091 dnl        disables the checks completely
1092 dnl
1093 AC_DEFUN([GLIBCXX_ENABLE_CLOCK_GETTIME], [
1094
1095   AC_MSG_CHECKING([for clock_gettime clocks])                                    
1096   GLIBCXX_ENABLE(clock-gettime,$1,[=KIND],
1097     [use KIND for check type],
1098     [permit yes|no|rt])
1099
1100   AC_LANG_SAVE
1101   AC_LANG_CPLUSPLUS
1102   ac_save_CXXFLAGS="$CXXFLAGS"
1103   CXXFLAGS="$CXXFLAGS -fno-exceptions"
1104   ac_save_LIBS="$LIBS"
1105
1106   ac_has_clock_monotonic=no;  
1107   ac_has_clock_realtime=no;
1108
1109   if test x"$enable_clock_gettime" != x"no"; then
1110
1111     if test x"$enable_clock_gettime" = x"rt"; then
1112       AC_SEARCH_LIBS(clock_gettime, [rt posix4])
1113     else
1114       AC_SEARCH_LIBS(clock_gettime, [posix4])
1115     fi
1116
1117     case "$ac_cv_search_clock_gettime" in
1118       -l*) GLIBCXX_LIBS=$ac_cv_search_clock_gettime
1119     esac
1120
1121     AC_CHECK_HEADERS(unistd.h, ac_has_unistd_h=yes, ac_has_unistd_h=no)
1122
1123     if test x"$ac_has_unistd_h" = x"yes"; then
1124       AC_MSG_CHECKING([for monotonic clock])
1125       AC_TRY_LINK(
1126         [#include <unistd.h>
1127          #include <time.h>
1128         ],
1129         [#if _POSIX_TIMERS > 0 && defined(_POSIX_MONOTONIC_CLOCK)
1130           timespec tp;     
1131          #endif
1132           clock_gettime(CLOCK_MONOTONIC, &tp);
1133         ], [ac_has_clock_monotonic=yes], [ac_has_clock_monotonic=no])
1134
1135       AC_MSG_RESULT($ac_has_clock_monotonic)   
1136     
1137       AC_MSG_CHECKING([for realtime clock])
1138       AC_TRY_LINK(
1139         [#include <unistd.h>
1140          #include <time.h>
1141         ],
1142         [#if _POSIX_TIMERS > 0
1143           timespec tp;      
1144          #endif
1145           clock_gettime(CLOCK_REALTIME, &tp);
1146         ], [ac_has_clock_realtime=yes], [ac_has_clock_realtime=no])
1147
1148       AC_MSG_RESULT($ac_has_clock_realtime)
1149     fi
1150
1151   fi
1152
1153   if test x"$ac_has_clock_monotonic" = x"yes"; then
1154     AC_DEFINE(_GLIBCXX_USE_CLOCK_MONOTONIC, 1,
1155       [ Defined if clock_gettime has monotonic clock support. ])
1156   fi
1157
1158   if test x"$ac_has_clock_realtime" = x"yes"; then
1159     AC_DEFINE(_GLIBCXX_USE_CLOCK_REALTIME, 1,
1160       [ Defined if clock_gettime has realtime clock support. ])
1161   fi
1162
1163   AC_SUBST(GLIBCXX_LIBS)
1164
1165   CXXFLAGS="$ac_save_CXXFLAGS"
1166   LIBS="$ac_save_LIBS"
1167   AC_LANG_RESTORE
1168 ])
1169
1170 dnl
1171 dnl Check for gettimeofday, used in the implementation of 20.8.5
1172 dnl [time.clock] in the current C++0x working draft.
1173 dnl
1174 AC_DEFUN([GLIBCXX_CHECK_GETTIMEOFDAY], [
1175   
1176   AC_MSG_CHECKING([for gettimeofday])
1177
1178   AC_LANG_SAVE
1179   AC_LANG_CPLUSPLUS
1180   ac_save_CXXFLAGS="$CXXFLAGS"
1181   CXXFLAGS="$CXXFLAGS -fno-exceptions"
1182   
1183   ac_has_gettimeofday=no;
1184   AC_CHECK_HEADERS(sys/time.h, ac_has_sys_time_h=yes, ac_has_sys_time_h=no)
1185   if test x"$ac_has_sys_time_h" = x"yes"; then
1186     AC_MSG_CHECKING([for gettimeofday])
1187     GCC_TRY_COMPILE_OR_LINK([#include <sys/time.h>],
1188       [timeval tv; gettimeofday(&tv, 0);],
1189       [ac_has_gettimeofday=yes], [ac_has_gettimeofday=no])
1190     
1191     AC_MSG_RESULT($ac_has_gettimeofday)
1192   fi
1193   
1194   if test x"$ac_has_gettimeofday" = x"yes"; then
1195     AC_DEFINE(_GLIBCXX_USE_GETTIMEOFDAY, 1,
1196       [ Defined if gettimeofday is available. ])
1197   fi
1198   
1199   CXXFLAGS="$ac_save_CXXFLAGS"
1200   AC_LANG_RESTORE
1201 ])
1202
1203 dnl
1204 dnl Check for nanosleep, used in the implementation of 30.2.2
1205 dnl [thread.thread.this] in the current C++0x working draft.
1206 dnl
1207 AC_DEFUN([GLIBCXX_CHECK_NANOSLEEP], [
1208
1209   AC_MSG_CHECKING([for nanosleep])
1210
1211   AC_LANG_SAVE
1212   AC_LANG_CPLUSPLUS
1213   ac_save_CXXFLAGS="$CXXFLAGS"
1214   CXXFLAGS="$CXXFLAGS -fno-exceptions"
1215
1216   ac_has_nanosleep=no;
1217   AC_CHECK_HEADERS(time.h, ac_has_time_h=yes, ac_has_time_h=no)
1218   if test x"$ac_has_time_h" = x"yes"; then
1219     AC_MSG_CHECKING([for nanosleep])
1220     AC_TRY_COMPILE([#include <time.h>],                                                                                                         
1221       [timespec ts; nanosleep(&ts, 0);],
1222       [ac_has_nanosleep=yes], [ac_has_nanosleep=no])
1223
1224     AC_MSG_RESULT($ac_has_nanosleep)
1225   fi
1226
1227   if test x"$ac_has_nanosleep" = x"yes"; then
1228     AC_DEFINE(_GLIBCXX_USE_NANOSLEEP, 1,
1229       [ Defined if nanosleep is available. ])
1230   fi
1231
1232   CXXFLAGS="$ac_save_CXXFLAGS"
1233   AC_LANG_RESTORE
1234 ])
1235
1236 dnl
1237 dnl Check for ISO/IEC 9899:1999 "C99" support to ISO/IEC DTR 19768 "TR1"
1238 dnl facilities in Chapter 8, "C compatibility".
1239 dnl
1240 AC_DEFUN([GLIBCXX_CHECK_C99_TR1], [
1241
1242   AC_LANG_SAVE
1243   AC_LANG_CPLUSPLUS
1244
1245   # Use -std=c++98 because the default (-std=gnu++98) leaves __STRICT_ANSI__
1246   # undefined and fake C99 facilities may be spuriously enabled.
1247   ac_save_CXXFLAGS="$CXXFLAGS"
1248   CXXFLAGS="$CXXFLAGS -std=c++98"
1249
1250   # Check for the existence of <complex.h> complex math functions used
1251   # by tr1/complex.
1252   AC_CHECK_HEADERS(complex.h, ac_has_complex_h=yes, ac_has_complex_h=no)
1253   ac_c99_complex_tr1=no;
1254   if test x"$ac_has_complex_h" = x"yes"; then
1255     AC_MSG_CHECKING([for ISO C99 support to TR1 in <complex.h>])
1256     AC_TRY_COMPILE([#include <complex.h>],
1257                    [typedef __complex__ float float_type; float_type tmpf;
1258                     cacosf(tmpf);
1259                     casinf(tmpf);
1260                     catanf(tmpf);
1261                     cacoshf(tmpf);
1262                     casinhf(tmpf);
1263                     catanhf(tmpf);
1264                     typedef __complex__ double double_type; double_type tmpd;
1265                     cacos(tmpd);
1266                     casin(tmpd);
1267                     catan(tmpd);
1268                     cacosh(tmpd);
1269                     casinh(tmpd);
1270                     catanh(tmpd);
1271                     typedef __complex__ long double ld_type; ld_type tmpld;
1272                     cacosl(tmpld);
1273                     casinl(tmpld);
1274                     catanl(tmpld);
1275                     cacoshl(tmpld);
1276                     casinhl(tmpld);
1277                     catanhl(tmpld);
1278                    ],[ac_c99_complex_tr1=yes], [ac_c99_complex_tr1=no])
1279   fi
1280   AC_MSG_RESULT($ac_c99_complex_tr1)
1281   if test x"$ac_c99_complex_tr1" = x"yes"; then
1282     AC_DEFINE(_GLIBCXX_USE_C99_COMPLEX_TR1, 1,
1283               [Define if C99 functions in <complex.h> should be used in
1284               <tr1/complex>. Using compiler builtins for these functions
1285               requires corresponding C99 library functions to be present.])
1286   fi
1287
1288   # Check for the existence of <ctype.h> functions.
1289   AC_MSG_CHECKING([for ISO C99 support to TR1 in <ctype.h>])
1290   AC_CACHE_VAL(glibcxx_cv_c99_ctype_tr1, [
1291   AC_TRY_COMPILE([#include <ctype.h>],
1292                  [int ch;
1293                   int ret;
1294                   ret = isblank(ch);
1295                  ],[glibcxx_cv_c99_ctype_tr1=yes],
1296                    [glibcxx_cv_c99_ctype_tr1=no])
1297   ])
1298   AC_MSG_RESULT($glibcxx_cv_c99_ctype_tr1)
1299   if test x"$glibcxx_cv_c99_ctype_tr1" = x"yes"; then
1300     AC_DEFINE(_GLIBCXX_USE_C99_CTYPE_TR1, 1,
1301               [Define if C99 functions in <ctype.h> should be imported in
1302               <tr1/cctype> in namespace std::tr1.])
1303   fi
1304
1305   # Check for the existence of <fenv.h> functions.
1306   AC_CHECK_HEADERS(fenv.h, ac_has_fenv_h=yes, ac_has_fenv_h=no)
1307   ac_c99_fenv_tr1=no;
1308   if test x"$ac_has_fenv_h" = x"yes"; then
1309     AC_MSG_CHECKING([for ISO C99 support to TR1 in <fenv.h>])
1310     AC_TRY_COMPILE([#include <fenv.h>],
1311                    [int except, mode;
1312                     fexcept_t* pflag;
1313                     fenv_t* penv;
1314                     int ret;
1315                     ret = feclearexcept(except);
1316                     ret = fegetexceptflag(pflag, except);
1317                     ret = feraiseexcept(except);
1318                     ret = fesetexceptflag(pflag, except);
1319                     ret = fetestexcept(except);
1320                     ret = fegetround();
1321                     ret = fesetround(mode);
1322                     ret = fegetenv(penv);
1323                     ret = feholdexcept(penv);
1324                     ret = fesetenv(penv);
1325                     ret = feupdateenv(penv);
1326                    ],[ac_c99_fenv_tr1=yes], [ac_c99_fenv_tr1=no])
1327   fi
1328   AC_MSG_RESULT($ac_c99_fenv_tr1)
1329   if test x"$ac_c99_fenv_tr1" = x"yes"; then
1330     AC_DEFINE(_GLIBCXX_USE_C99_FENV_TR1, 1,
1331               [Define if C99 functions in <fenv.h> should be imported in
1332               <tr1/cfenv> in namespace std::tr1.])
1333   fi
1334
1335   # Check for the existence of <stdint.h> types.
1336   AC_MSG_CHECKING([for ISO C99 support to TR1 in <stdint.h>])
1337   AC_CACHE_VAL(glibcxx_cv_c99_stdint_tr1, [
1338   AC_TRY_COMPILE([#define __STDC_LIMIT_MACROS
1339                   #define __STDC_CONSTANT_MACROS
1340                   #include <stdint.h>],
1341                  [typedef int8_t          my_int8_t;
1342                   my_int8_t               i8 = INT8_MIN;
1343                   i8 = INT8_MAX;
1344                   typedef int16_t         my_int16_t;
1345                   my_int16_t              i16 = INT16_MIN;
1346                   i16 = INT16_MAX;
1347                   typedef int32_t         my_int32_t;
1348                   my_int32_t              i32 = INT32_MIN;
1349                   i32 = INT32_MAX;
1350                   typedef int64_t         my_int64_t;
1351                   my_int64_t              i64 = INT64_MIN;
1352                   i64 = INT64_MAX;
1353                   typedef int_fast8_t     my_int_fast8_t;
1354                   my_int_fast8_t          if8 = INT_FAST8_MIN;
1355                   if8 = INT_FAST8_MAX;
1356                   typedef int_fast16_t    my_int_fast16_t;
1357                   my_int_fast16_t         if16 = INT_FAST16_MIN;
1358                   if16 = INT_FAST16_MAX;
1359                   typedef int_fast32_t    my_int_fast32_t;
1360                   my_int_fast32_t         if32 = INT_FAST32_MIN;
1361                   if32 = INT_FAST32_MAX;
1362                   typedef int_fast64_t    my_int_fast64_t;
1363                   my_int_fast64_t         if64 = INT_FAST64_MIN;
1364                   if64 = INT_FAST64_MAX;
1365                   typedef int_least8_t    my_int_least8_t;
1366                   my_int_least8_t         il8 = INT_LEAST8_MIN;
1367                   il8 = INT_LEAST8_MAX;
1368                   typedef int_least16_t   my_int_least16_t;
1369                   my_int_least16_t        il16 = INT_LEAST16_MIN;
1370                   il16 = INT_LEAST16_MAX;
1371                   typedef int_least32_t   my_int_least32_t;
1372                   my_int_least32_t        il32 = INT_LEAST32_MIN;
1373                   il32 = INT_LEAST32_MAX;
1374                   typedef int_least64_t   my_int_least64_t;
1375                   my_int_least64_t        il64 = INT_LEAST64_MIN;
1376                   il64 = INT_LEAST64_MAX;
1377                   typedef intmax_t        my_intmax_t;
1378                   my_intmax_t             im = INTMAX_MAX;
1379                   im = INTMAX_MIN;
1380                   typedef intptr_t        my_intptr_t;
1381                   my_intptr_t             ip = INTPTR_MAX;
1382                   ip = INTPTR_MIN;
1383                   typedef uint8_t         my_uint8_t;
1384                   my_uint8_t              ui8 = UINT8_MAX;
1385                   ui8 = UINT8_MAX;
1386                   typedef uint16_t        my_uint16_t;
1387                   my_uint16_t             ui16 = UINT16_MAX;
1388                   ui16 = UINT16_MAX;
1389                   typedef uint32_t        my_uint32_t;
1390                   my_uint32_t             ui32 = UINT32_MAX;
1391                   ui32 = UINT32_MAX;
1392                   typedef uint64_t        my_uint64_t;
1393                   my_uint64_t             ui64 = UINT64_MAX;
1394                   ui64 = UINT64_MAX;
1395                   typedef uint_fast8_t    my_uint_fast8_t;
1396                   my_uint_fast8_t         uif8 = UINT_FAST8_MAX;
1397                   uif8 = UINT_FAST8_MAX;
1398                   typedef uint_fast16_t   my_uint_fast16_t;
1399                   my_uint_fast16_t        uif16 = UINT_FAST16_MAX;
1400                   uif16 = UINT_FAST16_MAX;
1401                   typedef uint_fast32_t   my_uint_fast32_t;
1402                   my_uint_fast32_t        uif32 = UINT_FAST32_MAX;
1403                   uif32 = UINT_FAST32_MAX;
1404                   typedef uint_fast64_t   my_uint_fast64_t;
1405                   my_uint_fast64_t        uif64 = UINT_FAST64_MAX;
1406                   uif64 = UINT_FAST64_MAX;
1407                   typedef uint_least8_t   my_uint_least8_t;
1408                   my_uint_least8_t        uil8 = UINT_LEAST8_MAX;
1409                   uil8 = UINT_LEAST8_MAX;
1410                   typedef uint_least16_t  my_uint_least16_t;
1411                   my_uint_least16_t       uil16 = UINT_LEAST16_MAX;
1412                   uil16 = UINT_LEAST16_MAX;
1413                   typedef uint_least32_t  my_uint_least32_t;
1414                   my_uint_least32_t       uil32 = UINT_LEAST32_MAX;
1415                   uil32 = UINT_LEAST32_MAX;
1416                   typedef uint_least64_t  my_uint_least64_t;
1417                   my_uint_least64_t       uil64 = UINT_LEAST64_MAX;
1418                   uil64 = UINT_LEAST64_MAX;
1419                   typedef uintmax_t       my_uintmax_t;
1420                   my_uintmax_t            uim = UINTMAX_MAX;
1421                   uim = UINTMAX_MAX;
1422                   typedef uintptr_t       my_uintptr_t;
1423                   my_uintptr_t            uip = UINTPTR_MAX;
1424                   uip = UINTPTR_MAX;
1425                  ],[glibcxx_cv_c99_stdint_tr1=yes],
1426                    [glibcxx_cv_c99_stdint_tr1=no])
1427   ])
1428   AC_MSG_RESULT($glibcxx_cv_c99_stdint_tr1)
1429   if test x"$glibcxx_cv_c99_stdint_tr1" = x"yes"; then
1430     AC_DEFINE(_GLIBCXX_USE_C99_STDINT_TR1, 1,
1431               [Define if C99 types in <stdint.h> should be imported in
1432               <tr1/cstdint> in namespace std::tr1.])
1433   fi
1434
1435   # Check for the existence of <math.h> functions.
1436   AC_MSG_CHECKING([for ISO C99 support to TR1 in <math.h>])
1437   AC_CACHE_VAL(glibcxx_cv_c99_math_tr1, [
1438   AC_TRY_COMPILE([#include <math.h>],
1439                  [typedef double_t  my_double_t;
1440                   typedef float_t   my_float_t;
1441                   acosh(0.0);
1442                   acoshf(0.0f);
1443                   acoshl(0.0l);
1444                   asinh(0.0);
1445                   asinhf(0.0f);
1446                   asinhl(0.0l);
1447                   atanh(0.0);
1448                   atanhf(0.0f);
1449                   atanhl(0.0l);
1450                   cbrt(0.0);
1451                   cbrtf(0.0f);
1452                   cbrtl(0.0l);
1453                   copysign(0.0, 0.0);
1454                   copysignf(0.0f, 0.0f);
1455                   copysignl(0.0l, 0.0l);
1456                   erf(0.0);
1457                   erff(0.0f);
1458                   erfl(0.0l);
1459                   erfc(0.0);
1460                   erfcf(0.0f);
1461                   erfcl(0.0l);
1462                   exp2(0.0);
1463                   exp2f(0.0f);
1464                   exp2l(0.0l);
1465                   expm1(0.0);
1466                   expm1f(0.0f);
1467                   expm1l(0.0l);
1468                   fdim(0.0, 0.0);
1469                   fdimf(0.0f, 0.0f);
1470                   fdiml(0.0l, 0.0l);
1471                   fma(0.0, 0.0, 0.0);
1472                   fmaf(0.0f, 0.0f, 0.0f);
1473                   fmal(0.0l, 0.0l, 0.0l);
1474                   fmax(0.0, 0.0);
1475                   fmaxf(0.0f, 0.0f);
1476                   fmaxl(0.0l, 0.0l);
1477                   fmin(0.0, 0.0);
1478                   fminf(0.0f, 0.0f);
1479                   fminl(0.0l, 0.0l);
1480                   hypot(0.0, 0.0);
1481                   hypotf(0.0f, 0.0f);
1482                   hypotl(0.0l, 0.0l);
1483                   ilogb(0.0);
1484                   ilogbf(0.0f);
1485                   ilogbl(0.0l);
1486                   lgamma(0.0);
1487                   lgammaf(0.0f);
1488                   lgammal(0.0l);
1489                   llrint(0.0);
1490                   llrintf(0.0f);
1491                   llrintl(0.0l);
1492                   llround(0.0);
1493                   llroundf(0.0f);
1494                   llroundl(0.0l);
1495                   log1p(0.0);
1496                   log1pf(0.0f);
1497                   log1pl(0.0l);
1498                   log2(0.0);
1499                   log2f(0.0f);
1500                   log2l(0.0l);
1501                   logb(0.0);
1502                   logbf(0.0f);
1503                   logbl(0.0l);
1504                   lrint(0.0);
1505                   lrintf(0.0f);
1506                   lrintl(0.0l);
1507                   lround(0.0);
1508                   lroundf(0.0f);
1509                   lroundl(0.0l);
1510                   nan(0);
1511                   nanf(0);
1512                   nanl(0);
1513                   nearbyint(0.0);
1514                   nearbyintf(0.0f);
1515                   nearbyintl(0.0l);
1516                   nextafter(0.0, 0.0);
1517                   nextafterf(0.0f, 0.0f);
1518                   nextafterl(0.0l, 0.0l);
1519                   nexttoward(0.0, 0.0);
1520                   nexttowardf(0.0f, 0.0f);
1521                   nexttowardl(0.0l, 0.0l);
1522                   remainder(0.0, 0.0);
1523                   remainderf(0.0f, 0.0f);
1524                   remainderl(0.0l, 0.0l);
1525                   remquo(0.0, 0.0, 0);
1526                   remquo(0.0f, 0.0f, 0);
1527                   remquo(0.0l, 0.0l, 0);
1528                   rint(0.0);
1529                   rintf(0.0f);
1530                   rintl(0.0l);
1531                   round(0.0);
1532                   roundf(0.0f);
1533                   roundl(0.0l);
1534                   scalbln(0.0, 0l);
1535                   scalblnf(0.0f, 0l);
1536                   scalblnl(0.0l, 0l);
1537                   scalbn(0.0, 0);
1538                   scalbnf(0.0f, 0);
1539                   scalbnl(0.0l, 0);
1540                   tgamma(0.0);
1541                   tgammaf(0.0f);
1542                   tgammal(0.0l);
1543                   trunc(0.0);
1544                   truncf(0.0f);
1545                   truncl(0.0l);
1546                  ],[glibcxx_cv_c99_math_tr1=yes], [glibcxx_cv_c99_math_tr1=no])
1547   ])
1548   AC_MSG_RESULT($glibcxx_cv_c99_math_tr1)
1549   if test x"$glibcxx_cv_c99_math_tr1" = x"yes"; then
1550     AC_DEFINE(_GLIBCXX_USE_C99_MATH_TR1, 1,
1551               [Define if C99 functions or macros in <math.h> should be imported
1552               in <tr1/cmath> in namespace std::tr1.])
1553   fi
1554
1555   # Check for the existence of <inttypes.h> functions (NB: doesn't make
1556   # sense if the glibcxx_cv_c99_stdint_tr1 check fails, per C99, 7.8/1).
1557   ac_c99_inttypes_tr1=no;
1558   if test x"$glibcxx_cv_c99_stdint_tr1" = x"yes"; then
1559     AC_MSG_CHECKING([for ISO C99 support to TR1 in <inttypes.h>])
1560     AC_TRY_COMPILE([#include <inttypes.h>],
1561                    [intmax_t i, numer, denom, base;
1562                     const char* s;
1563                     char** endptr;
1564                     intmax_t ret = imaxabs(i);
1565                     imaxdiv_t dret = imaxdiv(numer, denom);
1566                     ret = strtoimax(s, endptr, base);
1567                     uintmax_t uret = strtoumax(s, endptr, base);
1568                    ],[ac_c99_inttypes_tr1=yes], [ac_c99_inttypes_tr1=no])
1569   fi
1570   AC_MSG_RESULT($ac_c99_inttypes_tr1)
1571   if test x"$ac_c99_inttypes_tr1" = x"yes"; then
1572     AC_DEFINE(_GLIBCXX_USE_C99_INTTYPES_TR1, 1,
1573               [Define if C99 functions in <inttypes.h> should be imported in
1574               <tr1/cinttypes> in namespace std::tr1.])
1575   fi
1576
1577   # Check for the existence of whcar_t <inttypes.h> functions (NB: doesn't
1578   # make sense if the glibcxx_cv_c99_stdint_tr1 check fails, per C99, 7.8/1).
1579   ac_c99_inttypes_wchar_t_tr1=no;
1580   if test x"$glibcxx_cv_c99_stdint_tr1" = x"yes"; then
1581     AC_MSG_CHECKING([for wchar_t ISO C99 support to TR1 in <inttypes.h>])
1582     AC_TRY_COMPILE([#include <inttypes.h>],
1583                    [intmax_t base;
1584                     const wchar_t* s;
1585                     wchar_t** endptr;
1586                     intmax_t ret = wcstoimax(s, endptr, base);
1587                     uintmax_t uret = wcstoumax(s, endptr, base);
1588                    ],[ac_c99_inttypes_wchar_t_tr1=yes],
1589                      [ac_c99_inttypes_wchar_t_tr1=no])
1590   fi
1591   AC_MSG_RESULT($ac_c99_inttypes_wchar_t_tr1)
1592   if test x"$ac_c99_inttypes_wchar_t_tr1" = x"yes"; then
1593     AC_DEFINE(_GLIBCXX_USE_C99_INTTYPES_WCHAR_T_TR1, 1,
1594               [Define if wchar_t C99 functions in <inttypes.h> should be
1595               imported in <tr1/cinttypes> in namespace std::tr1.])
1596   fi
1597
1598   # Check for the existence of the <stdbool.h> header.  
1599   AC_CHECK_HEADERS(stdbool.h)
1600
1601   CXXFLAGS="$ac_save_CXXFLAGS"
1602   AC_LANG_RESTORE
1603 ])
1604
1605 dnl
1606 dnl Check whether "/dev/random" and "/dev/urandom" are available for the
1607 dnl random_device of "TR1" (Chapter 5.1, "Random number generation").
1608 dnl
1609 AC_DEFUN([GLIBCXX_CHECK_RANDOM_TR1], [
1610
1611   AC_MSG_CHECKING([for "/dev/random" and "/dev/urandom" for TR1 random_device])
1612   AC_CACHE_VAL(glibcxx_cv_random_tr1, [
1613     if test -r /dev/random && test -r /dev/urandom; then
1614       glibcxx_cv_random_tr1=yes;
1615     else
1616       glibcxx_cv_random_tr1=no;
1617     fi
1618   ])
1619   AC_MSG_RESULT($glibcxx_cv_random_tr1)
1620
1621   if test x"$glibcxx_cv_random_tr1" = x"yes"; then
1622     AC_DEFINE(_GLIBCXX_USE_RANDOM_TR1, 1,
1623               [Define if /dev/random and /dev/urandom are available for
1624                the random_device of TR1 (Chapter 5.1).])
1625   fi
1626
1627 ])
1628
1629 dnl
1630 dnl Check whether EOF, SEEK_CUR, and SEEK_END have the most common values:
1631 dnl in that case including <cstdio> in some C++ headers can be avoided.
1632 dnl
1633 AC_DEFUN([GLIBCXX_CHECK_STDIO_MACROS], [
1634
1635   AC_MSG_CHECKING([for EOF == -1, SEEK_CUR == 1, SEEK_END == 2])
1636   AC_CACHE_VAL(glibcxx_cv_stdio_macros, [
1637   AC_TRY_COMPILE([#include <stdio.h>],
1638                  [#if ((EOF != -1) || (SEEK_CUR != 1) || (SEEK_END != 2))
1639                     unusual values...
1640                   #endif
1641                  ], [glibcxx_cv_stdio_macros=yes],
1642                     [glibcxx_cv_stdio_macros=no])
1643   ])
1644   AC_MSG_RESULT($glibcxx_cv_stdio_macros)
1645   if test x"$glibcxx_cv_stdio_macros" = x"yes"; then
1646     AC_DEFINE(_GLIBCXX_STDIO_MACROS, 1,
1647               [Define if EOF == -1, SEEK_CUR == 1, SEEK_END == 2.])
1648   fi
1649
1650 ])
1651
1652 dnl
1653 dnl Check whether macros, etc are present for <system_error>
1654 dnl
1655 AC_DEFUN([GLIBCXX_CHECK_SYSTEM_ERROR], [
1656
1657 m4_pushdef([n_syserr], [1])dnl
1658 m4_foreach([syserr], [EOWNERDEAD, ENOTRECOVERABLE, ENOLINK, EPROTO, ENODATA,
1659                       ENOSR, ENOSTR, ETIME, EBADMSG, ECANCELED,
1660                       EOVERFLOW, ENOTSUP, EIDRM, ETXTBSY],
1661 [m4_pushdef([SYSERR], m4_toupper(syserr))dnl
1662 AC_MSG_CHECKING([for syserr])
1663 AC_CACHE_VAL([glibcxx_cv_system_error[]n_syserr], [
1664 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <errno.h>]],
1665                                    [int i = syserr;])],
1666                   [glibcxx_cv_system_error[]n_syserr=yes],
1667                   [glibcxx_cv_system_error[]n_syserr=no])
1668 ])
1669 AC_MSG_RESULT([$glibcxx_cv_system_error[]n_syserr])
1670 if test x"$glibcxx_cv_system_error[]n_syserr" = x"yes"; then
1671   AC_DEFINE([HAVE_]SYSERR, 1, [Define if ]syserr[ exists.])
1672 fi
1673 m4_define([n_syserr], m4_incr(n_syserr))dnl
1674 m4_popdef([SYSERR])dnl
1675 ])
1676 m4_popdef([n_syserr])dnl
1677 ])
1678
1679 dnl
1680 dnl Check whether C++200x's standard layout types are supported. 
1681 dnl
1682 AC_DEFUN([GLIBCXX_CHECK_STANDARD_LAYOUT], [
1683
1684   AC_MSG_CHECKING([for ISO C++200x standard layout type support])
1685   AC_CACHE_VAL(ac_standard_layout, [
1686   AC_LANG_SAVE
1687   AC_LANG_CPLUSPLUS
1688   ac_test_CXXFLAGS="${CXXFLAGS+set}"
1689   ac_save_CXXFLAGS="$CXXFLAGS"
1690   CXXFLAGS='-std=gnu++0x'
1691
1692   AC_TRY_COMPILE([struct b
1693                   {
1694                     bool t;
1695
1696                     // Need standard layout relaxation from POD
1697                     private:        
1698                     b& operator=(const b&);
1699                     b(const b&);
1700                     };],
1701                  [b tst1 = { false };],
1702                  [ac_standard_layout=yes], [ac_standard_layout=no])
1703
1704   CXXFLAGS="$ac_save_CXXFLAGS"
1705   AC_LANG_RESTORE
1706   ])
1707   AC_MSG_RESULT($ac_standard_layout)
1708   if test x"$ac_standard_layout" = x"yes"; then
1709     AC_DEFINE(_GLIBCXX_USE_STANDARD_LAYOUT, 1,
1710               [Define if standard layout types are supported in C++200x.])
1711   fi
1712 ])
1713
1714 dnl
1715 dnl Check for what type of C headers to use.
1716 dnl
1717 dnl --enable-cheaders= [does stuff].
1718 dnl --disable-cheaders [does not do anything, really].
1719 dnl  +  Usage:  GLIBCXX_ENABLE_CHEADERS[(DEFAULT)]
1720 dnl       Where DEFAULT is either 'c' or 'c_std' or 'c_global'.
1721 dnl
1722 AC_DEFUN([GLIBCXX_ENABLE_CHEADERS], [
1723   GLIBCXX_ENABLE(cheaders,$1,[=KIND],
1724     [construct "C" headers for g++], [permit c|c_std|c_global])
1725   AC_MSG_NOTICE("C" header strategy set to $enable_cheaders)
1726
1727   C_INCLUDE_DIR='${glibcxx_srcdir}/include/'$enable_cheaders
1728
1729   # Allow overrides to configure.host here.
1730   if test $enable_cheaders = c_global; then
1731      c_compatibility=yes
1732   fi
1733
1734   if test $enable_cheaders = c_global || test $enable_cheaders = c_std; then
1735      c_extra=yes
1736   fi
1737
1738   AC_SUBST(C_INCLUDE_DIR)
1739   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_C, test $enable_cheaders = c)
1740   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_C_STD, test $enable_cheaders = c_std)
1741   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_C_GLOBAL, test $enable_cheaders = c_global)
1742   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_COMPATIBILITY, test $c_compatibility = yes)
1743   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_EXTRA, test $c_extra = yes)
1744 ])
1745
1746
1747 dnl
1748 dnl Check for which locale library to use.  The choice is mapped to
1749 dnl a subdirectory of config/locale.
1750 dnl
1751 dnl Default is generic.
1752 dnl
1753 AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [
1754   GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@],
1755     [use MODEL for target locale package],
1756     [permit generic|gnu|ieee_1003.1-2001|yes|no|auto])
1757
1758   # Deal with gettext issues.  Default to not using it (=no) until we detect
1759   # support for it later.  Let the user turn it off via --e/d, but let that
1760   # default to on for easier handling.
1761   USE_NLS=no
1762   AC_ARG_ENABLE(nls,
1763     AC_HELP_STRING([--enable-nls],[use Native Language Support (default)]),
1764     [],
1765     [enable_nls=yes])
1766   
1767   # Either a known packaage, or "auto"
1768   if test $enable_clocale = no || test $enable_clocale = yes; then
1769      enable_clocale=auto
1770   fi
1771   enable_clocale_flag=$enable_clocale
1772
1773   # Probe for locale model to use if none specified.
1774   # Default to "generic".
1775   if test $enable_clocale_flag = auto; then
1776     case ${target_os} in
1777       linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
1778         enable_clocale_flag=gnu 
1779         ;;
1780       darwin* | freebsd*)
1781         enable_clocale_flag=darwin
1782         ;;
1783       *)
1784         enable_clocale_flag=generic
1785         ;;
1786     esac
1787   fi
1788
1789   # Sanity check model, and test for special functionality.
1790   if test $enable_clocale_flag = gnu; then
1791     AC_EGREP_CPP([_GLIBCXX_ok], [
1792     #include <features.h>
1793     #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)
1794       _GLIBCXX_ok
1795     #endif
1796     ], enable_clocale_flag=gnu, enable_clocale_flag=generic)
1797
1798     if test $enable_clocale = auto; then
1799       # Test for bugs early in glibc-2.2.x series
1800       AC_TRY_RUN([
1801       #define _GNU_SOURCE 1
1802       #include <locale.h>
1803       #include <string.h>
1804       #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
1805       extern __typeof(newlocale) __newlocale;
1806       extern __typeof(duplocale) __duplocale;
1807       extern __typeof(strcoll_l) __strcoll_l;
1808       #endif
1809       int main()
1810       {
1811         const char __one[] = "Äuglein Augmen";
1812         const char __two[] = "Äuglein";
1813         int i;
1814         int j;
1815         __locale_t        loc;
1816         __locale_t        loc_dup;
1817         loc = __newlocale(1 << LC_ALL, "de_DE", 0);
1818         loc_dup = __duplocale(loc);
1819         i = __strcoll_l(__one, __two, loc);
1820         j = __strcoll_l(__one, __two, loc_dup);
1821         return 0;
1822       }
1823       ],
1824       [enable_clocale_flag=gnu],[enable_clocale_flag=generic],
1825       [enable_clocale_flag=generic])
1826     fi
1827
1828     # Set it to scream when it hurts.
1829     ac_save_CFLAGS="$CFLAGS"    
1830     CFLAGS="-Wimplicit-function-declaration -Werror"
1831
1832     # Use strxfrm_l if available.
1833     AC_TRY_COMPILE([#define _GNU_SOURCE 1
1834                     #include <string.h>
1835                     #include <locale.h>],
1836                     [char s[128]; __locale_t loc; strxfrm_l(s, "C", 5, loc);], 
1837                     AC_DEFINE(HAVE_STRXFRM_L, 1, 
1838                     [Define if strxfrm_l is available in <string.h>.]),)
1839     
1840     # Use strerror_l if available.
1841     AC_TRY_COMPILE([#define _GNU_SOURCE 1
1842                     #include <string.h>
1843                     #include <locale.h>],
1844                     [__locale_t loc; strerror_l(5, loc);], 
1845                     AC_DEFINE(HAVE_STRERROR_L, 1, 
1846                     [Define if strerror_l is available in <string.h>.]),)
1847
1848     CFLAGS="$ac_save_CFLAGS"
1849   fi
1850
1851   # Perhaps use strerror_r if available, and strerror_l isn't.
1852   ac_save_CFLAGS="$CFLAGS"      
1853   CFLAGS="-Wimplicit-function-declaration -Werror"
1854   AC_TRY_COMPILE([#define _GNU_SOURCE 1
1855                   #include <string.h>
1856                   #include <locale.h>],
1857                   [char s[128]; strerror_r(5, s, 128);], 
1858                   AC_DEFINE(HAVE_STRERROR_R, 1, 
1859                   [Define if strerror_r is available in <string.h>.]),)
1860   CFLAGS="$ac_save_CFLAGS"
1861
1862   # Set configure bits for specified locale package
1863   AC_MSG_CHECKING([for C locale to use])
1864   case ${enable_clocale_flag} in
1865     generic)
1866       AC_MSG_RESULT(generic)
1867
1868       CLOCALE_H=config/locale/generic/c_locale.h
1869       CLOCALE_CC=config/locale/generic/c_locale.cc
1870       CCODECVT_CC=config/locale/generic/codecvt_members.cc
1871       CCOLLATE_CC=config/locale/generic/collate_members.cc
1872       CCTYPE_CC=config/locale/generic/ctype_members.cc
1873       CMESSAGES_H=config/locale/generic/messages_members.h
1874       CMESSAGES_CC=config/locale/generic/messages_members.cc
1875       CMONEY_CC=config/locale/generic/monetary_members.cc
1876       CNUMERIC_CC=config/locale/generic/numeric_members.cc
1877       CTIME_H=config/locale/generic/time_members.h
1878       CTIME_CC=config/locale/generic/time_members.cc
1879       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
1880       ;;
1881     darwin)
1882       AC_MSG_RESULT(darwin or freebsd)
1883
1884       CLOCALE_H=config/locale/generic/c_locale.h
1885       CLOCALE_CC=config/locale/generic/c_locale.cc
1886       CCODECVT_CC=config/locale/generic/codecvt_members.cc
1887       CCOLLATE_CC=config/locale/generic/collate_members.cc
1888       CCTYPE_CC=config/locale/darwin/ctype_members.cc
1889       CMESSAGES_H=config/locale/generic/messages_members.h
1890       CMESSAGES_CC=config/locale/generic/messages_members.cc
1891       CMONEY_CC=config/locale/generic/monetary_members.cc
1892       CNUMERIC_CC=config/locale/generic/numeric_members.cc
1893       CTIME_H=config/locale/generic/time_members.h
1894       CTIME_CC=config/locale/generic/time_members.cc
1895       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
1896       ;;
1897         
1898     gnu)
1899       AC_MSG_RESULT(gnu)
1900
1901       # Declare intention to use gettext, and add support for specific
1902       # languages.
1903       # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT
1904       ALL_LINGUAS="de fr"
1905
1906       # Don't call AM-GNU-GETTEXT here. Instead, assume glibc.
1907       AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no)
1908       if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
1909         USE_NLS=yes
1910       fi
1911       # Export the build objects.
1912       for ling in $ALL_LINGUAS; do \
1913         glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \
1914         glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \
1915       done
1916       AC_SUBST(glibcxx_MOFILES)
1917       AC_SUBST(glibcxx_POFILES)
1918
1919       CLOCALE_H=config/locale/gnu/c_locale.h
1920       CLOCALE_CC=config/locale/gnu/c_locale.cc
1921       CCODECVT_CC=config/locale/gnu/codecvt_members.cc
1922       CCOLLATE_CC=config/locale/gnu/collate_members.cc
1923       CCTYPE_CC=config/locale/gnu/ctype_members.cc
1924       CMESSAGES_H=config/locale/gnu/messages_members.h
1925       CMESSAGES_CC=config/locale/gnu/messages_members.cc
1926       CMONEY_CC=config/locale/gnu/monetary_members.cc
1927       CNUMERIC_CC=config/locale/gnu/numeric_members.cc
1928       CTIME_H=config/locale/gnu/time_members.h
1929       CTIME_CC=config/locale/gnu/time_members.cc
1930       CLOCALE_INTERNAL_H=config/locale/gnu/c++locale_internal.h
1931       ;;
1932     ieee_1003.1-2001)
1933       AC_MSG_RESULT(IEEE 1003.1)
1934
1935       CLOCALE_H=config/locale/ieee_1003.1-2001/c_locale.h
1936       CLOCALE_CC=config/locale/ieee_1003.1-2001/c_locale.cc
1937       CCODECVT_CC=config/locale/generic/codecvt_members.cc
1938       CCOLLATE_CC=config/locale/generic/collate_members.cc
1939       CCTYPE_CC=config/locale/generic/ctype_members.cc
1940       CMESSAGES_H=config/locale/ieee_1003.1-2001/messages_members.h
1941       CMESSAGES_CC=config/locale/ieee_1003.1-2001/messages_members.cc
1942       CMONEY_CC=config/locale/generic/monetary_members.cc
1943       CNUMERIC_CC=config/locale/generic/numeric_members.cc
1944       CTIME_H=config/locale/generic/time_members.h
1945       CTIME_CC=config/locale/generic/time_members.cc
1946       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
1947       ;;
1948   esac
1949
1950   # This is where the testsuite looks for locale catalogs, using the
1951   # -DLOCALEDIR define during testsuite compilation.
1952   glibcxx_localedir=${glibcxx_builddir}/po/share/locale
1953   AC_SUBST(glibcxx_localedir)
1954
1955   # A standalone libintl (e.g., GNU libintl) may be in use.
1956   if test $USE_NLS = yes; then
1957     AC_CHECK_HEADERS([libintl.h], [], USE_NLS=no)
1958     AC_SEARCH_LIBS(gettext, intl, [], USE_NLS=no)
1959   fi
1960   if test $USE_NLS = yes; then
1961     AC_DEFINE(_GLIBCXX_USE_NLS, 1, 
1962               [Define if NLS translations are to be used.])
1963   fi
1964
1965   AC_SUBST(USE_NLS)
1966   AC_SUBST(CLOCALE_H)
1967   AC_SUBST(CMESSAGES_H)
1968   AC_SUBST(CCODECVT_CC)
1969   AC_SUBST(CCOLLATE_CC)
1970   AC_SUBST(CCTYPE_CC)
1971   AC_SUBST(CMESSAGES_CC)
1972   AC_SUBST(CMONEY_CC)
1973   AC_SUBST(CNUMERIC_CC)
1974   AC_SUBST(CTIME_H)
1975   AC_SUBST(CTIME_CC)
1976   AC_SUBST(CLOCALE_CC)
1977   AC_SUBST(CLOCALE_INTERNAL_H)
1978 ])
1979
1980
1981 dnl
1982 dnl Check for which std::allocator base class to use.  The choice is
1983 dnl mapped from a subdirectory of include/ext.
1984 dnl
1985 dnl Default is new.
1986 dnl
1987 AC_DEFUN([GLIBCXX_ENABLE_ALLOCATOR], [
1988   AC_MSG_CHECKING([for std::allocator base class])
1989   GLIBCXX_ENABLE(libstdcxx-allocator,auto,[=KIND],
1990     [use KIND for target std::allocator base],
1991     [permit new|malloc|mt|bitmap|pool|yes|no|auto])
1992
1993   # If they didn't use this option switch, or if they specified --enable
1994   # with no specific model, we'll have to look for one.  If they
1995   # specified --disable (???), do likewise.
1996   if test $enable_libstdcxx_allocator = no ||
1997      test $enable_libstdcxx_allocator = yes;
1998   then
1999      enable_libstdcxx_allocator=auto
2000   fi
2001
2002   # Either a known package, or "auto". Auto implies the default choice
2003   # for a particular platform.
2004   enable_libstdcxx_allocator_flag=$enable_libstdcxx_allocator
2005
2006   # Probe for host-specific support if no specific model is specified.
2007   # Default to "new".
2008   if test $enable_libstdcxx_allocator_flag = auto; then
2009     case ${target_os} in
2010       linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
2011         enable_libstdcxx_allocator_flag=new
2012         ;;
2013       *)
2014         enable_libstdcxx_allocator_flag=new
2015         ;;
2016     esac
2017   fi
2018   AC_MSG_RESULT($enable_libstdcxx_allocator_flag)
2019   
2020
2021   # Set configure bits for specified locale package
2022   case ${enable_libstdcxx_allocator_flag} in
2023     bitmap)
2024       ALLOCATOR_H=config/allocator/bitmap_allocator_base.h
2025       ALLOCATOR_NAME=__gnu_cxx::bitmap_allocator
2026       ;;
2027     malloc)
2028       ALLOCATOR_H=config/allocator/malloc_allocator_base.h
2029       ALLOCATOR_NAME=__gnu_cxx::malloc_allocator
2030       ;;
2031     mt)
2032       ALLOCATOR_H=config/allocator/mt_allocator_base.h
2033       ALLOCATOR_NAME=__gnu_cxx::__mt_alloc
2034       ;;
2035     new)
2036       ALLOCATOR_H=config/allocator/new_allocator_base.h
2037       ALLOCATOR_NAME=__gnu_cxx::new_allocator
2038       ;;
2039     pool)
2040       ALLOCATOR_H=config/allocator/pool_allocator_base.h
2041       ALLOCATOR_NAME=__gnu_cxx::__pool_alloc
2042       ;;        
2043   esac
2044
2045   AC_SUBST(ALLOCATOR_H)
2046   AC_SUBST(ALLOCATOR_NAME)
2047 ])
2048
2049
2050 dnl
2051 dnl Check for whether the Boost-derived checks should be turned on.
2052 dnl
2053 dnl --enable-concept-checks turns them on.
2054 dnl --disable-concept-checks leaves them off.
2055 dnl  +  Usage:  GLIBCXX_ENABLE_CONCEPT_CHECKS[(DEFAULT)]
2056 dnl       Where DEFAULT is either `yes' or `no'.
2057 dnl
2058 AC_DEFUN([GLIBCXX_ENABLE_CONCEPT_CHECKS], [
2059   GLIBCXX_ENABLE(concept-checks,$1,,[use Boost-derived template checks])
2060   if test $enable_concept_checks = yes; then
2061     AC_DEFINE(_GLIBCXX_CONCEPT_CHECKS, 1,
2062               [Define to use concept checking code from the boost libraries.])
2063   fi
2064 ])
2065
2066 dnl
2067 dnl Check for parallel mode pre-requisites, including OpenMP support.
2068 dnl
2069 dnl  +  Usage:  GLIBCXX_ENABLE_PARALLEL
2070 dnl
2071 AC_DEFUN([GLIBCXX_ENABLE_PARALLEL], [
2072
2073   enable_parallel=no;
2074
2075   # See if configured libgomp/omp.h exists. (libgomp may be in
2076   # noconfigdirs but not explicitly disabled.)
2077   if test -f $glibcxx_builddir/../libgomp/omp.h; then
2078     enable_parallel=yes;
2079   else
2080     AC_MSG_NOTICE([$glibcxx_builddir/../libgomp/omp.h not found])
2081   fi
2082
2083   AC_MSG_CHECKING([for parallel mode support])
2084   AC_MSG_RESULT([$enable_parallel])
2085   GLIBCXX_CONDITIONAL(ENABLE_PARALLEL, test $enable_parallel = yes)
2086 ])
2087
2088
2089 dnl
2090 dnl Check for which I/O library to use:  stdio, or something specific.
2091 dnl
2092 dnl Default is stdio.
2093 dnl
2094 AC_DEFUN([GLIBCXX_ENABLE_CSTDIO], [
2095   AC_MSG_CHECKING([for underlying I/O to use])
2096   GLIBCXX_ENABLE(cstdio,stdio,[=PACKAGE],
2097     [use target-specific I/O package], [permit stdio])
2098
2099   # Now that libio has been removed, you can have any color you want as long
2100   # as it's black.  This is one big no-op until other packages are added, but
2101   # showing the framework never hurts.
2102   case ${enable_cstdio} in
2103     stdio)
2104       CSTDIO_H=config/io/c_io_stdio.h
2105       BASIC_FILE_H=config/io/basic_file_stdio.h
2106       BASIC_FILE_CC=config/io/basic_file_stdio.cc
2107       AC_MSG_RESULT(stdio)
2108       ;;
2109   esac
2110
2111   AC_SUBST(CSTDIO_H)
2112   AC_SUBST(BASIC_FILE_H)
2113   AC_SUBST(BASIC_FILE_CC)
2114 ])
2115
2116
2117 dnl
2118 dnl Check for "unusual" flags to pass to the compiler while building.
2119 dnl
2120 dnl --enable-cxx-flags='-foo -bar -baz' is a general method for passing
2121 dnl     experimental flags such as -fpch, -fIMI, -Dfloat=char, etc.
2122 dnl --disable-cxx-flags passes nothing.
2123 dnl  +  See http://gcc.gnu.org/ml/libstdc++/2000-q2/msg00131.html
2124 dnl         http://gcc.gnu.org/ml/libstdc++/2000-q2/msg00284.html
2125 dnl         http://gcc.gnu.org/ml/libstdc++/2000-q1/msg00035.html
2126 dnl  +  Usage:  GLIBCXX_ENABLE_CXX_FLAGS(default flags)
2127 dnl       If "default flags" is an empty string, the effect is the same
2128 dnl       as --disable or --enable=no.
2129 dnl
2130 AC_DEFUN([GLIBCXX_ENABLE_CXX_FLAGS], [dnl
2131   AC_MSG_CHECKING([for extra compiler flags for building])
2132   GLIBCXX_ENABLE(cxx-flags,$1,[=FLAGS],
2133     [pass compiler FLAGS when building library],
2134     [case "x$enable_cxx_flags" in
2135       xno | x)   enable_cxx_flags= ;;
2136       x-*)       ;;
2137       *)         AC_MSG_ERROR(_g_switch needs compiler flags as arguments) ;;
2138      esac])
2139
2140   # Run through flags (either default or command-line) and set anything
2141   # extra (e.g., #defines) that must accompany particular g++ options.
2142   if test -n "$enable_cxx_flags"; then
2143     for f in $enable_cxx_flags; do
2144       case "$f" in
2145         -fhonor-std)  ;;
2146         -*)  ;;
2147         *)   # and we're trying to pass /what/ exactly?
2148              AC_MSG_ERROR([compiler flags start with a -]) ;;
2149       esac
2150     done
2151   fi
2152
2153   EXTRA_CXX_FLAGS="$enable_cxx_flags"
2154   AC_MSG_RESULT($EXTRA_CXX_FLAGS)
2155   AC_SUBST(EXTRA_CXX_FLAGS)
2156 ])
2157
2158
2159 dnl
2160 dnl Check to see if debugging libraries are to be built.
2161 dnl
2162 dnl --enable-libstdcxx-debug
2163 dnl builds a separate set of debugging libraries in addition to the
2164 dnl normal (shared, static) libstdc++ binaries.
2165 dnl
2166 dnl --disable-libstdcxx-debug
2167 dnl builds only one (non-debug) version of libstdc++.
2168 dnl
2169 dnl --enable-libstdcxx-debug-flags=FLAGS
2170 dnl iff --enable-debug == yes, then use FLAGS to build the debug library.
2171 dnl
2172 dnl  +  Usage:  GLIBCXX_ENABLE_DEBUG[(DEFAULT)]
2173 dnl       Where DEFAULT is either `yes' or `no'.
2174 dnl
2175 AC_DEFUN([GLIBCXX_ENABLE_DEBUG], [
2176   AC_MSG_CHECKING([for additional debug build])
2177   GLIBCXX_ENABLE(libstdcxx-debug,$1,,[build extra debug library])
2178   AC_MSG_RESULT($enable_libstdcxx_debug)
2179   GLIBCXX_CONDITIONAL(GLIBCXX_BUILD_DEBUG, test $enable_libstdcxx_debug = yes)
2180 ])
2181
2182
2183 dnl
2184 dnl Check for explicit debug flags.
2185 dnl
2186 dnl --enable-libstdcxx-debug-flags='-O1'
2187 dnl is a general method for passing flags to be used when
2188 dnl building debug libraries with --enable-debug.
2189 dnl
2190 dnl --disable-libstdcxx-debug-flags does nothing.
2191 dnl  +  Usage:  GLIBCXX_ENABLE_DEBUG_FLAGS(default flags)
2192 dnl       If "default flags" is an empty string, the effect is the same
2193 dnl       as --disable or --enable=no.
2194 dnl
2195 AC_DEFUN([GLIBCXX_ENABLE_DEBUG_FLAGS], [
2196   GLIBCXX_ENABLE(libstdcxx-debug-flags,[$1],[=FLAGS],
2197     [pass compiler FLAGS when building debug library],
2198     [case "x$enable_libstdcxx_debug_flags" in
2199       xno | x)    enable_libstdcxx_debug_flags= ;;
2200       x-*)        ;;
2201       *)          AC_MSG_ERROR(_g_switch needs compiler flags as arguments) ;;
2202      esac])
2203
2204   # Option parsed, now set things appropriately
2205   DEBUG_FLAGS="$enable_libstdcxx_debug_flags"
2206   AC_SUBST(DEBUG_FLAGS)
2207
2208   AC_MSG_NOTICE([Debug build flags set to $DEBUG_FLAGS])
2209 ])
2210
2211
2212 dnl
2213 dnl Check if the user only wants a freestanding library implementation.
2214 dnl
2215 dnl --disable-hosted-libstdcxx will turn off most of the library build,
2216 dnl installing only the headers required by [17.4.1.3] and the language
2217 dnl support library.  More than that will be built (to keep the Makefiles
2218 dnl conveniently clean), but not installed.
2219 dnl
2220 dnl Sets:
2221 dnl  is_hosted  (yes/no)
2222 dnl
2223 dnl Defines:
2224 dnl  _GLIBCXX_HOSTED   (always defined, either to 1 or 0)
2225 dnl
2226 AC_DEFUN([GLIBCXX_ENABLE_HOSTED], [
2227   AC_ARG_ENABLE([hosted-libstdcxx],
2228     AC_HELP_STRING([--disable-hosted-libstdcxx],
2229                    [only build freestanding C++ runtime support]),,
2230     [case "$host" in
2231         arm*-*-symbianelf*) 
2232             enable_hosted_libstdcxx=no
2233             ;;
2234         *) 
2235             enable_hosted_libstdcxx=yes
2236             ;;
2237      esac])
2238   if test "$enable_hosted_libstdcxx" = no; then
2239     AC_MSG_NOTICE([Only freestanding libraries will be built])
2240     is_hosted=no
2241     hosted_define=0
2242     enable_abi_check=no
2243     enable_libstdcxx_pch=no
2244   else
2245     is_hosted=yes
2246     hosted_define=1
2247   fi
2248   GLIBCXX_CONDITIONAL(GLIBCXX_HOSTED, test $is_hosted = yes)
2249   AC_DEFINE_UNQUOTED(_GLIBCXX_HOSTED, $hosted_define,
2250     [Define to 1 if a full hosted library is built, or 0 if freestanding.])
2251 ])
2252
2253
2254 dnl
2255 dnl Check for template specializations for the 'long long' type.
2256 dnl The result determines only whether 'long long' I/O is enabled; things
2257 dnl like numeric_limits<> specializations are always available.
2258 dnl
2259 dnl --enable-long-long defines _GLIBCXX_USE_LONG_LONG
2260 dnl --disable-long-long leaves _GLIBCXX_USE_LONG_LONG undefined
2261 dnl  +  Usage:  GLIBCXX_ENABLE_LONG_LONG[(DEFAULT)]
2262 dnl       Where DEFAULT is either `yes' or `no'.
2263 dnl
2264 AC_DEFUN([GLIBCXX_ENABLE_LONG_LONG], [
2265   GLIBCXX_ENABLE(long-long,$1,,[enable template specializations for 'long long'])
2266   if test $enable_long_long = yes; then
2267     AC_DEFINE(_GLIBCXX_USE_LONG_LONG, 1, 
2268               [Define if code specialized for long long should be used.])
2269   fi
2270   AC_MSG_CHECKING([for enabled long long specializations])
2271   AC_MSG_RESULT([$enable_long_long])
2272 ])
2273
2274
2275 dnl
2276 dnl Check for template specializations for the 'wchar_t' type.
2277 dnl
2278 dnl --enable-wchar_t defines _GLIBCXX_USE_WCHAR_T
2279 dnl --disable-wchar_t leaves _GLIBCXX_USE_WCHAR_T undefined
2280 dnl  +  Usage:  GLIBCXX_ENABLE_WCHAR_T[(DEFAULT)]
2281 dnl       Where DEFAULT is either `yes' or `no'.
2282 dnl
2283 dnl Necessary support must also be present.
2284 dnl
2285 AC_DEFUN([GLIBCXX_ENABLE_WCHAR_T], [
2286   GLIBCXX_ENABLE(wchar_t,$1,,[enable template specializations for 'wchar_t'])
2287
2288   # Test wchar.h for mbstate_t, which is needed for char_traits and fpos.
2289   AC_CHECK_HEADERS(wchar.h, ac_has_wchar_h=yes, ac_has_wchar_h=no)
2290   AC_MSG_CHECKING([for mbstate_t])
2291   AC_TRY_COMPILE([#include <wchar.h>],
2292   [mbstate_t teststate;],
2293   have_mbstate_t=yes, have_mbstate_t=no)
2294   AC_MSG_RESULT($have_mbstate_t)
2295   if test x"$have_mbstate_t" = xyes; then
2296     AC_DEFINE(HAVE_MBSTATE_T,1,[Define if mbstate_t exists in wchar.h.])
2297   fi
2298
2299   # Test it always, for use in GLIBCXX_ENABLE_C99, together with
2300   # ac_has_wchar_h.
2301   AC_CHECK_HEADERS(wctype.h, ac_has_wctype_h=yes, ac_has_wctype_h=no)
2302   
2303   if test x"$enable_wchar_t" = x"yes"; then
2304
2305     AC_LANG_SAVE
2306     AC_LANG_CPLUSPLUS
2307     
2308     if test x"$ac_has_wchar_h" = xyes &&
2309        test x"$ac_has_wctype_h" = xyes; then
2310       AC_TRY_COMPILE([#include <wchar.h>
2311                       #include <stddef.h>
2312                       wint_t i;
2313                       long l = WEOF;
2314                       long j = WCHAR_MIN;
2315                       long k = WCHAR_MAX;
2316                       namespace test
2317                       {
2318                         using ::btowc;
2319                         using ::fgetwc;
2320                         using ::fgetws;
2321                         using ::fputwc;
2322                         using ::fputws;
2323                         using ::fwide;
2324                         using ::fwprintf; 
2325                         using ::fwscanf;
2326                         using ::getwc;
2327                         using ::getwchar;
2328                         using ::mbrlen; 
2329                         using ::mbrtowc; 
2330                         using ::mbsinit; 
2331                         using ::mbsrtowcs; 
2332                         using ::putwc;
2333                         using ::putwchar;
2334                         using ::swprintf; 
2335                         using ::swscanf; 
2336                         using ::ungetwc;
2337                         using ::vfwprintf; 
2338                         using ::vswprintf; 
2339                         using ::vwprintf; 
2340                         using ::wcrtomb; 
2341                         using ::wcscat; 
2342                         using ::wcschr; 
2343                         using ::wcscmp; 
2344                         using ::wcscoll; 
2345                         using ::wcscpy; 
2346                         using ::wcscspn; 
2347                         using ::wcsftime; 
2348                         using ::wcslen;
2349                         using ::wcsncat; 
2350                         using ::wcsncmp; 
2351                         using ::wcsncpy; 
2352                         using ::wcspbrk;
2353                         using ::wcsrchr; 
2354                         using ::wcsrtombs; 
2355                         using ::wcsspn; 
2356                         using ::wcsstr;
2357                         using ::wcstod; 
2358                         using ::wcstok; 
2359                         using ::wcstol;
2360                         using ::wcstoul; 
2361                         using ::wcsxfrm; 
2362                         using ::wctob; 
2363                         using ::wmemchr;
2364                         using ::wmemcmp;
2365                         using ::wmemcpy;
2366                         using ::wmemmove;
2367                         using ::wmemset;
2368                         using ::wprintf; 
2369                         using ::wscanf; 
2370                       }
2371                      ],[],[], [enable_wchar_t=no])
2372     else
2373       enable_wchar_t=no
2374     fi
2375
2376     AC_LANG_RESTORE
2377   fi
2378
2379   if test x"$enable_wchar_t" = x"yes"; then
2380     AC_DEFINE(_GLIBCXX_USE_WCHAR_T, 1,
2381               [Define if code specialized for wchar_t should be used.])
2382   fi
2383
2384   AC_MSG_CHECKING([for enabled wchar_t specializations])
2385   AC_MSG_RESULT([$enable_wchar_t])
2386 ])
2387
2388
2389 dnl
2390 dnl Check to see if building and using a C++ precompiled header can be done.
2391 dnl
2392 dnl --enable-libstdcxx-pch=yes
2393 dnl default, this shows intent to use stdc++.h.gch If it looks like it
2394 dnl may work, after some light-hearted attempts to puzzle out compiler
2395 dnl support, flip bits on in include/Makefile.am
2396 dnl
2397 dnl --disable-libstdcxx-pch
2398 dnl turns off attempts to use or build stdc++.h.gch.
2399 dnl
2400 dnl Substs:
2401 dnl  glibcxx_PCHFLAGS
2402 dnl
2403 AC_DEFUN([GLIBCXX_ENABLE_PCH], [
2404   GLIBCXX_ENABLE(libstdcxx-pch,$1,,[build pre-compiled libstdc++ headers])
2405   if test $enable_libstdcxx_pch = yes; then
2406     AC_CACHE_CHECK([for compiler with PCH support],
2407       [glibcxx_cv_prog_CXX_pch],
2408       [ac_save_CXXFLAGS="$CXXFLAGS"
2409        CXXFLAGS="$CXXFLAGS -Werror -Winvalid-pch -Wno-deprecated"
2410        AC_LANG_SAVE
2411        AC_LANG_CPLUSPLUS
2412        echo '#include <math.h>' > conftest.h
2413        if $CXX $CXXFLAGS $CPPFLAGS -x c++-header conftest.h \
2414                           -o conftest.h.gch 1>&5 2>&1 &&
2415                 echo '#error "pch failed"' > conftest.h &&
2416           echo '#include "conftest.h"' > conftest.cc &&
2417                $CXX -c $CXXFLAGS $CPPFLAGS conftest.cc 1>&5 2>&1 ;
2418        then
2419          glibcxx_cv_prog_CXX_pch=yes
2420        else
2421          glibcxx_cv_prog_CXX_pch=no
2422        fi
2423        rm -f conftest*
2424        CXXFLAGS=$ac_save_CXXFLAGS
2425        AC_LANG_RESTORE
2426       ])
2427     enable_libstdcxx_pch=$glibcxx_cv_prog_CXX_pch
2428   fi
2429
2430   AC_MSG_CHECKING([for enabled PCH])
2431   AC_MSG_RESULT([$enable_libstdcxx_pch])
2432
2433   GLIBCXX_CONDITIONAL(GLIBCXX_BUILD_PCH, test $enable_libstdcxx_pch = yes)
2434   if test $enable_libstdcxx_pch = yes; then
2435     glibcxx_PCHFLAGS="-include bits/stdc++.h"
2436   else
2437     glibcxx_PCHFLAGS=""
2438   fi
2439   AC_SUBST(glibcxx_PCHFLAGS)
2440 ])
2441
2442
2443 dnl
2444 dnl Check for atomic builtins.
2445 dnl See:
2446 dnl http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html#Atomic-Builtins
2447 dnl
2448 dnl This checks to see if the host supports the compiler-generated
2449 dnl builtins for atomic operations for various integral sizes. Note, this 
2450 dnl is intended to be an all-or-nothing switch, so all the atomic operations
2451 dnl that are used should be checked.
2452 dnl
2453 dnl Note:
2454 dnl libgomp and libgfortran do this with a link test, instead of an asm test.
2455 dnl see: CHECK_SYNC_FETCH_AND_ADD
2456 dnl
2457 dnl Defines:
2458 dnl  _GLIBCXX_ATOMIC_BUILTINS_1 
2459 dnl  _GLIBCXX_ATOMIC_BUILTINS_4
2460 dnl
2461 AC_DEFUN([GLIBCXX_ENABLE_ATOMIC_BUILTINS], [
2462   AC_LANG_SAVE
2463   AC_LANG_CPLUSPLUS
2464   old_CXXFLAGS="$CXXFLAGS"
2465   
2466   # Compile unoptimized.
2467   CXXFLAGS='-O0 -S'
2468
2469   # Fake what AC_TRY_COMPILE does, without linking as this is
2470   # unnecessary for a builtins test.
2471
2472     cat > conftest.$ac_ext << EOF
2473 [#]line __oline__ "configure"
2474 int main()
2475 {
2476   // NB: _Atomic_word not necessarily int. 
2477   typedef int atomic_type;
2478   atomic_type c1;
2479   atomic_type c2;
2480   const atomic_type c3(0);
2481   __sync_fetch_and_add(&c1, c2);
2482   __sync_val_compare_and_swap(&c1, c3, c2);
2483   __sync_lock_test_and_set(&c1, c3);
2484   __sync_lock_release(&c1);
2485   __sync_synchronize();
2486   return 0;
2487 }
2488 EOF
2489
2490     AC_MSG_CHECKING([for atomic builtins for int])
2491     if AC_TRY_EVAL(ac_compile); then
2492       if grep __sync_ conftest.s >/dev/null 2>&1 ; then
2493         enable_atomic_builtinsi=no
2494       else
2495       AC_DEFINE(_GLIBCXX_ATOMIC_BUILTINS_4, 1,
2496         [Define if builtin atomic operations for int are supported on this host.])
2497         enable_atomic_builtinsi=yes
2498       fi
2499     fi
2500     AC_MSG_RESULT($enable_atomic_builtinsi)
2501     rm -f conftest*
2502
2503     cat > conftest.$ac_ext << EOF
2504 [#]line __oline__ "configure"
2505 int main()
2506 {
2507   typedef bool atomic_type;
2508   atomic_type c1;
2509   atomic_type c2;
2510   const atomic_type c3(0);
2511   __sync_fetch_and_add(&c1, c2);
2512   __sync_val_compare_and_swap(&c1, c3, c2);
2513   __sync_lock_test_and_set(&c1, c3);
2514   __sync_lock_release(&c1);
2515   __sync_synchronize();
2516   return 0;
2517 }
2518 EOF
2519
2520     AC_MSG_CHECKING([for atomic builtins for bool])
2521     if AC_TRY_EVAL(ac_compile); then
2522       if grep __sync_ conftest.s >/dev/null 2>&1 ; then
2523         enable_atomic_builtinsb=no
2524       else
2525       AC_DEFINE(_GLIBCXX_ATOMIC_BUILTINS_1, 1,
2526       [Define if builtin atomic operations for bool are supported on this host.])
2527         enable_atomic_builtinsb=yes
2528       fi
2529     fi
2530     AC_MSG_RESULT($enable_atomic_builtinsb)
2531     rm -f conftest*
2532
2533   CXXFLAGS="$old_CXXFLAGS"
2534   AC_LANG_RESTORE
2535
2536   # Set atomicity_dir to builtins if either of above tests pass.
2537   if test $enable_atomic_builtinsi = yes || test $enable_atomic_builtinsb = yes ; then
2538     atomicity_dir=cpu/generic/atomicity_builtins
2539   fi
2540
2541   # If still generic, set to mutex.
2542   if test $atomicity_dir = "cpu/generic" ; then
2543     atomicity_dir=cpu/generic/atomicity_mutex
2544     AC_MSG_WARN([No native atomic operations are provided for this platform.])
2545       if test $target_thread_file = single; then
2546         AC_MSG_WARN([They cannot be faked when thread support is disabled.])
2547         AC_MSG_WARN([Thread-safety of certain classes is not guaranteed.])
2548       else
2549         AC_MSG_WARN([They will be faked using a mutex.])
2550         AC_MSG_WARN([Performance of certain classes will degrade as a result.])
2551       fi
2552   fi
2553
2554 ])
2555
2556
2557 dnl
2558 dnl Check for exception handling support.  If an explicit enable/disable
2559 dnl sjlj exceptions is given, we don't have to detect.  Otherwise the
2560 dnl target may or may not support call frame exceptions.
2561 dnl
2562 dnl --enable-sjlj-exceptions forces the use of builtin setjmp.
2563 dnl --disable-sjlj-exceptions forces the use of call frame unwinding.
2564 dnl Neither one forces an attempt at detection.
2565 dnl
2566 dnl Defines:
2567 dnl  _GLIBCXX_SJLJ_EXCEPTIONS if the compiler is configured for it
2568 dnl
2569 AC_DEFUN([GLIBCXX_ENABLE_SJLJ_EXCEPTIONS], [
2570   AC_MSG_CHECKING([for exception model to use])
2571   AC_LANG_SAVE
2572   AC_LANG_CPLUSPLUS
2573   GLIBCXX_ENABLE(sjlj-exceptions,auto,,
2574     [force use of builtin_setjmp for exceptions],
2575     [permit yes|no|auto])
2576
2577   if test $enable_sjlj_exceptions = auto; then
2578     # Botheration.  Now we've got to detect the exception model.  Link tests
2579     # against libgcc.a are problematic since we've not been given proper -L
2580     # bits for single-tree newlib and libgloss.
2581     #
2582     # Fake what AC_TRY_COMPILE does.  XXX Look at redoing this new-style.
2583     cat > conftest.$ac_ext << EOF
2584 [#]line __oline__ "configure"
2585 struct S { ~S(); };
2586 void bar();
2587 void foo()
2588 {
2589   S s;
2590   bar();
2591 }
2592 EOF
2593     old_CXXFLAGS="$CXXFLAGS"
2594     CXXFLAGS=-S
2595     if AC_TRY_EVAL(ac_compile); then
2596       if grep _Unwind_SjLj_Resume conftest.s >/dev/null 2>&1 ; then
2597         enable_sjlj_exceptions=yes
2598       elif grep _Unwind_Resume conftest.s >/dev/null 2>&1 ; then
2599         enable_sjlj_exceptions=no
2600       elif grep __cxa_end_cleanup conftest.s >/dev/null 2>&1 ; then
2601         enable_sjlj_exceptions=no
2602       fi
2603     fi
2604     CXXFLAGS="$old_CXXFLAGS"
2605     rm -f conftest*
2606   fi
2607
2608   # This is a tad weird, for hysterical raisins.  We have to map
2609   # enable/disable to two different models.
2610   case $enable_sjlj_exceptions in
2611     yes)
2612       AC_DEFINE(_GLIBCXX_SJLJ_EXCEPTIONS, 1,
2613         [Define if the compiler is configured for setjmp/longjmp exceptions.])
2614       ac_exception_model_name=sjlj
2615       ;;
2616     no)
2617       ac_exception_model_name="call frame"
2618       ;;
2619     *)
2620       AC_MSG_ERROR([unable to detect exception model])
2621       ;;
2622   esac
2623  AC_LANG_RESTORE
2624  AC_MSG_RESULT($ac_exception_model_name)
2625 ])
2626
2627
2628 dnl
2629 dnl Allow visibility attributes to be used on namespaces, objects, etc.
2630 dnl
2631 dnl --enable-visibility enables attempt to use visibility attributes.
2632 dnl --disable-visibility turns off all use of visibility attributes.
2633 dnl  +  Usage:  GLIBCXX_ENABLE_VISIBILITY[(DEFAULT)]
2634 dnl       Where DEFAULT is 'yes'.
2635 dnl
2636 AC_DEFUN([GLIBCXX_ENABLE_VISIBILITY], [
2637 GLIBCXX_ENABLE(visibility,$1,,[enables visibility safe usage])
2638
2639 if test x$enable_visibility = xyes ; then
2640   dnl all hail libgfortran
2641   dnl Check whether the target supports hidden visibility.
2642   AC_CACHE_CHECK([whether the target supports hidden visibility],
2643                  glibcxx_cv_have_attribute_visibility, [
2644   save_CFLAGS="$CFLAGS"
2645   CFLAGS="$CFLAGS -Werror"
2646   AC_TRY_COMPILE([void __attribute__((visibility("hidden"))) foo(void) { }],
2647                  [], glibcxx_cv_have_attribute_visibility=yes,
2648                  glibcxx_cv_have_attribute_visibility=no)
2649   CFLAGS="$save_CFLAGS"])
2650   if test $glibcxx_cv_have_attribute_visibility = no; then
2651     enable_visibility=no
2652   fi
2653 fi
2654
2655 GLIBCXX_CONDITIONAL(ENABLE_VISIBILITY, test $enable_visibility = yes)
2656 AC_MSG_NOTICE([visibility supported: $enable_visibility])
2657 ])
2658
2659
2660 dnl
2661 dnl Add version tags to symbols in shared library (or not), additionally
2662 dnl marking other symbols as private/local (or not).
2663 dnl
2664 dnl --enable-symvers=style adds a version script to the linker call when
2665 dnl       creating the shared library.  The choice of version script is
2666 dnl       controlled by 'style'.
2667 dnl --disable-symvers does not.
2668 dnl  +  Usage:  GLIBCXX_ENABLE_SYMVERS[(DEFAULT)]
2669 dnl       Where DEFAULT is either 'yes' or 'no'.  Passing `yes' tries to
2670 dnl       choose a default style based on linker characteristics.  Passing
2671 dnl       'no' disables versioning.
2672 dnl
2673 AC_DEFUN([GLIBCXX_ENABLE_SYMVERS], [
2674
2675 GLIBCXX_ENABLE(symvers,$1,[=STYLE],
2676   [enables symbol versioning of the shared library],
2677   [permit yes|no|gnu|gnu-versioned-namespace|darwin|darwin-export])
2678
2679 # If we never went through the GLIBCXX_CHECK_LINKER_FEATURES macro, then we
2680 # don't know enough about $LD to do tricks...
2681 AC_REQUIRE([GLIBCXX_CHECK_LINKER_FEATURES])
2682
2683 # Turn a 'yes' into a suitable default.
2684 if test x$enable_symvers = xyes ; then
2685   if test $enable_shared = no || test "x$LD" = x || test x$gcc_no_link = xyes; then
2686     enable_symvers=no
2687   else
2688     if test $with_gnu_ld = yes ; then
2689       case ${target_os} in
2690         cygwin* | pe | mingw32*)
2691           enable_symvers=no ;;
2692         *)
2693           enable_symvers=gnu ;;
2694       esac
2695     else
2696       case ${target_os} in
2697         darwin*)
2698           enable_symvers=darwin ;;
2699         *)
2700           enable_symvers=no ;;
2701       esac
2702     fi
2703   fi
2704 fi
2705
2706 # Check to see if 'darwin' or 'darwin-export' can win.
2707 if test x$enable_symvers = xdarwin-export ; then
2708     enable_symvers=darwin
2709 fi
2710
2711 # Check to see if 'gnu' can win.
2712 if test $enable_symvers = gnu || test $enable_symvers = gnu-versioned-namespace; then
2713   # Check to see if libgcc_s exists, indicating that shared libgcc is possible.
2714   AC_MSG_CHECKING([for shared libgcc])
2715   ac_save_CFLAGS="$CFLAGS"
2716   CFLAGS=' -lgcc_s'
2717   AC_TRY_LINK(, [return 0;], glibcxx_shared_libgcc=yes, glibcxx_shared_libgcc=no)
2718   CFLAGS="$ac_save_CFLAGS"
2719   if test $glibcxx_shared_libgcc = no; then
2720     cat > conftest.c <<EOF
2721 int main (void) { return 0; }
2722 EOF
2723 changequote(,)dnl
2724     glibcxx_libgcc_s_suffix=`${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \
2725                              -shared -shared-libgcc -o conftest.so \
2726                              conftest.c -v 2>&1 >/dev/null \
2727                              | sed -n 's/^.* -lgcc_s\([^ ]*\) .*$/\1/p'`
2728 changequote([,])dnl
2729     rm -f conftest.c conftest.so
2730     if test x${glibcxx_libgcc_s_suffix+set} = xset; then
2731       CFLAGS=" -lgcc_s$glibcxx_libgcc_s_suffix"
2732       AC_TRY_LINK(, [return 0;], glibcxx_shared_libgcc=yes)
2733       CFLAGS="$ac_save_CFLAGS"
2734     fi
2735   fi
2736   AC_MSG_RESULT($glibcxx_shared_libgcc)
2737
2738   # For GNU ld, we need at least this version.  The format is described in
2739   # GLIBCXX_CHECK_LINKER_FEATURES above.
2740   glibcxx_min_gnu_ld_version=21400
2741
2742   # If no shared libgcc, can't win.
2743   if test $glibcxx_shared_libgcc != yes; then
2744       AC_MSG_WARN([=== You have requested GNU symbol versioning, but])
2745       AC_MSG_WARN([=== you are not building a shared libgcc_s.])
2746       AC_MSG_WARN([=== Symbol versioning will be disabled.])
2747       enable_symvers=no
2748   elif test $with_gnu_ld != yes ; then
2749     # just fail for now
2750     AC_MSG_WARN([=== You have requested GNU symbol versioning, but])
2751     AC_MSG_WARN([=== you are not using the GNU linker.])
2752     AC_MSG_WARN([=== Symbol versioning will be disabled.])
2753     enable_symvers=no
2754   elif test $glibcxx_ld_is_gold = yes ; then
2755     : All versions of gold support symbol versioning.
2756   elif test $glibcxx_gnu_ld_version -lt $glibcxx_min_gnu_ld_version ; then
2757     # The right tools, the right setup, but too old.  Fallbacks?
2758     AC_MSG_WARN(=== Linker version $glibcxx_gnu_ld_version is too old for)
2759     AC_MSG_WARN(=== full symbol versioning support in this release of GCC.)
2760     AC_MSG_WARN(=== You would need to upgrade your binutils to version)
2761     AC_MSG_WARN(=== $glibcxx_min_gnu_ld_version or later and rebuild GCC.)
2762     AC_MSG_WARN([=== Symbol versioning will be disabled.])
2763     enable_symvers=no
2764   fi
2765 fi
2766
2767 # Everything parsed; figure out what file to use.
2768 case $enable_symvers in
2769   no)
2770     SYMVER_FILE=config/abi/pre/none.ver
2771     ;;
2772   gnu)
2773     SYMVER_FILE=config/abi/pre/gnu.ver
2774     AC_DEFINE(_GLIBCXX_SYMVER_GNU, 1, 
2775               [Define to use GNU versioning in the shared library.])
2776     ;;
2777   gnu-versioned-namespace)
2778     SYMVER_FILE=config/abi/pre/gnu-versioned-namespace.ver
2779     AC_DEFINE(_GLIBCXX_SYMVER_GNU_NAMESPACE, 1, 
2780               [Define to use GNU namespace versioning in the shared library.])
2781     ;;
2782   darwin)
2783     SYMVER_FILE=config/abi/pre/gnu.ver
2784     AC_DEFINE(_GLIBCXX_SYMVER_DARWIN, 1, 
2785               [Define to use darwin versioning in the shared library.])
2786     ;;
2787 esac
2788
2789 if test x$enable_symvers != xno ; then
2790   AC_DEFINE(_GLIBCXX_SYMVER, 1,
2791          [Define to use symbol versioning in the shared library.])
2792 fi
2793
2794 AC_SUBST(SYMVER_FILE)
2795 AC_SUBST(port_specific_symbol_files)
2796 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS, test $enable_symvers != no)
2797 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_GNU, test $enable_symvers = gnu)
2798 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_GNU_NAMESPACE, test $enable_symvers = gnu-versioned-namespace)
2799 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_DARWIN, test $enable_symvers = darwin)
2800 AC_MSG_NOTICE(versioning on shared library symbols is $enable_symvers)
2801
2802 # Now, set up compatibility support, if any.
2803 # In addition, need this to deal with std::size_t mangling in
2804 # src/compatibility.cc.  In a perfect world, could use
2805 # typeid(std::size_t).name()[0] to do direct substitution.
2806 AC_MSG_CHECKING([for size_t as unsigned int])
2807 ac_save_CFLAGS="$CFLAGS"
2808 CFLAGS="-Werror"
2809 AC_TRY_COMPILE(, [__SIZE_TYPE__* stp; unsigned int* uip; stp = uip;], 
2810                  [glibcxx_size_t_is_i=yes], [glibcxx_size_t_is_i=no])
2811 CFLAGS=$ac_save_CFLAGS
2812 if test "$glibcxx_size_t_is_i" = yes; then
2813   AC_DEFINE(_GLIBCXX_SIZE_T_IS_UINT, 1, [Define if size_t is unsigned int.])
2814 fi
2815 AC_MSG_RESULT([$glibcxx_size_t_is_i])
2816
2817 AC_MSG_CHECKING([for ptrdiff_t as int])
2818 ac_save_CFLAGS="$CFLAGS"
2819 CFLAGS="-Werror"
2820 AC_TRY_COMPILE(, [__PTRDIFF_TYPE__* ptp; int* ip; ptp = ip;], 
2821                  [glibcxx_ptrdiff_t_is_i=yes], [glibcxx_ptrdiff_t_is_i=no])
2822 CFLAGS=$ac_save_CFLAGS
2823 if test "$glibcxx_ptrdiff_t_is_i" = yes; then
2824   AC_DEFINE(_GLIBCXX_PTRDIFF_T_IS_INT, 1, [Define if ptrdiff_t is int.])
2825 fi
2826 AC_MSG_RESULT([$glibcxx_ptrdiff_t_is_i])
2827 ])
2828
2829
2830 dnl
2831 dnl Setup to use the gcc gthr.h thread-specific memory and mutex model.
2832 dnl We must stage the required headers so that they will be installed
2833 dnl with the library (unlike libgcc, the STL implementation is provided
2834 dnl solely within headers).  Since we must not inject random user-space
2835 dnl macro names into user-provided C++ code, we first stage into <file>-in
2836 dnl and process to <file> with an output command.  The reason for a two-
2837 dnl stage process here is to correctly handle $srcdir!=$objdir without
2838 dnl having to write complex code (the sed commands to clean the macro
2839 dnl namespace are complex and fragile enough as it is).  We must also
2840 dnl add a relative path so that -I- is supported properly.
2841 dnl
2842 dnl Substs:
2843 dnl  glibcxx_thread_h
2844 dnl
2845 dnl Defines:
2846 dnl  HAVE_GTHR_DEFAULT
2847 dnl
2848 AC_DEFUN([GLIBCXX_ENABLE_THREADS], [
2849   AC_MSG_CHECKING([for thread model used by GCC])
2850   target_thread_file=`$CXX -v 2>&1 | sed -n 's/^Thread model: //p'`
2851   AC_MSG_RESULT([$target_thread_file])
2852
2853   if test $target_thread_file != single; then
2854     AC_DEFINE(HAVE_GTHR_DEFAULT, 1,
2855               [Define if gthr-default.h exists 
2856               (meaning that threading support is enabled).])
2857   fi
2858
2859   glibcxx_thread_h=gthr-$target_thread_file.h
2860
2861   dnl Check for __GTHREADS define.
2862   gthread_file=${toplevel_srcdir}/gcc/${glibcxx_thread_h}
2863   if grep __GTHREADS $gthread_file >/dev/null 2>&1 ; then
2864     enable_thread=yes
2865   else
2866    enable_thread=no
2867   fi
2868
2869   AC_SUBST(glibcxx_thread_h)
2870 ])
2871
2872
2873 dnl
2874 dnl Check if gthread implementation defines the types and functions
2875 dnl required by the c++0x thread library.  Conforming gthread
2876 dnl implementations can define __GTHREADS_CXX0X to enable use with c++0x.
2877 dnl
2878 AC_DEFUN([GLIBCXX_CHECK_GTHREADS], [
2879   AC_LANG_SAVE
2880   AC_LANG_CPLUSPLUS
2881
2882   ac_save_CXXFLAGS="$CXXFLAGS"
2883   CXXFLAGS="$CXXFLAGS -fno-exceptions -I${toplevel_srcdir}/gcc"
2884
2885   target_thread_file=`$CXX -v 2>&1 | sed -n 's/^Thread model: //p'`
2886   case $target_thread_file in
2887     posix)
2888       CXXFLAGS="$CXXFLAGS -DSUPPORTS_WEAK -DGTHREAD_USE_WEAK -D_PTHREADS"
2889   esac
2890
2891   AC_MSG_CHECKING([for gthreads library])
2892
2893   AC_TRY_COMPILE([#include "gthr.h"],
2894     [
2895       #ifndef __GTHREADS_CXX0X
2896       #error
2897       #endif
2898
2899       // In case of POSIX threads check _POSIX_TIMEOUTS too.
2900       #if (defined(_PTHREADS) \
2901            && (!defined(_POSIX_TIMEOUTS) || _POSIX_TIMEOUTS <= 0))
2902       #error
2903       #endif
2904     ], [ac_has_gthreads=yes], [ac_has_gthreads=no])
2905
2906   AC_MSG_RESULT([$ac_has_gthreads])
2907
2908   if test x"$ac_has_gthreads" = x"yes"; then
2909     AC_DEFINE(_GLIBCXX_HAS_GTHREADS, 1,
2910               [Define if gthreads library is available.])
2911   fi
2912
2913   CXXFLAGS="$ac_save_CXXFLAGS"
2914   AC_LANG_RESTORE
2915 ])
2916
2917
2918 # Check whether LC_MESSAGES is available in <locale.h>.
2919 # Ulrich Drepper <drepper@cygnus.com>, 1995.
2920 #
2921 # This file file be copied and used freely without restrictions.  It can
2922 # be used in projects which are not available under the GNU Public License
2923 # but which still want to provide support for the GNU gettext functionality.
2924 # Please note that the actual code is *not* freely available.
2925 AC_DEFUN([AC_LC_MESSAGES], [
2926   AC_CHECK_HEADER(locale.h, [
2927     AC_CACHE_CHECK([for LC_MESSAGES], ac_cv_val_LC_MESSAGES,
2928       [AC_TRY_COMPILE([#include <locale.h>], [return LC_MESSAGES],
2929        ac_cv_val_LC_MESSAGES=yes, ac_cv_val_LC_MESSAGES=no)])
2930     if test $ac_cv_val_LC_MESSAGES = yes; then
2931       AC_DEFINE(HAVE_LC_MESSAGES, 1, 
2932                 [Define if LC_MESSAGES is available in <locale.h>.])
2933     fi
2934   ])
2935 ])
2936
2937 # Macros from the top-level gcc directory.
2938 m4_include([../config/tls.m4])
2939