OSDN Git Service

279c4f3e1456247f629fa93cbc74d994bcd7d2e1
[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 ISO/IEC 9899:1999 "C99" support to ISO/IEC DTR 19768 "TR1"
1205 dnl facilities in Chapter 8, "C compatibility".
1206 dnl
1207 AC_DEFUN([GLIBCXX_CHECK_C99_TR1], [
1208
1209   AC_LANG_SAVE
1210   AC_LANG_CPLUSPLUS
1211
1212   # Use -std=c++98 because the default (-std=gnu++98) leaves __STRICT_ANSI__
1213   # undefined and fake C99 facilities may be spuriously enabled.
1214   ac_save_CXXFLAGS="$CXXFLAGS"
1215   CXXFLAGS="$CXXFLAGS -std=c++98"
1216
1217   # Check for the existence of <complex.h> complex math functions used
1218   # by tr1/complex.
1219   AC_CHECK_HEADERS(complex.h, ac_has_complex_h=yes, ac_has_complex_h=no)
1220   ac_c99_complex_tr1=no;
1221   if test x"$ac_has_complex_h" = x"yes"; then
1222     AC_MSG_CHECKING([for ISO C99 support to TR1 in <complex.h>])
1223     AC_TRY_COMPILE([#include <complex.h>],
1224                    [typedef __complex__ float float_type; float_type tmpf;
1225                     cacosf(tmpf);
1226                     casinf(tmpf);
1227                     catanf(tmpf);
1228                     cacoshf(tmpf);
1229                     casinhf(tmpf);
1230                     catanhf(tmpf);
1231                     typedef __complex__ double double_type; double_type tmpd;
1232                     cacos(tmpd);
1233                     casin(tmpd);
1234                     catan(tmpd);
1235                     cacosh(tmpd);
1236                     casinh(tmpd);
1237                     catanh(tmpd);
1238                     typedef __complex__ long double ld_type; ld_type tmpld;
1239                     cacosl(tmpld);
1240                     casinl(tmpld);
1241                     catanl(tmpld);
1242                     cacoshl(tmpld);
1243                     casinhl(tmpld);
1244                     catanhl(tmpld);
1245                    ],[ac_c99_complex_tr1=yes], [ac_c99_complex_tr1=no])
1246   fi
1247   AC_MSG_RESULT($ac_c99_complex_tr1)
1248   if test x"$ac_c99_complex_tr1" = x"yes"; then
1249     AC_DEFINE(_GLIBCXX_USE_C99_COMPLEX_TR1, 1,
1250               [Define if C99 functions in <complex.h> should be used in
1251               <tr1/complex>. Using compiler builtins for these functions
1252               requires corresponding C99 library functions to be present.])
1253   fi
1254
1255   # Check for the existence of <ctype.h> functions.
1256   AC_MSG_CHECKING([for ISO C99 support to TR1 in <ctype.h>])
1257   AC_CACHE_VAL(glibcxx_cv_c99_ctype_tr1, [
1258   AC_TRY_COMPILE([#include <ctype.h>],
1259                  [int ch;
1260                   int ret;
1261                   ret = isblank(ch);
1262                  ],[glibcxx_cv_c99_ctype_tr1=yes],
1263                    [glibcxx_cv_c99_ctype_tr1=no])
1264   ])
1265   AC_MSG_RESULT($glibcxx_cv_c99_ctype_tr1)
1266   if test x"$glibcxx_cv_c99_ctype_tr1" = x"yes"; then
1267     AC_DEFINE(_GLIBCXX_USE_C99_CTYPE_TR1, 1,
1268               [Define if C99 functions in <ctype.h> should be imported in
1269               <tr1/cctype> in namespace std::tr1.])
1270   fi
1271
1272   # Check for the existence of <fenv.h> functions.
1273   AC_CHECK_HEADERS(fenv.h, ac_has_fenv_h=yes, ac_has_fenv_h=no)
1274   ac_c99_fenv_tr1=no;
1275   if test x"$ac_has_fenv_h" = x"yes"; then
1276     AC_MSG_CHECKING([for ISO C99 support to TR1 in <fenv.h>])
1277     AC_TRY_COMPILE([#include <fenv.h>],
1278                    [int except, mode;
1279                     fexcept_t* pflag;
1280                     fenv_t* penv;
1281                     int ret;
1282                     ret = feclearexcept(except);
1283                     ret = fegetexceptflag(pflag, except);
1284                     ret = feraiseexcept(except);
1285                     ret = fesetexceptflag(pflag, except);
1286                     ret = fetestexcept(except);
1287                     ret = fegetround();
1288                     ret = fesetround(mode);
1289                     ret = fegetenv(penv);
1290                     ret = feholdexcept(penv);
1291                     ret = fesetenv(penv);
1292                     ret = feupdateenv(penv);
1293                    ],[ac_c99_fenv_tr1=yes], [ac_c99_fenv_tr1=no])
1294   fi
1295   AC_MSG_RESULT($ac_c99_fenv_tr1)
1296   if test x"$ac_c99_fenv_tr1" = x"yes"; then
1297     AC_DEFINE(_GLIBCXX_USE_C99_FENV_TR1, 1,
1298               [Define if C99 functions in <fenv.h> should be imported in
1299               <tr1/cfenv> in namespace std::tr1.])
1300   fi
1301
1302   # Check for the existence of <stdint.h> types.
1303   AC_MSG_CHECKING([for ISO C99 support to TR1 in <stdint.h>])
1304   AC_CACHE_VAL(glibcxx_cv_c99_stdint_tr1, [
1305   AC_TRY_COMPILE([#define __STDC_LIMIT_MACROS
1306                   #define __STDC_CONSTANT_MACROS
1307                   #include <stdint.h>],
1308                  [typedef int8_t          my_int8_t;
1309                   my_int8_t               i8 = INT8_MIN;
1310                   i8 = INT8_MAX;
1311                   typedef int16_t         my_int16_t;
1312                   my_int16_t              i16 = INT16_MIN;
1313                   i16 = INT16_MAX;
1314                   typedef int32_t         my_int32_t;
1315                   my_int32_t              i32 = INT32_MIN;
1316                   i32 = INT32_MAX;
1317                   typedef int64_t         my_int64_t;
1318                   my_int64_t              i64 = INT64_MIN;
1319                   i64 = INT64_MAX;
1320                   typedef int_fast8_t     my_int_fast8_t;
1321                   my_int_fast8_t          if8 = INT_FAST8_MIN;
1322                   if8 = INT_FAST8_MAX;
1323                   typedef int_fast16_t    my_int_fast16_t;
1324                   my_int_fast16_t         if16 = INT_FAST16_MIN;
1325                   if16 = INT_FAST16_MAX;
1326                   typedef int_fast32_t    my_int_fast32_t;
1327                   my_int_fast32_t         if32 = INT_FAST32_MIN;
1328                   if32 = INT_FAST32_MAX;
1329                   typedef int_fast64_t    my_int_fast64_t;
1330                   my_int_fast64_t         if64 = INT_FAST64_MIN;
1331                   if64 = INT_FAST64_MAX;
1332                   typedef int_least8_t    my_int_least8_t;
1333                   my_int_least8_t         il8 = INT_LEAST8_MIN;
1334                   il8 = INT_LEAST8_MAX;
1335                   typedef int_least16_t   my_int_least16_t;
1336                   my_int_least16_t        il16 = INT_LEAST16_MIN;
1337                   il16 = INT_LEAST16_MAX;
1338                   typedef int_least32_t   my_int_least32_t;
1339                   my_int_least32_t        il32 = INT_LEAST32_MIN;
1340                   il32 = INT_LEAST32_MAX;
1341                   typedef int_least64_t   my_int_least64_t;
1342                   my_int_least64_t        il64 = INT_LEAST64_MIN;
1343                   il64 = INT_LEAST64_MAX;
1344                   typedef intmax_t        my_intmax_t;
1345                   my_intmax_t             im = INTMAX_MAX;
1346                   im = INTMAX_MIN;
1347                   typedef intptr_t        my_intptr_t;
1348                   my_intptr_t             ip = INTPTR_MAX;
1349                   ip = INTPTR_MIN;
1350                   typedef uint8_t         my_uint8_t;
1351                   my_uint8_t              ui8 = UINT8_MAX;
1352                   ui8 = UINT8_MAX;
1353                   typedef uint16_t        my_uint16_t;
1354                   my_uint16_t             ui16 = UINT16_MAX;
1355                   ui16 = UINT16_MAX;
1356                   typedef uint32_t        my_uint32_t;
1357                   my_uint32_t             ui32 = UINT32_MAX;
1358                   ui32 = UINT32_MAX;
1359                   typedef uint64_t        my_uint64_t;
1360                   my_uint64_t             ui64 = UINT64_MAX;
1361                   ui64 = UINT64_MAX;
1362                   typedef uint_fast8_t    my_uint_fast8_t;
1363                   my_uint_fast8_t         uif8 = UINT_FAST8_MAX;
1364                   uif8 = UINT_FAST8_MAX;
1365                   typedef uint_fast16_t   my_uint_fast16_t;
1366                   my_uint_fast16_t        uif16 = UINT_FAST16_MAX;
1367                   uif16 = UINT_FAST16_MAX;
1368                   typedef uint_fast32_t   my_uint_fast32_t;
1369                   my_uint_fast32_t        uif32 = UINT_FAST32_MAX;
1370                   uif32 = UINT_FAST32_MAX;
1371                   typedef uint_fast64_t   my_uint_fast64_t;
1372                   my_uint_fast64_t        uif64 = UINT_FAST64_MAX;
1373                   uif64 = UINT_FAST64_MAX;
1374                   typedef uint_least8_t   my_uint_least8_t;
1375                   my_uint_least8_t        uil8 = UINT_LEAST8_MAX;
1376                   uil8 = UINT_LEAST8_MAX;
1377                   typedef uint_least16_t  my_uint_least16_t;
1378                   my_uint_least16_t       uil16 = UINT_LEAST16_MAX;
1379                   uil16 = UINT_LEAST16_MAX;
1380                   typedef uint_least32_t  my_uint_least32_t;
1381                   my_uint_least32_t       uil32 = UINT_LEAST32_MAX;
1382                   uil32 = UINT_LEAST32_MAX;
1383                   typedef uint_least64_t  my_uint_least64_t;
1384                   my_uint_least64_t       uil64 = UINT_LEAST64_MAX;
1385                   uil64 = UINT_LEAST64_MAX;
1386                   typedef uintmax_t       my_uintmax_t;
1387                   my_uintmax_t            uim = UINTMAX_MAX;
1388                   uim = UINTMAX_MAX;
1389                   typedef uintptr_t       my_uintptr_t;
1390                   my_uintptr_t            uip = UINTPTR_MAX;
1391                   uip = UINTPTR_MAX;
1392                  ],[glibcxx_cv_c99_stdint_tr1=yes],
1393                    [glibcxx_cv_c99_stdint_tr1=no])
1394   ])
1395   AC_MSG_RESULT($glibcxx_cv_c99_stdint_tr1)
1396   if test x"$glibcxx_cv_c99_stdint_tr1" = x"yes"; then
1397     AC_DEFINE(_GLIBCXX_USE_C99_STDINT_TR1, 1,
1398               [Define if C99 types in <stdint.h> should be imported in
1399               <tr1/cstdint> in namespace std::tr1.])
1400   fi
1401
1402   # Check for the existence of <math.h> functions.
1403   AC_MSG_CHECKING([for ISO C99 support to TR1 in <math.h>])
1404   AC_CACHE_VAL(glibcxx_cv_c99_math_tr1, [
1405   AC_TRY_COMPILE([#include <math.h>],
1406                  [typedef double_t  my_double_t;
1407                   typedef float_t   my_float_t;
1408                   acosh(0.0);
1409                   acoshf(0.0f);
1410                   acoshl(0.0l);
1411                   asinh(0.0);
1412                   asinhf(0.0f);
1413                   asinhl(0.0l);
1414                   atanh(0.0);
1415                   atanhf(0.0f);
1416                   atanhl(0.0l);
1417                   cbrt(0.0);
1418                   cbrtf(0.0f);
1419                   cbrtl(0.0l);
1420                   copysign(0.0, 0.0);
1421                   copysignf(0.0f, 0.0f);
1422                   copysignl(0.0l, 0.0l);
1423                   erf(0.0);
1424                   erff(0.0f);
1425                   erfl(0.0l);
1426                   erfc(0.0);
1427                   erfcf(0.0f);
1428                   erfcl(0.0l);
1429                   exp2(0.0);
1430                   exp2f(0.0f);
1431                   exp2l(0.0l);
1432                   expm1(0.0);
1433                   expm1f(0.0f);
1434                   expm1l(0.0l);
1435                   fdim(0.0, 0.0);
1436                   fdimf(0.0f, 0.0f);
1437                   fdiml(0.0l, 0.0l);
1438                   fma(0.0, 0.0, 0.0);
1439                   fmaf(0.0f, 0.0f, 0.0f);
1440                   fmal(0.0l, 0.0l, 0.0l);
1441                   fmax(0.0, 0.0);
1442                   fmaxf(0.0f, 0.0f);
1443                   fmaxl(0.0l, 0.0l);
1444                   fmin(0.0, 0.0);
1445                   fminf(0.0f, 0.0f);
1446                   fminl(0.0l, 0.0l);
1447                   hypot(0.0, 0.0);
1448                   hypotf(0.0f, 0.0f);
1449                   hypotl(0.0l, 0.0l);
1450                   ilogb(0.0);
1451                   ilogbf(0.0f);
1452                   ilogbl(0.0l);
1453                   lgamma(0.0);
1454                   lgammaf(0.0f);
1455                   lgammal(0.0l);
1456                   llrint(0.0);
1457                   llrintf(0.0f);
1458                   llrintl(0.0l);
1459                   llround(0.0);
1460                   llroundf(0.0f);
1461                   llroundl(0.0l);
1462                   log1p(0.0);
1463                   log1pf(0.0f);
1464                   log1pl(0.0l);
1465                   log2(0.0);
1466                   log2f(0.0f);
1467                   log2l(0.0l);
1468                   logb(0.0);
1469                   logbf(0.0f);
1470                   logbl(0.0l);
1471                   lrint(0.0);
1472                   lrintf(0.0f);
1473                   lrintl(0.0l);
1474                   lround(0.0);
1475                   lroundf(0.0f);
1476                   lroundl(0.0l);
1477                   nan(0);
1478                   nanf(0);
1479                   nanl(0);
1480                   nearbyint(0.0);
1481                   nearbyintf(0.0f);
1482                   nearbyintl(0.0l);
1483                   nextafter(0.0, 0.0);
1484                   nextafterf(0.0f, 0.0f);
1485                   nextafterl(0.0l, 0.0l);
1486                   nexttoward(0.0, 0.0);
1487                   nexttowardf(0.0f, 0.0f);
1488                   nexttowardl(0.0l, 0.0l);
1489                   remainder(0.0, 0.0);
1490                   remainderf(0.0f, 0.0f);
1491                   remainderl(0.0l, 0.0l);
1492                   remquo(0.0, 0.0, 0);
1493                   remquo(0.0f, 0.0f, 0);
1494                   remquo(0.0l, 0.0l, 0);
1495                   rint(0.0);
1496                   rintf(0.0f);
1497                   rintl(0.0l);
1498                   round(0.0);
1499                   roundf(0.0f);
1500                   roundl(0.0l);
1501                   scalbln(0.0, 0l);
1502                   scalblnf(0.0f, 0l);
1503                   scalblnl(0.0l, 0l);
1504                   scalbn(0.0, 0);
1505                   scalbnf(0.0f, 0);
1506                   scalbnl(0.0l, 0);
1507                   tgamma(0.0);
1508                   tgammaf(0.0f);
1509                   tgammal(0.0l);
1510                   trunc(0.0);
1511                   truncf(0.0f);
1512                   truncl(0.0l);
1513                  ],[glibcxx_cv_c99_math_tr1=yes], [glibcxx_cv_c99_math_tr1=no])
1514   ])
1515   AC_MSG_RESULT($glibcxx_cv_c99_math_tr1)
1516   if test x"$glibcxx_cv_c99_math_tr1" = x"yes"; then
1517     AC_DEFINE(_GLIBCXX_USE_C99_MATH_TR1, 1,
1518               [Define if C99 functions or macros in <math.h> should be imported
1519               in <tr1/cmath> in namespace std::tr1.])
1520   fi
1521
1522   # Check for the existence of <inttypes.h> functions (NB: doesn't make
1523   # sense if the previous check fails, per C99, 7.8/1).
1524   ac_c99_inttypes_tr1=no;
1525   if test x"$glibcxx_cv_c99_stdint_tr1" = x"yes"; then
1526     AC_MSG_CHECKING([for ISO C99 support to TR1 in <inttypes.h>])
1527     AC_TRY_COMPILE([#include <inttypes.h>],
1528                    [intmax_t i, numer, denom, base;
1529                     const char* s;
1530                     char** endptr;
1531                     intmax_t ret = imaxabs(i);
1532                     imaxdiv_t dret = imaxdiv(numer, denom);
1533                     ret = strtoimax(s, endptr, base);
1534                     uintmax_t uret = strtoumax(s, endptr, base);
1535                    ],[ac_c99_inttypes_tr1=yes], [ac_c99_inttypes_tr1=no])
1536   fi
1537   AC_MSG_RESULT($ac_c99_inttypes_tr1)
1538   if test x"$ac_c99_inttypes_tr1" = x"yes"; then
1539     AC_DEFINE(_GLIBCXX_USE_C99_INTTYPES_TR1, 1,
1540               [Define if C99 functions in <inttypes.h> should be imported in
1541               <tr1/cinttypes> in namespace std::tr1.])
1542   fi
1543
1544   # Check for the existence of the <stdbool.h> header.  
1545   AC_CHECK_HEADERS(stdbool.h)
1546
1547   CXXFLAGS="$ac_save_CXXFLAGS"
1548   AC_LANG_RESTORE
1549 ])
1550
1551 dnl
1552 dnl Check whether "/dev/random" and "/dev/urandom" are available for the
1553 dnl random_device of "TR1" (Chapter 5.1, "Random number generation").
1554 dnl
1555 AC_DEFUN([GLIBCXX_CHECK_RANDOM_TR1], [
1556
1557   AC_MSG_CHECKING([for "/dev/random" and "/dev/urandom" for TR1 random_device])
1558   AC_CACHE_VAL(glibcxx_cv_random_tr1, [
1559     if test -r /dev/random && test -r /dev/urandom; then
1560       glibcxx_cv_random_tr1=yes;
1561     else
1562       glibcxx_cv_random_tr1=no;
1563     fi
1564   ])
1565   AC_MSG_RESULT($glibcxx_cv_random_tr1)
1566
1567   if test x"$glibcxx_cv_random_tr1" = x"yes"; then
1568     AC_DEFINE(_GLIBCXX_USE_RANDOM_TR1, 1,
1569               [Define if /dev/random and /dev/urandom are available for
1570                the random_device of TR1 (Chapter 5.1).])
1571   fi
1572
1573 ])
1574
1575 dnl
1576 dnl Check whether EOF, SEEK_CUR, and SEEK_END have the most common values:
1577 dnl in that case including <cstdio> in some C++ headers can be avoided.
1578 dnl
1579 AC_DEFUN([GLIBCXX_CHECK_STDIO_MACROS], [
1580
1581   AC_MSG_CHECKING([for EOF == -1, SEEK_CUR == 1, SEEK_END == 2])
1582   AC_CACHE_VAL(glibcxx_cv_stdio_macros, [
1583   AC_TRY_COMPILE([#include <stdio.h>],
1584                  [#if ((EOF != -1) || (SEEK_CUR != 1) || (SEEK_END != 2))
1585                     unusual values...
1586                   #endif
1587                  ], [glibcxx_cv_stdio_macros=yes],
1588                     [glibcxx_cv_stdio_macros=no])
1589   ])
1590   AC_MSG_RESULT($glibcxx_cv_stdio_macros)
1591   if test x"$glibcxx_cv_stdio_macros" = x"yes"; then
1592     AC_DEFINE(_GLIBCXX_STDIO_MACROS, 1,
1593               [Define if EOF == -1, SEEK_CUR == 1, SEEK_END == 2.])
1594   fi
1595
1596 ])
1597
1598 dnl
1599 dnl Check whether macros, etc are present for <system_error>
1600 dnl
1601 AC_DEFUN([GLIBCXX_CHECK_SYSTEM_ERROR], [
1602
1603 m4_pushdef([n_syserr], [1])dnl
1604 m4_foreach([syserr], [EOWNERDEAD, ENOTRECOVERABLE, ENOLINK, EPROTO, ENODATA,
1605                       ENOSR, ENOSTR, ETIME, EBADMSG, ECANCELED,
1606                       EOVERFLOW, ENOTSUP, EIDRM, ETXTBSY],
1607 [m4_pushdef([SYSERR], m4_toupper(syserr))dnl
1608 AC_MSG_CHECKING([for syserr])
1609 AC_CACHE_VAL([glibcxx_cv_system_error[]n_syserr], [
1610 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <errno.h>]],
1611                                    [int i = syserr;])],
1612                   [glibcxx_cv_system_error[]n_syserr=yes],
1613                   [glibcxx_cv_system_error[]n_syserr=no])
1614 ])
1615 AC_MSG_RESULT([$glibcxx_cv_system_error[]n_syserr])
1616 if test x"$glibcxx_cv_system_error[]n_syserr" = x"yes"; then
1617   AC_DEFINE([HAVE_]SYSERR, 1, [Define if ]syserr[ exists.])
1618 fi
1619 m4_define([n_syserr], m4_incr(n_syserr))dnl
1620 m4_popdef([SYSERR])dnl
1621 ])
1622 m4_popdef([n_syserr])dnl
1623 ])
1624
1625 dnl
1626 dnl Check whether C++200x's standard layout types are supported. 
1627 dnl
1628 AC_DEFUN([GLIBCXX_CHECK_STANDARD_LAYOUT], [
1629
1630   AC_MSG_CHECKING([for ISO C++200x standard layout type support])
1631   AC_CACHE_VAL(ac_standard_layout, [
1632   AC_LANG_SAVE
1633   AC_LANG_CPLUSPLUS
1634   ac_test_CXXFLAGS="${CXXFLAGS+set}"
1635   ac_save_CXXFLAGS="$CXXFLAGS"
1636   CXXFLAGS='-std=gnu++0x'
1637
1638   AC_TRY_COMPILE([struct b
1639                   {
1640                     bool t;
1641
1642                     // Need standard layout relaxation from POD
1643                     private:        
1644                     b& operator=(const b&);
1645                     b(const b&);
1646                     };
1647
1648                     int main()
1649                     {
1650                       b tst1 = { false };
1651                        return 0;
1652                     }],,
1653              [ac_standard_layout=yes], [ac_standard_layout=no])
1654
1655   CXXFLAGS="$ac_save_CXXFLAGS"
1656   AC_LANG_RESTORE
1657   ])
1658   AC_MSG_RESULT($ac_standard_layout)
1659   if test x"$ac_standard_layout" = x"yes"; then
1660     AC_DEFINE(_GLIBCXX_USE_STANDARD_LAYOUT, 1,
1661               [Define if standard layout types are supported in C++200x.])
1662   fi
1663 ])
1664
1665 dnl
1666 dnl Check for what type of C headers to use.
1667 dnl
1668 dnl --enable-cheaders= [does stuff].
1669 dnl --disable-cheaders [does not do anything, really].
1670 dnl  +  Usage:  GLIBCXX_ENABLE_CHEADERS[(DEFAULT)]
1671 dnl       Where DEFAULT is either 'c' or 'c_std' or 'c_global'.
1672 dnl
1673 AC_DEFUN([GLIBCXX_ENABLE_CHEADERS], [
1674   GLIBCXX_ENABLE(cheaders,$1,[=KIND],
1675     [construct "C" headers for g++], [permit c|c_std|c_global])
1676   AC_MSG_NOTICE("C" header strategy set to $enable_cheaders)
1677
1678   C_INCLUDE_DIR='${glibcxx_srcdir}/include/'$enable_cheaders
1679
1680   # Allow overrides to configure.host here.
1681   if test $enable_cheaders = c_global; then
1682      c_compatibility=yes
1683   fi
1684
1685   if test $enable_cheaders = c_global || test $enable_cheaders = c_std; then
1686      c_extra=yes
1687   fi
1688
1689   AC_SUBST(C_INCLUDE_DIR)
1690   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_C, test $enable_cheaders = c)
1691   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_C_STD, test $enable_cheaders = c_std)
1692   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_C_GLOBAL, test $enable_cheaders = c_global)
1693   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_COMPATIBILITY, test $c_compatibility = yes)
1694   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_EXTRA, test $c_extra = yes)
1695 ])
1696
1697
1698 dnl
1699 dnl Check for which locale library to use.  The choice is mapped to
1700 dnl a subdirectory of config/locale.
1701 dnl
1702 dnl Default is generic.
1703 dnl
1704 AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [
1705   GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@],
1706     [use MODEL for target locale package],
1707     [permit generic|gnu|ieee_1003.1-2001|yes|no|auto])
1708
1709   # Deal with gettext issues.  Default to not using it (=no) until we detect
1710   # support for it later.  Let the user turn it off via --e/d, but let that
1711   # default to on for easier handling.
1712   USE_NLS=no
1713   AC_ARG_ENABLE(nls,
1714     AC_HELP_STRING([--enable-nls],[use Native Language Support (default)]),
1715     [],
1716     [enable_nls=yes])
1717   
1718   # Either a known packaage, or "auto"
1719   if test $enable_clocale = no || test $enable_clocale = yes; then
1720      enable_clocale=auto
1721   fi
1722   enable_clocale_flag=$enable_clocale
1723
1724   # Probe for locale model to use if none specified.
1725   # Default to "generic".
1726   if test $enable_clocale_flag = auto; then
1727     case ${target_os} in
1728       linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
1729         enable_clocale_flag=gnu 
1730         ;;
1731       darwin* | freebsd*)
1732         enable_clocale_flag=darwin
1733         ;;
1734       *)
1735         enable_clocale_flag=generic
1736         ;;
1737     esac
1738   fi
1739
1740   # Sanity check model, and test for special functionality.
1741   if test $enable_clocale_flag = gnu; then
1742     AC_EGREP_CPP([_GLIBCXX_ok], [
1743     #include <features.h>
1744     #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)
1745       _GLIBCXX_ok
1746     #endif
1747     ], enable_clocale_flag=gnu, enable_clocale_flag=generic)
1748
1749     if test $enable_clocale = auto; then
1750       # Test for bugs early in glibc-2.2.x series
1751       AC_TRY_RUN([
1752       #define _GNU_SOURCE 1
1753       #include <locale.h>
1754       #include <string.h>
1755       #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
1756       extern __typeof(newlocale) __newlocale;
1757       extern __typeof(duplocale) __duplocale;
1758       extern __typeof(strcoll_l) __strcoll_l;
1759       #endif
1760       int main()
1761       {
1762         const char __one[] = "Äuglein Augmen";
1763         const char __two[] = "Äuglein";
1764         int i;
1765         int j;
1766         __locale_t        loc;
1767         __locale_t        loc_dup;
1768         loc = __newlocale(1 << LC_ALL, "de_DE", 0);
1769         loc_dup = __duplocale(loc);
1770         i = __strcoll_l(__one, __two, loc);
1771         j = __strcoll_l(__one, __two, loc_dup);
1772         return 0;
1773       }
1774       ],
1775       [enable_clocale_flag=gnu],[enable_clocale_flag=generic],
1776       [enable_clocale_flag=generic])
1777     fi
1778
1779     # Set it to scream when it hurts.
1780     ac_save_CFLAGS="$CFLAGS"    
1781     CFLAGS="-Wimplicit-function-declaration -Werror"
1782
1783     # Use strxfrm_l if available.
1784     AC_TRY_COMPILE([#define _GNU_SOURCE 1
1785                     #include <string.h>
1786                     #include <locale.h>],
1787                     [char s[128]; __locale_t loc; strxfrm_l(s, "C", 5, loc);], 
1788                     AC_DEFINE(HAVE_STRXFRM_L, 1, 
1789                     [Define if strxfrm_l is available in <string.h>.]),)
1790     
1791     # Use strerror_l if available.
1792     AC_TRY_COMPILE([#define _GNU_SOURCE 1
1793                     #include <string.h>
1794                     #include <locale.h>],
1795                     [__locale_t loc; strerror_l(5, loc);], 
1796                     AC_DEFINE(HAVE_STRERROR_L, 1, 
1797                     [Define if strerror_l is available in <string.h>.]),)
1798
1799     CFLAGS="$ac_save_CFLAGS"
1800   fi
1801
1802   # Perhaps use strerror_r if available, and strerror_l isn't.
1803   ac_save_CFLAGS="$CFLAGS"      
1804   CFLAGS="-Wimplicit-function-declaration -Werror"
1805   AC_TRY_COMPILE([#define _GNU_SOURCE 1
1806                   #include <string.h>
1807                   #include <locale.h>],
1808                   [char s[128]; strerror_r(5, s, 128);], 
1809                   AC_DEFINE(HAVE_STRERROR_R, 1, 
1810                   [Define if strerror_r is available in <string.h>.]),)
1811   CFLAGS="$ac_save_CFLAGS"
1812
1813   # Set configure bits for specified locale package
1814   AC_MSG_CHECKING([for C locale to use])
1815   case ${enable_clocale_flag} in
1816     generic)
1817       AC_MSG_RESULT(generic)
1818
1819       CLOCALE_H=config/locale/generic/c_locale.h
1820       CLOCALE_CC=config/locale/generic/c_locale.cc
1821       CCODECVT_CC=config/locale/generic/codecvt_members.cc
1822       CCOLLATE_CC=config/locale/generic/collate_members.cc
1823       CCTYPE_CC=config/locale/generic/ctype_members.cc
1824       CMESSAGES_H=config/locale/generic/messages_members.h
1825       CMESSAGES_CC=config/locale/generic/messages_members.cc
1826       CMONEY_CC=config/locale/generic/monetary_members.cc
1827       CNUMERIC_CC=config/locale/generic/numeric_members.cc
1828       CTIME_H=config/locale/generic/time_members.h
1829       CTIME_CC=config/locale/generic/time_members.cc
1830       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
1831       ;;
1832     darwin)
1833       AC_MSG_RESULT(darwin or freebsd)
1834
1835       CLOCALE_H=config/locale/generic/c_locale.h
1836       CLOCALE_CC=config/locale/generic/c_locale.cc
1837       CCODECVT_CC=config/locale/generic/codecvt_members.cc
1838       CCOLLATE_CC=config/locale/generic/collate_members.cc
1839       CCTYPE_CC=config/locale/darwin/ctype_members.cc
1840       CMESSAGES_H=config/locale/generic/messages_members.h
1841       CMESSAGES_CC=config/locale/generic/messages_members.cc
1842       CMONEY_CC=config/locale/generic/monetary_members.cc
1843       CNUMERIC_CC=config/locale/generic/numeric_members.cc
1844       CTIME_H=config/locale/generic/time_members.h
1845       CTIME_CC=config/locale/generic/time_members.cc
1846       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
1847       ;;
1848         
1849     gnu)
1850       AC_MSG_RESULT(gnu)
1851
1852       # Declare intention to use gettext, and add support for specific
1853       # languages.
1854       # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT
1855       ALL_LINGUAS="de fr"
1856
1857       # Don't call AM-GNU-GETTEXT here. Instead, assume glibc.
1858       AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no)
1859       if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
1860         USE_NLS=yes
1861       fi
1862       # Export the build objects.
1863       for ling in $ALL_LINGUAS; do \
1864         glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \
1865         glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \
1866       done
1867       AC_SUBST(glibcxx_MOFILES)
1868       AC_SUBST(glibcxx_POFILES)
1869
1870       CLOCALE_H=config/locale/gnu/c_locale.h
1871       CLOCALE_CC=config/locale/gnu/c_locale.cc
1872       CCODECVT_CC=config/locale/gnu/codecvt_members.cc
1873       CCOLLATE_CC=config/locale/gnu/collate_members.cc
1874       CCTYPE_CC=config/locale/gnu/ctype_members.cc
1875       CMESSAGES_H=config/locale/gnu/messages_members.h
1876       CMESSAGES_CC=config/locale/gnu/messages_members.cc
1877       CMONEY_CC=config/locale/gnu/monetary_members.cc
1878       CNUMERIC_CC=config/locale/gnu/numeric_members.cc
1879       CTIME_H=config/locale/gnu/time_members.h
1880       CTIME_CC=config/locale/gnu/time_members.cc
1881       CLOCALE_INTERNAL_H=config/locale/gnu/c++locale_internal.h
1882       ;;
1883     ieee_1003.1-2001)
1884       AC_MSG_RESULT(IEEE 1003.1)
1885
1886       CLOCALE_H=config/locale/ieee_1003.1-2001/c_locale.h
1887       CLOCALE_CC=config/locale/ieee_1003.1-2001/c_locale.cc
1888       CCODECVT_CC=config/locale/generic/codecvt_members.cc
1889       CCOLLATE_CC=config/locale/generic/collate_members.cc
1890       CCTYPE_CC=config/locale/generic/ctype_members.cc
1891       CMESSAGES_H=config/locale/ieee_1003.1-2001/messages_members.h
1892       CMESSAGES_CC=config/locale/ieee_1003.1-2001/messages_members.cc
1893       CMONEY_CC=config/locale/generic/monetary_members.cc
1894       CNUMERIC_CC=config/locale/generic/numeric_members.cc
1895       CTIME_H=config/locale/generic/time_members.h
1896       CTIME_CC=config/locale/generic/time_members.cc
1897       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
1898       ;;
1899   esac
1900
1901   # This is where the testsuite looks for locale catalogs, using the
1902   # -DLOCALEDIR define during testsuite compilation.
1903   glibcxx_localedir=${glibcxx_builddir}/po/share/locale
1904   AC_SUBST(glibcxx_localedir)
1905
1906   # A standalone libintl (e.g., GNU libintl) may be in use.
1907   if test $USE_NLS = yes; then
1908     AC_CHECK_HEADERS([libintl.h], [], USE_NLS=no)
1909     AC_SEARCH_LIBS(gettext, intl, [], USE_NLS=no)
1910   fi
1911   if test $USE_NLS = yes; then
1912     AC_DEFINE(_GLIBCXX_USE_NLS, 1, 
1913               [Define if NLS translations are to be used.])
1914   fi
1915
1916   AC_SUBST(USE_NLS)
1917   AC_SUBST(CLOCALE_H)
1918   AC_SUBST(CMESSAGES_H)
1919   AC_SUBST(CCODECVT_CC)
1920   AC_SUBST(CCOLLATE_CC)
1921   AC_SUBST(CCTYPE_CC)
1922   AC_SUBST(CMESSAGES_CC)
1923   AC_SUBST(CMONEY_CC)
1924   AC_SUBST(CNUMERIC_CC)
1925   AC_SUBST(CTIME_H)
1926   AC_SUBST(CTIME_CC)
1927   AC_SUBST(CLOCALE_CC)
1928   AC_SUBST(CLOCALE_INTERNAL_H)
1929 ])
1930
1931
1932 dnl
1933 dnl Check for which std::allocator base class to use.  The choice is
1934 dnl mapped from a subdirectory of include/ext.
1935 dnl
1936 dnl Default is new.
1937 dnl
1938 AC_DEFUN([GLIBCXX_ENABLE_ALLOCATOR], [
1939   AC_MSG_CHECKING([for std::allocator base class])
1940   GLIBCXX_ENABLE(libstdcxx-allocator,auto,[=KIND],
1941     [use KIND for target std::allocator base],
1942     [permit new|malloc|mt|bitmap|pool|yes|no|auto])
1943
1944   # If they didn't use this option switch, or if they specified --enable
1945   # with no specific model, we'll have to look for one.  If they
1946   # specified --disable (???), do likewise.
1947   if test $enable_libstdcxx_allocator = no ||
1948      test $enable_libstdcxx_allocator = yes;
1949   then
1950      enable_libstdcxx_allocator=auto
1951   fi
1952
1953   # Either a known package, or "auto". Auto implies the default choice
1954   # for a particular platform.
1955   enable_libstdcxx_allocator_flag=$enable_libstdcxx_allocator
1956
1957   # Probe for host-specific support if no specific model is specified.
1958   # Default to "new".
1959   if test $enable_libstdcxx_allocator_flag = auto; then
1960     case ${target_os} in
1961       linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
1962         enable_libstdcxx_allocator_flag=new
1963         ;;
1964       *)
1965         enable_libstdcxx_allocator_flag=new
1966         ;;
1967     esac
1968   fi
1969   AC_MSG_RESULT($enable_libstdcxx_allocator_flag)
1970   
1971
1972   # Set configure bits for specified locale package
1973   case ${enable_libstdcxx_allocator_flag} in
1974     bitmap)
1975       ALLOCATOR_H=config/allocator/bitmap_allocator_base.h
1976       ALLOCATOR_NAME=__gnu_cxx::bitmap_allocator
1977       ;;
1978     malloc)
1979       ALLOCATOR_H=config/allocator/malloc_allocator_base.h
1980       ALLOCATOR_NAME=__gnu_cxx::malloc_allocator
1981       ;;
1982     mt)
1983       ALLOCATOR_H=config/allocator/mt_allocator_base.h
1984       ALLOCATOR_NAME=__gnu_cxx::__mt_alloc
1985       ;;
1986     new)
1987       ALLOCATOR_H=config/allocator/new_allocator_base.h
1988       ALLOCATOR_NAME=__gnu_cxx::new_allocator
1989       ;;
1990     pool)
1991       ALLOCATOR_H=config/allocator/pool_allocator_base.h
1992       ALLOCATOR_NAME=__gnu_cxx::__pool_alloc
1993       ;;        
1994   esac
1995
1996   AC_SUBST(ALLOCATOR_H)
1997   AC_SUBST(ALLOCATOR_NAME)
1998 ])
1999
2000
2001 dnl
2002 dnl Check for whether the Boost-derived checks should be turned on.
2003 dnl
2004 dnl --enable-concept-checks turns them on.
2005 dnl --disable-concept-checks leaves them off.
2006 dnl  +  Usage:  GLIBCXX_ENABLE_CONCEPT_CHECKS[(DEFAULT)]
2007 dnl       Where DEFAULT is either `yes' or `no'.
2008 dnl
2009 AC_DEFUN([GLIBCXX_ENABLE_CONCEPT_CHECKS], [
2010   GLIBCXX_ENABLE(concept-checks,$1,,[use Boost-derived template checks])
2011   if test $enable_concept_checks = yes; then
2012     AC_DEFINE(_GLIBCXX_CONCEPT_CHECKS, 1,
2013               [Define to use concept checking code from the boost libraries.])
2014   fi
2015 ])
2016
2017 dnl
2018 dnl Check for parallel mode pre-requisites, including OpenMP support.
2019 dnl
2020 dnl  +  Usage:  GLIBCXX_ENABLE_PARALLEL
2021 dnl
2022 AC_DEFUN([GLIBCXX_ENABLE_PARALLEL], [
2023
2024   enable_parallel=no;
2025
2026   # See if configured libgomp/omp.h exists. (libgomp may be in
2027   # noconfigdirs but not explicitly disabled.)
2028   if test -f $glibcxx_builddir/../libgomp/omp.h; then
2029     enable_parallel=yes;
2030   else
2031     AC_MSG_NOTICE([$glibcxx_builddir/../libgomp/omp.h not found])
2032   fi
2033
2034   AC_MSG_CHECKING([for parallel mode support])
2035   AC_MSG_RESULT([$enable_parallel])
2036   GLIBCXX_CONDITIONAL(ENABLE_PARALLEL, test $enable_parallel = yes)
2037 ])
2038
2039
2040 dnl
2041 dnl Check for which I/O library to use:  stdio, or something specific.
2042 dnl
2043 dnl Default is stdio.
2044 dnl
2045 AC_DEFUN([GLIBCXX_ENABLE_CSTDIO], [
2046   AC_MSG_CHECKING([for underlying I/O to use])
2047   GLIBCXX_ENABLE(cstdio,stdio,[=PACKAGE],
2048     [use target-specific I/O package], [permit stdio])
2049
2050   # Now that libio has been removed, you can have any color you want as long
2051   # as it's black.  This is one big no-op until other packages are added, but
2052   # showing the framework never hurts.
2053   case ${enable_cstdio} in
2054     stdio)
2055       CSTDIO_H=config/io/c_io_stdio.h
2056       BASIC_FILE_H=config/io/basic_file_stdio.h
2057       BASIC_FILE_CC=config/io/basic_file_stdio.cc
2058       AC_MSG_RESULT(stdio)
2059       ;;
2060   esac
2061
2062   AC_SUBST(CSTDIO_H)
2063   AC_SUBST(BASIC_FILE_H)
2064   AC_SUBST(BASIC_FILE_CC)
2065 ])
2066
2067
2068 dnl
2069 dnl Check for "unusual" flags to pass to the compiler while building.
2070 dnl
2071 dnl --enable-cxx-flags='-foo -bar -baz' is a general method for passing
2072 dnl     experimental flags such as -fpch, -fIMI, -Dfloat=char, etc.
2073 dnl --disable-cxx-flags passes nothing.
2074 dnl  +  See http://gcc.gnu.org/ml/libstdc++/2000-q2/msg00131.html
2075 dnl         http://gcc.gnu.org/ml/libstdc++/2000-q2/msg00284.html
2076 dnl         http://gcc.gnu.org/ml/libstdc++/2000-q1/msg00035.html
2077 dnl  +  Usage:  GLIBCXX_ENABLE_CXX_FLAGS(default flags)
2078 dnl       If "default flags" is an empty string, the effect is the same
2079 dnl       as --disable or --enable=no.
2080 dnl
2081 AC_DEFUN([GLIBCXX_ENABLE_CXX_FLAGS], [dnl
2082   AC_MSG_CHECKING([for extra compiler flags for building])
2083   GLIBCXX_ENABLE(cxx-flags,$1,[=FLAGS],
2084     [pass compiler FLAGS when building library],
2085     [case "x$enable_cxx_flags" in
2086       xno | x)   enable_cxx_flags= ;;
2087       x-*)       ;;
2088       *)         AC_MSG_ERROR(_g_switch needs compiler flags as arguments) ;;
2089      esac])
2090
2091   # Run through flags (either default or command-line) and set anything
2092   # extra (e.g., #defines) that must accompany particular g++ options.
2093   if test -n "$enable_cxx_flags"; then
2094     for f in $enable_cxx_flags; do
2095       case "$f" in
2096         -fhonor-std)  ;;
2097         -*)  ;;
2098         *)   # and we're trying to pass /what/ exactly?
2099              AC_MSG_ERROR([compiler flags start with a -]) ;;
2100       esac
2101     done
2102   fi
2103
2104   EXTRA_CXX_FLAGS="$enable_cxx_flags"
2105   AC_MSG_RESULT($EXTRA_CXX_FLAGS)
2106   AC_SUBST(EXTRA_CXX_FLAGS)
2107 ])
2108
2109
2110 dnl
2111 dnl Check to see if debugging libraries are to be built.
2112 dnl
2113 dnl --enable-libstdcxx-debug
2114 dnl builds a separate set of debugging libraries in addition to the
2115 dnl normal (shared, static) libstdc++ binaries.
2116 dnl
2117 dnl --disable-libstdcxx-debug
2118 dnl builds only one (non-debug) version of libstdc++.
2119 dnl
2120 dnl --enable-libstdcxx-debug-flags=FLAGS
2121 dnl iff --enable-debug == yes, then use FLAGS to build the debug library.
2122 dnl
2123 dnl  +  Usage:  GLIBCXX_ENABLE_DEBUG[(DEFAULT)]
2124 dnl       Where DEFAULT is either `yes' or `no'.
2125 dnl
2126 AC_DEFUN([GLIBCXX_ENABLE_DEBUG], [
2127   AC_MSG_CHECKING([for additional debug build])
2128   GLIBCXX_ENABLE(libstdcxx-debug,$1,,[build extra debug library])
2129   AC_MSG_RESULT($enable_libstdcxx_debug)
2130   GLIBCXX_CONDITIONAL(GLIBCXX_BUILD_DEBUG, test $enable_libstdcxx_debug = yes)
2131 ])
2132
2133
2134 dnl
2135 dnl Check for explicit debug flags.
2136 dnl
2137 dnl --enable-libstdcxx-debug-flags='-O1'
2138 dnl is a general method for passing flags to be used when
2139 dnl building debug libraries with --enable-debug.
2140 dnl
2141 dnl --disable-libstdcxx-debug-flags does nothing.
2142 dnl  +  Usage:  GLIBCXX_ENABLE_DEBUG_FLAGS(default flags)
2143 dnl       If "default flags" is an empty string, the effect is the same
2144 dnl       as --disable or --enable=no.
2145 dnl
2146 AC_DEFUN([GLIBCXX_ENABLE_DEBUG_FLAGS], [
2147   GLIBCXX_ENABLE(libstdcxx-debug-flags,[$1],[=FLAGS],
2148     [pass compiler FLAGS when building debug library],
2149     [case "x$enable_libstdcxx_debug_flags" in
2150       xno | x)    enable_libstdcxx_debug_flags= ;;
2151       x-*)        ;;
2152       *)          AC_MSG_ERROR(_g_switch needs compiler flags as arguments) ;;
2153      esac])
2154
2155   # Option parsed, now set things appropriately
2156   DEBUG_FLAGS="$enable_libstdcxx_debug_flags"
2157   AC_SUBST(DEBUG_FLAGS)
2158
2159   AC_MSG_NOTICE([Debug build flags set to $DEBUG_FLAGS])
2160 ])
2161
2162
2163 dnl
2164 dnl Check if the user only wants a freestanding library implementation.
2165 dnl
2166 dnl --disable-hosted-libstdcxx will turn off most of the library build,
2167 dnl installing only the headers required by [17.4.1.3] and the language
2168 dnl support library.  More than that will be built (to keep the Makefiles
2169 dnl conveniently clean), but not installed.
2170 dnl
2171 dnl Sets:
2172 dnl  is_hosted  (yes/no)
2173 dnl
2174 dnl Defines:
2175 dnl  _GLIBCXX_HOSTED   (always defined, either to 1 or 0)
2176 dnl
2177 AC_DEFUN([GLIBCXX_ENABLE_HOSTED], [
2178   AC_ARG_ENABLE([hosted-libstdcxx],
2179     AC_HELP_STRING([--disable-hosted-libstdcxx],
2180                    [only build freestanding C++ runtime support]),,
2181     [case "$host" in
2182         arm*-*-symbianelf*) 
2183             enable_hosted_libstdcxx=no
2184             ;;
2185         *) 
2186             enable_hosted_libstdcxx=yes
2187             ;;
2188      esac])
2189   if test "$enable_hosted_libstdcxx" = no; then
2190     AC_MSG_NOTICE([Only freestanding libraries will be built])
2191     is_hosted=no
2192     hosted_define=0
2193     enable_abi_check=no
2194     enable_libstdcxx_pch=no
2195   else
2196     is_hosted=yes
2197     hosted_define=1
2198   fi
2199   GLIBCXX_CONDITIONAL(GLIBCXX_HOSTED, test $is_hosted = yes)
2200   AC_DEFINE_UNQUOTED(_GLIBCXX_HOSTED, $hosted_define,
2201     [Define to 1 if a full hosted library is built, or 0 if freestanding.])
2202 ])
2203
2204
2205 dnl
2206 dnl Check for template specializations for the 'long long' type.
2207 dnl The result determines only whether 'long long' I/O is enabled; things
2208 dnl like numeric_limits<> specializations are always available.
2209 dnl
2210 dnl --enable-long-long defines _GLIBCXX_USE_LONG_LONG
2211 dnl --disable-long-long leaves _GLIBCXX_USE_LONG_LONG undefined
2212 dnl  +  Usage:  GLIBCXX_ENABLE_LONG_LONG[(DEFAULT)]
2213 dnl       Where DEFAULT is either `yes' or `no'.
2214 dnl
2215 AC_DEFUN([GLIBCXX_ENABLE_LONG_LONG], [
2216   GLIBCXX_ENABLE(long-long,$1,,[enable template specializations for 'long long'])
2217   if test $enable_long_long = yes; then
2218     AC_DEFINE(_GLIBCXX_USE_LONG_LONG, 1, 
2219               [Define if code specialized for long long should be used.])
2220   fi
2221   AC_MSG_CHECKING([for enabled long long specializations])
2222   AC_MSG_RESULT([$enable_long_long])
2223 ])
2224
2225
2226 dnl
2227 dnl Check for template specializations for the 'wchar_t' type.
2228 dnl
2229 dnl --enable-wchar_t defines _GLIBCXX_USE_WCHAR_T
2230 dnl --disable-wchar_t leaves _GLIBCXX_USE_WCHAR_T undefined
2231 dnl  +  Usage:  GLIBCXX_ENABLE_WCHAR_T[(DEFAULT)]
2232 dnl       Where DEFAULT is either `yes' or `no'.
2233 dnl
2234 dnl Necessary support must also be present.
2235 dnl
2236 AC_DEFUN([GLIBCXX_ENABLE_WCHAR_T], [
2237   GLIBCXX_ENABLE(wchar_t,$1,,[enable template specializations for 'wchar_t'])
2238
2239   # Test wchar.h for mbstate_t, which is needed for char_traits and fpos.
2240   AC_CHECK_HEADERS(wchar.h, ac_has_wchar_h=yes, ac_has_wchar_h=no)
2241   AC_MSG_CHECKING([for mbstate_t])
2242   AC_TRY_COMPILE([#include <wchar.h>],
2243   [mbstate_t teststate;],
2244   have_mbstate_t=yes, have_mbstate_t=no)
2245   AC_MSG_RESULT($have_mbstate_t)
2246   if test x"$have_mbstate_t" = xyes; then
2247     AC_DEFINE(HAVE_MBSTATE_T,1,[Define if mbstate_t exists in wchar.h.])
2248   fi
2249
2250   # Test it always, for use in GLIBCXX_ENABLE_C99, together with
2251   # ac_has_wchar_h.
2252   AC_CHECK_HEADERS(wctype.h, ac_has_wctype_h=yes, ac_has_wctype_h=no)
2253   
2254   if test x"$enable_wchar_t" = x"yes"; then
2255
2256     AC_LANG_SAVE
2257     AC_LANG_CPLUSPLUS
2258     
2259     if test x"$ac_has_wchar_h" = xyes &&
2260        test x"$ac_has_wctype_h" = xyes; then
2261       AC_TRY_COMPILE([#include <wchar.h>
2262                       #include <stddef.h>
2263                       wint_t i;
2264                       long l = WEOF;
2265                       long j = WCHAR_MIN;
2266                       long k = WCHAR_MAX;
2267                       namespace test
2268                       {
2269                         using ::btowc;
2270                         using ::fgetwc;
2271                         using ::fgetws;
2272                         using ::fputwc;
2273                         using ::fputws;
2274                         using ::fwide;
2275                         using ::fwprintf; 
2276                         using ::fwscanf;
2277                         using ::getwc;
2278                         using ::getwchar;
2279                         using ::mbrlen; 
2280                         using ::mbrtowc; 
2281                         using ::mbsinit; 
2282                         using ::mbsrtowcs; 
2283                         using ::putwc;
2284                         using ::putwchar;
2285                         using ::swprintf; 
2286                         using ::swscanf; 
2287                         using ::ungetwc;
2288                         using ::vfwprintf; 
2289                         using ::vswprintf; 
2290                         using ::vwprintf; 
2291                         using ::wcrtomb; 
2292                         using ::wcscat; 
2293                         using ::wcschr; 
2294                         using ::wcscmp; 
2295                         using ::wcscoll; 
2296                         using ::wcscpy; 
2297                         using ::wcscspn; 
2298                         using ::wcsftime; 
2299                         using ::wcslen;
2300                         using ::wcsncat; 
2301                         using ::wcsncmp; 
2302                         using ::wcsncpy; 
2303                         using ::wcspbrk;
2304                         using ::wcsrchr; 
2305                         using ::wcsrtombs; 
2306                         using ::wcsspn; 
2307                         using ::wcsstr;
2308                         using ::wcstod; 
2309                         using ::wcstok; 
2310                         using ::wcstol;
2311                         using ::wcstoul; 
2312                         using ::wcsxfrm; 
2313                         using ::wctob; 
2314                         using ::wmemchr;
2315                         using ::wmemcmp;
2316                         using ::wmemcpy;
2317                         using ::wmemmove;
2318                         using ::wmemset;
2319                         using ::wprintf; 
2320                         using ::wscanf; 
2321                       }
2322                      ],[],[], [enable_wchar_t=no])
2323     else
2324       enable_wchar_t=no
2325     fi
2326
2327     AC_LANG_RESTORE
2328   fi
2329
2330   if test x"$enable_wchar_t" = x"yes"; then
2331     AC_DEFINE(_GLIBCXX_USE_WCHAR_T, 1,
2332               [Define if code specialized for wchar_t should be used.])
2333   fi
2334
2335   AC_MSG_CHECKING([for enabled wchar_t specializations])
2336   AC_MSG_RESULT([$enable_wchar_t])
2337 ])
2338
2339
2340 dnl
2341 dnl Check to see if building and using a C++ precompiled header can be done.
2342 dnl
2343 dnl --enable-libstdcxx-pch=yes
2344 dnl default, this shows intent to use stdc++.h.gch If it looks like it
2345 dnl may work, after some light-hearted attempts to puzzle out compiler
2346 dnl support, flip bits on in include/Makefile.am
2347 dnl
2348 dnl --disable-libstdcxx-pch
2349 dnl turns off attempts to use or build stdc++.h.gch.
2350 dnl
2351 dnl Substs:
2352 dnl  glibcxx_PCHFLAGS
2353 dnl
2354 AC_DEFUN([GLIBCXX_ENABLE_PCH], [
2355   GLIBCXX_ENABLE(libstdcxx-pch,$1,,[build pre-compiled libstdc++ headers])
2356   if test $enable_libstdcxx_pch = yes; then
2357     AC_CACHE_CHECK([for compiler with PCH support],
2358       [glibcxx_cv_prog_CXX_pch],
2359       [ac_save_CXXFLAGS="$CXXFLAGS"
2360        CXXFLAGS="$CXXFLAGS -Werror -Winvalid-pch -Wno-deprecated"
2361        AC_LANG_SAVE
2362        AC_LANG_CPLUSPLUS
2363        echo '#include <math.h>' > conftest.h
2364        if $CXX $CXXFLAGS $CPPFLAGS -x c++-header conftest.h \
2365                           -o conftest.h.gch 1>&5 2>&1 &&
2366                 echo '#error "pch failed"' > conftest.h &&
2367           echo '#include "conftest.h"' > conftest.cc &&
2368                $CXX -c $CXXFLAGS $CPPFLAGS conftest.cc 1>&5 2>&1 ;
2369        then
2370          glibcxx_cv_prog_CXX_pch=yes
2371        else
2372          glibcxx_cv_prog_CXX_pch=no
2373        fi
2374        rm -f conftest*
2375        CXXFLAGS=$ac_save_CXXFLAGS
2376        AC_LANG_RESTORE
2377       ])
2378     enable_libstdcxx_pch=$glibcxx_cv_prog_CXX_pch
2379   fi
2380
2381   AC_MSG_CHECKING([for enabled PCH])
2382   AC_MSG_RESULT([$enable_libstdcxx_pch])
2383
2384   GLIBCXX_CONDITIONAL(GLIBCXX_BUILD_PCH, test $enable_libstdcxx_pch = yes)
2385   if test $enable_libstdcxx_pch = yes; then
2386     glibcxx_PCHFLAGS="-include bits/stdc++.h"
2387   else
2388     glibcxx_PCHFLAGS=""
2389   fi
2390   AC_SUBST(glibcxx_PCHFLAGS)
2391 ])
2392
2393
2394 dnl
2395 dnl Check for atomic builtins.
2396 dnl See:
2397 dnl http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html#Atomic-Builtins
2398 dnl
2399 dnl This checks to see if the host supports the compiler-generated
2400 dnl builtins for atomic operations for various integral sizes. Note, this 
2401 dnl is intended to be an all-or-nothing switch, so all the atomic operations
2402 dnl that are used should be checked.
2403 dnl
2404 dnl Note:
2405 dnl libgomp and libgfortran do this with a link test, instead of an asm test.
2406 dnl see: CHECK_SYNC_FETCH_AND_ADD
2407 dnl
2408 dnl Defines:
2409 dnl  _GLIBCXX_ATOMIC_BUILTINS_1 
2410 dnl  _GLIBCXX_ATOMIC_BUILTINS_4
2411 dnl
2412 AC_DEFUN([GLIBCXX_ENABLE_ATOMIC_BUILTINS], [
2413   AC_LANG_SAVE
2414   AC_LANG_CPLUSPLUS
2415   old_CXXFLAGS="$CXXFLAGS"
2416   
2417   # Compile unoptimized.
2418   CXXFLAGS='-O0 -S'
2419
2420   # Fake what AC_TRY_COMPILE does, without linking as this is
2421   # unnecessary for a builtins test.
2422
2423     cat > conftest.$ac_ext << EOF
2424 [#]line __oline__ "configure"
2425 int main()
2426 {
2427   // NB: _Atomic_word not necessarily int. 
2428   typedef int atomic_type;
2429   atomic_type c1;
2430   atomic_type c2;
2431   const atomic_type c3(0);
2432   __sync_fetch_and_add(&c1, c2);
2433   __sync_val_compare_and_swap(&c1, c3, c2);
2434   __sync_lock_test_and_set(&c1, c3);
2435   __sync_lock_release(&c1);
2436   __sync_synchronize();
2437   return 0;
2438 }
2439 EOF
2440
2441     AC_MSG_CHECKING([for atomic builtins for int])
2442     if AC_TRY_EVAL(ac_compile); then
2443       if grep __sync_ conftest.s >/dev/null 2>&1 ; then
2444         enable_atomic_builtinsi=no
2445       else
2446       AC_DEFINE(_GLIBCXX_ATOMIC_BUILTINS_4, 1,
2447         [Define if builtin atomic operations for int are supported on this host.])
2448         enable_atomic_builtinsi=yes
2449       fi
2450     fi
2451     AC_MSG_RESULT($enable_atomic_builtinsi)
2452     rm -f conftest*
2453
2454     cat > conftest.$ac_ext << EOF
2455 [#]line __oline__ "configure"
2456 int main()
2457 {
2458   typedef bool atomic_type;
2459   atomic_type c1;
2460   atomic_type c2;
2461   const atomic_type c3(0);
2462   __sync_fetch_and_add(&c1, c2);
2463   __sync_val_compare_and_swap(&c1, c3, c2);
2464   __sync_lock_test_and_set(&c1, c3);
2465   __sync_lock_release(&c1);
2466   __sync_synchronize();
2467   return 0;
2468 }
2469 EOF
2470
2471     AC_MSG_CHECKING([for atomic builtins for bool])
2472     if AC_TRY_EVAL(ac_compile); then
2473       if grep __sync_ conftest.s >/dev/null 2>&1 ; then
2474         enable_atomic_builtinsb=no
2475       else
2476       AC_DEFINE(_GLIBCXX_ATOMIC_BUILTINS_1, 1,
2477       [Define if builtin atomic operations for bool are supported on this host.])
2478         enable_atomic_builtinsb=yes
2479       fi
2480     fi
2481     AC_MSG_RESULT($enable_atomic_builtinsb)
2482     rm -f conftest*
2483
2484   CXXFLAGS="$old_CXXFLAGS"
2485   AC_LANG_RESTORE
2486
2487   # Set atomicity_dir to builtins if either of above tests pass.
2488   if test $enable_atomic_builtinsi = yes || test $enable_atomic_builtinsb = yes ; then
2489     atomicity_dir=cpu/generic/atomicity_builtins
2490   fi
2491
2492   # If still generic, set to mutex.
2493   if test $atomicity_dir = "cpu/generic" ; then
2494     atomicity_dir=cpu/generic/atomicity_mutex
2495     AC_MSG_WARN([No native atomic operations are provided for this platform.])
2496       if test $target_thread_file = single; then
2497         AC_MSG_WARN([They cannot be faked when thread support is disabled.])
2498         AC_MSG_WARN([Thread-safety of certain classes is not guaranteed.])
2499       else
2500         AC_MSG_WARN([They will be faked using a mutex.])
2501         AC_MSG_WARN([Performance of certain classes will degrade as a result.])
2502       fi
2503   fi
2504
2505 ])
2506
2507
2508 dnl
2509 dnl Check for exception handling support.  If an explicit enable/disable
2510 dnl sjlj exceptions is given, we don't have to detect.  Otherwise the
2511 dnl target may or may not support call frame exceptions.
2512 dnl
2513 dnl --enable-sjlj-exceptions forces the use of builtin setjmp.
2514 dnl --disable-sjlj-exceptions forces the use of call frame unwinding.
2515 dnl Neither one forces an attempt at detection.
2516 dnl
2517 dnl Defines:
2518 dnl  _GLIBCXX_SJLJ_EXCEPTIONS if the compiler is configured for it
2519 dnl
2520 AC_DEFUN([GLIBCXX_ENABLE_SJLJ_EXCEPTIONS], [
2521   AC_MSG_CHECKING([for exception model to use])
2522   AC_LANG_SAVE
2523   AC_LANG_CPLUSPLUS
2524   GLIBCXX_ENABLE(sjlj-exceptions,auto,,
2525     [force use of builtin_setjmp for exceptions],
2526     [permit yes|no|auto])
2527
2528   if test $enable_sjlj_exceptions = auto; then
2529     # Botheration.  Now we've got to detect the exception model.  Link tests
2530     # against libgcc.a are problematic since we've not been given proper -L
2531     # bits for single-tree newlib and libgloss.
2532     #
2533     # Fake what AC_TRY_COMPILE does.  XXX Look at redoing this new-style.
2534     cat > conftest.$ac_ext << EOF
2535 [#]line __oline__ "configure"
2536 struct S { ~S(); };
2537 void bar();
2538 void foo()
2539 {
2540   S s;
2541   bar();
2542 }
2543 EOF
2544     old_CXXFLAGS="$CXXFLAGS"
2545     CXXFLAGS=-S
2546     if AC_TRY_EVAL(ac_compile); then
2547       if grep _Unwind_SjLj_Resume conftest.s >/dev/null 2>&1 ; then
2548         enable_sjlj_exceptions=yes
2549       elif grep _Unwind_Resume conftest.s >/dev/null 2>&1 ; then
2550         enable_sjlj_exceptions=no
2551       elif grep __cxa_end_cleanup conftest.s >/dev/null 2>&1 ; then
2552         enable_sjlj_exceptions=no
2553       fi
2554     fi
2555     CXXFLAGS="$old_CXXFLAGS"
2556     rm -f conftest*
2557   fi
2558
2559   # This is a tad weird, for hysterical raisins.  We have to map
2560   # enable/disable to two different models.
2561   case $enable_sjlj_exceptions in
2562     yes)
2563       AC_DEFINE(_GLIBCXX_SJLJ_EXCEPTIONS, 1,
2564         [Define if the compiler is configured for setjmp/longjmp exceptions.])
2565       ac_exception_model_name=sjlj
2566       ;;
2567     no)
2568       ac_exception_model_name="call frame"
2569       ;;
2570     *)
2571       AC_MSG_ERROR([unable to detect exception model])
2572       ;;
2573   esac
2574  AC_LANG_RESTORE
2575  AC_MSG_RESULT($ac_exception_model_name)
2576 ])
2577
2578
2579 dnl
2580 dnl Allow visibility attributes to be used on namespaces, objects, etc.
2581 dnl
2582 dnl --enable-visibility enables attempt to use visibility attributes.
2583 dnl --disable-visibility turns off all use of visibility attributes.
2584 dnl  +  Usage:  GLIBCXX_ENABLE_VISIBILITY[(DEFAULT)]
2585 dnl       Where DEFAULT is 'yes'.
2586 dnl
2587 AC_DEFUN([GLIBCXX_ENABLE_VISIBILITY], [
2588 GLIBCXX_ENABLE(visibility,$1,,[enables visibility safe usage])
2589
2590 if test x$enable_visibility = xyes ; then
2591   dnl all hail libgfortran
2592   dnl Check whether the target supports hidden visibility.
2593   AC_CACHE_CHECK([whether the target supports hidden visibility],
2594                  glibcxx_cv_have_attribute_visibility, [
2595   save_CFLAGS="$CFLAGS"
2596   CFLAGS="$CFLAGS -Werror"
2597   AC_TRY_COMPILE([void __attribute__((visibility("hidden"))) foo(void) { }],
2598                  [], glibcxx_cv_have_attribute_visibility=yes,
2599                  glibcxx_cv_have_attribute_visibility=no)
2600   CFLAGS="$save_CFLAGS"])
2601   if test $glibcxx_cv_have_attribute_visibility = no; then
2602     enable_visibility=no
2603   fi
2604 fi
2605
2606 GLIBCXX_CONDITIONAL(ENABLE_VISIBILITY, test $enable_visibility = yes)
2607 AC_MSG_NOTICE([visibility supported: $enable_visibility])
2608 ])
2609
2610
2611 dnl
2612 dnl Add version tags to symbols in shared library (or not), additionally
2613 dnl marking other symbols as private/local (or not).
2614 dnl
2615 dnl --enable-symvers=style adds a version script to the linker call when
2616 dnl       creating the shared library.  The choice of version script is
2617 dnl       controlled by 'style'.
2618 dnl --disable-symvers does not.
2619 dnl  +  Usage:  GLIBCXX_ENABLE_SYMVERS[(DEFAULT)]
2620 dnl       Where DEFAULT is either 'yes' or 'no'.  Passing `yes' tries to
2621 dnl       choose a default style based on linker characteristics.  Passing
2622 dnl       'no' disables versioning.
2623 dnl
2624 AC_DEFUN([GLIBCXX_ENABLE_SYMVERS], [
2625
2626 GLIBCXX_ENABLE(symvers,$1,[=STYLE],
2627   [enables symbol versioning of the shared library],
2628   [permit yes|no|gnu|gnu-versioned-namespace|darwin|darwin-export])
2629
2630 # If we never went through the GLIBCXX_CHECK_LINKER_FEATURES macro, then we
2631 # don't know enough about $LD to do tricks...
2632 AC_REQUIRE([GLIBCXX_CHECK_LINKER_FEATURES])
2633
2634 # Turn a 'yes' into a suitable default.
2635 if test x$enable_symvers = xyes ; then
2636   if test $enable_shared = no || test "x$LD" = x || test x$gcc_no_link = xyes; then
2637     enable_symvers=no
2638   else
2639     if test $with_gnu_ld = yes ; then
2640       case ${target_os} in
2641         cygwin* | pe | mingw32*)
2642           enable_symvers=no ;;
2643         *)
2644           enable_symvers=gnu ;;
2645       esac
2646     else
2647       case ${target_os} in
2648         darwin*)
2649           enable_symvers=darwin ;;
2650         *)
2651           enable_symvers=no ;;
2652       esac
2653     fi
2654   fi
2655 fi
2656
2657 # Check to see if 'darwin' or 'darwin-export' can win.
2658 if test x$enable_symvers = xdarwin-export ; then
2659     enable_symvers=darwin
2660 fi
2661
2662 # Check to see if 'gnu' can win.
2663 if test $enable_symvers = gnu || test $enable_symvers = gnu-versioned-namespace; then
2664   # Check to see if libgcc_s exists, indicating that shared libgcc is possible.
2665   AC_MSG_CHECKING([for shared libgcc])
2666   ac_save_CFLAGS="$CFLAGS"
2667   CFLAGS=' -lgcc_s'
2668   AC_TRY_LINK(, [return 0;], glibcxx_shared_libgcc=yes, glibcxx_shared_libgcc=no)
2669   CFLAGS="$ac_save_CFLAGS"
2670   if test $glibcxx_shared_libgcc = no; then
2671     cat > conftest.c <<EOF
2672 int main (void) { return 0; }
2673 EOF
2674 changequote(,)dnl
2675     glibcxx_libgcc_s_suffix=`${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \
2676                              -shared -shared-libgcc -o conftest.so \
2677                              conftest.c -v 2>&1 >/dev/null \
2678                              | sed -n 's/^.* -lgcc_s\([^ ]*\) .*$/\1/p'`
2679 changequote([,])dnl
2680     rm -f conftest.c conftest.so
2681     if test x${glibcxx_libgcc_s_suffix+set} = xset; then
2682       CFLAGS=" -lgcc_s$glibcxx_libgcc_s_suffix"
2683       AC_TRY_LINK(, [return 0;], glibcxx_shared_libgcc=yes)
2684       CFLAGS="$ac_save_CFLAGS"
2685     fi
2686   fi
2687   AC_MSG_RESULT($glibcxx_shared_libgcc)
2688
2689   # For GNU ld, we need at least this version.  The format is described in
2690   # GLIBCXX_CHECK_LINKER_FEATURES above.
2691   glibcxx_min_gnu_ld_version=21400
2692
2693   # If no shared libgcc, can't win.
2694   if test $glibcxx_shared_libgcc != yes; then
2695       AC_MSG_WARN([=== You have requested GNU symbol versioning, but])
2696       AC_MSG_WARN([=== you are not building a shared libgcc_s.])
2697       AC_MSG_WARN([=== Symbol versioning will be disabled.])
2698       enable_symvers=no
2699   elif test $with_gnu_ld != yes ; then
2700     # just fail for now
2701     AC_MSG_WARN([=== You have requested GNU symbol versioning, but])
2702     AC_MSG_WARN([=== you are not using the GNU linker.])
2703     AC_MSG_WARN([=== Symbol versioning will be disabled.])
2704     enable_symvers=no
2705   elif test $glibcxx_ld_is_gold = yes ; then
2706     : All versions of gold support symbol versioning.
2707   elif test $glibcxx_gnu_ld_version -lt $glibcxx_min_gnu_ld_version ; then
2708     # The right tools, the right setup, but too old.  Fallbacks?
2709     AC_MSG_WARN(=== Linker version $glibcxx_gnu_ld_version is too old for)
2710     AC_MSG_WARN(=== full symbol versioning support in this release of GCC.)
2711     AC_MSG_WARN(=== You would need to upgrade your binutils to version)
2712     AC_MSG_WARN(=== $glibcxx_min_gnu_ld_version or later and rebuild GCC.)
2713     AC_MSG_WARN([=== Symbol versioning will be disabled.])
2714     enable_symvers=no
2715   fi
2716 fi
2717
2718 # Everything parsed; figure out what file to use.
2719 case $enable_symvers in
2720   no)
2721     SYMVER_FILE=config/abi/pre/none.ver
2722     ;;
2723   gnu)
2724     SYMVER_FILE=config/abi/pre/gnu.ver
2725     AC_DEFINE(_GLIBCXX_SYMVER_GNU, 1, 
2726               [Define to use GNU versioning in the shared library.])
2727     ;;
2728   gnu-versioned-namespace)
2729     SYMVER_FILE=config/abi/pre/gnu-versioned-namespace.ver
2730     AC_DEFINE(_GLIBCXX_SYMVER_GNU_NAMESPACE, 1, 
2731               [Define to use GNU namespace versioning in the shared library.])
2732     ;;
2733   darwin)
2734     SYMVER_FILE=config/abi/pre/gnu.ver
2735     AC_DEFINE(_GLIBCXX_SYMVER_DARWIN, 1, 
2736               [Define to use darwin versioning in the shared library.])
2737     ;;
2738 esac
2739
2740 if test x$enable_symvers != xno ; then
2741   AC_DEFINE(_GLIBCXX_SYMVER, 1,
2742          [Define to use symbol versioning in the shared library.])
2743 fi
2744
2745 AC_SUBST(SYMVER_FILE)
2746 AC_SUBST(port_specific_symbol_files)
2747 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS, test $enable_symvers != no)
2748 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_GNU, test $enable_symvers = gnu)
2749 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_GNU_NAMESPACE, test $enable_symvers = gnu-versioned-namespace)
2750 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_DARWIN, test $enable_symvers = darwin)
2751 AC_MSG_NOTICE(versioning on shared library symbols is $enable_symvers)
2752
2753 # Now, set up compatibility support, if any.
2754 # In addition, need this to deal with std::size_t mangling in
2755 # src/compatibility.cc.  In a perfect world, could use
2756 # typeid(std::size_t).name()[0] to do direct substitution.
2757 AC_MSG_CHECKING([for size_t as unsigned int])
2758 ac_save_CFLAGS="$CFLAGS"
2759 CFLAGS="-Werror"
2760 AC_TRY_COMPILE(, [__SIZE_TYPE__* stp; unsigned int* uip; stp = uip;], 
2761                  [glibcxx_size_t_is_i=yes], [glibcxx_size_t_is_i=no])
2762 CFLAGS=$ac_save_CFLAGS
2763 if test "$glibcxx_size_t_is_i" = yes; then
2764   AC_DEFINE(_GLIBCXX_SIZE_T_IS_UINT, 1, [Define if size_t is unsigned int.])
2765 fi
2766 AC_MSG_RESULT([$glibcxx_size_t_is_i])
2767
2768 AC_MSG_CHECKING([for ptrdiff_t as int])
2769 ac_save_CFLAGS="$CFLAGS"
2770 CFLAGS="-Werror"
2771 AC_TRY_COMPILE(, [__PTRDIFF_TYPE__* ptp; int* ip; ptp = ip;], 
2772                  [glibcxx_ptrdiff_t_is_i=yes], [glibcxx_ptrdiff_t_is_i=no])
2773 CFLAGS=$ac_save_CFLAGS
2774 if test "$glibcxx_ptrdiff_t_is_i" = yes; then
2775   AC_DEFINE(_GLIBCXX_PTRDIFF_T_IS_INT, 1, [Define if ptrdiff_t is int.])
2776 fi
2777 AC_MSG_RESULT([$glibcxx_ptrdiff_t_is_i])
2778 ])
2779
2780
2781 dnl
2782 dnl Setup to use the gcc gthr.h thread-specific memory and mutex model.
2783 dnl We must stage the required headers so that they will be installed
2784 dnl with the library (unlike libgcc, the STL implementation is provided
2785 dnl solely within headers).  Since we must not inject random user-space
2786 dnl macro names into user-provided C++ code, we first stage into <file>-in
2787 dnl and process to <file> with an output command.  The reason for a two-
2788 dnl stage process here is to correctly handle $srcdir!=$objdir without
2789 dnl having to write complex code (the sed commands to clean the macro
2790 dnl namespace are complex and fragile enough as it is).  We must also
2791 dnl add a relative path so that -I- is supported properly.
2792 dnl
2793 dnl Substs:
2794 dnl  glibcxx_thread_h
2795 dnl
2796 dnl Defines:
2797 dnl  HAVE_GTHR_DEFAULT
2798 dnl
2799 AC_DEFUN([GLIBCXX_ENABLE_THREADS], [
2800   AC_MSG_CHECKING([for thread model used by GCC])
2801   target_thread_file=`$CXX -v 2>&1 | sed -n 's/^Thread model: //p'`
2802   AC_MSG_RESULT([$target_thread_file])
2803
2804   if test $target_thread_file != single; then
2805     AC_DEFINE(HAVE_GTHR_DEFAULT, 1,
2806               [Define if gthr-default.h exists 
2807               (meaning that threading support is enabled).])
2808   fi
2809
2810   glibcxx_thread_h=gthr-$target_thread_file.h
2811
2812   dnl Check for __GTHREADS define.
2813   gthread_file=${toplevel_srcdir}/gcc/${glibcxx_thread_h}
2814   if grep __GTHREADS $gthread_file >/dev/null 2>&1 ; then
2815     enable_thread=yes
2816   else
2817    enable_thread=no
2818   fi
2819
2820   AC_SUBST(glibcxx_thread_h)
2821 ])
2822
2823
2824 dnl
2825 dnl Check if gthread implementation defines the types and functions
2826 dnl required by the c++0x thread library.  Conforming gthread
2827 dnl implementations can define __GTHREADS_CXX0X to enable use with c++0x.
2828 dnl
2829 AC_DEFUN([GLIBCXX_CHECK_GTHREADS], [
2830   AC_LANG_SAVE
2831   AC_LANG_CPLUSPLUS
2832
2833   ac_save_CXXFLAGS="$CXXFLAGS"
2834   CXXFLAGS="$CXXFLAGS -fno-exceptions -I${toplevel_srcdir}/gcc"
2835
2836   target_thread_file=`$CXX -v 2>&1 | sed -n 's/^Thread model: //p'`
2837   case $target_thread_file in
2838     posix)
2839       CXXFLAGS="$CXXFLAGS -DSUPPORTS_WEAK -DGTHREAD_USE_WEAK -D_PTHREADS"
2840   esac
2841
2842   AC_MSG_CHECKING([for gthreads library])
2843
2844   AC_TRY_COMPILE([#include "gthr.h"],
2845     [
2846         #ifndef __GTHREADS_CXX0X
2847         #error
2848         #endif
2849     ], [ac_has_gthreads=yes], [ac_has_gthreads=no])
2850
2851   AC_MSG_RESULT([$ac_has_gthreads])
2852
2853   if test x"$ac_has_gthreads" = x"yes"; then
2854     AC_DEFINE(_GLIBCXX_HAS_GTHREADS, 1,
2855               [Define if gthreads library is available.])
2856   fi
2857
2858   CXXFLAGS="$ac_save_CXXFLAGS"
2859   AC_LANG_RESTORE
2860 ])
2861
2862
2863 # Check whether LC_MESSAGES is available in <locale.h>.
2864 # Ulrich Drepper <drepper@cygnus.com>, 1995.
2865 #
2866 # This file file be copied and used freely without restrictions.  It can
2867 # be used in projects which are not available under the GNU Public License
2868 # but which still want to provide support for the GNU gettext functionality.
2869 # Please note that the actual code is *not* freely available.
2870 AC_DEFUN([AC_LC_MESSAGES], [
2871   AC_CHECK_HEADER(locale.h, [
2872     AC_CACHE_CHECK([for LC_MESSAGES], ac_cv_val_LC_MESSAGES,
2873       [AC_TRY_COMPILE([#include <locale.h>], [return LC_MESSAGES],
2874        ac_cv_val_LC_MESSAGES=yes, ac_cv_val_LC_MESSAGES=no)])
2875     if test $ac_cv_val_LC_MESSAGES = yes; then
2876       AC_DEFINE(HAVE_LC_MESSAGES, 1, 
2877                 [Define if LC_MESSAGES is available in <locale.h>.])
2878     fi
2879   ])
2880 ])
2881
2882 # Macros from the top-level gcc directory.
2883 m4_include([../config/tls.m4])
2884