[Ada] Sprint: fix pasto in comment
[official-gcc.git] / libstdc++-v3 / acinclude.m4
blob24145fdf1ce820f3aa97812252b39067f65708a9
1 dnl
2 dnl GLIBCXX_CONDITIONAL (NAME, SHELL-TEST)
3 dnl
4 dnl Exactly like AM_CONDITIONAL, but delays evaluation of the test until the
5 dnl end of configure.  This lets tested variables be reassigned, and the
6 dnl conditional will depend on the final state of the variable.  For a simple
7 dnl example of why this is needed, see GLIBCXX_ENABLE_HOSTED.
8 dnl
9 m4_define([_m4_divert(glibcxx_diversion)], 8000)dnl
10 AC_DEFUN([GLIBCXX_CONDITIONAL], [dnl
11   m4_divert_text([glibcxx_diversion],dnl
12    AM_CONDITIONAL([$1],[$2])
13   )dnl
14 ])dnl
15 AC_DEFUN([GLIBCXX_EVALUATE_CONDITIONALS], [m4_undivert([glibcxx_diversion])])dnl
18 dnl
19 dnl Check to see what architecture and operating system we are compiling
20 dnl for.  Also, if architecture- or OS-specific flags are required for
21 dnl compilation, pick them up here.
22 dnl
23 AC_DEFUN([GLIBCXX_CHECK_HOST], [
24   . $glibcxx_srcdir/configure.host
25   AC_MSG_NOTICE([CPU config directory is $cpu_include_dir])
26   AC_MSG_NOTICE([OS config directory is $os_include_dir])
29 dnl
30 dnl Initialize the rest of the library configury.  At this point we have
31 dnl variables like $host.
32 dnl
33 dnl Sets:
34 dnl  SUBDIRS
35 dnl Substs:
36 dnl  glibcxx_builddir     (absolute path)
37 dnl  glibcxx_srcdir       (absolute path)
38 dnl  toplevel_builddir    (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 libsupc++ src src/c++98 src/c++11 src/c++17 src/filesystem doc po testsuite python])
53   SUBDIRS='glibcxx_SUBDIRS'
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_builddir=${glibcxx_builddir}/..
64   toplevel_srcdir=${glibcxx_srcdir}/..
65   AC_SUBST(glibcxx_builddir)
66   AC_SUBST(glibcxx_srcdir)
67   AC_SUBST(toplevel_builddir)
68   AC_SUBST(toplevel_srcdir)
70   # We use these options to decide which functions to include.  They are
71   # set from the top level.
72   AC_ARG_WITH([target-subdir],
73     AC_HELP_STRING([--with-target-subdir=SUBDIR],
74                    [configuring in a subdirectory]))
76   AC_ARG_WITH([cross-host],
77     AC_HELP_STRING([--with-cross-host=HOST],
78                    [configuring with a cross compiler]))
80   AC_ARG_WITH([newlib],
81     AC_HELP_STRING([--with-newlib],
82                    [assume newlib as a system C library]))
84   # Will set LN_S to either 'ln -s', 'ln', or 'cp -p' (if linking isn't
85   # available).  Uncomment the next line to force a particular method.
86   AC_PROG_LN_S
87   #LN_S='cp -p'
89   AC_CHECK_TOOL(AS, as)
90   AC_CHECK_TOOL(AR, ar)
91   AC_CHECK_TOOL(RANLIB, ranlib, ranlib-not-found-in-path-error)
93   AM_MAINTAINER_MODE
95   # Set up safe default values for all subsequent AM_CONDITIONAL tests
96   # which are themselves conditionally expanded.
97   ## (Right now, this only matters for enable_wchar_t, but nothing prevents
98   ## other macros from doing the same.  This should be automated.)  -pme
100   # Check for C library flavor since GNU/Linux platforms use different
101   # configuration directories depending on the C library in use.
102   AC_EGREP_CPP([_using_uclibc], [
103   #include <stdio.h>
104   #if __UCLIBC__
105     _using_uclibc
106   #endif
107   ], uclibc=yes, uclibc=no)
109   AC_EGREP_CPP([_using_bionic], [
110   #include <stdio.h>
111   #if __BIONIC__
112     _using_bionic
113   #endif
114   ], bionic=yes, bionic=no)
116   # Find platform-specific directories containing configuration info.
117   # Also possibly modify flags used elsewhere, as needed by the platform.
118   GLIBCXX_CHECK_HOST
123 dnl Tests for newer compiler features, or features that are present in newer
124 dnl compiler versions but not older compiler versions still in use, should
125 dnl be placed here.
127 dnl Defines:
128 dnl  WERROR='-Werror' if requested and possible; g++'s that lack the
129 dnl   new inlining code or the new system_header pragma will die on -Werror.
130 dnl   Leave it out by default and use maint-mode to use it.
131 dnl  SECTION_FLAGS='-ffunction-sections -fdata-sections' if
132 dnl   compiler supports it and the user has not requested debug mode.
134 AC_DEFUN([GLIBCXX_CHECK_COMPILER_FEATURES], [
135   # All these tests are for C++; save the language and the compiler flags.
136   # The CXXFLAGS thing is suspicious, but based on similar bits previously
137   # found in GLIBCXX_CONFIGURE.
138   AC_LANG_SAVE
139   AC_LANG_CPLUSPLUS
140   ac_test_CXXFLAGS="${CXXFLAGS+set}"
141   ac_save_CXXFLAGS="$CXXFLAGS"
143   # Check for -ffunction-sections -fdata-sections
144   AC_MSG_CHECKING([for g++ that supports -ffunction-sections -fdata-sections])
145   CXXFLAGS='-g -Werror -ffunction-sections -fdata-sections'
146   AC_TRY_COMPILE([int foo; void bar() { };],, [ac_fdsections=yes], [ac_fdsections=no])
147   if test "$ac_test_CXXFLAGS" = set; then
148     CXXFLAGS="$ac_save_CXXFLAGS"
149   else
150     # this is the suspicious part
151     CXXFLAGS=''
152   fi
153   if test x"$ac_fdsections" = x"yes"; then
154     SECTION_FLAGS='-ffunction-sections -fdata-sections'
155   fi
156   AC_MSG_RESULT($ac_fdsections)
158   AC_LANG_RESTORE
159   AC_SUBST(SECTION_FLAGS)
164 dnl If GNU ld is in use, check to see if tricky linker opts can be used.  If
165 dnl the native linker is in use, all variables will be defined to something
166 dnl safe (like an empty string).
168 dnl Defines:
169 dnl  SECTION_LDFLAGS='-Wl,--gc-sections' if possible
170 dnl  OPT_LDFLAGS='-Wl,-O1' and '-z,relro' if possible
171 dnl  LD (as a side effect of testing)
172 dnl Sets:
173 dnl  with_gnu_ld
174 dnl  glibcxx_ld_is_gold (set to "no" or "yes")
175 dnl  glibcxx_gnu_ld_version (possibly)
177 dnl The last will be a single integer, e.g., version 1.23.45.0.67.89 will
178 dnl set glibcxx_gnu_ld_version to 12345.  Zeros cause problems.
180 AC_DEFUN([GLIBCXX_CHECK_LINKER_FEATURES], [
181   # If we're not using GNU ld, then there's no point in even trying these
182   # tests.  Check for that first.  We should have already tested for gld
183   # by now (in libtool), but require it now just to be safe...
184   test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS=''
185   test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''
186   AC_REQUIRE([AC_PROG_LD])
187   AC_REQUIRE([AC_PROG_AWK])
189   # The name set by libtool depends on the version of libtool.  Shame on us
190   # for depending on an impl detail, but c'est la vie.  Older versions used
191   # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
192   # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
193   # makes sense).  We'll test with_gnu_ld everywhere else, so if that isn't
194   # set (hence we're using an older libtool), then set it.
195   if test x${with_gnu_ld+set} != xset; then
196     if test x${ac_cv_prog_gnu_ld+set} != xset; then
197       # We got through "ac_require(ac_prog_ld)" and still not set?  Huh?
198       with_gnu_ld=no
199     else
200       with_gnu_ld=$ac_cv_prog_gnu_ld
201     fi
202   fi
204   # Start by getting the version number.  I think the libtool test already
205   # does some of this, but throws away the result.
206   glibcxx_ld_is_gold=no
207   if test x"$with_gnu_ld" = x"yes"; then
208     AC_MSG_CHECKING([for ld version])
209     changequote(,)
210     if $LD --version 2>/dev/null | grep 'GNU gold' >/dev/null 2>&1; then
211       glibcxx_ld_is_gold=yes
212     fi
213     ldver=`$LD --version 2>/dev/null |
214            sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'`
215     changequote([,])
216     glibcxx_gnu_ld_version=`echo $ldver | \
217            $AWK -F. '{ if (NF<3) [$]3=0; print ([$]1*100+[$]2)*100+[$]3 }'`
218     AC_MSG_RESULT($glibcxx_gnu_ld_version)
219   fi
221   # Set --gc-sections.
222   glibcxx_have_gc_sections=no
223   if test "$glibcxx_ld_is_gold" = "yes"; then
224     if $LD --help 2>/dev/null | grep gc-sections >/dev/null 2>&1; then
225       glibcxx_have_gc_sections=yes
226     fi
227   else
228     glibcxx_gcsections_min_ld=21602
229     if test x"$with_gnu_ld" = x"yes" &&
230         test $glibcxx_gnu_ld_version -gt $glibcxx_gcsections_min_ld ; then
231       glibcxx_have_gc_sections=yes
232     fi
233   fi
234   if test "$glibcxx_have_gc_sections" = "yes"; then
235     # Sufficiently young GNU ld it is!  Joy and bunny rabbits!
236     # NB: This flag only works reliably after 2.16.1. Configure tests
237     # for this are difficult, so hard wire a value that should work.
239     ac_test_CFLAGS="${CFLAGS+set}"
240     ac_save_CFLAGS="$CFLAGS"
241     CFLAGS='-Wl,--gc-sections'
243     # Check for -Wl,--gc-sections
244     AC_MSG_CHECKING([for ld that supports -Wl,--gc-sections])
245     AC_TRY_LINK([ int one(void) { return 1; }
246      int two(void) { return 2; }
247         ], [ two(); ] , [ac_gcsections=yes], [ac_gcsections=no])
248     if test "$ac_gcsections" = "yes"; then
249       rm -f conftest.c
250       touch conftest.c
251       if $CC -c conftest.c; then
252         if $LD --gc-sections -o conftest conftest.o 2>&1 | \
253            grep "Warning: gc-sections option ignored" > /dev/null; then
254           ac_gcsections=no
255         fi
256       fi
257       rm -f conftest.c conftest.o conftest
258     fi
259     if test "$ac_gcsections" = "yes"; then
260       SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS"
261     fi
262     AC_MSG_RESULT($ac_gcsections)
264     if test "$ac_test_CFLAGS" = set; then
265       CFLAGS="$ac_save_CFLAGS"
266     else
267       # this is the suspicious part
268       CFLAGS=''
269     fi
270   fi
272   # Set -z,relro.
273   # Note this is only for shared objects.
274   ac_ld_relro=no
275   if test x"$with_gnu_ld" = x"yes"; then
276     AC_MSG_CHECKING([for ld that supports -Wl,-z,relro])
277     cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"`
278     if test -n "$cxx_z_relo"; then
279       OPT_LDFLAGS="-Wl,-z,relro"
280       ac_ld_relro=yes
281     fi
282     AC_MSG_RESULT($ac_ld_relro)
283   fi
285   # Set linker optimization flags.
286   if test x"$with_gnu_ld" = x"yes"; then
287     OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
288   fi
290   AC_SUBST(SECTION_LDFLAGS)
291   AC_SUBST(OPT_LDFLAGS)
296 dnl Check for headers for, and arguments to, the setrlimit() function.
297 dnl Used only in testsuite_hooks.h.  Called from GLIBCXX_CONFIGURE_TESTSUITE.
299 dnl Defines:
300 dnl  _GLIBCXX_RES_LIMITS if we can set artificial resource limits
301 dnl  various HAVE_LIMIT_* for individual limit names
303 AC_DEFUN([GLIBCXX_CHECK_SETRLIMIT_ancilliary], [
304   AC_MSG_CHECKING([for RLIMIT_$1])
305   AC_TRY_COMPILE(
306     [#include <unistd.h>
307      #include <sys/time.h>
308      #include <sys/resource.h>
309     ],
310     [ int f = RLIMIT_$1 ; ],
311     [glibcxx_mresult=1], [glibcxx_mresult=0])
312   AC_DEFINE_UNQUOTED(HAVE_LIMIT_$1, $glibcxx_mresult,
313                      [Only used in build directory testsuite_hooks.h.])
314   if test $glibcxx_mresult = 1 ; then res=yes ; else res=no ; fi
315   AC_MSG_RESULT($res)
318 AC_DEFUN([GLIBCXX_CHECK_SETRLIMIT], [
319   setrlimit_have_headers=yes
320   AC_CHECK_HEADERS(unistd.h sys/time.h sys/resource.h,
321                    [],
322                    [setrlimit_have_headers=no])
323   # If don't have the headers, then we can't run the tests now, and we
324   # won't be seeing any of these during testsuite compilation.
325   if test $setrlimit_have_headers = yes; then
326     # Can't do these in a loop, else the resulting syntax is wrong.
327     GLIBCXX_CHECK_SETRLIMIT_ancilliary(DATA)
328     GLIBCXX_CHECK_SETRLIMIT_ancilliary(RSS)
329     GLIBCXX_CHECK_SETRLIMIT_ancilliary(VMEM)
330     GLIBCXX_CHECK_SETRLIMIT_ancilliary(AS)
331     GLIBCXX_CHECK_SETRLIMIT_ancilliary(FSIZE)
333     # Check for rlimit, setrlimit.
334     AC_CACHE_VAL(glibcxx_cv_setrlimit, [
335       AC_TRY_COMPILE(
336         [#include <unistd.h>
337          #include <sys/time.h>
338          #include <sys/resource.h>
339         ],
340         [struct rlimit r;
341          setrlimit(0, &r);],
342         [glibcxx_cv_setrlimit=yes], [glibcxx_cv_setrlimit=no])
343     ])
344   fi
346   AC_MSG_CHECKING([for testsuite resource limits support])
347   if test $setrlimit_have_headers = yes && test $glibcxx_cv_setrlimit = yes; then
348     ac_res_limits=yes
349     AC_DEFINE(_GLIBCXX_RES_LIMITS, 1,
350               [Define if using setrlimit to set resource limits during
351               "make check"])
352   else
353     ac_res_limits=no
354   fi
355   AC_MSG_RESULT($ac_res_limits)
360 dnl Check whether S_ISREG (Posix) or S_IFREG is available in <sys/stat.h>.
361 dnl Define HAVE_S_ISREG / HAVE_S_IFREG appropriately.
363 AC_DEFUN([GLIBCXX_CHECK_S_ISREG_OR_S_IFREG], [
365   AC_LANG_SAVE
366   AC_LANG_CPLUSPLUS
367   ac_save_CXXFLAGS="$CXXFLAGS"
368   CXXFLAGS="$CXXFLAGS -fno-exceptions"
370   AC_MSG_CHECKING([for S_ISREG or S_IFREG])
371   AC_CACHE_VAL(glibcxx_cv_S_ISREG, [
372     GCC_TRY_COMPILE_OR_LINK(
373       [#include <sys/stat.h>],
374       [struct stat buffer;
375        fstat(0, &buffer);
376        S_ISREG(buffer.st_mode);],
377       [glibcxx_cv_S_ISREG=yes],
378       [glibcxx_cv_S_ISREG=no])
379   ])
380   AC_CACHE_VAL(glibcxx_cv_S_IFREG, [
381     GCC_TRY_COMPILE_OR_LINK(
382       [#include <sys/stat.h>],
383       [struct stat buffer;
384        fstat(0, &buffer);
385        S_IFREG & buffer.st_mode;],
386       [glibcxx_cv_S_IFREG=yes],
387       [glibcxx_cv_S_IFREG=no])
388   ])
389   res=no
390   if test $glibcxx_cv_S_ISREG = yes; then
391     AC_DEFINE(HAVE_S_ISREG, 1,
392               [Define if S_ISREG is available in <sys/stat.h>.])
393     res=S_ISREG
394   elif test $glibcxx_cv_S_IFREG = yes; then
395     AC_DEFINE(HAVE_S_IFREG, 1,
396               [Define if S_IFREG is available in <sys/stat.h>.])
397     res=S_IFREG
398   fi
399   AC_MSG_RESULT($res)
401   CXXFLAGS="$ac_save_CXXFLAGS"
402   AC_LANG_RESTORE
407 dnl Check whether poll is available in <poll.h>, and define HAVE_POLL.
409 AC_DEFUN([GLIBCXX_CHECK_POLL], [
411   AC_LANG_SAVE
412   AC_LANG_CPLUSPLUS
413   ac_save_CXXFLAGS="$CXXFLAGS"
414   CXXFLAGS="$CXXFLAGS -fno-exceptions"
416   AC_MSG_CHECKING([for poll])
417   AC_CACHE_VAL(glibcxx_cv_POLL, [
418     GCC_TRY_COMPILE_OR_LINK(
419       [#include <poll.h>],
420       [struct pollfd pfd[1];
421        pfd[0].events = POLLIN;
422        poll(pfd, 1, 0);],
423       [glibcxx_cv_POLL=yes],
424       [glibcxx_cv_POLL=no])
425   ])
426   if test $glibcxx_cv_POLL = yes; then
427     AC_DEFINE(HAVE_POLL, 1, [Define if poll is available in <poll.h>.])
428   fi
429   AC_MSG_RESULT($glibcxx_cv_POLL)
431   CXXFLAGS="$ac_save_CXXFLAGS"
432   AC_LANG_RESTORE
437 dnl Check whether writev is available in <sys/uio.h>, and define HAVE_WRITEV.
439 AC_DEFUN([GLIBCXX_CHECK_WRITEV], [
441   AC_LANG_SAVE
442   AC_LANG_CPLUSPLUS
443   ac_save_CXXFLAGS="$CXXFLAGS"
444   CXXFLAGS="$CXXFLAGS -fno-exceptions"
446   AC_MSG_CHECKING([for writev])
447   AC_CACHE_VAL(glibcxx_cv_WRITEV, [
448     GCC_TRY_COMPILE_OR_LINK(
449       [#include <sys/uio.h>],
450       [struct iovec iov[2];
451        writev(0, iov, 0);],
452       [glibcxx_cv_WRITEV=yes],
453       [glibcxx_cv_WRITEV=no])
454   ])
455   if test $glibcxx_cv_WRITEV = yes; then
456     AC_DEFINE(HAVE_WRITEV, 1, [Define if writev is available in <sys/uio.h>.])
457   fi
458   AC_MSG_RESULT($glibcxx_cv_WRITEV)
460   CXXFLAGS="$ac_save_CXXFLAGS"
461   AC_LANG_RESTORE
466 dnl Check whether int64_t is available in <stdint.h>, and define HAVE_INT64_T.
467 dnl Also check whether int64_t is actually a typedef to long or long long.
469 AC_DEFUN([GLIBCXX_CHECK_INT64_T], [
471   AC_LANG_SAVE
472   AC_LANG_CPLUSPLUS
474   AC_MSG_CHECKING([for int64_t])
475   AC_CACHE_VAL(glibcxx_cv_INT64_T, [
476     AC_TRY_COMPILE(
477       [#include <stdint.h>],
478       [int64_t var;],
479       [glibcxx_cv_INT64_T=yes],
480       [glibcxx_cv_INT64_T=no])
481   ])
483   if test $glibcxx_cv_INT64_T = yes; then
484     AC_DEFINE(HAVE_INT64_T, 1, [Define if int64_t is available in <stdint.h>.])
485     AC_MSG_RESULT($glibcxx_cv_INT64_T)
487     AC_MSG_CHECKING([for int64_t as long])
488     AC_CACHE_VAL(glibcxx_cv_int64_t_long, [
489       AC_TRY_COMPILE(
490         [#include <stdint.h>
491         template<typename, typename> struct same { enum { value = -1 }; };
492         template<typename Tp> struct same<Tp, Tp> { enum { value = 1 }; };
493         int array[same<int64_t, long>::value];], [],
494         [glibcxx_cv_int64_t_long=yes], [glibcxx_cv_int64_t_long=no])
495     ])
497     if test $glibcxx_cv_int64_t_long = yes; then
498       AC_DEFINE(HAVE_INT64_T_LONG, 1, [Define if int64_t is a long.])
499       AC_MSG_RESULT($glibcxx_cv_int64_t_long)
500     fi
502     AC_MSG_CHECKING([for int64_t as long long])
503     AC_CACHE_VAL(glibcxx_cv_int64_t_long_long, [
504       AC_TRY_COMPILE(
505         [#include <stdint.h>
506         template<typename, typename> struct same { enum { value = -1 }; };
507         template<typename Tp> struct same<Tp, Tp> { enum { value = 1 }; };
508         int array[same<int64_t, long long>::value];], [],
509         [glibcxx_cv_int64_t_long_long=yes], [glibcxx_cv_int64_t_long_long=no])
510     ])
512     if test $glibcxx_cv_int64_t_long_long = yes; then
513       AC_DEFINE(HAVE_INT64_T_LONG_LONG, 1, [Define if int64_t is a long long.])
514       AC_MSG_RESULT($glibcxx_cv_int64_t_long_long)
515     fi
516   fi
518   AC_LANG_RESTORE
523 dnl Check whether LFS support is available.
525 AC_DEFUN([GLIBCXX_CHECK_LFS], [
526   AC_LANG_SAVE
527   AC_LANG_CPLUSPLUS
528   ac_save_CXXFLAGS="$CXXFLAGS"
529   CXXFLAGS="$CXXFLAGS -fno-exceptions"
530   AC_MSG_CHECKING([for LFS support])
531   AC_CACHE_VAL(glibcxx_cv_LFS, [
532     GCC_TRY_COMPILE_OR_LINK(
533       [#include <unistd.h>
534        #include <stdio.h>
535        #include <sys/stat.h>
536       ],
537       [FILE* fp;
538        fopen64("t", "w");
539        fseeko64(fp, 0, SEEK_CUR);
540        ftello64(fp);
541        lseek64(1, 0, SEEK_CUR);
542        struct stat64 buf;
543        fstat64(1, &buf);],
544       [glibcxx_cv_LFS=yes],
545       [glibcxx_cv_LFS=no])
546   ])
547   if test $glibcxx_cv_LFS = yes; then
548     AC_DEFINE(_GLIBCXX_USE_LFS, 1, [Define if LFS support is available.])
549   fi
550   AC_MSG_RESULT($glibcxx_cv_LFS)
551   CXXFLAGS="$ac_save_CXXFLAGS"
552   AC_LANG_RESTORE
557 dnl Check for whether a fully dynamic basic_string implementation should
558 dnl be turned on, that does not put empty objects in per-process static
559 dnl memory (mostly useful together with shared memory allocators, see PR
560 dnl libstdc++/16612 for details).
562 dnl --enable-fully-dynamic-string defines _GLIBCXX_FULLY_DYNAMIC_STRING to 1
563 dnl --disable-fully-dynamic-string defines _GLIBCXX_FULLY_DYNAMIC_STRING to 0
564 dnl otherwise undefined
565 dnl  +  Usage:  GLIBCXX_ENABLE_FULLY_DYNAMIC_STRING[(DEFAULT)]
566 dnl       Where DEFAULT is either `yes' or `no'.
568 AC_DEFUN([GLIBCXX_ENABLE_FULLY_DYNAMIC_STRING], [
569   GLIBCXX_ENABLE(fully-dynamic-string,$1,,[do not put empty strings in per-process static memory])
570   if test $enable_fully_dynamic_string = yes; then
571     enable_fully_dynamic_string_def=1
572   else
573     enable_fully_dynamic_string_def=0
574   fi
575   AC_DEFINE_UNQUOTED([_GLIBCXX_FULLY_DYNAMIC_STRING], [${enable_fully_dynamic_string_def}],
576               [Define to 1 if a fully dynamic basic_string is wanted, 0 to disable, undefined for platform defaults])
581 dnl Does any necessary configuration of the testsuite directory.  Generates
582 dnl the testsuite_hooks.h header.
584 dnl GLIBCXX_ENABLE_SYMVERS and GLIBCXX_IS_NATIVE must be done before this.
586 dnl Sets:
587 dnl  enable_abi_check
588 dnl  GLIBCXX_TEST_WCHAR_T
589 dnl  GLIBCXX_TEST_THREAD
590 dnl Substs:
591 dnl  baseline_dir
592 dnl  baseline_subdir_switch
594 AC_DEFUN([GLIBCXX_CONFIGURE_TESTSUITE], [
595   # Do checks for resource limit functions.
596   GLIBCXX_CHECK_SETRLIMIT
598   if $GLIBCXX_IS_NATIVE ; then
599     # Look for setenv, so that extended locale tests can be performed.
600     GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_3(setenv)
601   fi
603   if $GLIBCXX_IS_NATIVE && test $is_hosted = yes &&
604      test $enable_symvers != no; then
605     case "$host" in
606       *-*-cygwin*)
607         enable_abi_check=no ;;
608       *)
609         enable_abi_check=yes ;;
610     esac
611   else
612     # Only build this as native, since automake does not understand
613     # CXX_FOR_BUILD.
614     enable_abi_check=no
615   fi
617   # Export file names for ABI checking.
618   baseline_dir="$glibcxx_srcdir/config/abi/post/${abi_baseline_pair}"
619   AC_SUBST(baseline_dir)
620   baseline_subdir_switch="$abi_baseline_subdir_switch"
621   AC_SUBST(baseline_subdir_switch)
626 dnl Does any necessary configuration for docbook in the docs directory.
628 dnl XSLTPROC must be set before this
630 dnl Sets:
631 dnl  glibcxx_stylesheets
632 dnl Substs:
633 dnl  XSL_STYLE_DIR
635 AC_DEFUN([GLIBCXX_CONFIGURE_DOCBOOK], [
637 glibcxx_docbook_url=http://docbook.sourceforge.net/release/xsl-ns/current/
639 AC_MSG_CHECKING([for local stylesheet directory])
640 glibcxx_local_stylesheets=no
641 if test x${XMLCATALOG} = xyes && xsl_style_dir=`xmlcatalog "" $glibcxx_docbook_url 2>/dev/null`
642 then
643   XSL_STYLE_DIR=`echo $xsl_style_dir | sed -n 's;^file://;;p'`
644   glibcxx_local_stylesheets=yes
645 else
646   for dir in \
647     /usr/share/sgml/docbook/xsl-ns-stylesheets \
648     /usr/share/xml/docbook/stylesheet/docbook-xsl-ns \
649     /usr/share/xml/docbook/stylesheet/nwalsh5/current \
650     /usr/share/xml/docbook/stylesheet/nwalsh/current
651   do
652     if test -d $dir; then
653       glibcxx_local_stylesheets=yes
654       XSL_STYLE_DIR=$dir
655       break
656     fi
657   done
659 AC_MSG_RESULT($glibcxx_local_stylesheets)
661 if test x"$glibcxx_local_stylesheets" = x"yes"; then
662   AC_SUBST(XSL_STYLE_DIR)
663   AC_MSG_NOTICE($XSL_STYLE_DIR)
665   AC_MSG_CHECKING([for docbook stylesheets for documentation creation])
666   glibcxx_stylesheets=no
667   if test x${XMLCATALOG} = xno || xmlcatalog "" $glibcxx_docbook_url/xhtml/docbook.xsl >/dev/null 2>&1; then
668     if test x${XSLTPROC} = xyes && echo '<title/>' | xsltproc --noout --nonet --xinclude $glibcxx_docbook_url/xhtml/docbook.xsl - 2>/dev/null; then
669       glibcxx_stylesheets=yes
670     fi
671   fi
672   AC_MSG_RESULT($glibcxx_stylesheets)
674 else
675   glibcxx_stylesheets=no
678 # Check for epub3 dependencies.
679 AC_MSG_CHECKING([for epub3 stylesheets for documentation creation])
680 glibcxx_epub_stylesheets=no
681 if test x"$glibcxx_local_stylesheets" = x"yes"; then
682    if test -f "$XSL_STYLE_DIR/epub3/chunk.xsl"; then
683       glibcxx_epub_stylesheets=yes
684    fi
686 AC_MSG_RESULT($glibcxx_epub_stylesheets)
687 AM_CONDITIONAL(BUILD_EPUB, test x"$glibcxx_epub_stylesheets" = x"yes")
693 dnl Set up *_INCLUDES variables for all sundry Makefile.am's.
695 dnl Substs:
696 dnl  GLIBCXX_INCLUDES
697 dnl  TOPLEVEL_INCLUDES
699 AC_DEFUN([GLIBCXX_EXPORT_INCLUDES], [
700   # Used for every C++ compile we perform.
701   GLIBCXX_INCLUDES="\
702 -I$glibcxx_builddir/include/$host_alias \
703 -I$glibcxx_builddir/include \
704 -I$glibcxx_srcdir/libsupc++"
706   # For Canadian crosses, pick this up too.
707   if test $CANADIAN = yes; then
708     GLIBCXX_INCLUDES="$GLIBCXX_INCLUDES -I\${includedir}"
709   fi
711   # Stuff in the actual top level.  Currently only used by libsupc++ to
712   # get unwind* headers from the libgcc dir.
713   #TOPLEVEL_INCLUDES='-I$(toplevel_srcdir)/libgcc -I$(toplevel_srcdir)/include'
714   TOPLEVEL_INCLUDES='-I$(toplevel_srcdir)/libgcc'
716   # Now, export this to all the little Makefiles....
717   AC_SUBST(GLIBCXX_INCLUDES)
718   AC_SUBST(TOPLEVEL_INCLUDES)
723 dnl Set up *_FLAGS and *FLAGS variables for all sundry Makefile.am's.
724 dnl (SECTION_FLAGS is done under CHECK_COMPILER_FEATURES.)
726 dnl Substs:
727 dnl  OPTIMIZE_CXXFLAGS
728 dnl  WARN_FLAGS
730 AC_DEFUN([GLIBCXX_EXPORT_FLAGS], [
731   # Optimization flags that are probably a good idea for thrill-seekers. Just
732   # uncomment the lines below and make, everything else is ready to go...
733   # Alternatively OPTIMIZE_CXXFLAGS can be set in configure.host.
734   # OPTIMIZE_CXXFLAGS = -O3 -fstrict-aliasing -fvtable-gc
735   AC_SUBST(OPTIMIZE_CXXFLAGS)
737   WARN_FLAGS="-Wall -Wextra -Wwrite-strings -Wcast-qual -Wabi=2"
738   AC_SUBST(WARN_FLAGS)
743 dnl All installation directory information is determined here.
745 dnl Substs:
746 dnl  gxx_install_dir
747 dnl  glibcxx_prefixdir
748 dnl  glibcxx_toolexecdir
749 dnl  glibcxx_toolexeclibdir
751 dnl Assumes cross_compiling bits already done, and with_cross_host in
752 dnl particular.
754 dnl This logic must match gcc/configure.ac's setting of gcc_gxx_include_dir.
755 dnl config/gxx-include-dir.m4 must be kept consistant with this as well.
756 AC_DEFUN([GLIBCXX_EXPORT_INSTALL_INFO], [
757   glibcxx_toolexecdir=no
758   glibcxx_toolexeclibdir=no
759   glibcxx_prefixdir=$prefix
761   AC_MSG_CHECKING([for gxx-include-dir])
762   AC_ARG_WITH([gxx-include-dir],
763     AC_HELP_STRING([--with-gxx-include-dir=DIR],
764                    [installation directory for include files]),
765     [case "$withval" in
766       yes) AC_MSG_ERROR([Missing directory for --with-gxx-include-dir]) ;;
767       no)  gxx_include_dir=no ;;
768       *)   gxx_include_dir=$withval ;;
769      esac],
770     [gxx_include_dir=no])
771   AC_MSG_RESULT($gxx_include_dir)
773   AC_MSG_CHECKING([for --enable-version-specific-runtime-libs])
774   AC_ARG_ENABLE([version-specific-runtime-libs],
775     AC_HELP_STRING([--enable-version-specific-runtime-libs],
776                    [Specify that runtime libraries should be installed in a compiler-specific directory]),
777     [case "$enableval" in
778       yes) version_specific_libs=yes ;;
779       no)  version_specific_libs=no ;;
780       *)   AC_MSG_ERROR([Unknown argument to enable/disable version-specific libs]);;
781      esac],
782     [version_specific_libs=no])
783   AC_MSG_RESULT($version_specific_libs)
785   # Default case for install directory for include files.
786   if test $version_specific_libs = no && test $gxx_include_dir = no; then
787     gxx_include_dir='include/c++/${gcc_version}'
788     if test -n "$with_cross_host" &&
789        test x"$with_cross_host" != x"no"; then
790       gxx_include_dir='${prefix}/${target_alias}/'"$gxx_include_dir"
791     else
792       gxx_include_dir='${prefix}/'"$gxx_include_dir"
793     fi
794   fi
796   # Version-specific runtime libs processing.
797   if test $version_specific_libs = yes; then
798     # Need the gcc compiler version to know where to install libraries
799     # and header files if --enable-version-specific-runtime-libs option
800     # is selected.  FIXME: these variables are misnamed, there are
801     # no executables installed in _toolexecdir or _toolexeclibdir.
802     if test x"$gxx_include_dir" = x"no"; then
803       gxx_include_dir='${libdir}/gcc/${host_alias}/${gcc_version}/include/c++'
804     fi
805     glibcxx_toolexecdir='${libdir}/gcc/${host_alias}'
806     glibcxx_toolexeclibdir='${toolexecdir}/${gcc_version}$(MULTISUBDIR)'
807   fi
809   # Calculate glibcxx_toolexecdir, glibcxx_toolexeclibdir
810   # Install a library built with a cross compiler in tooldir, not libdir.
811   if test x"$glibcxx_toolexecdir" = x"no"; then
812     if test -n "$with_cross_host" &&
813        test x"$with_cross_host" != x"no"; then
814       glibcxx_toolexecdir='${exec_prefix}/${host_alias}'
815       glibcxx_toolexeclibdir='${toolexecdir}/lib'
816     else
817       glibcxx_toolexecdir='${libdir}/gcc/${host_alias}'
818       glibcxx_toolexeclibdir='${libdir}'
819     fi
820     multi_os_directory=`$CXX -print-multi-os-directory`
821     case $multi_os_directory in
822       .) ;; # Avoid trailing /.
823       *) glibcxx_toolexeclibdir=$glibcxx_toolexeclibdir/$multi_os_directory ;;
824     esac
825   fi
827   AC_MSG_CHECKING([for install location])
828   AC_MSG_RESULT($gxx_include_dir)
830   AC_SUBST(glibcxx_prefixdir)
831   AC_SUBST(gxx_include_dir)
832   AC_SUBST(glibcxx_toolexecdir)
833   AC_SUBST(glibcxx_toolexeclibdir)
838 dnl GLIBCXX_ENABLE
839 dnl    (FEATURE, DEFAULT, HELP-ARG, HELP-STRING)
840 dnl    (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, permit a|b|c)
841 dnl    (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, SHELL-CODE-HANDLER)
843 dnl See manual/appendix_porting.html#appendix.porting.build_hacking for
844 dnl documentation.
846 m4_define([GLIBCXX_ENABLE],[dnl
847 m4_define([_g_switch],[--enable-$1])dnl
848 m4_define([_g_help],[AC_HELP_STRING([_g_switch$3],[$4 @<:@default=$2@:>@])])dnl
849  AC_ARG_ENABLE([$1],m4_dquote(_g_help),
850   m4_bmatch([$5],
851    [^permit ],
852      [[
853       case "$enableval" in
854        m4_bpatsubst([$5],[permit ])) ;;
855        *) AC_MSG_ERROR(Unknown argument to enable/disable $1) ;;
856           dnl Idea for future:  generate a URL pointing to
857           dnl "onlinedocs/configopts.html#whatever"
858       esac
859      ]],
860    [^$],
861      [[
862       case "$enableval" in
863        yes|no) ;;
864        *) AC_MSG_ERROR(Argument to enable/disable $1 must be yes or no) ;;
865       esac
866      ]],
867    [[$5]]),
868   [enable_]m4_bpatsubst([$1],-,_)[=][$2])
869 m4_undefine([_g_switch])dnl
870 m4_undefine([_g_help])dnl
875 dnl Check for ISO/IEC 9899:1999 "C99" support.
877 dnl --enable-c99 defines _GLIBCXX_USE_C99
878 dnl --disable-c99 leaves _GLIBCXX_USE_C99 undefined
879 dnl  +  Usage:  GLIBCXX_ENABLE_C99[(DEFAULT)]
880 dnl       Where DEFAULT is either `yes' or `no'.
881 dnl  +  If 'C99' stuff is not available, ignores DEFAULT and sets `no'.
883 AC_DEFUN([GLIBCXX_ENABLE_C99], [
884   GLIBCXX_ENABLE(c99,$1,,[turns on ISO/IEC 9899:1999 support])
886   if test x"$enable_c99" = x"yes"; then
887     AC_LANG_SAVE
888     AC_LANG_CPLUSPLUS
890     # Use -std=c++98 (instead of -std=gnu++98) because leaving __STRICT_ANSI__
891     # undefined may cause fake C99 facilities, like pre-standard snprintf,
892     # to be spuriously enabled.
893     ac_save_CXXFLAGS="$CXXFLAGS"
894     CXXFLAGS="$CXXFLAGS -std=c++98"
895     ac_save_LIBS="$LIBS"
896     ac_save_gcc_no_link="$gcc_no_link"
898     if test x$gcc_no_link != xyes; then
899       # Use -fno-exceptions to that the C driver can link these tests without
900       # hitting undefined references to personality routines.
901       CXXFLAGS="$CXXFLAGS -fno-exceptions"
902       AC_CHECK_LIB(m, sin, [LIBS="$LIBS -lm"], [
903         # Use the default compile-only tests in GCC_TRY_COMPILE_OR_LINK
904         gcc_no_link=yes
905       ])
906     fi
908     # Check for the existence of <math.h> functions used if C99 is enabled.
909     AC_MSG_CHECKING([for ISO C99 support in <math.h> for C++98])
910     AC_CACHE_VAL(glibcxx_cv_c99_math_cxx98, [
911       GCC_TRY_COMPILE_OR_LINK(
912         [#include <math.h>
913          volatile double d1, d2;
914          volatile int i;],
915         [i = fpclassify(d1);
916          i = isfinite(d1);
917          i = isinf(d1);
918          i = isnan(d1);
919          i = isnormal(d1);
920          i = signbit(d1);
921          i = isgreater(d1, d2);
922          i = isgreaterequal(d1, d2);
923          i = isless(d1, d2);
924          i = islessequal(d1, d2);
925          i = islessgreater(d1, d2);
926          i = islessgreater(d1, d2);
927          i = isunordered(d1, d2);
928         ], [glibcxx_cv_c99_math_cxx98=yes], [glibcxx_cv_c99_math_cxx98=no])
929     ])
930     AC_MSG_RESULT($glibcxx_cv_c99_math_cxx98)
931     if test x"$glibcxx_cv_c99_math_cxx98" = x"yes"; then
932       AC_DEFINE(_GLIBCXX98_USE_C99_MATH, 1,
933         [Define if C99 functions or macros in <math.h> should be imported
934         in <cmath> in namespace std for C++98.])
935     fi
937     # Check for the existence of <complex.h> complex math functions.
938     # This is necessary even though libstdc++ uses the builtin versions
939     # of these functions, because if the builtin cannot be used, a reference
940     # to the library function is emitted.
941     AC_CHECK_HEADERS(tgmath.h, ac_has_tgmath_h=yes, ac_has_tgmath_h=no)
942     AC_CHECK_HEADERS(complex.h, ac_has_complex_h=yes, ac_has_complex_h=no)
943     if test x"$ac_has_complex_h" = x"yes"; then
944       AC_MSG_CHECKING([for ISO C99 support in <complex.h> for C++98])
945       AC_CACHE_VAL(glibcxx_cv_c99_complex_cxx98, [
946         GCC_TRY_COMPILE_OR_LINK(
947           [#include <complex.h>
948            typedef __complex__ float float_type;
949            typedef __complex__ double double_type;
950            typedef __complex__ long double ld_type;
951            volatile float_type tmpf;
952            volatile double_type tmpd;
953            volatile ld_type tmpld;
954            volatile float f;
955            volatile double d;
956            volatile long double ld;],
957           [f = cabsf(tmpf);
958            f = cargf(tmpf);
959            tmpf = ccosf(tmpf);
960            tmpf = ccoshf(tmpf);
961            tmpf = cexpf(tmpf);
962            tmpf = clogf(tmpf);
963            tmpf = csinf(tmpf);
964            tmpf = csinhf(tmpf);
965            tmpf = csqrtf(tmpf);
966            tmpf = ctanf(tmpf);
967            tmpf = ctanhf(tmpf);
968            tmpf = cpowf(tmpf, tmpf);
969            tmpf = cprojf(tmpf);
970            d = cabs(tmpd);
971            d = carg(tmpd);
972            tmpd = ccos(tmpd);
973            tmpd = ccosh(tmpd);
974            tmpd = cexp(tmpd);
975            tmpd = clog(tmpd);
976            tmpd = csin(tmpd);
977            tmpd = csinh(tmpd);
978            tmpd = csqrt(tmpd);
979            tmpd = ctan(tmpd);
980            tmpd = ctanh(tmpd);
981            tmpd = cpow(tmpd, tmpd);
982            tmpd = cproj(tmpd);
983            ld = cabsl(tmpld);
984            ld = cargl(tmpld);
985            tmpld = ccosl(tmpld);
986            tmpld = ccoshl(tmpld);
987            tmpld = cexpl(tmpld);
988            tmpld = clogl(tmpld);
989            tmpld = csinl(tmpld);
990            tmpld = csinhl(tmpld);
991            tmpld = csqrtl(tmpld);
992            tmpld = ctanl(tmpld);
993            tmpld = ctanhl(tmpld);
994            tmpld = cpowl(tmpld, tmpld);
995            tmpld = cprojl(tmpld);
996           ], [glibcxx_cv_c99_complex_cxx98=yes], [glibcxx_cv_c99_complex_cxx98=no])
997       ])
998     fi
999     AC_MSG_RESULT($glibcxx_cv_c99_complex_cxx98)
1000     if test x"$glibcxx_cv_c99_complex_cxx98" = x"yes"; then
1001       AC_DEFINE(_GLIBCXX98_USE_C99_COMPLEX, 1,
1002         [Define if C99 functions in <complex.h> should be used in
1003         <complex> for C++98. Using compiler builtins for these functions
1004         requires corresponding C99 library functions to be present.])
1005     fi
1007     # Check for the existence in <stdio.h> of vscanf, et. al.
1008     AC_MSG_CHECKING([for ISO C99 support in <stdio.h> for C++98])
1009     AC_CACHE_VAL(glibcxx_cv_c99_stdio_cxx98, [
1010       GCC_TRY_COMPILE_OR_LINK(
1011         [#include <stdio.h>
1012          #include <stdarg.h>
1013          void foo(char* fmt, ...)
1014          {
1015            va_list args; va_start(args, fmt);
1016            vfscanf(stderr, "%i", args);
1017            vscanf("%i", args);
1018            vsnprintf(fmt, 0, "%i", args);
1019            vsscanf(fmt, "%i", args);
1020            snprintf(fmt, 0, "%i");
1021          }], [],
1022         [glibcxx_cv_c99_stdio_cxx98=yes], [glibcxx_cv_c99_stdio_cxx98=no])
1023     ])
1024     AC_MSG_RESULT($glibcxx_cv_c99_stdio_cxx98)
1025     if test x"$glibcxx_cv_c99_stdio_cxx98" = x"yes"; then
1026       AC_DEFINE(_GLIBCXX98_USE_C99_STDIO, 1,
1027         [Define if C99 functions or macros in <stdio.h> should be imported
1028         in <cstdio> in namespace std for C++98.])
1029     fi
1031     # Check for the existence in <stdlib.h> of lldiv_t, et. al.
1032     AC_MSG_CHECKING([for ISO C99 support in <stdlib.h> for C++98])
1033     AC_CACHE_VAL(glibcxx_cv_c99_stdlib_cxx98, [
1034       GCC_TRY_COMPILE_OR_LINK(
1035         [#include <stdlib.h>
1036          volatile float f;
1037          volatile long double ld;
1038          volatile unsigned long long ll;
1039          lldiv_t mydivt;],
1040         [char* tmp;
1041          f = strtof("gnu", &tmp);
1042          ld = strtold("gnu", &tmp);
1043          ll = strtoll("gnu", &tmp, 10);
1044          ll = strtoull("gnu", &tmp, 10);
1045          ll = llabs(10);
1046          mydivt = lldiv(10,1);
1047          ll = mydivt.quot;
1048          ll = mydivt.rem;
1049          ll = atoll("10");
1050          _Exit(0);
1051         ], [glibcxx_cv_c99_stdlib_cxx98=yes], [glibcxx_cv_c99_stdlib_cxx98=no])
1052     ])
1053     AC_MSG_RESULT($glibcxx_cv_c99_stdlib_cxx98)
1054     if test x"$glibcxx_cv_c99_stdlib_cxx98" = x"yes"; then
1055       AC_DEFINE(_GLIBCXX98_USE_C99_STDLIB, 1,
1056         [Define if C99 functions or macros in <stdlib.h> should be imported
1057         in <cstdlib> in namespace std for C++98.])
1058     fi
1060     # Check for the existence in <wchar.h> of wcstold, etc.
1061     if test x"$ac_has_wchar_h" = xyes &&
1062        test x"$ac_has_wctype_h" = xyes; then
1063       AC_MSG_CHECKING([for ISO C99 support in <wchar.h> for C++98])
1064       AC_CACHE_VAL(glibcxx_cv_c99_wchar_cxx98, [
1065         AC_TRY_COMPILE([#include <wchar.h>
1066           namespace test
1067           {
1068             using ::wcstold;
1069             using ::wcstoll;
1070             using ::wcstoull;
1071           }
1072         ], [], [glibcxx_cv_c99_wchar_cxx98=yes], [glibcxx_cv_c99_wchar_cxx98=no])
1073       ])
1075       # Checks for wide character functions that may not be present.
1076       # Injection of these is wrapped with guard macros.
1077       # NB: only put functions here, instead of immediately above, if
1078       # absolutely necessary.
1079       AC_TRY_COMPILE([#include <wchar.h>
1080         namespace test { using ::vfwscanf; }], [],
1081         [AC_DEFINE(HAVE_VFWSCANF, 1, [Defined if vfwscanf exists.])], [])
1083       AC_TRY_COMPILE([#include <wchar.h>
1084         namespace test { using ::vswscanf; }], [],
1085         [AC_DEFINE(HAVE_VSWSCANF, 1, [Defined if vswscanf exists.])], [])
1087       AC_TRY_COMPILE([#include <wchar.h>
1088         namespace test { using ::vwscanf; }], [],
1089         [AC_DEFINE(HAVE_VWSCANF, 1, [Defined if vwscanf exists.])], [])
1091       AC_TRY_COMPILE([#include <wchar.h>
1092         namespace test { using ::wcstof; }], [],
1093         [AC_DEFINE(HAVE_WCSTOF, 1, [Defined if wcstof exists.])], [])
1095       AC_TRY_COMPILE([#include <wctype.h>],
1096         [wint_t t; int i = iswblank(t);],
1097         [AC_DEFINE(HAVE_ISWBLANK, 1, [Defined if iswblank exists.])], [])
1099       AC_MSG_RESULT($glibcxx_cv_c99_wchar_cxx98)
1100       if test x"$glibcxx_cv_c99_wchar_cxx98" = x"yes"; then
1101         AC_DEFINE(_GLIBCXX98_USE_C99_WCHAR, 1,
1102           [Define if C99 functions or macros in <wchar.h> should be imported
1103           in <cwchar> in namespace std for C++98.])
1104       fi
1105     fi
1107     # Option parsed, now set things appropriately.
1108     if test x"$glibcxx_cv_c99_math_cxx98" = x"no" ||
1109        test x"$glibcxx_cv_c99_complex_cxx98" = x"no" ||
1110        test x"$glibcxx_cv_c99_stdio_cxx98" = x"no" ||
1111        test x"$glibcxx_cv_c99_stdlib_cxx98" = x"no" ||
1112        test x"$glibcxx_cv_c99_wchar_cxx98" = x"no"; then
1113       enable_c99=no;
1114     else
1115       AC_DEFINE(_GLIBCXX_USE_C99, 1,
1116         [Define if C99 functions or macros from <wchar.h>, <math.h>,
1117         <complex.h>, <stdio.h>, and <stdlib.h> can be used or exposed.])
1118     fi
1120     gcc_no_link="$ac_save_gcc_no_link"
1121     LIBS="$ac_save_LIBS"
1122     CXXFLAGS="$ac_save_CXXFLAGS"
1123     AC_LANG_RESTORE
1125     AC_LANG_SAVE
1126     AC_LANG_CPLUSPLUS
1128     # Use -std=c++11 and test again for C99 library feature in C++11 mode.
1129     # For the reasons given above we use -std=c++11 not -std=gnu++11.
1130     ac_save_CXXFLAGS="$CXXFLAGS"
1131     CXXFLAGS="$CXXFLAGS -std=c++11"
1132     ac_save_LIBS="$LIBS"
1133     ac_save_gcc_no_link="$gcc_no_link"
1135     if test x$gcc_no_link != xyes; then
1136       # Use -fno-exceptions to that the C driver can link these tests without
1137       # hitting undefined references to personality routines.
1138       CXXFLAGS="$CXXFLAGS -fno-exceptions"
1139       AC_CHECK_LIB(m, sin, [LIBS="$LIBS -lm"], [
1140         # Use the default compile-only tests in GCC_TRY_COMPILE_OR_LINK
1141         gcc_no_link=yes
1142       ])
1143     fi
1145     # Check for the existence of <math.h> functions used if C99 is enabled.
1146     AC_MSG_CHECKING([for ISO C99 support in <math.h> for C++11])
1147     AC_CACHE_VAL(glibcxx_cv_c99_math_cxx11, [
1148       GCC_TRY_COMPILE_OR_LINK(
1149         [#include <math.h>
1150          volatile double d1, d2;
1151          volatile int i;],
1152         [i = fpclassify(d1);
1153          i = isfinite(d1);
1154          i = isinf(d1);
1155          i = isnan(d1);
1156          i = isnormal(d1);
1157          i = signbit(d1);
1158          i = isgreater(d1, d2);
1159          i = isgreaterequal(d1, d2);
1160          i = isless(d1, d2);
1161          i = islessequal(d1, d2);
1162          i = islessgreater(d1, d2);
1163          i = islessgreater(d1, d2);
1164          i = isunordered(d1, d2);
1165         ], [glibcxx_cv_c99_math_cxx11=yes], [glibcxx_cv_c99_math_cxx11=no])
1166     ])
1167     AC_MSG_RESULT($glibcxx_cv_c99_math_cxx11)
1168     if test x"$glibcxx_cv_c99_math_cxx11" = x"yes"; then
1169       AC_DEFINE(_GLIBCXX11_USE_C99_MATH, 1,
1170         [Define if C99 functions or macros in <math.h> should be imported
1171         in <cmath> in namespace std for C++11.])
1172     fi
1174     # Check for the existence of <complex.h> complex math functions.
1175     # This is necessary even though libstdc++ uses the builtin versions
1176     # of these functions, because if the builtin cannot be used, a reference
1177     # to the library function is emitted.
1178     AC_CHECK_HEADERS(tgmath.h, ac_has_tgmath_h=yes, ac_has_tgmath_h=no)
1179     AC_CHECK_HEADERS(complex.h, ac_has_complex_h=yes, ac_has_complex_h=no)
1180     if test x"$ac_has_complex_h" = x"yes"; then
1181       AC_MSG_CHECKING([for ISO C99 support in <complex.h> for C++11])
1182       AC_CACHE_VAL(glibcxx_cv_c99_complex_cxx11, [
1183         GCC_TRY_COMPILE_OR_LINK(
1184           [#include <complex.h>
1185            typedef __complex__ float float_type;
1186            typedef __complex__ double double_type;
1187            typedef __complex__ long double ld_type;
1188            volatile float_type tmpf;
1189            volatile double_type tmpd;
1190            volatile ld_type tmpld;
1191            volatile float f;
1192            volatile double d;
1193            volatile long double ld;],
1194           [f = cabsf(tmpf);
1195            f = cargf(tmpf);
1196            tmpf = ccosf(tmpf);
1197            tmpf = ccoshf(tmpf);
1198            tmpf = cexpf(tmpf);
1199            tmpf = clogf(tmpf);
1200            tmpf = csinf(tmpf);
1201            tmpf = csinhf(tmpf);
1202            tmpf = csqrtf(tmpf);
1203            tmpf = ctanf(tmpf);
1204            tmpf = ctanhf(tmpf);
1205            tmpf = cpowf(tmpf, tmpf);
1206            tmpf = cprojf(tmpf);
1207            d = cabs(tmpd);
1208            d = carg(tmpd);
1209            tmpd = ccos(tmpd);
1210            tmpd = ccosh(tmpd);
1211            tmpd = cexp(tmpd);
1212            tmpd = clog(tmpd);
1213            tmpd = csin(tmpd);
1214            tmpd = csinh(tmpd);
1215            tmpd = csqrt(tmpd);
1216            tmpd = ctan(tmpd);
1217            tmpd = ctanh(tmpd);
1218            tmpd = cpow(tmpd, tmpd);
1219            tmpd = cproj(tmpd);
1220            ld = cabsl(tmpld);
1221            ld = cargl(tmpld);
1222            tmpld = ccosl(tmpld);
1223            tmpld = ccoshl(tmpld);
1224            tmpld = cexpl(tmpld);
1225            tmpld = clogl(tmpld);
1226            tmpld = csinl(tmpld);
1227            tmpld = csinhl(tmpld);
1228            tmpld = csqrtl(tmpld);
1229            tmpld = ctanl(tmpld);
1230            tmpld = ctanhl(tmpld);
1231            tmpld = cpowl(tmpld, tmpld);
1232            tmpld = cprojl(tmpld);
1233           ], [glibcxx_cv_c99_complex_cxx11=yes], [glibcxx_cv_c99_complex_cxx11=no])
1234       ])
1235     fi
1236     AC_MSG_RESULT($glibcxx_cv_c99_complex_cxx11)
1237     if test x"$glibcxx_cv_c99_complex_cxx11" = x"yes"; then
1238       AC_DEFINE(_GLIBCXX11_USE_C99_COMPLEX, 1,
1239         [Define if C99 functions in <complex.h> should be used in
1240         <complex> for C++11. Using compiler builtins for these functions
1241         requires corresponding C99 library functions to be present.])
1242     fi
1244     # Check for the existence in <stdio.h> of vscanf, et. al.
1245     AC_MSG_CHECKING([for ISO C99 support in <stdio.h> for C++11])
1246     AC_CACHE_VAL(glibcxx_cv_c99_stdio_cxx11, [
1247       GCC_TRY_COMPILE_OR_LINK(
1248         [#include <stdio.h>
1249          #include <stdarg.h>
1250          void foo(char* fmt, ...)
1251          {
1252            va_list args; va_start(args, fmt);
1253            vfscanf(stderr, "%i", args);
1254            vscanf("%i", args);
1255            vsnprintf(fmt, 0, "%i", args);
1256            vsscanf(fmt, "%i", args);
1257            snprintf(fmt, 0, "%i");
1258          }], [],
1259         [glibcxx_cv_c99_stdio_cxx11=yes], [glibcxx_cv_c99_stdio_cxx11=no])
1260     ])
1261     AC_MSG_RESULT($glibcxx_cv_c99_stdio_cxx11)
1262     if test x"$glibcxx_cv_c99_stdio_cxx11" = x"yes"; then
1263       AC_DEFINE(_GLIBCXX11_USE_C99_STDIO, 1,
1264         [Define if C99 functions or macros in <stdio.h> should be imported
1265         in <cstdio> in namespace std for C++11.])
1266     fi
1268     # Check for the existence in <stdlib.h> of lldiv_t, et. al.
1269     AC_MSG_CHECKING([for ISO C99 support in <stdlib.h> for C++11])
1270     AC_CACHE_VAL(glibcxx_cv_c99_stdlib_cxx11, [
1271       GCC_TRY_COMPILE_OR_LINK(
1272         [#include <stdlib.h>
1273          volatile float f;
1274          volatile long double ld;
1275          volatile unsigned long long ll;
1276          lldiv_t mydivt;],
1277         [char* tmp;
1278          f = strtof("gnu", &tmp);
1279          ld = strtold("gnu", &tmp);
1280          ll = strtoll("gnu", &tmp, 10);
1281          ll = strtoull("gnu", &tmp, 10);
1282          ll = llabs(10);
1283          mydivt = lldiv(10,1);
1284          ll = mydivt.quot;
1285          ll = mydivt.rem;
1286          ll = atoll("10");
1287          _Exit(0);
1288         ], [glibcxx_cv_c99_stdlib_cxx11=yes], [glibcxx_cv_c99_stdlib_cxx11=no])
1289     ])
1290     AC_MSG_RESULT($glibcxx_cv_c99_stdlib_cxx11)
1291     if test x"$glibcxx_cv_c99_stdlib_cxx11" = x"yes"; then
1292       AC_DEFINE(_GLIBCXX11_USE_C99_STDLIB, 1,
1293         [Define if C99 functions or macros in <stdlib.h> should be imported
1294         in <cstdlib> in namespace std for C++11.])
1295     fi
1297     # Check for the existence in <wchar.h> of wcstold, etc.
1298     if test x"$ac_has_wchar_h" = xyes &&
1299        test x"$ac_has_wctype_h" = xyes; then
1300       AC_MSG_CHECKING([for ISO C99 support in <wchar.h> for C++11])
1301       AC_CACHE_VAL(glibcxx_cv_c99_wchar_cxx11, [
1302         AC_TRY_COMPILE([#include <wchar.h>
1303           namespace test
1304           {
1305             using ::wcstold;
1306             using ::wcstoll;
1307             using ::wcstoull;
1308           }
1309         ], [], [glibcxx_cv_c99_wchar_cxx11=yes], [glibcxx_cv_c99_wchar_cxx11=no])
1310       ])
1312       # Checks for wide character functions that may not be present.
1313       # Injection of these is wrapped with guard macros.
1314       # NB: only put functions here, instead of immediately above, if
1315       # absolutely necessary.
1316       AC_TRY_COMPILE([#include <wchar.h>
1317         namespace test { using ::vfwscanf; }], [],
1318         [AC_DEFINE(HAVE_VFWSCANF, 1, [Defined if vfwscanf exists.])], [])
1320       AC_TRY_COMPILE([#include <wchar.h>
1321         namespace test { using ::vswscanf; }], [],
1322         [AC_DEFINE(HAVE_VSWSCANF, 1, [Defined if vswscanf exists.])], [])
1324       AC_TRY_COMPILE([#include <wchar.h>
1325         namespace test { using ::vwscanf; }], [],
1326         [AC_DEFINE(HAVE_VWSCANF, 1, [Defined if vwscanf exists.])], [])
1328       AC_TRY_COMPILE([#include <wchar.h>
1329         namespace test { using ::wcstof; }], [],
1330         [AC_DEFINE(HAVE_WCSTOF, 1, [Defined if wcstof exists.])], [])
1332       AC_TRY_COMPILE([#include <wctype.h>],
1333         [wint_t t; int i = iswblank(t);],
1334         [AC_DEFINE(HAVE_ISWBLANK, 1, [Defined if iswblank exists.])], [])
1336       AC_MSG_RESULT($glibcxx_cv_c99_wchar_cxx11)
1337       if test x"$glibcxx_cv_c99_wchar_cxx11" = x"yes"; then
1338         AC_DEFINE(_GLIBCXX11_USE_C99_WCHAR, 1,
1339           [Define if C99 functions or macros in <wchar.h> should be imported
1340           in <cwchar> in namespace std for C++11.])
1341       fi
1342     fi
1344     gcc_no_link="$ac_save_gcc_no_link"
1345     LIBS="$ac_save_LIBS"
1346     CXXFLAGS="$ac_save_CXXFLAGS"
1347     AC_LANG_RESTORE
1348   fi
1350   AC_MSG_CHECKING([for fully enabled ISO C99 support])
1351   AC_MSG_RESULT($enable_c99)
1356 dnl Check for clock_gettime, nanosleep and sched_yield, used in the
1357 dnl implementation of 20.11.7 [time.clock], and 30.3.2 [thread.thread.this]
1358 dnl in the C++11 standard.
1360 dnl --enable-libstdcxx-time
1361 dnl --enable-libstdcxx-time=yes
1362 dnl        checks for the availability of monotonic and realtime clocks,
1363 dnl        nanosleep and sched_yield in libc and libposix4 and, if needed,
1364 dnl        links in the latter.
1365 dnl --enable-libstdcxx-time=rt
1366 dnl        also searches (and, if needed, links) librt.  Note that this is
1367 dnl        not always desirable because, in glibc 2.16 and earlier, for
1368 dnl        example, in turn it triggers the linking of libpthread too,
1369 dnl        which activates locking,
1370 dnl        a large overhead for single-thread programs.
1371 dnl --enable-libstdcxx-time=no
1372 dnl --disable-libstdcxx-time
1373 dnl        disables the checks completely
1375 dnl N.B. Darwin provides nanosleep but doesn't support the whole POSIX
1376 dnl Timers option, so doesn't define _POSIX_TIMERS. Because the test
1377 dnl below fails Darwin unconditionally defines _GLIBCXX_USE_NANOSLEEP in
1378 dnl os_defines.h and also defines _GLIBCXX_USE_SCHED_YIELD.
1380 AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_TIME], [
1382   GLIBCXX_ENABLE(libstdcxx-time,auto,[[[=KIND]]],
1383     [use KIND for check type],
1384     [permit yes|no|rt])
1386   AC_LANG_SAVE
1387   AC_LANG_CPLUSPLUS
1388   ac_save_CXXFLAGS="$CXXFLAGS"
1389   CXXFLAGS="$CXXFLAGS -fno-exceptions"
1390   ac_save_LIBS="$LIBS"
1392   ac_has_clock_monotonic=no
1393   ac_has_clock_realtime=no
1394   ac_has_nanosleep=no
1395   ac_has_sched_yield=no
1397   if test x"$enable_libstdcxx_time" = x"auto"; then
1399     case "${target_os}" in
1400       cygwin*)
1401         ac_has_nanosleep=yes
1402         ;;
1403       darwin*)
1404         ac_has_nanosleep=yes
1405         ac_has_sched_yield=yes
1406         ;;
1407       gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
1408         AC_MSG_CHECKING([for at least GNU libc 2.17])
1409         AC_TRY_COMPILE(
1410           [#include <features.h>],
1411           [
1412           #if ! __GLIBC_PREREQ(2, 17)
1413           #error 
1414           #endif
1415           ],
1416           [glibcxx_glibc217=yes], [glibcxx_glibc217=no])
1417         AC_MSG_RESULT($glibcxx_glibc217)
1419         if test x"$glibcxx_glibc217" = x"yes"; then
1420           ac_has_clock_monotonic=yes
1421           ac_has_clock_realtime=yes
1422         fi
1423         ac_has_nanosleep=yes
1424         ac_has_sched_yield=yes
1425         ;;
1426       freebsd*|netbsd*|dragonfly*|rtems*)
1427         ac_has_clock_monotonic=yes
1428         ac_has_clock_realtime=yes
1429         ac_has_nanosleep=yes
1430         ac_has_sched_yield=yes
1431         ;;
1432       openbsd*)
1433         ac_has_clock_monotonic=yes
1434         ac_has_clock_realtime=yes
1435         ac_has_nanosleep=yes
1436         ;;
1437       solaris*)
1438         GLIBCXX_LIBS="$GLIBCXX_LIBS -lrt"
1439         ac_has_clock_monotonic=yes
1440         ac_has_clock_realtime=yes
1441         ac_has_nanosleep=yes
1442         ac_has_sched_yield=yes
1443         ;;
1444     esac
1446   elif test x"$enable_libstdcxx_time" != x"no"; then
1448     if test x"$enable_libstdcxx_time" = x"rt"; then
1449       AC_SEARCH_LIBS(clock_gettime, [rt posix4])
1450       AC_SEARCH_LIBS(nanosleep, [rt posix4])
1451     else
1452       AC_SEARCH_LIBS(clock_gettime, [posix4])
1453       AC_SEARCH_LIBS(nanosleep, [posix4])
1454     fi
1456     case "$ac_cv_search_clock_gettime" in
1457       -l*) GLIBCXX_LIBS=$ac_cv_search_clock_gettime
1458       ;;
1459     esac
1460     case "$ac_cv_search_nanosleep" in
1461       -l*) GLIBCXX_LIBS="$GLIBCXX_LIBS $ac_cv_search_nanosleep"
1462       ;;
1463     esac
1465     AC_SEARCH_LIBS(sched_yield, [rt posix4])
1467     case "$ac_cv_search_sched_yield" in
1468       -lposix4*)
1469       GLIBCXX_LIBS="$GLIBCXX_LIBS $ac_cv_search_sched_yield"
1470       ac_has_sched_yield=yes
1471       ;;
1472       -lrt*)
1473       if test x"$enable_libstdcxx_time" = x"rt"; then
1474         GLIBCXX_LIBS="$GLIBCXX_LIBS $ac_cv_search_sched_yield"
1475         ac_has_sched_yield=yes
1476       fi
1477       ;;
1478       *)
1479       ac_has_sched_yield=yes
1480       ;;
1481     esac
1483     AC_CHECK_HEADERS(unistd.h, ac_has_unistd_h=yes, ac_has_unistd_h=no)
1485     if test x"$ac_has_unistd_h" = x"yes"; then
1486       AC_MSG_CHECKING([for monotonic clock])
1487       AC_TRY_LINK(
1488         [#include <unistd.h>
1489          #include <time.h>
1490         ],
1491         [#if _POSIX_TIMERS > 0 && defined(_POSIX_MONOTONIC_CLOCK)
1492           timespec tp;
1493          #endif
1494           clock_gettime(CLOCK_MONOTONIC, &tp);
1495         ], [ac_has_clock_monotonic=yes], [ac_has_clock_monotonic=no])
1497       AC_MSG_RESULT($ac_has_clock_monotonic)
1499       AC_MSG_CHECKING([for realtime clock])
1500       AC_TRY_LINK(
1501         [#include <unistd.h>
1502          #include <time.h>
1503         ],
1504         [#if _POSIX_TIMERS > 0
1505           timespec tp;
1506          #endif
1507           clock_gettime(CLOCK_REALTIME, &tp);
1508         ], [ac_has_clock_realtime=yes], [ac_has_clock_realtime=no])
1510       AC_MSG_RESULT($ac_has_clock_realtime)
1512       AC_MSG_CHECKING([for nanosleep])
1513       AC_TRY_LINK(
1514         [#include <unistd.h>
1515          #include <time.h>
1516         ],
1517         [#if _POSIX_TIMERS > 0
1518           timespec tp;
1519          #endif
1520           nanosleep(&tp, 0);
1521         ], [ac_has_nanosleep=yes], [ac_has_nanosleep=no])
1523       AC_MSG_RESULT($ac_has_nanosleep)
1524     fi
1525   fi
1527   if test x"$ac_has_clock_monotonic" != x"yes"; then
1528     case ${target_os} in
1529       linux*)
1530         AC_MSG_CHECKING([for clock_gettime syscall])
1531         AC_TRY_COMPILE(
1532           [#include <unistd.h>
1533            #include <time.h>
1534            #include <sys/syscall.h>
1535           ],
1536           [#if _POSIX_TIMERS > 0 && defined(_POSIX_MONOTONIC_CLOCK)
1537             timespec tp;
1538            #endif
1539            syscall(SYS_clock_gettime, CLOCK_MONOTONIC, &tp);
1540            syscall(SYS_clock_gettime, CLOCK_REALTIME, &tp);
1541           ], [ac_has_clock_monotonic_syscall=yes], [ac_has_clock_monotonic_syscall=no])
1542         AC_MSG_RESULT($ac_has_clock_monotonic_syscall)
1543         if test x"$ac_has_clock_monotonic_syscall" = x"yes"; then
1544           AC_DEFINE(_GLIBCXX_USE_CLOCK_GETTIME_SYSCALL, 1,
1545           [ Defined if clock_gettime syscall has monotonic and realtime clock support. ])
1546           ac_has_clock_monotonic=yes
1547           ac_has_clock_realtime=yes
1548         fi;;
1549     esac
1550   fi
1552   if test x"$ac_has_clock_monotonic" = x"yes"; then
1553     AC_DEFINE(_GLIBCXX_USE_CLOCK_MONOTONIC, 1,
1554       [ Defined if clock_gettime has monotonic clock support. ])
1555   fi
1557   if test x"$ac_has_clock_realtime" = x"yes"; then
1558     AC_DEFINE(_GLIBCXX_USE_CLOCK_REALTIME, 1,
1559       [ Defined if clock_gettime has realtime clock support. ])
1560   fi
1562   if test x"$ac_has_sched_yield" = x"yes"; then
1563     AC_DEFINE(_GLIBCXX_USE_SCHED_YIELD, 1,
1564               [ Defined if sched_yield is available. ])
1565   fi
1567   if test x"$ac_has_nanosleep" = x"yes"; then
1568     AC_DEFINE(_GLIBCXX_USE_NANOSLEEP, 1,
1569       [ Defined if nanosleep is available. ])
1570   else
1571       AC_MSG_CHECKING([for sleep])
1572       AC_TRY_COMPILE([#include <unistd.h>],
1573                      [sleep(1)],
1574                      [ac_has_sleep=yes],[ac_has_sleep=no])
1575       if test x"$ac_has_sleep" = x"yes"; then
1576         AC_DEFINE(HAVE_SLEEP,1, [Defined if sleep exists.])
1577       fi
1578       AC_MSG_RESULT($ac_has_sleep)
1579       AC_MSG_CHECKING([for usleep])
1580       AC_TRY_COMPILE([#include <unistd.h>],
1581                      [sleep(1);
1582                       usleep(100);],
1583                      [ac_has_usleep=yes],[ac_has_usleep=no])
1584       if test x"$ac_has_usleep" = x"yes"; then
1585         AC_DEFINE(HAVE_USLEEP,1, [Defined if usleep exists.])
1586       fi
1587       AC_MSG_RESULT($ac_has_usleep)
1588   fi
1590   if test x"$ac_has_nanosleep$ac_has_sleep" = x"nono"; then
1591       AC_MSG_CHECKING([for Sleep])
1592       AC_TRY_COMPILE([#include <windows.h>],
1593                      [Sleep(1)],
1594                      [ac_has_win32_sleep=yes],[ac_has_win32_sleep=no])
1595       if test x"$ac_has_win32_sleep" = x"yes"; then
1596         AC_DEFINE(HAVE_WIN32_SLEEP,1, [Defined if Sleep exists.])
1597       fi
1598       AC_MSG_RESULT($ac_has_win32_sleep)
1599   fi
1601   AC_SUBST(GLIBCXX_LIBS)
1603   CXXFLAGS="$ac_save_CXXFLAGS"
1604   LIBS="$ac_save_LIBS"
1605   AC_LANG_RESTORE
1609 dnl Check for gettimeofday, used in the implementation of 20.11.7
1610 dnl [time.clock] in the C++11 standard.
1612 AC_DEFUN([GLIBCXX_CHECK_GETTIMEOFDAY], [
1614   AC_MSG_CHECKING([for gettimeofday])
1616   AC_LANG_SAVE
1617   AC_LANG_CPLUSPLUS
1618   ac_save_CXXFLAGS="$CXXFLAGS"
1619   CXXFLAGS="$CXXFLAGS -fno-exceptions"
1621   ac_has_gettimeofday=no;
1622   AC_CHECK_HEADERS(sys/time.h, ac_has_sys_time_h=yes, ac_has_sys_time_h=no)
1623   if test x"$ac_has_sys_time_h" = x"yes"; then
1624     AC_MSG_CHECKING([for gettimeofday])
1625     GCC_TRY_COMPILE_OR_LINK([#include <sys/time.h>],
1626       [timeval tv; gettimeofday(&tv, 0);],
1627       [ac_has_gettimeofday=yes], [ac_has_gettimeofday=no])
1629     AC_MSG_RESULT($ac_has_gettimeofday)
1630   fi
1632   if test x"$ac_has_gettimeofday" = x"yes"; then
1633     AC_DEFINE(_GLIBCXX_USE_GETTIMEOFDAY, 1,
1634       [ Defined if gettimeofday is available. ])
1635   fi
1637   CXXFLAGS="$ac_save_CXXFLAGS"
1638   AC_LANG_RESTORE
1642 dnl Check for ISO/IEC 9899:1999 "C99" support to ISO/IEC DTR 19768 "TR1"
1643 dnl facilities in Chapter 8, "C compatibility".
1645 AC_DEFUN([GLIBCXX_CHECK_C99_TR1], [
1647   AC_LANG_SAVE
1648   AC_LANG_CPLUSPLUS
1650   # Use -std=c++98 because the default (-std=gnu++98) leaves __STRICT_ANSI__
1651   # undefined and fake C99 facilities may be spuriously enabled.
1652   ac_save_CXXFLAGS="$CXXFLAGS"
1653   CXXFLAGS="$CXXFLAGS -std=c++98"
1655   # Check for the existence of <complex.h> complex math functions used
1656   # by tr1/complex.
1657   AC_CHECK_HEADERS(complex.h, ac_has_complex_h=yes, ac_has_complex_h=no)
1658   ac_c99_complex_tr1=no;
1659   if test x"$ac_has_complex_h" = x"yes"; then
1660     AC_MSG_CHECKING([for ISO C99 support to TR1 in <complex.h>])
1661     AC_TRY_COMPILE([#include <complex.h>],
1662                    [typedef __complex__ float float_type; float_type tmpf;
1663                     cacosf(tmpf);
1664                     casinf(tmpf);
1665                     catanf(tmpf);
1666                     cacoshf(tmpf);
1667                     casinhf(tmpf);
1668                     catanhf(tmpf);
1669                     typedef __complex__ double double_type; double_type tmpd;
1670                     cacos(tmpd);
1671                     casin(tmpd);
1672                     catan(tmpd);
1673                     cacosh(tmpd);
1674                     casinh(tmpd);
1675                     catanh(tmpd);
1676                     typedef __complex__ long double ld_type; ld_type tmpld;
1677                     cacosl(tmpld);
1678                     casinl(tmpld);
1679                     catanl(tmpld);
1680                     cacoshl(tmpld);
1681                     casinhl(tmpld);
1682                     catanhl(tmpld);
1683                    ],[ac_c99_complex_tr1=yes], [ac_c99_complex_tr1=no])
1684   fi
1685   AC_MSG_RESULT($ac_c99_complex_tr1)
1686   if test x"$ac_c99_complex_tr1" = x"yes"; then
1687     AC_DEFINE(_GLIBCXX_USE_C99_COMPLEX_TR1, 1,
1688               [Define if C99 functions in <complex.h> should be used in
1689               <tr1/complex>. Using compiler builtins for these functions
1690               requires corresponding C99 library functions to be present.])
1691   fi
1693   # Check for the existence of <ctype.h> functions.
1694   AC_MSG_CHECKING([for ISO C99 support to TR1 in <ctype.h>])
1695   AC_CACHE_VAL(glibcxx_cv_c99_ctype_tr1, [
1696   AC_TRY_COMPILE([#include <ctype.h>],
1697                  [int ch;
1698                   int ret;
1699                   ret = isblank(ch);
1700                  ],[glibcxx_cv_c99_ctype_tr1=yes],
1701                    [glibcxx_cv_c99_ctype_tr1=no])
1702   ])
1703   AC_MSG_RESULT($glibcxx_cv_c99_ctype_tr1)
1704   if test x"$glibcxx_cv_c99_ctype_tr1" = x"yes"; then
1705     AC_DEFINE(_GLIBCXX_USE_C99_CTYPE_TR1, 1,
1706               [Define if C99 functions in <ctype.h> should be imported in
1707               <tr1/cctype> in namespace std::tr1.])
1708   fi
1710   # Check for the existence of <fenv.h> functions.
1711   AC_CHECK_HEADERS(fenv.h, ac_has_fenv_h=yes, ac_has_fenv_h=no)
1712   ac_c99_fenv_tr1=no;
1713   if test x"$ac_has_fenv_h" = x"yes"; then
1714     AC_MSG_CHECKING([for ISO C99 support to TR1 in <fenv.h>])
1715     AC_TRY_COMPILE([#include <fenv.h>],
1716                    [int except, mode;
1717                     fexcept_t* pflag;
1718                     fenv_t* penv;
1719                     int ret;
1720                     ret = feclearexcept(except);
1721                     ret = fegetexceptflag(pflag, except);
1722                     ret = feraiseexcept(except);
1723                     ret = fesetexceptflag(pflag, except);
1724                     ret = fetestexcept(except);
1725                     ret = fegetround();
1726                     ret = fesetround(mode);
1727                     ret = fegetenv(penv);
1728                     ret = feholdexcept(penv);
1729                     ret = fesetenv(penv);
1730                     ret = feupdateenv(penv);
1731                    ],[ac_c99_fenv_tr1=yes], [ac_c99_fenv_tr1=no])
1732   fi
1733   AC_MSG_RESULT($ac_c99_fenv_tr1)
1734   if test x"$ac_c99_fenv_tr1" = x"yes"; then
1735     AC_DEFINE(_GLIBCXX_USE_C99_FENV_TR1, 1,
1736               [Define if C99 functions in <fenv.h> should be imported in
1737               <tr1/cfenv> in namespace std::tr1.])
1738   fi
1740   # Check for the existence of <stdint.h> types.
1741   AC_MSG_CHECKING([for ISO C99 support to TR1 in <stdint.h>])
1742   AC_CACHE_VAL(glibcxx_cv_c99_stdint_tr1, [
1743   AC_TRY_COMPILE([#define __STDC_LIMIT_MACROS
1744                   #define __STDC_CONSTANT_MACROS
1745                   #include <stdint.h>],
1746                  [typedef int8_t          my_int8_t;
1747                   my_int8_t               i8 = INT8_MIN;
1748                   i8 = INT8_MAX;
1749                   typedef int16_t         my_int16_t;
1750                   my_int16_t              i16 = INT16_MIN;
1751                   i16 = INT16_MAX;
1752                   typedef int32_t         my_int32_t;
1753                   my_int32_t              i32 = INT32_MIN;
1754                   i32 = INT32_MAX;
1755                   typedef int64_t         my_int64_t;
1756                   my_int64_t              i64 = INT64_MIN;
1757                   i64 = INT64_MAX;
1758                   typedef int_fast8_t     my_int_fast8_t;
1759                   my_int_fast8_t          if8 = INT_FAST8_MIN;
1760                   if8 = INT_FAST8_MAX;
1761                   typedef int_fast16_t    my_int_fast16_t;
1762                   my_int_fast16_t         if16 = INT_FAST16_MIN;
1763                   if16 = INT_FAST16_MAX;
1764                   typedef int_fast32_t    my_int_fast32_t;
1765                   my_int_fast32_t         if32 = INT_FAST32_MIN;
1766                   if32 = INT_FAST32_MAX;
1767                   typedef int_fast64_t    my_int_fast64_t;
1768                   my_int_fast64_t         if64 = INT_FAST64_MIN;
1769                   if64 = INT_FAST64_MAX;
1770                   typedef int_least8_t    my_int_least8_t;
1771                   my_int_least8_t         il8 = INT_LEAST8_MIN;
1772                   il8 = INT_LEAST8_MAX;
1773                   typedef int_least16_t   my_int_least16_t;
1774                   my_int_least16_t        il16 = INT_LEAST16_MIN;
1775                   il16 = INT_LEAST16_MAX;
1776                   typedef int_least32_t   my_int_least32_t;
1777                   my_int_least32_t        il32 = INT_LEAST32_MIN;
1778                   il32 = INT_LEAST32_MAX;
1779                   typedef int_least64_t   my_int_least64_t;
1780                   my_int_least64_t        il64 = INT_LEAST64_MIN;
1781                   il64 = INT_LEAST64_MAX;
1782                   typedef intmax_t        my_intmax_t;
1783                   my_intmax_t             im = INTMAX_MAX;
1784                   im = INTMAX_MIN;
1785                   typedef intptr_t        my_intptr_t;
1786                   my_intptr_t             ip = INTPTR_MAX;
1787                   ip = INTPTR_MIN;
1788                   typedef uint8_t         my_uint8_t;
1789                   my_uint8_t              ui8 = UINT8_MAX;
1790                   ui8 = UINT8_MAX;
1791                   typedef uint16_t        my_uint16_t;
1792                   my_uint16_t             ui16 = UINT16_MAX;
1793                   ui16 = UINT16_MAX;
1794                   typedef uint32_t        my_uint32_t;
1795                   my_uint32_t             ui32 = UINT32_MAX;
1796                   ui32 = UINT32_MAX;
1797                   typedef uint64_t        my_uint64_t;
1798                   my_uint64_t             ui64 = UINT64_MAX;
1799                   ui64 = UINT64_MAX;
1800                   typedef uint_fast8_t    my_uint_fast8_t;
1801                   my_uint_fast8_t         uif8 = UINT_FAST8_MAX;
1802                   uif8 = UINT_FAST8_MAX;
1803                   typedef uint_fast16_t   my_uint_fast16_t;
1804                   my_uint_fast16_t        uif16 = UINT_FAST16_MAX;
1805                   uif16 = UINT_FAST16_MAX;
1806                   typedef uint_fast32_t   my_uint_fast32_t;
1807                   my_uint_fast32_t        uif32 = UINT_FAST32_MAX;
1808                   uif32 = UINT_FAST32_MAX;
1809                   typedef uint_fast64_t   my_uint_fast64_t;
1810                   my_uint_fast64_t        uif64 = UINT_FAST64_MAX;
1811                   uif64 = UINT_FAST64_MAX;
1812                   typedef uint_least8_t   my_uint_least8_t;
1813                   my_uint_least8_t        uil8 = UINT_LEAST8_MAX;
1814                   uil8 = UINT_LEAST8_MAX;
1815                   typedef uint_least16_t  my_uint_least16_t;
1816                   my_uint_least16_t       uil16 = UINT_LEAST16_MAX;
1817                   uil16 = UINT_LEAST16_MAX;
1818                   typedef uint_least32_t  my_uint_least32_t;
1819                   my_uint_least32_t       uil32 = UINT_LEAST32_MAX;
1820                   uil32 = UINT_LEAST32_MAX;
1821                   typedef uint_least64_t  my_uint_least64_t;
1822                   my_uint_least64_t       uil64 = UINT_LEAST64_MAX;
1823                   uil64 = UINT_LEAST64_MAX;
1824                   typedef uintmax_t       my_uintmax_t;
1825                   my_uintmax_t            uim = UINTMAX_MAX;
1826                   uim = UINTMAX_MAX;
1827                   typedef uintptr_t       my_uintptr_t;
1828                   my_uintptr_t            uip = UINTPTR_MAX;
1829                   uip = UINTPTR_MAX;
1830                  ],[glibcxx_cv_c99_stdint_tr1=yes],
1831                    [glibcxx_cv_c99_stdint_tr1=no])
1832   ])
1833   AC_MSG_RESULT($glibcxx_cv_c99_stdint_tr1)
1834   if test x"$glibcxx_cv_c99_stdint_tr1" = x"yes"; then
1835     AC_DEFINE(_GLIBCXX_USE_C99_STDINT_TR1, 1,
1836               [Define if C99 types in <stdint.h> should be imported in
1837               <tr1/cstdint> in namespace std::tr1.])
1838   fi
1840   # Check for the existence of <math.h> functions.
1841   AC_MSG_CHECKING([for ISO C99 support to TR1 in <math.h>])
1842   AC_CACHE_VAL(glibcxx_cv_c99_math_tr1, [
1843   AC_TRY_COMPILE([#include <math.h>],
1844                  [typedef double_t  my_double_t;
1845                   typedef float_t   my_float_t;
1846                   acosh(0.0);
1847                   acoshf(0.0f);
1848                   acoshl(0.0l);
1849                   asinh(0.0);
1850                   asinhf(0.0f);
1851                   asinhl(0.0l);
1852                   atanh(0.0);
1853                   atanhf(0.0f);
1854                   atanhl(0.0l);
1855                   cbrt(0.0);
1856                   cbrtf(0.0f);
1857                   cbrtl(0.0l);
1858                   copysign(0.0, 0.0);
1859                   copysignf(0.0f, 0.0f);
1860                   copysignl(0.0l, 0.0l);
1861                   erf(0.0);
1862                   erff(0.0f);
1863                   erfl(0.0l);
1864                   erfc(0.0);
1865                   erfcf(0.0f);
1866                   erfcl(0.0l);
1867                   exp2(0.0);
1868                   exp2f(0.0f);
1869                   exp2l(0.0l);
1870                   expm1(0.0);
1871                   expm1f(0.0f);
1872                   expm1l(0.0l);
1873                   fdim(0.0, 0.0);
1874                   fdimf(0.0f, 0.0f);
1875                   fdiml(0.0l, 0.0l);
1876                   fma(0.0, 0.0, 0.0);
1877                   fmaf(0.0f, 0.0f, 0.0f);
1878                   fmal(0.0l, 0.0l, 0.0l);
1879                   fmax(0.0, 0.0);
1880                   fmaxf(0.0f, 0.0f);
1881                   fmaxl(0.0l, 0.0l);
1882                   fmin(0.0, 0.0);
1883                   fminf(0.0f, 0.0f);
1884                   fminl(0.0l, 0.0l);
1885                   hypot(0.0, 0.0);
1886                   hypotf(0.0f, 0.0f);
1887                   hypotl(0.0l, 0.0l);
1888                   ilogb(0.0);
1889                   ilogbf(0.0f);
1890                   ilogbl(0.0l);
1891                   lgamma(0.0);
1892                   lgammaf(0.0f);
1893                   lgammal(0.0l);
1894                   #ifndef __APPLE__ /* see below */
1895                   llrint(0.0);
1896                   llrintf(0.0f);
1897                   llrintl(0.0l);
1898                   llround(0.0);
1899                   llroundf(0.0f);
1900                   llroundl(0.0l);
1901                   #endif
1902                   log1p(0.0);
1903                   log1pf(0.0f);
1904                   log1pl(0.0l);
1905                   log2(0.0);
1906                   log2f(0.0f);
1907                   log2l(0.0l);
1908                   logb(0.0);
1909                   logbf(0.0f);
1910                   logbl(0.0l);
1911                   lrint(0.0);
1912                   lrintf(0.0f);
1913                   lrintl(0.0l);
1914                   lround(0.0);
1915                   lroundf(0.0f);
1916                   lroundl(0.0l);
1917                   nan(0);
1918                   nanf(0);
1919                   nanl(0);
1920                   nearbyint(0.0);
1921                   nearbyintf(0.0f);
1922                   nearbyintl(0.0l);
1923                   nextafter(0.0, 0.0);
1924                   nextafterf(0.0f, 0.0f);
1925                   nextafterl(0.0l, 0.0l);
1926                   nexttoward(0.0, 0.0);
1927                   nexttowardf(0.0f, 0.0f);
1928                   nexttowardl(0.0l, 0.0l);
1929                   remainder(0.0, 0.0);
1930                   remainderf(0.0f, 0.0f);
1931                   remainderl(0.0l, 0.0l);
1932                   remquo(0.0, 0.0, 0);
1933                   remquof(0.0f, 0.0f, 0);
1934                   remquol(0.0l, 0.0l, 0);
1935                   rint(0.0);
1936                   rintf(0.0f);
1937                   rintl(0.0l);
1938                   round(0.0);
1939                   roundf(0.0f);
1940                   roundl(0.0l);
1941                   scalbln(0.0, 0l);
1942                   scalblnf(0.0f, 0l);
1943                   scalblnl(0.0l, 0l);
1944                   scalbn(0.0, 0);
1945                   scalbnf(0.0f, 0);
1946                   scalbnl(0.0l, 0);
1947                   tgamma(0.0);
1948                   tgammaf(0.0f);
1949                   tgammal(0.0l);
1950                   trunc(0.0);
1951                   truncf(0.0f);
1952                   truncl(0.0l);
1953                  ],[glibcxx_cv_c99_math_tr1=yes], [glibcxx_cv_c99_math_tr1=no])
1954   ])
1955   AC_MSG_RESULT($glibcxx_cv_c99_math_tr1)
1956   if test x"$glibcxx_cv_c99_math_tr1" = x"yes"; then
1957     AC_DEFINE(_GLIBCXX_USE_C99_MATH_TR1, 1,
1958               [Define if C99 functions or macros in <math.h> should be imported
1959               in <tr1/cmath> in namespace std::tr1.])
1961     case "${target_os}" in
1962       darwin*)
1963         AC_MSG_CHECKING([for ISO C99 rounding functions in <math.h>])
1964         AC_CACHE_VAL(glibcxx_cv_c99_math_llround, [
1965           AC_TRY_COMPILE([#include <math.h>],
1966                  [llrint(0.0);
1967                   llrintf(0.0f);
1968                   llrintl(0.0l);
1969                   llround(0.0);
1970                   llroundf(0.0f);
1971                   llroundl(0.0l);
1972                  ],
1973                  [glibcxx_cv_c99_math_llround=yes],
1974                  [glibcxx_cv_c99_math_llround=no])
1975           ])
1976         AC_MSG_RESULT($glibcxx_cv_c99_math_llround)
1977         ;;
1978     esac
1979     if test x"$glibcxx_cv_c99_math_llround" = x"no"; then
1980       AC_DEFINE(_GLIBCXX_NO_C99_ROUNDING_FUNCS, 1,
1981                 [Define if C99 llrint and llround functions are missing from <math.h>.])
1982     fi
1983   fi
1985   # Check for the existence of <inttypes.h> functions (NB: doesn't make
1986   # sense if the glibcxx_cv_c99_stdint_tr1 check fails, per C99, 7.8/1).
1987   ac_c99_inttypes_tr1=no;
1988   if test x"$glibcxx_cv_c99_stdint_tr1" = x"yes"; then
1989     AC_MSG_CHECKING([for ISO C99 support to TR1 in <inttypes.h>])
1990     AC_TRY_COMPILE([#include <inttypes.h>],
1991                    [intmax_t i, numer, denom, base;
1992                     const char* s;
1993                     char** endptr;
1994                     intmax_t ret = imaxabs(i);
1995                     imaxdiv_t dret = imaxdiv(numer, denom);
1996                     ret = strtoimax(s, endptr, base);
1997                     uintmax_t uret = strtoumax(s, endptr, base);
1998                    ],[ac_c99_inttypes_tr1=yes], [ac_c99_inttypes_tr1=no])
1999   fi
2000   AC_MSG_RESULT($ac_c99_inttypes_tr1)
2001   if test x"$ac_c99_inttypes_tr1" = x"yes"; then
2002     AC_DEFINE(_GLIBCXX_USE_C99_INTTYPES_TR1, 1,
2003               [Define if C99 functions in <inttypes.h> should be imported in
2004               <tr1/cinttypes> in namespace std::tr1.])
2005   fi
2007   # Check for the existence of wchar_t <inttypes.h> functions (NB: doesn't
2008   # make sense if the glibcxx_cv_c99_stdint_tr1 check fails, per C99, 7.8/1).
2009   ac_c99_inttypes_wchar_t_tr1=no;
2010   if test x"$glibcxx_cv_c99_stdint_tr1" = x"yes"; then
2011     AC_MSG_CHECKING([for wchar_t ISO C99 support to TR1 in <inttypes.h>])
2012     AC_TRY_COMPILE([#include <inttypes.h>],
2013                    [intmax_t base;
2014                     const wchar_t* s;
2015                     wchar_t** endptr;
2016                     intmax_t ret = wcstoimax(s, endptr, base);
2017                     uintmax_t uret = wcstoumax(s, endptr, base);
2018                    ],[ac_c99_inttypes_wchar_t_tr1=yes],
2019                      [ac_c99_inttypes_wchar_t_tr1=no])
2020   fi
2021   AC_MSG_RESULT($ac_c99_inttypes_wchar_t_tr1)
2022   if test x"$ac_c99_inttypes_wchar_t_tr1" = x"yes"; then
2023     AC_DEFINE(_GLIBCXX_USE_C99_INTTYPES_WCHAR_T_TR1, 1,
2024               [Define if wchar_t C99 functions in <inttypes.h> should be
2025               imported in <tr1/cinttypes> in namespace std::tr1.])
2026   fi
2028   # Check for the existence of the <stdbool.h> header.
2029   AC_CHECK_HEADERS(stdbool.h)
2031   # Check for the existence of the <stdalign.h> header.
2032   AC_CHECK_HEADERS(stdalign.h)
2034   CXXFLAGS="$ac_save_CXXFLAGS"
2035   AC_LANG_RESTORE
2039 dnl Check for uchar.h and usability.
2041 AC_DEFUN([GLIBCXX_CHECK_UCHAR_H], [
2043   # Test uchar.h.
2044   AC_CHECK_HEADERS(uchar.h, ac_has_uchar_h=yes, ac_has_uchar_h=no)
2046   AC_LANG_SAVE
2047   AC_LANG_CPLUSPLUS
2048   ac_save_CXXFLAGS="$CXXFLAGS"
2049   CXXFLAGS="$CXXFLAGS -std=c++11"
2051   if test x"$ac_has_uchar_h" = x"yes"; then
2052     AC_MSG_CHECKING([for ISO C11 support for <uchar.h>])
2053     AC_TRY_COMPILE([#include <uchar.h>
2054                     #ifdef __STDC_UTF_16__
2055                     long i = __STDC_UTF_16__;
2056                     #endif
2057                     #ifdef __STDC_UTF_32__
2058                     long j = __STDC_UTF_32__;
2059                     #endif
2060                     namespace test
2061                     {
2062                       using ::c16rtomb;
2063                       using ::c32rtomb;
2064                       using ::mbrtoc16;
2065                       using ::mbrtoc32;
2066                     }
2067                    ],
2068                    [], [ac_c11_uchar_cxx11=yes], [ac_c11_uchar_cxx11=no])
2069   else
2070     ac_c11_uchar_cxx11=no
2071   fi
2072   AC_MSG_RESULT($ac_c11_uchar_cxx11)
2073   if test x"$ac_c11_uchar_cxx11" = x"yes"; then
2074     AC_DEFINE(_GLIBCXX_USE_C11_UCHAR_CXX11, 1,
2075               [Define if C11 functions in <uchar.h> should be imported into
2076               namespace std in <cuchar>.])
2077   fi
2079   CXXFLAGS="$ac_save_CXXFLAGS"
2080   AC_LANG_RESTORE
2085 dnl Check whether "/dev/random" and "/dev/urandom" are available for
2086 dnl class std::random_device from C++ 2011 [rand.device], and
2087 dnl random_device of "TR1" (Chapter 5.1, "Random number generation").
2089 AC_DEFUN([GLIBCXX_CHECK_DEV_RANDOM], [
2091   AC_MSG_CHECKING([for "/dev/random" and "/dev/urandom" for std::random_device])
2092   AC_CACHE_VAL(glibcxx_cv_dev_random, [
2093     if test -r /dev/random && test -r /dev/urandom; then
2094   ## For MSys environment the test above is detected as false-positive
2095   ## on mingw-targets.  So disable it explicitly for them.
2096       case ${target_os} in
2097         *mingw*) glibcxx_cv_dev_random=no ;;
2098         *) glibcxx_cv_dev_random=yes ;;
2099       esac
2100     else
2101       glibcxx_cv_dev_random=no;
2102     fi
2103   ])
2104   AC_MSG_RESULT($glibcxx_cv_dev_random)
2106   if test x"$glibcxx_cv_dev_random" = x"yes"; then
2107     AC_DEFINE(_GLIBCXX_USE_DEV_RANDOM, 1,
2108               [Define if /dev/random and /dev/urandom are available for
2109                std::random_device.])
2110     AC_DEFINE(_GLIBCXX_USE_RANDOM_TR1, 1,
2111               [Define if /dev/random and /dev/urandom are available for
2112                the random_device of TR1 (Chapter 5.1).])
2113   fi
2118 dnl Compute the EOF, SEEK_CUR, and SEEK_END integer constants.
2120 AC_DEFUN([GLIBCXX_COMPUTE_STDIO_INTEGER_CONSTANTS], [
2122   AC_CACHE_CHECK([for the value of EOF], glibcxx_cv_stdio_eof, [
2123   AC_COMPUTE_INT([glibcxx_cv_stdio_eof], [[EOF]],
2124                  [#include <stdio.h>],
2125                  [AC_MSG_ERROR([computing EOF failed])])
2126   ])
2127   AC_DEFINE_UNQUOTED(_GLIBCXX_STDIO_EOF, $glibcxx_cv_stdio_eof,
2128                      [Define to the value of the EOF integer constant.])
2130   AC_CACHE_CHECK([for the value of SEEK_CUR], glibcxx_cv_stdio_seek_cur, [
2131   AC_COMPUTE_INT([glibcxx_cv_stdio_seek_cur], [[SEEK_CUR]],
2132                  [#include <stdio.h>],
2133                  [AC_MSG_ERROR([computing SEEK_CUR failed])])
2134   ])
2135   AC_DEFINE_UNQUOTED(_GLIBCXX_STDIO_SEEK_CUR, $glibcxx_cv_stdio_seek_cur,
2136                      [Define to the value of the SEEK_CUR integer constant.])
2138   AC_CACHE_CHECK([for the value of SEEK_END], glibcxx_cv_stdio_seek_end, [
2139   AC_COMPUTE_INT([glibcxx_cv_stdio_seek_end], [[SEEK_END]],
2140                  [#include <stdio.h>],
2141                  [AC_MSG_ERROR([computing SEEK_END failed])])
2142   ])
2143   AC_DEFINE_UNQUOTED(_GLIBCXX_STDIO_SEEK_END, $glibcxx_cv_stdio_seek_end,
2144                      [Define to the value of the SEEK_END integer constant.])
2148 dnl Check whether required C++ overloads are present in <stdio.h>.
2150 AC_DEFUN([GLIBCXX_CHECK_STDIO_PROTO], [
2152   AC_LANG_SAVE
2153   AC_LANG_CPLUSPLUS
2154   # Use C++11 because a conforming <stdio.h> won't define gets for C++14,
2155   # and we don't need a declaration for C++14 anyway.
2156   ac_save_CXXFLAGS="$CXXFLAGS"
2157   CXXFLAGS="$CXXFLAGS -std=gnu++11"
2159   AC_MSG_CHECKING([for gets declaration])
2160   AC_CACHE_VAL(glibcxx_cv_gets, [
2161   AC_COMPILE_IFELSE([AC_LANG_SOURCE(
2162           [#include <stdio.h>
2163            namespace test 
2164            {
2165               using ::gets;
2166            }
2167         ])],
2168         [glibcxx_cv_gets=yes],
2169         [glibcxx_cv_gets=no]
2170       )])
2172   if test $glibcxx_cv_gets = yes; then
2173     AC_DEFINE(HAVE_GETS, 1, [Define if gets is available in <stdio.h> before C++14.])
2174   fi
2175   AC_MSG_RESULT($glibcxx_cv_gets)
2177   CXXFLAGS="$ac_save_CXXFLAGS"
2178   AC_LANG_RESTORE
2182 dnl Check whether required C++11 overloads for floating point and integral
2183 dnl types are present in <math.h>.
2185 AC_DEFUN([GLIBCXX_CHECK_MATH11_PROTO], [
2187   AC_LANG_SAVE
2188   AC_LANG_CPLUSPLUS
2189   ac_save_CXXFLAGS="$CXXFLAGS"
2190   CXXFLAGS="$CXXFLAGS -std=c++11"
2192   case "$host" in
2193     *-*-solaris2.*)
2194       # Solaris 12 Build 86, Solaris 11.3 SRU 3.6, and Solaris 10 Patch
2195       # 11996[67]-02 introduced the C++11 <math.h> floating point overloads.
2196       AC_MSG_CHECKING([for C++11 <math.h> floating point overloads])
2197       AC_CACHE_VAL(glibcxx_cv_math11_fp_overload, [
2198         AC_COMPILE_IFELSE([AC_LANG_SOURCE(
2199           [#include <math.h>
2200            #undef isfinite
2201            namespace std {
2202              inline bool isfinite(float __x)
2203              { return __builtin_isfinite(__x); }
2204            }
2205         ])],
2206         [glibcxx_cv_math11_fp_overload=no],
2207         [glibcxx_cv_math11_fp_overload=yes]
2208       )])
2210       # autoheader cannot handle indented templates.
2211       AH_VERBATIM([__CORRECT_ISO_CPP11_MATH_H_PROTO_FP],
2212         [/* Define if all C++11 floating point overloads are available in <math.h>.  */
2213 #if __cplusplus >= 201103L
2214 #undef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2215 #endif])
2217       if test $glibcxx_cv_math11_fp_overload = yes; then
2218         AC_DEFINE(__CORRECT_ISO_CPP11_MATH_H_PROTO_FP)
2219       fi
2220       AC_MSG_RESULT([$glibcxx_cv_math11_fp_overload])
2222       # Solaris 12 Build 90, Solaris 11.3 SRU 5.6, and Solaris 10 Patch
2223       # 11996[67]-02 introduced the C++11 <math.h> integral type overloads.
2224       AC_MSG_CHECKING([for C++11 <math.h> integral type overloads])
2225       AC_CACHE_VAL(glibcxx_cv_math11_int_overload, [
2226         AC_COMPILE_IFELSE([AC_LANG_SOURCE(
2227           [#include <math.h>
2228            namespace std {
2229              template<typename _Tp>
2230                struct __is_integer;
2231              template<>
2232                struct __is_integer<int>
2233                {
2234                  enum { __value = 1 };
2235                };
2236            }
2237            namespace __gnu_cxx {
2238              template<bool, typename>
2239                struct __enable_if;
2240              template<typename _Tp>
2241                struct __enable_if<true, _Tp>
2242                { typedef _Tp __type; };
2243            }
2244            namespace std {
2245              template<typename _Tp>
2246                constexpr typename __gnu_cxx::__enable_if
2247                          <__is_integer<_Tp>::__value, double>::__type
2248                log2(_Tp __x)
2249                { return __builtin_log2(__x); }
2250            }
2251            int
2252            main (void)
2253            {
2254              int i = 1000;
2255              return std::log2(i);
2256            }
2257         ])],
2258         [glibcxx_cv_math11_int_overload=no],
2259         [glibcxx_cv_math11_int_overload=yes]
2260       )])
2262       # autoheader cannot handle indented templates.
2263       AH_VERBATIM([__CORRECT_ISO_CPP11_MATH_H_PROTO_INT],
2264         [/* Define if all C++11 integral type overloads are available in <math.h>.  */
2265 #if __cplusplus >= 201103L
2266 #undef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2267 #endif])
2269       if test $glibcxx_cv_math11_int_overload = yes; then
2270         AC_DEFINE(__CORRECT_ISO_CPP11_MATH_H_PROTO_INT)
2271       fi
2272       AC_MSG_RESULT([$glibcxx_cv_math11_int_overload])
2273       ;;
2274     *)
2275       # If <math.h> defines the obsolete isinf(double) and isnan(double)
2276       # functions (instead of or as well as the C99 generic macros) then we
2277       # can't define std::isinf(double) and std::isnan(double) in <cmath>
2278       # and must use the ones from <math.h> instead.
2279       AC_MSG_CHECKING([for obsolete isinf function in <math.h>])
2280         AC_CACHE_VAL(glibcxx_cv_obsolete_isinf, [
2281           AC_COMPILE_IFELSE([AC_LANG_SOURCE(
2282             [#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS
2283              #include <math.h>
2284              #undef isinf
2285              namespace std {
2286                using ::isinf;
2287                bool isinf(float);
2288                bool isinf(long double);
2289              }
2290              using std::isinf;
2291              bool b = isinf(0.0);
2292           ])],
2293           [glibcxx_cv_obsolete_isinf=yes],
2294           [glibcxx_cv_obsolete_isinf=no]
2295         )])
2296       AC_MSG_RESULT([$glibcxx_cv_obsolete_isinf])
2297       if test $glibcxx_cv_obsolete_isinf = yes; then
2298         AC_DEFINE(HAVE_OBSOLETE_ISINF, 1,
2299                   [Define if <math.h> defines obsolete isinf function.])
2300       fi
2302       AC_MSG_CHECKING([for obsolete isnan function in <math.h>])
2303         AC_CACHE_VAL(glibcxx_cv_obsolete_isnan, [
2304           AC_COMPILE_IFELSE([AC_LANG_SOURCE(
2305             [#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS
2306              #include <math.h>
2307              #undef isnan
2308              namespace std {
2309                using ::isnan;
2310                bool isnan(float);
2311                bool isnan(long double);
2312              }
2313              using std::isnan;
2314              bool b = isnan(0.0);
2315           ])],
2316           [glibcxx_cv_obsolete_isnan=yes],
2317           [glibcxx_cv_obsolete_isnan=no]
2318         )])
2319       AC_MSG_RESULT([$glibcxx_cv_obsolete_isnan])
2320       if test $glibcxx_cv_obsolete_isnan = yes; then
2321         AC_DEFINE(HAVE_OBSOLETE_ISNAN, 1,
2322                   [Define if <math.h> defines obsolete isnan function.])
2323       fi
2324       ;;
2325   esac
2327   CXXFLAGS="$ac_save_CXXFLAGS"
2328   AC_LANG_RESTORE
2332 dnl Check whether macros, etc are present for <system_error>
2334 AC_DEFUN([GLIBCXX_CHECK_SYSTEM_ERROR], [
2336 m4_pushdef([n_syserr], [1])dnl
2337 m4_foreach([syserr], [EOWNERDEAD, ENOTRECOVERABLE, ENOLINK, EPROTO, ENODATA,
2338                       ENOSR, ENOSTR, ETIME, EBADMSG, ECANCELED,
2339                       EOVERFLOW, ENOTSUP, EIDRM, ETXTBSY,
2340                       ECHILD, ENOSPC, EPERM,
2341                       ETIMEDOUT, EWOULDBLOCK],
2342 [m4_pushdef([SYSERR], m4_toupper(syserr))dnl
2343 AC_MSG_CHECKING([for syserr])
2344 AC_CACHE_VAL([glibcxx_cv_system_error[]n_syserr], [
2345 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <errno.h>]],
2346                                    [int i = syserr;])],
2347                   [glibcxx_cv_system_error[]n_syserr=yes],
2348                   [glibcxx_cv_system_error[]n_syserr=no])
2350 AC_MSG_RESULT([$glibcxx_cv_system_error[]n_syserr])
2351 if test x"$glibcxx_cv_system_error[]n_syserr" = x"yes"; then
2352   AC_DEFINE([HAVE_]SYSERR, 1, [Define if ]syserr[ exists.])
2354 m4_define([n_syserr], m4_incr(n_syserr))dnl
2355 m4_popdef([SYSERR])dnl
2357 m4_popdef([n_syserr])dnl
2361 dnl Check for what type of C headers to use.
2363 dnl --enable-cheaders= [does stuff].
2364 dnl --disable-cheaders [does not do anything, really].
2365 dnl  +  Usage:  GLIBCXX_ENABLE_CHEADERS[(DEFAULT)]
2366 dnl       Where DEFAULT is either 'c' or 'c_std' or 'c_global'.
2368 AC_DEFUN([GLIBCXX_ENABLE_CHEADERS], [
2369   GLIBCXX_ENABLE(cheaders,$1,[[[=KIND]]],
2370     [construct "C" headers for g++], [permit c|c_std|c_global])
2371   AC_MSG_NOTICE("C" header strategy set to $enable_cheaders)
2373   C_INCLUDE_DIR='${glibcxx_srcdir}/include/'$enable_cheaders
2375   # Allow overrides to configure.host here.
2376   if test $enable_cheaders = c_global; then
2377      c_compatibility=yes
2378   fi
2380   AC_SUBST(C_INCLUDE_DIR)
2381   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_C, test $enable_cheaders = c)
2382   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_C_STD, test $enable_cheaders = c_std)
2383   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_C_GLOBAL, test $enable_cheaders = c_global)
2384   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_COMPATIBILITY, test $c_compatibility = yes)
2389 dnl Check for which locale library to use.  The choice is mapped to
2390 dnl a subdirectory of config/locale.
2392 dnl Default is generic.
2394 AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [
2395   GLIBCXX_ENABLE(clocale,auto,[[[=MODEL]]],
2396     [use MODEL for target locale package],
2397     [permit generic|gnu|ieee_1003.1-2001|newlib|yes|no|auto])
2399   # Deal with gettext issues.  Default to not using it (=no) until we detect
2400   # support for it later.  Let the user turn it off via --e/d, but let that
2401   # default to on for easier handling.
2402   USE_NLS=no
2403   AC_ARG_ENABLE(nls,
2404     AC_HELP_STRING([--enable-nls],[use Native Language Support (default)]),
2405     [],
2406     [enable_nls=yes])
2408   # Either a known package, or "auto"
2409   if test $enable_clocale = no || test $enable_clocale = yes; then
2410      enable_clocale=auto
2411   fi
2412   enable_clocale_flag=$enable_clocale
2414   # Probe for locale model to use if none specified.
2415   # Default to "generic".
2416   if test $enable_clocale_flag = auto; then
2417     case ${target_os} in
2418       linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
2419         enable_clocale_flag=gnu
2420         ;;
2421       darwin*)
2422         enable_clocale_flag=darwin
2423         ;;
2424       dragonfly* | freebsd*)
2425         enable_clocale_flag=dragonfly
2426         ;;
2427       openbsd*)
2428         enable_clocale_flag=newlib
2429         ;;
2430       *)
2431         if test x"$with_newlib" = x"yes"; then
2432           enable_clocale_flag=newlib
2433         else
2434           enable_clocale_flag=generic
2435         fi
2436         ;;
2437     esac
2438   fi
2440   # Sanity check model, and test for special functionality.
2441   if test $enable_clocale_flag = gnu; then
2442     AC_EGREP_CPP([_GLIBCXX_ok], [
2443     #include <features.h>
2444     #if (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)) && !defined(__UCLIBC__)
2445       _GLIBCXX_ok
2446     #endif
2447     ], enable_clocale_flag=gnu, enable_clocale_flag=generic)
2449     # Set it to scream when it hurts.
2450     ac_save_CFLAGS="$CFLAGS"
2451     CFLAGS="-Wimplicit-function-declaration -Werror"
2453     # Use strxfrm_l if available.
2454     AC_TRY_COMPILE([#define _GNU_SOURCE 1
2455                     #include <string.h>
2456                     #include <locale.h>],
2457                     [char s[128]; __locale_t loc; strxfrm_l(s, "C", 5, loc);],
2458                     AC_DEFINE(HAVE_STRXFRM_L, 1,
2459                     [Define if strxfrm_l is available in <string.h>.]),)
2461     # Use strerror_l if available.
2462     AC_TRY_COMPILE([#define _GNU_SOURCE 1
2463                     #include <string.h>
2464                     #include <locale.h>],
2465                     [__locale_t loc; strerror_l(5, loc);],
2466                     AC_DEFINE(HAVE_STRERROR_L, 1,
2467                     [Define if strerror_l is available in <string.h>.]),)
2469     CFLAGS="$ac_save_CFLAGS"
2470   fi
2472   # Perhaps use strerror_r if available, and strerror_l isn't.
2473   ac_save_CFLAGS="$CFLAGS"
2474   CFLAGS="-Wimplicit-function-declaration -Werror"
2475   AC_TRY_COMPILE([#define _GNU_SOURCE 1
2476                   #include <string.h>
2477                   #include <locale.h>],
2478                   [char s[128]; strerror_r(5, s, 128);],
2479                   AC_DEFINE(HAVE_STRERROR_R, 1,
2480                   [Define if strerror_r is available in <string.h>.]),)
2481   CFLAGS="$ac_save_CFLAGS"
2483   # Set configure bits for specified locale package
2484   AC_MSG_CHECKING([for C locale to use])
2485   case ${enable_clocale_flag} in
2486     generic)
2487       AC_MSG_RESULT(generic)
2489       CLOCALE_H=config/locale/generic/c_locale.h
2490       CLOCALE_CC=config/locale/generic/c_locale.cc
2491       CCODECVT_CC=config/locale/generic/codecvt_members.cc
2492       CCOLLATE_CC=config/locale/generic/collate_members.cc
2493       CCTYPE_CC=config/locale/generic/ctype_members.cc
2494       CMESSAGES_H=config/locale/generic/messages_members.h
2495       CMESSAGES_CC=config/locale/generic/messages_members.cc
2496       CMONEY_CC=config/locale/generic/monetary_members.cc
2497       CNUMERIC_CC=config/locale/generic/numeric_members.cc
2498       CTIME_H=config/locale/generic/time_members.h
2499       CTIME_CC=config/locale/generic/time_members.cc
2500       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2501       ;;
2502     darwin)
2503       AC_MSG_RESULT(darwin)
2505       CLOCALE_H=config/locale/generic/c_locale.h
2506       CLOCALE_CC=config/locale/generic/c_locale.cc
2507       CCODECVT_CC=config/locale/generic/codecvt_members.cc
2508       CCOLLATE_CC=config/locale/generic/collate_members.cc
2509       CCTYPE_CC=config/locale/darwin/ctype_members.cc
2510       CMESSAGES_H=config/locale/generic/messages_members.h
2511       CMESSAGES_CC=config/locale/generic/messages_members.cc
2512       CMONEY_CC=config/locale/generic/monetary_members.cc
2513       CNUMERIC_CC=config/locale/generic/numeric_members.cc
2514       CTIME_H=config/locale/generic/time_members.h
2515       CTIME_CC=config/locale/generic/time_members.cc
2516       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2517       ;;
2519     dragonfly)
2520       AC_MSG_RESULT(dragonfly or freebsd)
2522       CLOCALE_H=config/locale/dragonfly/c_locale.h
2523       CLOCALE_CC=config/locale/dragonfly/c_locale.cc
2524       CCODECVT_CC=config/locale/dragonfly/codecvt_members.cc
2525       CCOLLATE_CC=config/locale/dragonfly/collate_members.cc
2526       CCTYPE_CC=config/locale/dragonfly/ctype_members.cc
2527       CMESSAGES_H=config/locale/generic/messages_members.h
2528       CMESSAGES_CC=config/locale/generic/messages_members.cc
2529       CMONEY_CC=config/locale/dragonfly/monetary_members.cc
2530       CNUMERIC_CC=config/locale/dragonfly/numeric_members.cc
2531       CTIME_H=config/locale/dragonfly/time_members.h
2532       CTIME_CC=config/locale/dragonfly/time_members.cc
2533       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2534       ;;
2536     gnu)
2537       AC_MSG_RESULT(gnu)
2539       # Declare intention to use gettext, and add support for specific
2540       # languages.
2541       # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT
2542       ALL_LINGUAS="de fr"
2544       # Don't call AM-GNU-GETTEXT here. Instead, assume glibc.
2545       AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no)
2546       if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
2547         USE_NLS=yes
2548       fi
2549       # Export the build objects.
2550       for ling in $ALL_LINGUAS; do \
2551         glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \
2552         glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \
2553       done
2554       AC_SUBST(glibcxx_MOFILES)
2555       AC_SUBST(glibcxx_POFILES)
2557       CLOCALE_H=config/locale/gnu/c_locale.h
2558       CLOCALE_CC=config/locale/gnu/c_locale.cc
2559       CCODECVT_CC=config/locale/gnu/codecvt_members.cc
2560       CCOLLATE_CC=config/locale/gnu/collate_members.cc
2561       CCTYPE_CC=config/locale/gnu/ctype_members.cc
2562       CMESSAGES_H=config/locale/gnu/messages_members.h
2563       CMESSAGES_CC=config/locale/gnu/messages_members.cc
2564       CMONEY_CC=config/locale/gnu/monetary_members.cc
2565       CNUMERIC_CC=config/locale/gnu/numeric_members.cc
2566       CTIME_H=config/locale/gnu/time_members.h
2567       CTIME_CC=config/locale/gnu/time_members.cc
2568       CLOCALE_INTERNAL_H=config/locale/gnu/c++locale_internal.h
2569       ;;
2570     ieee_1003.1-2001)
2571       AC_MSG_RESULT(IEEE 1003.1)
2573       CLOCALE_H=config/locale/ieee_1003.1-2001/c_locale.h
2574       CLOCALE_CC=config/locale/ieee_1003.1-2001/c_locale.cc
2575       CCODECVT_CC=config/locale/generic/codecvt_members.cc
2576       CCOLLATE_CC=config/locale/generic/collate_members.cc
2577       CCTYPE_CC=config/locale/generic/ctype_members.cc
2578       CMESSAGES_H=config/locale/ieee_1003.1-2001/messages_members.h
2579       CMESSAGES_CC=config/locale/ieee_1003.1-2001/messages_members.cc
2580       CMONEY_CC=config/locale/generic/monetary_members.cc
2581       CNUMERIC_CC=config/locale/generic/numeric_members.cc
2582       CTIME_H=config/locale/generic/time_members.h
2583       CTIME_CC=config/locale/generic/time_members.cc
2584       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2585       ;;
2586     newlib)
2587       AC_MSG_RESULT(newlib)
2589       CLOCALE_H=config/locale/generic/c_locale.h
2590       CLOCALE_CC=config/locale/generic/c_locale.cc
2591       CCODECVT_CC=config/locale/generic/codecvt_members.cc
2592       CCOLLATE_CC=config/locale/generic/collate_members.cc
2593       CCTYPE_CC=config/locale/newlib/ctype_members.cc
2594       CMESSAGES_H=config/locale/generic/messages_members.h
2595       CMESSAGES_CC=config/locale/generic/messages_members.cc
2596       CMONEY_CC=config/locale/generic/monetary_members.cc
2597       CNUMERIC_CC=config/locale/generic/numeric_members.cc
2598       CTIME_H=config/locale/generic/time_members.h
2599       CTIME_CC=config/locale/generic/time_members.cc
2600       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2601       ;;
2602   esac
2604   # This is where the testsuite looks for locale catalogs, using the
2605   # -DLOCALEDIR define during testsuite compilation.
2606   glibcxx_localedir=${glibcxx_builddir}/po/share/locale
2607   AC_SUBST(glibcxx_localedir)
2609   # A standalone libintl (e.g., GNU libintl) may be in use.
2610   if test $USE_NLS = yes; then
2611     AC_CHECK_HEADERS([libintl.h], [], USE_NLS=no)
2612     AC_SEARCH_LIBS(gettext, intl, [], USE_NLS=no)
2613   fi
2614   if test $USE_NLS = yes; then
2615     AC_DEFINE(_GLIBCXX_USE_NLS, 1,
2616               [Define if NLS translations are to be used.])
2617   fi
2619   AC_SUBST(USE_NLS)
2620   AC_SUBST(CLOCALE_H)
2621   AC_SUBST(CMESSAGES_H)
2622   AC_SUBST(CCODECVT_CC)
2623   AC_SUBST(CCOLLATE_CC)
2624   AC_SUBST(CCTYPE_CC)
2625   AC_SUBST(CMESSAGES_CC)
2626   AC_SUBST(CMONEY_CC)
2627   AC_SUBST(CNUMERIC_CC)
2628   AC_SUBST(CTIME_H)
2629   AC_SUBST(CTIME_CC)
2630   AC_SUBST(CLOCALE_CC)
2631   AC_SUBST(CLOCALE_INTERNAL_H)
2636 dnl Check for which std::allocator base class to use.  The choice is
2637 dnl mapped from a subdirectory of include/ext.
2639 dnl Default is new.
2641 AC_DEFUN([GLIBCXX_ENABLE_ALLOCATOR], [
2642   AC_MSG_CHECKING([for std::allocator base class])
2643   GLIBCXX_ENABLE(libstdcxx-allocator,auto,[[[=KIND]]],
2644     [use KIND for target std::allocator base],
2645     [permit new|malloc|mt|bitmap|pool|yes|no|auto])
2647   # If they didn't use this option switch, or if they specified --enable
2648   # with no specific model, we'll have to look for one.  If they
2649   # specified --disable (???), do likewise.
2650   if test $enable_libstdcxx_allocator = no ||
2651      test $enable_libstdcxx_allocator = yes;
2652   then
2653      enable_libstdcxx_allocator=auto
2654   fi
2656   # Either a known package, or "auto". Auto implies the default choice
2657   # for a particular platform.
2658   enable_libstdcxx_allocator_flag=$enable_libstdcxx_allocator
2660   # Probe for host-specific support if no specific model is specified.
2661   # Default to "new".
2662   if test $enable_libstdcxx_allocator_flag = auto; then
2663     case ${target_os} in
2664       linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
2665         enable_libstdcxx_allocator_flag=new
2666         ;;
2667       *)
2668         enable_libstdcxx_allocator_flag=new
2669         ;;
2670     esac
2671   fi
2672   AC_MSG_RESULT($enable_libstdcxx_allocator_flag)
2675   # Set configure bits for specified locale package
2676   case ${enable_libstdcxx_allocator_flag} in
2677     bitmap)
2678       ALLOCATOR_H=config/allocator/bitmap_allocator_base.h
2679       ALLOCATOR_NAME=__gnu_cxx::bitmap_allocator
2680       ;;
2681     malloc)
2682       ALLOCATOR_H=config/allocator/malloc_allocator_base.h
2683       ALLOCATOR_NAME=__gnu_cxx::malloc_allocator
2684       ;;
2685     mt)
2686       ALLOCATOR_H=config/allocator/mt_allocator_base.h
2687       ALLOCATOR_NAME=__gnu_cxx::__mt_alloc
2688       ;;
2689     new)
2690       ALLOCATOR_H=config/allocator/new_allocator_base.h
2691       ALLOCATOR_NAME=__gnu_cxx::new_allocator
2692       ;;
2693     pool)
2694       ALLOCATOR_H=config/allocator/pool_allocator_base.h
2695       ALLOCATOR_NAME=__gnu_cxx::__pool_alloc
2696       ;;
2697   esac
2699   GLIBCXX_CONDITIONAL(ENABLE_ALLOCATOR_NEW,
2700                       test $enable_libstdcxx_allocator_flag = new)
2701   AC_SUBST(ALLOCATOR_H)
2702   AC_SUBST(ALLOCATOR_NAME)
2707 dnl Check for whether the Boost-derived checks should be turned on.
2709 dnl --enable-concept-checks turns them on.
2710 dnl --disable-concept-checks leaves them off.
2711 dnl  +  Usage:  GLIBCXX_ENABLE_CONCEPT_CHECKS[(DEFAULT)]
2712 dnl       Where DEFAULT is either `yes' or `no'.
2714 AC_DEFUN([GLIBCXX_ENABLE_CONCEPT_CHECKS], [
2715   GLIBCXX_ENABLE(concept-checks,$1,,[use Boost-derived template checks])
2716   if test $enable_concept_checks = yes; then
2717     AC_DEFINE(_GLIBCXX_CONCEPT_CHECKS, 1,
2718               [Define to use concept checking code from the boost libraries.])
2719   fi
2723 dnl Use extern templates.
2725 dnl --enable-extern-template defines _GLIBCXX_EXTERN_TEMPLATE to 1
2726 dnl --disable-extern-template defines _GLIBCXX_EXTERN_TEMPLATE to 0
2728 dnl  +  Usage:  GLIBCXX_ENABLE_TEMPLATE[(DEFAULT)]
2729 dnl       Where DEFAULT is `yes' or `no'.
2731 AC_DEFUN([GLIBCXX_ENABLE_EXTERN_TEMPLATE], [
2733   GLIBCXX_ENABLE(extern-template,$1,,[enable extern template])
2735   AC_MSG_CHECKING([for extern template support])
2736   AC_MSG_RESULT([$enable_extern_template])
2738   GLIBCXX_CONDITIONAL(ENABLE_EXTERN_TEMPLATE, test $enable_extern_template = yes)
2742 dnl Use vtable verification.
2744 dnl --enable-vtable-verify defines _GLIBCXX_VTABLE_VERIFY to 1
2745 dnl --disable-vtable-verify defines _GLIBCXX_VTABLE_VERIFY to 0
2747 dnl  +  Usage:  GLIBCXX_ENABLE_VTABLE_VERIFY[(DEFAULT)]
2748 dnl       Where DEFAULT is `yes' or `no'.
2750 AC_DEFUN([GLIBCXX_ENABLE_VTABLE_VERIFY], [
2752   GLIBCXX_ENABLE(vtable-verify,$1,,[enable vtable verify])
2754   AC_MSG_CHECKING([for vtable verify support])
2755   AC_MSG_RESULT([$enable_vtable_verify])
2757   vtv_cygmin=no
2758   if test $enable_vtable_verify = yes; then
2759     case ${target_os} in
2760       cygwin*|mingw32*)
2761         VTV_CXXFLAGS="-fvtable-verify=std -Wl,-lvtv,-u_vtable_map_vars_start,-u_vtable_map_vars_end"
2762         VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,--rpath -Wl,${toplevel_builddir}/libvtv/.libs"
2763         vtv_cygmin=yes
2764         ;;
2765       darwin*)
2766         VTV_CXXFLAGS="-fvtable-verify=std -Wl,-u,_vtable_map_vars_start -Wl,-u,_vtable_map_vars_end"
2767         VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,-rpath,${toplevel_builddir}/libvtv/.libs"
2768         ;;
2769       solaris2*)
2770         VTV_CXXFLAGS="-fvtable-verify=std -Wl,-u_vtable_map_vars_start,-u_vtable_map_vars_end"
2771         VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,-R -Wl,${toplevel_builddir}/libvtv/.libs"
2772         ;;
2773       *)
2774         VTV_CXXFLAGS="-fvtable-verify=std -Wl,-u_vtable_map_vars_start,-u_vtable_map_vars_end"
2775         VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,--rpath -Wl,${toplevel_builddir}/libvtv/.libs"
2776         ;;
2777     esac
2778     VTV_PCH_CXXFLAGS="-fvtable-verify=std"
2779   else
2780     VTV_CXXFLAGS= 
2781     VTV_PCH_CXXFLAGS=
2782     VTV_CXXLINKFLAGS= 
2783   fi
2785   AC_SUBST(VTV_CXXFLAGS)
2786   AC_SUBST(VTV_PCH_CXXFLAGS)
2787   AC_SUBST(VTV_CXXLINKFLAGS)
2788   AM_CONDITIONAL(VTV_CYGMIN, test x$vtv_cygmin = xyes)
2789   GLIBCXX_CONDITIONAL(ENABLE_VTABLE_VERIFY, test $enable_vtable_verify = yes)
2793 dnl Check for parallel mode pre-requisites, including OpenMP support.
2795 dnl  +  Usage:  GLIBCXX_ENABLE_PARALLEL
2797 AC_DEFUN([GLIBCXX_ENABLE_PARALLEL], [
2799   enable_parallel=no;
2801   # See if configured libgomp/omp.h exists. (libgomp may be in
2802   # noconfigdirs but not explicitly disabled.)
2803   if echo " ${TARGET_CONFIGDIRS} " | grep " libgomp " > /dev/null 2>&1 ; then
2804     enable_parallel=yes;
2805   else
2806     AC_MSG_NOTICE([target-libgomp not built])
2807   fi
2809   AC_MSG_CHECKING([for parallel mode support])
2810   AC_MSG_RESULT([$enable_parallel])
2815 dnl Check for which I/O library to use:  stdio, or something specific.
2817 dnl Default is stdio.
2819 AC_DEFUN([GLIBCXX_ENABLE_CSTDIO], [
2820   AC_MSG_CHECKING([for underlying I/O to use])
2821   GLIBCXX_ENABLE(cstdio,stdio,[[[=PACKAGE]]],
2822     [use target-specific I/O package], [permit stdio])
2824   # Now that libio has been removed, you can have any color you want as long
2825   # as it's black.  This is one big no-op until other packages are added, but
2826   # showing the framework never hurts.
2827   case ${enable_cstdio} in
2828     stdio)
2829       CSTDIO_H=config/io/c_io_stdio.h
2830       BASIC_FILE_H=config/io/basic_file_stdio.h
2831       BASIC_FILE_CC=config/io/basic_file_stdio.cc
2832       AC_MSG_RESULT(stdio)
2833       ;;
2834   esac
2836   AC_SUBST(CSTDIO_H)
2837   AC_SUBST(BASIC_FILE_H)
2838   AC_SUBST(BASIC_FILE_CC)
2843 dnl Check for "unusual" flags to pass to the compiler while building.
2845 dnl --enable-cxx-flags='-foo -bar -baz' is a general method for passing
2846 dnl     experimental flags such as -fpch, -fIMI, -Dfloat=char, etc.
2847 dnl --disable-cxx-flags passes nothing.
2848 dnl  +  See http://gcc.gnu.org/ml/libstdc++/2000-q2/msg00131.html
2849 dnl         http://gcc.gnu.org/ml/libstdc++/2000-q2/msg00284.html
2850 dnl         http://gcc.gnu.org/ml/libstdc++/2000-q1/msg00035.html
2851 dnl  +  Usage:  GLIBCXX_ENABLE_CXX_FLAGS(default flags)
2852 dnl       If "default flags" is an empty string, the effect is the same
2853 dnl       as --disable or --enable=no.
2855 AC_DEFUN([GLIBCXX_ENABLE_CXX_FLAGS], [dnl
2856   AC_MSG_CHECKING([for extra compiler flags for building])
2857   GLIBCXX_ENABLE(cxx-flags,$1,[=FLAGS],
2858     [pass compiler FLAGS when building library],
2859     [case "x$enable_cxx_flags" in
2860       xno | x)   enable_cxx_flags= ;;
2861       x-*)       ;;
2862       *)         AC_MSG_ERROR(_g_switch needs compiler flags as arguments) ;;
2863      esac])
2865   # Run through flags (either default or command-line) and set anything
2866   # extra (e.g., #defines) that must accompany particular g++ options.
2867   if test -n "$enable_cxx_flags"; then
2868     for f in $enable_cxx_flags; do
2869       case "$f" in
2870         -fhonor-std)  ;;
2871         -*)  ;;
2872         *)   # and we're trying to pass /what/ exactly?
2873              AC_MSG_ERROR([compiler flags start with a -]) ;;
2874       esac
2875     done
2876   fi
2878   EXTRA_CXX_FLAGS="$enable_cxx_flags"
2879   AC_MSG_RESULT($EXTRA_CXX_FLAGS)
2880   AC_SUBST(EXTRA_CXX_FLAGS)
2885 dnl Check to see if debugging libraries are to be built.
2887 dnl --enable-libstdcxx-debug
2888 dnl builds a separate set of debugging libraries in addition to the
2889 dnl normal (shared, static) libstdc++ binaries.
2891 dnl --disable-libstdcxx-debug
2892 dnl builds only one (non-debug) version of libstdc++.
2894 dnl --enable-libstdcxx-debug-flags=FLAGS
2895 dnl iff --enable-debug == yes, then use FLAGS to build the debug library.
2897 dnl  +  Usage:  GLIBCXX_ENABLE_DEBUG[(DEFAULT)]
2898 dnl       Where DEFAULT is either `yes' or `no'.
2900 AC_DEFUN([GLIBCXX_ENABLE_DEBUG], [
2901   AC_MSG_CHECKING([for additional debug build])
2902   skip_debug_build=
2903   GLIBCXX_ENABLE(libstdcxx-debug,$1,,[build extra debug library])
2904   if test x$enable_libstdcxx_debug = xyes; then
2905     if test -f $toplevel_builddir/../stage_final \
2906       && test -f $toplevel_builddir/../stage_current; then
2907       stage_final=`cat $toplevel_builddir/../stage_final`
2908       stage_current=`cat $toplevel_builddir/../stage_current`
2909       if test x$stage_current != x$stage_final ; then
2910         skip_debug_build=" (skipped for bootstrap stage $stage_current)"
2911         enable_libstdcxx_debug=no
2912       fi
2913     fi
2914   fi
2915   AC_MSG_RESULT($enable_libstdcxx_debug$skip_debug_build)
2916   GLIBCXX_CONDITIONAL(GLIBCXX_BUILD_DEBUG, test $enable_libstdcxx_debug = yes)
2921 dnl Check for explicit debug flags.
2923 dnl --enable-libstdcxx-debug-flags='-O1'
2924 dnl is a general method for passing flags to be used when
2925 dnl building debug libraries with --enable-libstdcxx-debug.
2927 dnl --disable-libstdcxx-debug-flags does nothing.
2928 dnl  +  Usage:  GLIBCXX_ENABLE_DEBUG_FLAGS(default flags)
2929 dnl       If "default flags" is an empty string, the effect is the same
2930 dnl       as --disable or --enable=no.
2932 AC_DEFUN([GLIBCXX_ENABLE_DEBUG_FLAGS], [
2933   GLIBCXX_ENABLE(libstdcxx-debug-flags,[$1],[=FLAGS],
2934     [pass compiler FLAGS when building debug library],
2935     [case "x$enable_libstdcxx_debug_flags" in
2936       xno | x)    enable_libstdcxx_debug_flags= ;;
2937       x-*)        ;;
2938       *)          AC_MSG_ERROR(_g_switch needs compiler flags as arguments) ;;
2939      esac])
2941   # Option parsed, now set things appropriately
2942   DEBUG_FLAGS="$enable_libstdcxx_debug_flags"
2943   AC_SUBST(DEBUG_FLAGS)
2945   AC_MSG_NOTICE([Debug build flags set to $DEBUG_FLAGS])
2950 dnl Check if the user only wants a freestanding library implementation.
2952 dnl --disable-hosted-libstdcxx will turn off most of the library build,
2953 dnl installing only the headers required by [17.4.1.3] and the language
2954 dnl support library.  More than that will be built (to keep the Makefiles
2955 dnl conveniently clean), but not installed.
2957 dnl Sets:
2958 dnl  is_hosted  (yes/no)
2960 dnl Defines:
2961 dnl  _GLIBCXX_HOSTED   (always defined, either to 1 or 0)
2963 AC_DEFUN([GLIBCXX_ENABLE_HOSTED], [
2964   AC_ARG_ENABLE([hosted-libstdcxx],
2965     AC_HELP_STRING([--disable-hosted-libstdcxx],
2966                    [only build freestanding C++ runtime support]),,
2967     [case "$host" in
2968         arm*-*-symbianelf*)
2969             enable_hosted_libstdcxx=no
2970             ;;
2971         *)
2972             enable_hosted_libstdcxx=yes
2973             ;;
2974      esac])
2975   if test "$enable_hosted_libstdcxx" = no; then
2976     AC_MSG_NOTICE([Only freestanding libraries will be built])
2977     is_hosted=no
2978     hosted_define=0
2979     enable_abi_check=no
2980     enable_libstdcxx_pch=no
2981   else
2982     is_hosted=yes
2983     hosted_define=1
2984   fi
2985   GLIBCXX_CONDITIONAL(GLIBCXX_HOSTED, test $is_hosted = yes)
2986   AC_DEFINE_UNQUOTED(_GLIBCXX_HOSTED, $hosted_define,
2987     [Define to 1 if a full hosted library is built, or 0 if freestanding.])
2992 dnl Check if the user wants a non-verbose library implementation.
2994 dnl --disable-libstdcxx-verbose will turn off descriptive messages to
2995 dnl standard error on termination.
2997 dnl Defines:
2998 dnl  _GLIBCXX_VERBOSE (always defined, either to 1 or 0)
3000 AC_DEFUN([GLIBCXX_ENABLE_VERBOSE], [
3001   AC_ARG_ENABLE([libstdcxx-verbose],
3002     AC_HELP_STRING([--disable-libstdcxx-verbose],
3003                    [disable termination messages to standard error]),,
3004                    [enable_libstdcxx_verbose=yes])
3005   if test x"$enable_libstdcxx_verbose" = xyes; then
3006     verbose_define=1
3007   else
3008     AC_MSG_NOTICE([verbose termination messages are disabled])
3009     verbose_define=0
3010   fi
3011   AC_DEFINE_UNQUOTED(_GLIBCXX_VERBOSE, $verbose_define,
3012     [Define to 1 if a verbose library is built, or 0 otherwise.])
3017 dnl Check for template specializations for the 'long long' type.
3018 dnl The result determines only whether 'long long' I/O is enabled; things
3019 dnl like numeric_limits<> specializations are always available.
3021 dnl --enable-long-long defines _GLIBCXX_USE_LONG_LONG
3022 dnl --disable-long-long leaves _GLIBCXX_USE_LONG_LONG undefined
3023 dnl  +  Usage:  GLIBCXX_ENABLE_LONG_LONG[(DEFAULT)]
3024 dnl       Where DEFAULT is either `yes' or `no'.
3026 AC_DEFUN([GLIBCXX_ENABLE_LONG_LONG], [
3027   GLIBCXX_ENABLE(long-long,$1,,[enable template specializations for 'long long'])
3028   if test $enable_long_long = yes; then
3029     AC_DEFINE(_GLIBCXX_USE_LONG_LONG, 1,
3030               [Define if code specialized for long long should be used.])
3031   fi
3032   AC_MSG_CHECKING([for enabled long long specializations])
3033   AC_MSG_RESULT([$enable_long_long])
3038 dnl Check for decimal floating point.
3039 dnl See:
3040 dnl http://gcc.gnu.org/onlinedocs/gcc/Decimal-Float.html#Decimal-Float
3042 dnl This checks to see if the host supports decimal floating point types.
3044 dnl Defines:
3045 dnl  _GLIBCXX_USE_DECIMAL_FLOAT
3047 AC_DEFUN([GLIBCXX_ENABLE_DECIMAL_FLOAT], [
3049   # Fake what AC_TRY_COMPILE does, without linking as this is
3050   # unnecessary for this test.
3052     cat > conftest.$ac_ext << EOF
3053 [#]line __oline__ "configure"
3054 int main()
3056   _Decimal32 d1;
3057   _Decimal64 d2;
3058   _Decimal128 d3;
3059   return 0;
3063     AC_MSG_CHECKING([for ISO/IEC TR 24733 ])
3064     if AC_TRY_EVAL(ac_compile); then
3065       AC_DEFINE(_GLIBCXX_USE_DECIMAL_FLOAT, 1,
3066       [Define if ISO/IEC TR 24733 decimal floating point types are supported on this host.])
3067       enable_dfp=yes
3068     else
3069       enable_dfp=no
3070     fi
3071     AC_MSG_RESULT($enable_dfp)
3072     rm -f conftest*
3076 dnl Check for GNU 128-bit integer and floating point types.
3078 dnl Note: also checks that the types aren't standard types.
3080 dnl Defines:
3081 dnl  _GLIBCXX_USE_INT128
3082 dnl  ENABLE_FLOAT128
3084 AC_DEFUN([GLIBCXX_ENABLE_INT128_FLOAT128], [
3086   AC_LANG_SAVE
3087   AC_LANG_CPLUSPLUS
3089   # Fake what AC_TRY_COMPILE does, without linking as this is
3090   # unnecessary for this test.
3092     cat > conftest.$ac_ext << EOF
3093 [#]line __oline__ "configure"
3094 template<typename T1, typename T2>
3095   struct same
3096   { typedef T2 type; };
3098 template<typename T>
3099   struct same<T, T>;
3101 int main()
3103   typename same<long, __int128>::type                i1;
3104   typename same<long long, __int128>::type           i2;
3108     AC_MSG_CHECKING([for __int128])
3109     if AC_TRY_EVAL(ac_compile); then
3110       AC_DEFINE(_GLIBCXX_USE_INT128, 1,
3111       [Define if __int128 is supported on this host.])
3112       enable_int128=yes
3113     else
3114       enable_int128=no
3115     fi
3116     AC_MSG_RESULT($enable_int128)
3117     rm -f conftest*
3119     cat > conftest.$ac_ext << EOF
3120 [#]line __oline__ "configure"
3121 template<typename T1, typename T2>
3122   struct same
3123   { typedef T2 type; };
3125 template<typename T>
3126   struct same<T, T>;
3128 int main()
3130   typename same<double, __float128>::type      f1;
3131   typename same<long double, __float128>::type f2;
3135     AC_MSG_CHECKING([for __float128])
3136     if AC_TRY_EVAL(ac_compile); then
3137       enable_float128=yes
3138     else
3139       enable_float128=no
3140     fi
3141     AC_MSG_RESULT($enable_float128)
3142     GLIBCXX_CONDITIONAL(ENABLE_FLOAT128, test $enable_float128 = yes)
3143     rm -f conftest*
3145   AC_LANG_RESTORE
3149 dnl Check for template specializations for the 'wchar_t' type.
3151 dnl --enable-wchar_t defines _GLIBCXX_USE_WCHAR_T
3152 dnl --disable-wchar_t leaves _GLIBCXX_USE_WCHAR_T undefined
3153 dnl  +  Usage:  GLIBCXX_ENABLE_WCHAR_T[(DEFAULT)]
3154 dnl       Where DEFAULT is either `yes' or `no'.
3156 dnl Necessary support must also be present.
3158 AC_DEFUN([GLIBCXX_ENABLE_WCHAR_T], [
3159   GLIBCXX_ENABLE(wchar_t,$1,,[enable template specializations for 'wchar_t'])
3161   # Test wchar.h for mbstate_t, which is needed for char_traits and fpos.
3162   AC_CHECK_HEADERS(wchar.h, ac_has_wchar_h=yes, ac_has_wchar_h=no)
3163   AC_MSG_CHECKING([for mbstate_t])
3164   AC_TRY_COMPILE([#include <wchar.h>],
3165   [mbstate_t teststate;],
3166   have_mbstate_t=yes, have_mbstate_t=no)
3167   AC_MSG_RESULT($have_mbstate_t)
3168   if test x"$have_mbstate_t" = xyes; then
3169     AC_DEFINE(HAVE_MBSTATE_T,1,[Define if mbstate_t exists in wchar.h.])
3170   fi
3172   # Test it always, for use in GLIBCXX_ENABLE_C99, together with
3173   # ac_has_wchar_h.
3174   AC_CHECK_HEADERS(wctype.h, ac_has_wctype_h=yes, ac_has_wctype_h=no)
3176   if test x"$enable_wchar_t" = x"yes"; then
3178     AC_LANG_SAVE
3179     AC_LANG_CPLUSPLUS
3181     if test x"$ac_has_wchar_h" = xyes &&
3182        test x"$ac_has_wctype_h" = xyes; then
3183       AC_TRY_COMPILE([#include <wchar.h>
3184                       #include <stddef.h>
3185                       wint_t i;
3186                       long l = WEOF;
3187                       long j = WCHAR_MIN;
3188                       long k = WCHAR_MAX;
3189                       namespace test
3190                       {
3191                         using ::btowc;
3192                         using ::fgetwc;
3193                         using ::fgetws;
3194                         using ::fputwc;
3195                         using ::fputws;
3196                         using ::fwide;
3197                         using ::fwprintf;
3198                         using ::fwscanf;
3199                         using ::getwc;
3200                         using ::getwchar;
3201                         using ::mbrlen;
3202                         using ::mbrtowc;
3203                         using ::mbsinit;
3204                         using ::mbsrtowcs;
3205                         using ::putwc;
3206                         using ::putwchar;
3207                         using ::swprintf;
3208                         using ::swscanf;
3209                         using ::ungetwc;
3210                         using ::vfwprintf;
3211                         using ::vswprintf;
3212                         using ::vwprintf;
3213                         using ::wcrtomb;
3214                         using ::wcscat;
3215                         using ::wcschr;
3216                         using ::wcscmp;
3217                         using ::wcscoll;
3218                         using ::wcscpy;
3219                         using ::wcscspn;
3220                         using ::wcsftime;
3221                         using ::wcslen;
3222                         using ::wcsncat;
3223                         using ::wcsncmp;
3224                         using ::wcsncpy;
3225                         using ::wcspbrk;
3226                         using ::wcsrchr;
3227                         using ::wcsrtombs;
3228                         using ::wcsspn;
3229                         using ::wcsstr;
3230                         using ::wcstod;
3231                         using ::wcstok;
3232                         using ::wcstol;
3233                         using ::wcstoul;
3234                         using ::wcsxfrm;
3235                         using ::wctob;
3236                         using ::wmemchr;
3237                         using ::wmemcmp;
3238                         using ::wmemcpy;
3239                         using ::wmemmove;
3240                         using ::wmemset;
3241                         using ::wprintf;
3242                         using ::wscanf;
3243                       }
3244                      ],[],[], [enable_wchar_t=no])
3245     else
3246       enable_wchar_t=no
3247     fi
3249     AC_LANG_RESTORE
3250   fi
3252   if test x"$enable_wchar_t" = x"yes"; then
3253     AC_DEFINE(_GLIBCXX_USE_WCHAR_T, 1,
3254               [Define if code specialized for wchar_t should be used.])
3255   fi
3257   AC_MSG_CHECKING([for enabled wchar_t specializations])
3258   AC_MSG_RESULT([$enable_wchar_t])
3263 dnl Check to see if building and using a C++ precompiled header can be done.
3265 dnl --enable-libstdcxx-pch=yes
3266 dnl default, this shows intent to use stdc++.h.gch If it looks like it
3267 dnl may work, after some light-hearted attempts to puzzle out compiler
3268 dnl support, flip bits on in include/Makefile.am
3270 dnl --disable-libstdcxx-pch
3271 dnl turns off attempts to use or build stdc++.h.gch.
3273 dnl Substs:
3274 dnl  glibcxx_PCHFLAGS
3276 AC_DEFUN([GLIBCXX_ENABLE_PCH], [
3277   GLIBCXX_ENABLE(libstdcxx-pch,$1,,[build pre-compiled libstdc++ headers])
3278   if test $enable_libstdcxx_pch = yes; then
3279     AC_CACHE_CHECK([for compiler with PCH support],
3280       [glibcxx_cv_prog_CXX_pch],
3281       [ac_save_CXXFLAGS="$CXXFLAGS"
3282        CXXFLAGS="$CXXFLAGS -Werror -Winvalid-pch -Wno-deprecated"
3283        AC_LANG_SAVE
3284        AC_LANG_CPLUSPLUS
3285        echo '#include <math.h>' > conftest.h
3286        if $CXX $CXXFLAGS $CPPFLAGS -x c++-header conftest.h \
3287                           -o conftest.h.gch 1>&5 2>&1 &&
3288                 echo '#error "pch failed"' > conftest.h &&
3289           echo '#include "conftest.h"' > conftest.cc &&
3290                $CXX -c $CXXFLAGS $CPPFLAGS conftest.cc 1>&5 2>&1 ;
3291        then
3292          glibcxx_cv_prog_CXX_pch=yes
3293        else
3294          glibcxx_cv_prog_CXX_pch=no
3295        fi
3296        rm -f conftest*
3297        CXXFLAGS=$ac_save_CXXFLAGS
3298        AC_LANG_RESTORE
3299       ])
3300     enable_libstdcxx_pch=$glibcxx_cv_prog_CXX_pch
3301   fi
3303   AC_MSG_CHECKING([for enabled PCH])
3304   AC_MSG_RESULT([$enable_libstdcxx_pch])
3306   GLIBCXX_CONDITIONAL(GLIBCXX_BUILD_PCH, test $enable_libstdcxx_pch = yes)
3307   if test $enable_libstdcxx_pch = yes; then
3308     glibcxx_PCHFLAGS="-include bits/stdc++.h"
3309   else
3310     glibcxx_PCHFLAGS=""
3311   fi
3312   AC_SUBST(glibcxx_PCHFLAGS)
3317 dnl Check for atomic builtins.
3318 dnl See:
3319 dnl http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html
3321 dnl This checks to see if the host supports the compiler-generated
3322 dnl builtins for atomic operations for various integral sizes. Note, this
3323 dnl is intended to be an all-or-nothing switch, so all the atomic operations
3324 dnl that are used should be checked.
3326 dnl Note:
3327 dnl libgomp and libgfortran use a link test, see CHECK_SYNC_FETCH_AND_ADD.
3329 AC_DEFUN([GLIBCXX_ENABLE_ATOMIC_BUILTINS], [
3330   AC_LANG_SAVE
3331   AC_LANG_CPLUSPLUS
3332   old_CXXFLAGS="$CXXFLAGS"
3334   # Do link tests if possible, instead asm tests, limited to some platforms
3335   # see discussion in PR target/40134, PR libstdc++/40133 and the thread
3336   # starting at http://gcc.gnu.org/ml/gcc-patches/2009-07/msg00322.html
3337   atomic_builtins_link_tests=no
3338   if test x$gcc_no_link != xyes; then
3339     # Can do link tests. Limit to some tested platforms
3340     case "$host" in
3341       *-*-linux* | *-*-uclinux* | *-*-kfreebsd*-gnu | *-*-gnu*)
3342         atomic_builtins_link_tests=yes
3343         ;;
3344     esac
3345   fi
3347   if test x$atomic_builtins_link_tests = xyes; then
3349   # Do link tests.
3351   CXXFLAGS="$CXXFLAGS -fno-exceptions"
3353   AC_MSG_CHECKING([for atomic builtins for bool])
3354   AC_CACHE_VAL(glibcxx_cv_atomic_bool, [
3355     AC_TRY_LINK(
3356       [ ],
3357       [typedef bool atomic_type;
3358        atomic_type c1;
3359        atomic_type c2;
3360        atomic_type c3(0);
3361        // N.B. __atomic_fetch_add is not supported for bool.
3362        __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3363                                    __ATOMIC_RELAXED);
3364        __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3365        __atomic_load_n(&c1, __ATOMIC_RELAXED);
3366       ],
3367       [glibcxx_cv_atomic_bool=yes],
3368       [glibcxx_cv_atomic_bool=no])
3369   ])
3370   AC_MSG_RESULT($glibcxx_cv_atomic_bool)
3372   AC_MSG_CHECKING([for atomic builtins for short])
3373   AC_CACHE_VAL(glibcxx_cv_atomic_short, [
3374     AC_TRY_LINK(
3375       [ ],
3376       [typedef short atomic_type;
3377        atomic_type c1;
3378        atomic_type c2;
3379        atomic_type c3(0);
3380        __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3381        __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3382                                    __ATOMIC_RELAXED);
3383        __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3384        __atomic_load_n(&c1, __ATOMIC_RELAXED);
3385       ],
3386       [glibcxx_cv_atomic_short=yes],
3387       [glibcxx_cv_atomic_short=no])
3388   ])
3389   AC_MSG_RESULT($glibcxx_cv_atomic_short)
3391   AC_MSG_CHECKING([for atomic builtins for int])
3392   AC_CACHE_VAL(glibcxx_cv_atomic_int, [
3393     AC_TRY_LINK(
3394       [ ],
3395       [typedef int atomic_type;
3396        atomic_type c1;
3397        atomic_type c2;
3398        atomic_type c3(0);
3399        __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3400        __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3401                                    __ATOMIC_RELAXED);
3402        __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3403        __atomic_load_n(&c1, __ATOMIC_RELAXED);
3404       ],
3405       [glibcxx_cv_atomic_int=yes],
3406       [glibcxx_cv_atomic_int=no])
3407   ])
3408   AC_MSG_RESULT($glibcxx_cv_atomic_int)
3410   AC_MSG_CHECKING([for atomic builtins for long long])
3411   AC_CACHE_VAL(glibcxx_cv_atomic_long_long, [
3412     AC_TRY_LINK(
3413       [ ],
3414       [typedef long long atomic_type;
3415        atomic_type c1;
3416        atomic_type c2;
3417        atomic_type c3(0);
3418        __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3419        __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3420                                    __ATOMIC_RELAXED);
3421        __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3422        __atomic_load_n(&c1, __ATOMIC_RELAXED);
3423       ],
3424       [glibcxx_cv_atomic_long_long=yes],
3425       [glibcxx_cv_atomic_long_long=no])
3426   ])
3427   AC_MSG_RESULT($glibcxx_cv_atomic_long_long)
3429   else
3431   # Do asm tests.
3433   # Compile unoptimized.
3434   CXXFLAGS='-O0 -S'
3436   # Fake what AC_TRY_COMPILE does.
3438     cat > conftest.$ac_ext << EOF
3439 [#]line __oline__ "configure"
3440 int main()
3442   typedef bool atomic_type;
3443   atomic_type c1;
3444   atomic_type c2;
3445   atomic_type c3(0);
3446   // N.B. __atomic_fetch_add is not supported for bool.
3447   __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3448                               __ATOMIC_RELAXED);
3449   __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3450   __atomic_load_n(&c1, __ATOMIC_RELAXED);
3452   return 0;
3456     AC_MSG_CHECKING([for atomic builtins for bool])
3457     if AC_TRY_EVAL(ac_compile); then
3458       if grep __atomic_ conftest.s >/dev/null 2>&1 ; then
3459         glibcxx_cv_atomic_bool=no
3460       else
3461         glibcxx_cv_atomic_bool=yes
3462       fi
3463     fi
3464     AC_MSG_RESULT($glibcxx_cv_atomic_bool)
3465     rm -f conftest*
3467     cat > conftest.$ac_ext << EOF
3468 [#]line __oline__ "configure"
3469 int main()
3471   typedef short atomic_type;
3472   atomic_type c1;
3473   atomic_type c2;
3474   atomic_type c3(0);
3475   __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3476   __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3477                               __ATOMIC_RELAXED);
3478   __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3479   __atomic_load_n(&c1, __ATOMIC_RELAXED);
3481   return 0;
3485     AC_MSG_CHECKING([for atomic builtins for short])
3486     if AC_TRY_EVAL(ac_compile); then
3487       if grep __atomic_ conftest.s >/dev/null 2>&1 ; then
3488         glibcxx_cv_atomic_short=no
3489       else
3490         glibcxx_cv_atomic_short=yes
3491       fi
3492     fi
3493     AC_MSG_RESULT($glibcxx_cv_atomic_short)
3494     rm -f conftest*
3496     cat > conftest.$ac_ext << EOF
3497 [#]line __oline__ "configure"
3498 int main()
3500   // NB: _Atomic_word not necessarily int.
3501   typedef int atomic_type;
3502   atomic_type c1;
3503   atomic_type c2;
3504   atomic_type c3(0);
3505   __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3506   __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3507                               __ATOMIC_RELAXED);
3508   __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3509   __atomic_load_n(&c1, __ATOMIC_RELAXED);
3511   return 0;
3515     AC_MSG_CHECKING([for atomic builtins for int])
3516     if AC_TRY_EVAL(ac_compile); then
3517       if grep __atomic_ conftest.s >/dev/null 2>&1 ; then
3518         glibcxx_cv_atomic_int=no
3519       else
3520         glibcxx_cv_atomic_int=yes
3521       fi
3522     fi
3523     AC_MSG_RESULT($glibcxx_cv_atomic_int)
3524     rm -f conftest*
3526     cat > conftest.$ac_ext << EOF
3527 [#]line __oline__ "configure"
3528 int main()
3530   typedef long long atomic_type;
3531   atomic_type c1;
3532   atomic_type c2;
3533   atomic_type c3(0);
3534   __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3535   __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3536                               __ATOMIC_RELAXED);
3537   __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3538   __atomic_load_n(&c1, __ATOMIC_RELAXED);
3540   return 0;
3544     AC_MSG_CHECKING([for atomic builtins for long long])
3545     if AC_TRY_EVAL(ac_compile); then
3546       if grep __atomic_ conftest.s >/dev/null 2>&1 ; then
3547         glibcxx_cv_atomic_long_long=no
3548       else
3549         glibcxx_cv_atomic_long_long=yes
3550       fi
3551     fi
3552     AC_MSG_RESULT($glibcxx_cv_atomic_long_long)
3553     rm -f conftest*
3555   fi
3557   CXXFLAGS="$old_CXXFLAGS"
3558   AC_LANG_RESTORE
3560   # Set atomicity_dir to builtins if all but the long long test above passes,
3561   # or if the builtins were already chosen (e.g. by configure.host).
3562   if { test "$glibcxx_cv_atomic_bool" = yes \
3563      && test "$glibcxx_cv_atomic_short" = yes \
3564      && test "$glibcxx_cv_atomic_int" = yes; } \
3565      || test "$atomicity_dir" = "cpu/generic/atomicity_builtins"; then
3566     AC_DEFINE(_GLIBCXX_ATOMIC_BUILTINS, 1,
3567     [Define if the compiler supports C++11 atomics.])
3568     atomicity_dir=cpu/generic/atomicity_builtins
3569   fi
3571   # If still generic, set to mutex.
3572   if test $atomicity_dir = "cpu/generic" ; then
3573     atomicity_dir=cpu/generic/atomicity_mutex
3574     AC_MSG_WARN([No native atomic operations are provided for this platform.])
3575       if test "x$target_thread_file" = xsingle; then
3576         AC_MSG_WARN([They cannot be faked when thread support is disabled.])
3577         AC_MSG_WARN([Thread-safety of certain classes is not guaranteed.])
3578       else
3579         AC_MSG_WARN([They will be faked using a mutex.])
3580         AC_MSG_WARN([Performance of certain classes will degrade as a result.])
3581       fi
3582   fi
3587 dnl Set default lock policy for synchronizing shared_ptr reference counting.
3589 dnl --with-libstdcxx-lock-policy=auto
3590 dnl     Use atomic operations for shared_ptr reference counting only if
3591 dnl     the default target supports atomic compare-and-swap.
3592 dnl --with-libstdcxx-lock-policy=atomic
3593 dnl     Use atomic operations for shared_ptr reference counting.
3594 dnl --with-libstdcxx-lock-policy=mutex
3595 dnl     Use a mutex to synchronize shared_ptr reference counting.
3597 dnl This controls the value of __gnu_cxx::__default_lock_policy, which
3598 dnl determines how shared_ptr reference counts are synchronized.
3599 dnl The option "atomic" means that atomic operations should be used,
3600 dnl "mutex" means that a mutex will be used. The default option, "auto",
3601 dnl will check if the target supports the compiler-generated builtins
3602 dnl for atomic compare-and-swap operations for 2-byte and 4-byte integers,
3603 dnl and will use "atomic" if supported, "mutex" otherwise.
3604 dnl This option is ignored if the thread model used by GCC is "single",
3605 dnl as no synchronization is used at all in that case.
3606 dnl This option affects the library ABI (except in the "single" thread model).
3608 dnl Defines _GLIBCXX_HAVE_ATOMIC_LOCK_POLICY to 1 if atomics should be used.
3610 AC_DEFUN([GLIBCXX_ENABLE_LOCK_POLICY], [
3612   AC_ARG_WITH([libstdcxx-lock-policy],
3613     AC_HELP_STRING([--with-libstdcxx-lock-policy={atomic,mutex,auto}],
3614       [synchronization policy for shared_ptr reference counting [default=auto]]),
3615               [libstdcxx_atomic_lock_policy=$withval],
3616               [libstdcxx_atomic_lock_policy=auto])
3618   case "$libstdcxx_atomic_lock_policy" in
3619     atomic|mutex|auto) ;;
3620     *) AC_MSG_ERROR([Invalid argument for --with-libstdcxx-lock-policy]) ;;
3621   esac
3622   AC_MSG_CHECKING([for lock policy for shared_ptr reference counts])
3624   if test x"$libstdcxx_atomic_lock_policy" = x"auto"; then
3625     AC_LANG_SAVE
3626     AC_LANG_CPLUSPLUS
3627     ac_save_CXXFLAGS="$CXXFLAGS"
3629     dnl Why do we care about 2-byte CAS on targets with 4-byte _Atomic_word?!
3630     AC_TRY_COMPILE([
3631     #if ! defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2
3632     # error "No 2-byte compare-and-swap"
3633     #elif ! defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
3634     # error "No 4-byte compare-and-swap"
3635     #endif
3636     ],,
3637     [libstdcxx_atomic_lock_policy=atomic],
3638     [libstdcxx_atomic_lock_policy=mutex])
3639     AC_LANG_RESTORE
3640     CXXFLAGS="$ac_save_CXXFLAGS"
3641   fi
3643   if test x"$libstdcxx_atomic_lock_policy" = x"atomic"; then
3644     AC_MSG_RESULT(atomic)
3645     AC_DEFINE(HAVE_ATOMIC_LOCK_POLICY,1,
3646       [Defined if shared_ptr reference counting should use atomic operations.])
3647   else
3648     AC_MSG_RESULT(mutex)
3649   fi
3654 dnl Allow visibility attributes to be used on namespaces, objects, etc.
3656 dnl --enable-libstdcxx-visibility enables attempt to use visibility attributes.
3657 dnl --disable-libstdcxx-visibility turns off all use of visibility attributes.
3658 dnl  +  Usage:  GLIBCXX_ENABLE_LIBSTDCXX_VISIBILITY[(DEFAULT)]
3659 dnl       Where DEFAULT is 'yes'.
3661 AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_VISIBILITY], [
3662 GLIBCXX_ENABLE(libstdcxx-visibility,$1,,[enables visibility safe usage])
3664 if test x$enable_libstdcxx_visibility = xyes ; then
3665   dnl all hail libgfortran
3666   dnl Check whether the target supports hidden visibility.
3667   AC_CACHE_CHECK([whether the target supports hidden visibility],
3668                  glibcxx_cv_have_attribute_visibility, [
3669   save_CFLAGS="$CFLAGS"
3670   CFLAGS="$CFLAGS -Werror"
3671   AC_TRY_COMPILE([void __attribute__((visibility("hidden"))) foo(void) { }],
3672                  [], glibcxx_cv_have_attribute_visibility=yes,
3673                  glibcxx_cv_have_attribute_visibility=no)
3674   CFLAGS="$save_CFLAGS"])
3675   if test $glibcxx_cv_have_attribute_visibility = no; then
3676     enable_libstdcxx_visibility=no
3677   fi
3680 GLIBCXX_CONDITIONAL(ENABLE_VISIBILITY, test $enable_libstdcxx_visibility = yes)
3681 AC_MSG_NOTICE([visibility supported: $enable_libstdcxx_visibility])
3686 dnl Add version tags to symbols in shared library (or not), additionally
3687 dnl marking other symbols as private/local (or not).
3689 dnl Sets libtool_VERSION, and determines shared library SONAME.
3691 dnl  This depends on GLIBCXX CHECK_LINKER_FEATURES, but without it assumes no.
3693 dnl --enable-symvers=style adds a version script to the linker call when
3694 dnl       creating the shared library.  The choice of version script is
3695 dnl       controlled by 'style'.
3696 dnl --disable-symvers does not.
3698 dnl  +  Usage:  GLIBCXX_ENABLE_SYMVERS[(DEFAULT)]
3699 dnl       Where DEFAULT is either 'yes' or 'no'.  Passing `yes' tries to
3700 dnl       choose a default style based on linker characteristics.  Passing
3701 dnl       'no' disables versioning.
3703 AC_DEFUN([GLIBCXX_ENABLE_SYMVERS], [
3705 GLIBCXX_ENABLE(symvers,$1,[[[=STYLE]]],
3706   [enables symbol versioning of the shared library],
3707   [permit yes|no|gnu|gnu-versioned-namespace|darwin|darwin-export|sun])
3709 # If we never went through the GLIBCXX_CHECK_LINKER_FEATURES macro, then we
3710 # don't know enough about $LD to do tricks...
3711 AC_REQUIRE([GLIBCXX_CHECK_LINKER_FEATURES])
3712 # Sun style symbol versions needs GNU c++filt for make_sunver.pl to work
3713 # with extern "C++" in version scripts.
3714 AC_REQUIRE([GCC_PROG_GNU_CXXFILT])
3716 # Turn a 'yes' into a suitable default.
3717 if test x$enable_symvers = xyes ; then
3718   if test $enable_shared = no || test "x$LD" = x || test x$gcc_no_link = xyes; then
3719     enable_symvers=no
3720   else
3721     if test $with_gnu_ld = yes ; then
3722       case ${target_os} in
3723         hpux*)
3724           enable_symvers=no ;;
3725         *)
3726           enable_symvers=gnu ;;
3727       esac
3728     else
3729       case ${target_os} in
3730         darwin*)
3731           enable_symvers=darwin ;;
3732         # Sun symbol versioning exists since Solaris 2.5.
3733         solaris2.[[5-9]]* | solaris2.1[[0-9]]*)
3734           # make_sunver.pl needs GNU c++filt to support extern "C++" in
3735           # version scripts, so disable symbol versioning if none can be
3736           # found.
3737           if test -z "$ac_cv_path_CXXFILT"; then
3738             AC_MSG_WARN([=== You have requested Sun symbol versioning, but])
3739             AC_MSG_WARN([=== no GNU c++filt could  be found.])
3740             AC_MSG_WARN([=== Symbol versioning will be disabled.])
3741             enable_symvers=no
3742           else
3743             enable_symvers=sun
3744           fi
3745           ;;
3746         *)
3747           enable_symvers=no ;;
3748       esac
3749     fi
3750   fi
3753 # Check to see if 'darwin' or 'darwin-export' can win.
3754 if test x$enable_symvers = xdarwin-export ; then
3755     enable_symvers=darwin
3758 # Check if 'sun' was requested on non-Solaris 2 platforms.
3759 if test x$enable_symvers = xsun ; then
3760   case ${target_os} in
3761     solaris2*)
3762       # All fine.
3763       ;;
3764     *)
3765       # Unlikely to work.
3766       AC_MSG_WARN([=== You have requested Sun symbol versioning, but])
3767       AC_MSG_WARN([=== you are not targetting Solaris 2.])
3768       AC_MSG_WARN([=== Symbol versioning will be disabled.])
3769       enable_symvers=no
3770       ;;
3771   esac
3774 # Check to see if 'gnu' can win.
3775 if test $enable_symvers = gnu ||
3776   test $enable_symvers = gnu-versioned-namespace ||
3777   test $enable_symvers = sun; then
3778   # Check to see if libgcc_s exists, indicating that shared libgcc is possible.
3779   AC_MSG_CHECKING([for shared libgcc])
3780   ac_save_CFLAGS="$CFLAGS"
3781   CFLAGS=' -lgcc_s'
3782   AC_TRY_LINK(, [return 0;], glibcxx_shared_libgcc=yes, glibcxx_shared_libgcc=no)
3783   CFLAGS="$ac_save_CFLAGS"
3784   if test $glibcxx_shared_libgcc = no; then
3785     cat > conftest.c <<EOF
3786 int main (void) { return 0; }
3788 changequote(,)dnl
3789     glibcxx_libgcc_s_suffix=`${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \
3790                              -shared -shared-libgcc -o conftest.so \
3791                              conftest.c -v 2>&1 >/dev/null \
3792                              | sed -n 's/^.* -lgcc_s\([^ ]*\) .*$/\1/p'`
3793 changequote([,])dnl
3794     rm -f conftest.c conftest.so
3795     if test x${glibcxx_libgcc_s_suffix+set} = xset; then
3796       CFLAGS=" -lgcc_s$glibcxx_libgcc_s_suffix"
3797       AC_TRY_LINK(, [return 0;], glibcxx_shared_libgcc=yes)
3798       CFLAGS="$ac_save_CFLAGS"
3799     fi
3800   fi
3801   AC_MSG_RESULT($glibcxx_shared_libgcc)
3803   # For GNU ld, we need at least this version.  The format is described in
3804   # GLIBCXX_CHECK_LINKER_FEATURES above.
3805   glibcxx_min_gnu_ld_version=21400
3807   # If no shared libgcc, can't win.
3808   if test $glibcxx_shared_libgcc != yes; then
3809       AC_MSG_WARN([=== You have requested GNU symbol versioning, but])
3810       AC_MSG_WARN([=== you are not building a shared libgcc_s.])
3811       AC_MSG_WARN([=== Symbol versioning will be disabled.])
3812       enable_symvers=no
3813   elif test $with_gnu_ld != yes && test $enable_symvers = sun; then
3814     : All interesting versions of Sun ld support sun style symbol versioning.
3815   elif test $with_gnu_ld != yes ; then
3816     # just fail for now
3817     AC_MSG_WARN([=== You have requested GNU symbol versioning, but])
3818     AC_MSG_WARN([=== you are not using the GNU linker.])
3819     AC_MSG_WARN([=== Symbol versioning will be disabled.])
3820     enable_symvers=no
3821   elif test $glibcxx_ld_is_gold = yes ; then
3822     : All versions of gold support symbol versioning.
3823   elif test $glibcxx_gnu_ld_version -lt $glibcxx_min_gnu_ld_version ; then
3824     # The right tools, the right setup, but too old.  Fallbacks?
3825     AC_MSG_WARN(=== Linker version $glibcxx_gnu_ld_version is too old for)
3826     AC_MSG_WARN(=== full symbol versioning support in this release of GCC.)
3827     AC_MSG_WARN(=== You would need to upgrade your binutils to version)
3828     AC_MSG_WARN(=== $glibcxx_min_gnu_ld_version or later and rebuild GCC.)
3829     AC_MSG_WARN([=== Symbol versioning will be disabled.])
3830     enable_symvers=no
3831   fi
3834 # For libtool versioning info, format is CURRENT:REVISION:AGE
3835 libtool_VERSION=6:27:0
3837 # Everything parsed; figure out what files and settings to use.
3838 case $enable_symvers in
3839   no)
3840     SYMVER_FILE=config/abi/pre/none.ver
3841     ;;
3842   gnu)
3843     SYMVER_FILE=config/abi/pre/gnu.ver
3844     AC_DEFINE(_GLIBCXX_SYMVER_GNU, 1,
3845               [Define to use GNU versioning in the shared library.])
3846     ;;
3847   gnu-versioned-namespace)
3848     libtool_VERSION=8:0:0
3849     SYMVER_FILE=config/abi/pre/gnu-versioned-namespace.ver
3850     AC_DEFINE(_GLIBCXX_SYMVER_GNU_NAMESPACE, 1,
3851               [Define to use GNU namespace versioning in the shared library.])
3852     ;;
3853   darwin)
3854     SYMVER_FILE=config/abi/pre/gnu.ver
3855     AC_DEFINE(_GLIBCXX_SYMVER_DARWIN, 1,
3856               [Define to use darwin versioning in the shared library.])
3857     ;;
3858   sun)
3859     SYMVER_FILE=config/abi/pre/gnu.ver
3860     AC_DEFINE(_GLIBCXX_SYMVER_SUN, 1,
3861               [Define to use Sun versioning in the shared library.])
3862     ;;
3863 esac
3865 if test x$enable_symvers != xno ; then
3866   AC_DEFINE(_GLIBCXX_SYMVER, 1,
3867          [Define to use symbol versioning in the shared library.])
3870 AC_CACHE_CHECK([whether the target supports .symver directive],
3871                glibcxx_cv_have_as_symver_directive, [
3872   AC_TRY_COMPILE([void foo (void); __asm (".symver foo, bar@SYMVER");],
3873                  [], glibcxx_cv_have_as_symver_directive=yes,
3874                  glibcxx_cv_have_as_symver_directive=no)])
3875 if test $glibcxx_cv_have_as_symver_directive = yes; then
3876   AC_DEFINE(HAVE_AS_SYMVER_DIRECTIVE, 1,
3877     [Define to 1 if the target assembler supports .symver directive.])
3880 AC_SUBST(SYMVER_FILE)
3881 AC_SUBST(port_specific_symbol_files)
3882 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS, test $enable_symvers != no)
3883 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_GNU, test $enable_symvers = gnu)
3884 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_GNU_NAMESPACE, test $enable_symvers = gnu-versioned-namespace)
3885 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_DARWIN, test $enable_symvers = darwin)
3886 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_SUN, test $enable_symvers = sun)
3887 AC_MSG_NOTICE(versioning on shared library symbols is $enable_symvers)
3889 if test $enable_symvers != no ; then
3890    case ${target_os} in
3891      # The Solaris 2 runtime linker doesn't support the GNU extension of
3892      # binding the same symbol to different versions
3893      solaris2*)
3894        ;;
3895      # Other platforms with GNU symbol versioning (GNU/Linux, more?) do.
3896      *)
3897        AC_DEFINE(HAVE_SYMVER_SYMBOL_RENAMING_RUNTIME_SUPPORT, 1,
3898          [Define to 1 if the target runtime linker supports binding the same symbol to different versions.])
3899        ;;
3900     esac
3903 # Now, set up compatibility support, if any.
3904 # In addition, need this to deal with std::size_t mangling in
3905 # src/compatibility.cc.  In a perfect world, could use
3906 # typeid(std::size_t).name()[0] to do direct substitution.
3907 AC_MSG_CHECKING([for size_t as unsigned int])
3908 ac_save_CFLAGS="$CFLAGS"
3909 CFLAGS="-Werror"
3910 AC_TRY_COMPILE(, [__SIZE_TYPE__* stp; unsigned int* uip; stp = uip;],
3911                  [glibcxx_size_t_is_i=yes], [glibcxx_size_t_is_i=no])
3912 CFLAGS=$ac_save_CFLAGS
3913 if test "$glibcxx_size_t_is_i" = yes; then
3914   AC_DEFINE(_GLIBCXX_SIZE_T_IS_UINT, 1, [Define if size_t is unsigned int.])
3916 AC_MSG_RESULT([$glibcxx_size_t_is_i])
3918 AC_MSG_CHECKING([for ptrdiff_t as int])
3919 ac_save_CFLAGS="$CFLAGS"
3920 CFLAGS="-Werror"
3921 AC_TRY_COMPILE(, [__PTRDIFF_TYPE__* ptp; int* ip; ptp = ip;],
3922                  [glibcxx_ptrdiff_t_is_i=yes], [glibcxx_ptrdiff_t_is_i=no])
3923 CFLAGS=$ac_save_CFLAGS
3924 if test "$glibcxx_ptrdiff_t_is_i" = yes; then
3925   AC_DEFINE(_GLIBCXX_PTRDIFF_T_IS_INT, 1, [Define if ptrdiff_t is int.])
3927 AC_MSG_RESULT([$glibcxx_ptrdiff_t_is_i])
3932 dnl Setup to use the gcc gthr.h thread-specific memory and mutex model.
3933 dnl We must stage the required headers so that they will be installed
3934 dnl with the library (unlike libgcc, the STL implementation is provided
3935 dnl solely within headers).  Since we must not inject random user-space
3936 dnl macro names into user-provided C++ code, we first stage into <file>-in
3937 dnl and process to <file> with an output command.  The reason for a two-
3938 dnl stage process here is to correctly handle $srcdir!=$objdir without
3939 dnl having to write complex code (the sed commands to clean the macro
3940 dnl namespace are complex and fragile enough as it is).  We must also
3941 dnl add a relative path so that -I- is supported properly.
3943 dnl Substs:
3944 dnl  thread_header
3946 AC_DEFUN([GLIBCXX_ENABLE_THREADS], [
3947   AC_MSG_CHECKING([for thread model used by GCC])
3948   target_thread_file=`$CXX -v 2>&1 | sed -n 's/^Thread model: //p'`
3949   AC_MSG_RESULT([$target_thread_file])
3950   GCC_AC_THREAD_HEADER([$target_thread_file])
3955 dnl Check if gthread implementation defines the types and functions
3956 dnl required by the c++0x thread library.  Conforming gthread
3957 dnl implementations can define __GTHREADS_CXX0X to enable use with c++0x.
3959 dnl GLIBCXX_ENABLE_SYMVERS must be done before this.
3961 AC_DEFUN([GLIBCXX_CHECK_GTHREADS], [
3962   GLIBCXX_ENABLE(libstdcxx-threads,auto,,[enable C++11 threads support])
3964   if test x$enable_libstdcxx_threads = xauto || 
3965      test x$enable_libstdcxx_threads = xyes; then
3967   AC_LANG_SAVE
3968   AC_LANG_CPLUSPLUS
3970   ac_save_CXXFLAGS="$CXXFLAGS"
3971   CXXFLAGS="$CXXFLAGS -fno-exceptions \
3972         -I${toplevel_srcdir}/libgcc -I${toplevel_builddir}/libgcc"
3974   target_thread_file=`$CXX -v 2>&1 | sed -n 's/^Thread model: //p'`
3975   case $target_thread_file in
3976     posix)
3977       CXXFLAGS="$CXXFLAGS -DSUPPORTS_WEAK -DGTHREAD_USE_WEAK -D_PTHREADS"
3978   esac
3980   AC_MSG_CHECKING([whether it can be safely assumed that mutex_timedlock is available])
3982   AC_TRY_COMPILE([#include <unistd.h>],
3983     [
3984       // In case of POSIX threads check _POSIX_TIMEOUTS.
3985       #if (defined(_PTHREADS) \
3986           && (!defined(_POSIX_TIMEOUTS) || _POSIX_TIMEOUTS <= 0))
3987       #error
3988       #endif
3989     ], [ac_gthread_use_mutex_timedlock=1], [ac_gthread_use_mutex_timedlock=0])
3991   AC_DEFINE_UNQUOTED(_GTHREAD_USE_MUTEX_TIMEDLOCK, $ac_gthread_use_mutex_timedlock,
3992                      [Define to 1 if mutex_timedlock is available.])
3994   if test $ac_gthread_use_mutex_timedlock = 1 ; then res_mutex_timedlock=yes ;
3995   else res_mutex_timedlock=no ; fi
3996   AC_MSG_RESULT([$res_mutex_timedlock])
3998   AC_MSG_CHECKING([for gthreads library])
4000   AC_TRY_COMPILE([#include "gthr.h"],
4001     [
4002       #ifndef __GTHREADS_CXX0X
4003       #error
4004       #endif
4005     ], [ac_has_gthreads=yes], [ac_has_gthreads=no])
4006   else
4007     ac_has_gthreads=no
4008   fi
4010   AC_MSG_RESULT([$ac_has_gthreads])
4012   if test x"$ac_has_gthreads" = x"yes"; then
4013     AC_DEFINE(_GLIBCXX_HAS_GTHREADS, 1,
4014               [Define if gthreads library is available.])
4016     # Also check for pthread_rwlock_t for std::shared_timed_mutex in C++14
4017     AC_CHECK_TYPE([pthread_rwlock_t],
4018             [AC_DEFINE([_GLIBCXX_USE_PTHREAD_RWLOCK_T], 1,
4019             [Define if POSIX read/write locks are available in <gthr.h>.])],
4020             [],
4021             [#include "gthr.h"])
4022   fi
4024   CXXFLAGS="$ac_save_CXXFLAGS"
4025   AC_LANG_RESTORE
4029 # Check whether LC_MESSAGES is available in <locale.h>.
4030 # Ulrich Drepper <drepper@cygnus.com>, 1995.
4032 # This file file be copied and used freely without restrictions.  It can
4033 # be used in projects which are not available under the GNU Public License
4034 # but which still want to provide support for the GNU gettext functionality.
4035 # Please note that the actual code is *not* freely available.
4036 AC_DEFUN([AC_LC_MESSAGES], [
4037   AC_CHECK_HEADER(locale.h, [
4038     AC_CACHE_CHECK([for LC_MESSAGES], ac_cv_val_LC_MESSAGES,
4039       [AC_TRY_COMPILE([#include <locale.h>], [return LC_MESSAGES],
4040        ac_cv_val_LC_MESSAGES=yes, ac_cv_val_LC_MESSAGES=no)])
4041     if test $ac_cv_val_LC_MESSAGES = yes; then
4042       AC_DEFINE(HAVE_LC_MESSAGES, 1,
4043                 [Define if LC_MESSAGES is available in <locale.h>.])
4044     fi
4045   ])
4049 dnl Check whether rdrand is supported in the assembler.
4050 AC_DEFUN([GLIBCXX_CHECK_X86_RDRAND], [
4051   AC_MSG_CHECKING([for rdrand support in assembler])
4052   AC_CACHE_VAL(ac_cv_x86_rdrand, [
4053   ac_cv_x86_rdrand=no
4054   case "$target" in
4055     i?86-*-* | \
4056     x86_64-*-*)
4057     AC_TRY_COMPILE(, [asm("rdrand %eax");],
4058                 [ac_cv_x86_rdrand=yes], [ac_cv_x86_rdrand=no])
4059   esac
4060   ])
4061   if test $ac_cv_x86_rdrand = yes; then
4062     AC_DEFINE(_GLIBCXX_X86_RDRAND, 1,
4063                 [ Defined if as can handle rdrand. ])
4064   fi
4065   AC_MSG_RESULT($ac_cv_x86_rdrand)
4069 dnl Check whether rdseed is supported in the assembler.
4070 AC_DEFUN([GLIBCXX_CHECK_X86_RDSEED], [
4071   AC_MSG_CHECKING([for rdseed support in assembler])
4072   AC_CACHE_VAL(ac_cv_x86_rdseed, [
4073   ac_cv_x86_rdseed=no
4074   case "$target" in
4075     i?86-*-* | \
4076     x86_64-*-*)
4077     AC_TRY_COMPILE(, [asm("rdseed %eax");],
4078                 [ac_cv_x86_rdseed=yes], [ac_cv_x86_rdseed=no])
4079   esac
4080   ])
4081   if test $ac_cv_x86_rdseed = yes; then
4082     AC_DEFINE(_GLIBCXX_X86_RDSEED, 1,
4083                 [ Defined if as can handle rdseed. ])
4084   fi
4085   AC_MSG_RESULT($ac_cv_x86_rdseed)
4089 dnl Check whether get_nprocs is available in <sys/sysinfo.h>, and define _GLIBCXX_USE_GET_NPROCS.
4091 AC_DEFUN([GLIBCXX_CHECK_GET_NPROCS], [
4093   AC_LANG_SAVE
4094   AC_LANG_CPLUSPLUS
4095   ac_save_CXXFLAGS="$CXXFLAGS"
4096   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4098   AC_MSG_CHECKING([for get_nprocs])
4099   AC_CACHE_VAL(glibcxx_cv_GET_NPROCS, [
4100     GCC_TRY_COMPILE_OR_LINK(
4101       [#include <sys/sysinfo.h>],
4102       [int n = get_nprocs();],
4103       [glibcxx_cv_GET_NPROCS=yes],
4104       [glibcxx_cv_GET_NPROCS=no])
4105   ])
4106   if test $glibcxx_cv_GET_NPROCS = yes; then
4107     AC_DEFINE(_GLIBCXX_USE_GET_NPROCS, 1, [Define if get_nprocs is available in <sys/sysinfo.h>.])
4108   fi
4109   AC_MSG_RESULT($glibcxx_cv_GET_NPROCS)
4111   CXXFLAGS="$ac_save_CXXFLAGS"
4112   AC_LANG_RESTORE
4116 dnl Check whether sysconf(_SC_NPROCESSORS_ONLN) is available in <unistd.h>, and define _GLIBCXX_USE_SC_NPROCESSORS_ONLN.
4118 AC_DEFUN([GLIBCXX_CHECK_SC_NPROCESSORS_ONLN], [
4120   AC_LANG_SAVE
4121   AC_LANG_CPLUSPLUS
4122   ac_save_CXXFLAGS="$CXXFLAGS"
4123   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4125   AC_MSG_CHECKING([for _SC_NPROCESSORS_ONLN])
4126   AC_CACHE_VAL(glibcxx_cv_SC_NPROCESSORS_ONLN, [
4127     GCC_TRY_COMPILE_OR_LINK(
4128       [#include <unistd.h>],
4129       [int n = sysconf(_SC_NPROCESSORS_ONLN);],
4130       [glibcxx_cv_SC_NPROCESSORS_ONLN=yes],
4131       [glibcxx_cv_SC_NPROCESSORS_ONLN=no])
4132   ])
4133   if test $glibcxx_cv_SC_NPROCESSORS_ONLN = yes; then
4134     AC_DEFINE(_GLIBCXX_USE_SC_NPROCESSORS_ONLN, 1, [Define if _SC_NPROCESSORS_ONLN  is available in <unistd.h>.])
4135   fi
4136   AC_MSG_RESULT($glibcxx_cv_SC_NPROCESSORS_ONLN)
4138   CXXFLAGS="$ac_save_CXXFLAGS"
4139   AC_LANG_RESTORE
4143 dnl Check whether sysconf(_SC_NPROC_ONLN) is available in <unistd.h>, and define _GLIBCXX_USE_SC_NPROC_ONLN.
4145 AC_DEFUN([GLIBCXX_CHECK_SC_NPROC_ONLN], [
4147   AC_LANG_SAVE
4148   AC_LANG_CPLUSPLUS
4149   ac_save_CXXFLAGS="$CXXFLAGS"
4150   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4152   AC_MSG_CHECKING([for _SC_NPROC_ONLN])
4153   AC_CACHE_VAL(glibcxx_cv_SC_NPROC_ONLN, [
4154     GCC_TRY_COMPILE_OR_LINK(
4155       [#include <unistd.h>],
4156       [int n = sysconf(_SC_NPROC_ONLN);],
4157       [glibcxx_cv_SC_NPROC_ONLN=yes],
4158       [glibcxx_cv_SC_NPROC_ONLN=no])
4159   ])
4160   if test $glibcxx_cv_SC_NPROC_ONLN = yes; then
4161     AC_DEFINE(_GLIBCXX_USE_SC_NPROC_ONLN, 1, [Define if _SC_NPROC_ONLN  is available in <unistd.h>.])
4162   fi
4163   AC_MSG_RESULT($glibcxx_cv_SC_NPROC_ONLN)
4165   CXXFLAGS="$ac_save_CXXFLAGS"
4166   AC_LANG_RESTORE
4170 dnl Check whether pthread_num_processors_np is available in <pthread.h>, and define _GLIBCXX_USE_PTHREADS_NUM_PROCESSORS_NP.
4172 AC_DEFUN([GLIBCXX_CHECK_PTHREADS_NUM_PROCESSORS_NP], [
4174   AC_LANG_SAVE
4175   AC_LANG_CPLUSPLUS
4176   ac_save_CXXFLAGS="$CXXFLAGS"
4177   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4179   AC_MSG_CHECKING([for pthreads_num_processors_np])
4180   AC_CACHE_VAL(glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP, [
4181     GCC_TRY_COMPILE_OR_LINK(
4182       [#include <pthread.h>],
4183       [int n = pthread_num_processors_np();],
4184       [glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP=yes],
4185       [glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP=no])
4186   ])
4187   if test $glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP = yes; then
4188     AC_DEFINE(_GLIBCXX_USE_PTHREADS_NUM_PROCESSORS_NP, 1, [Define if pthreads_num_processors_np is available in <pthread.h>.])
4189   fi
4190   AC_MSG_RESULT($glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP)
4192   CXXFLAGS="$ac_save_CXXFLAGS"
4193   AC_LANG_RESTORE
4197 dnl Check whether sysctl is available in <pthread.h>, and define _GLIBCXX_USE_SYSCTL_HW_NCPU.
4199 AC_DEFUN([GLIBCXX_CHECK_SYSCTL_HW_NCPU], [
4201   AC_LANG_SAVE
4202   AC_LANG_CPLUSPLUS
4203   ac_save_CXXFLAGS="$CXXFLAGS"
4204   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4206   AC_MSG_CHECKING([for hw.ncpu sysctl])
4207   AC_CACHE_VAL(glibcxx_cv_SYSCTL_HW_NCPU, [
4208     GCC_TRY_COMPILE_OR_LINK(
4209       [
4210        #include <stddef.h>
4211        #include <sys/sysctl.h>
4212        ],
4213       [
4214        int count;
4215        size_t size = sizeof(count);
4216        int mib[] = { CTL_HW, HW_NCPU };
4217        sysctl(mib, 2, &count, &size, NULL, 0);
4218       ],
4219       [glibcxx_cv_SYSCTL_HW_NCPU=yes],
4220       [glibcxx_cv_SYSCTL_HW_NCPU=no])
4221   ])
4222   if test $glibcxx_cv_SYSCTL_HW_NCPU = yes; then
4223     AC_DEFINE(_GLIBCXX_USE_SYSCTL_HW_NCPU, 1, [Define if sysctl(), CTL_HW and HW_NCPU are available in <sys/sysctl.h>.])
4224   fi
4225   AC_MSG_RESULT($glibcxx_cv_SYSCTL_HW_NCPU)
4227   CXXFLAGS="$ac_save_CXXFLAGS"
4228   AC_LANG_RESTORE
4232 dnl Check to see if python pretty printing can be activated.
4234 dnl --with-python-dir=dir
4235 dnl installs directory into $prefix/dir
4236 AC_DEFUN([GLIBCXX_ENABLE_PYTHON], [
4238 AC_MSG_CHECKING([for custom python install directory])
4239 AC_ARG_WITH([python-dir],
4240             AS_HELP_STRING([--with-python-dir],
4241                            [the location to install Python modules. This path is relative starting from the prefix.]),
4242             [with_python_dir=$withval], [with_python_dir="no"])
4243 AC_MSG_RESULT(${with_python_dir})
4245 # Needed for installing Python modules during make install.
4246 python_mod_dir="${with_python_dir}"
4247 AC_SUBST(python_mod_dir)
4248 GLIBCXX_CONDITIONAL(ENABLE_PYTHONDIR, test $python_mod_dir != no)
4252 dnl Check to see if -Werror is disabled.
4254 dnl --enable-werror/--disable-werror
4255 AC_DEFUN([GLIBCXX_ENABLE_WERROR], [
4256   AC_MSG_CHECKING([for -Werror])
4257   GLIBCXX_ENABLE(werror,$1,,[turns on -Werror])
4258   AC_MSG_RESULT($enable_werror)
4259   GLIBCXX_CONDITIONAL(ENABLE_WERROR, test $enable_werror = yes)
4263 dnl Check whether obsolescent tmpnam is available in <stdio.h>,
4264 dnl and define _GLIBCXX_USE_TMPNAM.
4266 AC_DEFUN([GLIBCXX_CHECK_TMPNAM], [dnl
4268   AC_LANG_SAVE
4269   AC_LANG_CPLUSPLUS
4270   ac_save_CXXFLAGS="$CXXFLAGS"
4271   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4273   AC_MSG_CHECKING([for tmpnam])
4274   AC_CACHE_VAL(glibcxx_cv_TMPNAM, [dnl
4275     GCC_TRY_COMPILE_OR_LINK(
4276       [#include <stdio.h>],
4277       [char *tmp = tmpnam(NULL);],
4278       [glibcxx_cv_TMPNAM=yes],
4279       [glibcxx_cv_TMPNAM=no])
4280   ])
4281   if test $glibcxx_cv_TMPNAM = yes; then
4282     AC_DEFINE(_GLIBCXX_USE_TMPNAM, 1, [Define if obsolescent tmpnam is available in <stdio.h>.])
4283   fi
4284   AC_MSG_RESULT($glibcxx_cv_TMPNAM)
4286   CXXFLAGS="$ac_save_CXXFLAGS"
4287   AC_LANG_RESTORE
4291 dnl Check to see if sys/sdt.h exists and that it is suitable for use.
4292 dnl Some versions of sdt.h were not compatible with C++11.
4294 AC_DEFUN([GLIBCXX_CHECK_SDT_H], [
4295   AC_MSG_CHECKING([for suitable sys/sdt.h])
4296   # Note that this test has to be run with the C language.
4297   # Otherwise, sdt.h will try to include some headers from
4298   # libstdc++ itself.
4299   AC_LANG_SAVE
4300   AC_LANG_C
4301   AC_CACHE_VAL(glibcxx_cv_sys_sdt_h, [
4302     # Because we have to run the test in C, we use grep rather
4303     # than the compiler to check for the bug.  The bug is that
4304     # were strings without trailing whitespace, causing g++
4305     # to look for operator"".  The pattern searches for the fixed
4306     # output.
4307     AC_EGREP_CPP([ \",\" ], [
4308       #include <sys/sdt.h>
4309       int f() { STAP_PROBE(hi, bob); }
4310     ], [glibcxx_cv_sys_sdt_h=yes], [glibcxx_cv_sys_sdt_h=no])
4311   ])
4312   AC_LANG_RESTORE
4313   if test $glibcxx_cv_sys_sdt_h = yes; then
4314     AC_DEFINE(HAVE_SYS_SDT_H, 1,
4315               [Define to 1 if you have a suitable <sys/sdt.h> header file])
4316   fi
4317   AC_MSG_RESULT($glibcxx_cv_sys_sdt_h)
4321 dnl Control whether the library should define symbols for old and new ABIs.
4322 dnl This affects definitions of strings, stringstreams and locale facets.
4324 dnl --disable-libstdcxx-dual-abi will use old ABI for all types.
4326 dnl Defines:
4327 dnl  _GLIBCXX_USE_DUAL_ABI (always defined, either to 1 or 0)
4329 AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_DUAL_ABI], [
4330   GLIBCXX_ENABLE(libstdcxx-dual-abi,$1,,[support two versions of std::string])
4331   if test x$enable_symvers = xgnu-versioned-namespace; then
4332     # gnu-versioned-namespace is incompatible with the dual ABI.
4333     enable_libstdcxx_dual_abi="no"
4334   fi
4335   if test x"$enable_libstdcxx_dual_abi" != xyes; then
4336     AC_MSG_NOTICE([dual ABI is disabled])
4337     default_libstdcxx_abi="gcc4-compatible"
4338   fi
4339   GLIBCXX_CONDITIONAL(ENABLE_DUAL_ABI, test $enable_libstdcxx_dual_abi = yes)
4343 dnl Check to see which ABI should be enabled by default.
4345 dnl --with-default-libstdcxx-abi={gcc4-compatible,new}
4347 dnl Defines:
4348 dnl  _GLIBCXX_USE_CXX11_ABI (always defined, either to 1 or 0)
4350 AC_DEFUN([GLIBCXX_DEFAULT_ABI], [
4351   if test x$enable_libstdcxx_dual_abi = xyes; then
4352   AC_MSG_CHECKING([for default std::string ABI to use])
4353   AC_ARG_WITH([default-libstdcxx-abi],
4354     AS_HELP_STRING([--with-default-libstdcxx-abi],
4355                    [set the std::string ABI to use by default]),
4356     [case "$withval" in
4357       gcc4-compatible)  default_libstdcxx_abi="gcc4-compatible" ;;
4358       new|cxx11)  default_libstdcxx_abi="new" ;;
4359       c++*|gnu++*) AC_MSG_ERROR([Supported arguments for --with-default-libstdcxx-abi have changed, use "new" or "gcc4-compatible"]) ;;
4360       *) AC_MSG_ERROR([Invalid argument for --with-default-libstdcxx-abi]) ;;
4361      esac
4362      ],
4363     [default_libstdcxx_abi="new"])
4364   AC_MSG_RESULT(${default_libstdcxx_abi})
4365   fi
4366   if test $default_libstdcxx_abi = "new"; then
4367     glibcxx_cxx11_abi=1
4368     glibcxx_cxx98_abi=0
4369   else
4370     glibcxx_cxx11_abi=0
4371     glibcxx_cxx98_abi=1
4372   fi
4373   AC_SUBST(glibcxx_cxx98_abi)
4374   GLIBCXX_CONDITIONAL(ENABLE_CXX11_ABI, test $glibcxx_cxx11_abi = 1)
4378 dnl Check to see whether to build libstdc++fs.a
4380 dnl --enable-libstdcxx-filesystem-ts
4382 AC_DEFUN([GLIBCXX_ENABLE_FILESYSTEM_TS], [
4383   GLIBCXX_ENABLE(libstdcxx-filesystem-ts,auto,,
4384     [turns on ISO/IEC TS 18822 support],
4385     [permit yes|no|auto])
4387   AC_MSG_CHECKING([whether to build Filesystem TS support])
4388   if test x"$ac_cv_header_dirent_h" != x"yes"; then
4389     enable_libstdcxx_filesystem_ts=no
4390   fi
4391   if test x"$enable_libstdcxx_filesystem_ts" = x"auto"; then
4392     case "${target_os}" in
4393       freebsd*|netbsd*|openbsd*|dragonfly*|darwin*)
4394         enable_libstdcxx_filesystem_ts=yes
4395         ;;
4396       gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
4397         enable_libstdcxx_filesystem_ts=yes
4398         ;;
4399       rtems*)
4400         enable_libstdcxx_filesystem_ts=yes
4401         ;;
4402       solaris*)
4403         enable_libstdcxx_filesystem_ts=yes
4404         ;;
4405       *)
4406         enable_libstdcxx_filesystem_ts=no
4407         ;;
4408     esac
4409   fi
4410   AC_MSG_RESULT($enable_libstdcxx_filesystem_ts)
4411   GLIBCXX_CONDITIONAL(ENABLE_FILESYSTEM_TS, test $enable_libstdcxx_filesystem_ts = yes)
4415 dnl Check whether the library calls required by the Filesystem TS are present.
4416 dnl Defines:
4417 dnl  HAVE_STRUCT_DIRENT_D_TYPE
4418 dnl  _GLIBCXX_USE_REALPATH
4419 dnl  _GLIBCXX_USE_UTIMENSAT
4420 dnl  _GLIBCXX_USE_ST_MTIM
4421 dnl  _GLIBCXX_USE_FCHMOD
4422 dnl  _GLIBCXX_USE_FCHMODAT
4423 dnl  _GLIBCXX_USE_SENDFILE
4424 dnl  HAVE_LINK
4425 dnl  HAVE_READLINK
4426 dnl  HAVE_SYMLINK
4428 AC_DEFUN([GLIBCXX_CHECK_FILESYSTEM_DEPS], [dnl
4430   if test $enable_libstdcxx_filesystem_ts = yes; then
4431     AC_LANG_SAVE
4432     AC_LANG_CPLUSPLUS
4433     ac_save_CXXFLAGS="$CXXFLAGS"
4434     CXXFLAGS="$CXXFLAGS -fno-exceptions"
4436     AC_MSG_CHECKING([for struct dirent.d_type])
4437     AC_CACHE_VAL(glibcxx_cv_dirent_d_type, [dnl
4438       GCC_TRY_COMPILE_OR_LINK(
4439         [#include <dirent.h>],
4440         [
4441          struct dirent d;
4442          if (sizeof d.d_type) return 0;
4443         ],
4444         [glibcxx_cv_dirent_d_type=yes],
4445         [glibcxx_cv_dirent_d_type=no])
4446     ])
4447     if test $glibcxx_cv_dirent_d_type = yes; then
4448       AC_DEFINE(HAVE_STRUCT_DIRENT_D_TYPE, 1, [Define to 1 if `d_type' is a member of `struct dirent'.])
4449     fi
4450     AC_MSG_RESULT($glibcxx_cv_dirent_d_type)
4452     AC_MSG_CHECKING([for realpath])
4453     AC_CACHE_VAL(glibcxx_cv_realpath, [dnl
4454       GCC_TRY_COMPILE_OR_LINK(
4455         [
4456          #include <limits.h>
4457          #include <stdlib.h>
4458          #include <unistd.h>
4459         ],
4460         [
4461          #if _XOPEN_VERSION < 500
4462          #error
4463          #elif _XOPEN_VERSION >= 700 || defined(PATH_MAX)
4464          char *tmp = realpath((const char*)NULL, (char*)NULL);
4465          #else
4466          #error
4467          #endif
4468         ],
4469         [glibcxx_cv_realpath=yes],
4470         [glibcxx_cv_realpath=no])
4471     ])
4472     if test $glibcxx_cv_realpath = yes; then
4473       AC_DEFINE(_GLIBCXX_USE_REALPATH, 1, [Define if usable realpath is available in <stdlib.h>.])
4474     fi
4475     AC_MSG_RESULT($glibcxx_cv_realpath)
4477     AC_MSG_CHECKING([for utimensat])
4478     AC_CACHE_VAL(glibcxx_cv_utimensat, [dnl
4479       GCC_TRY_COMPILE_OR_LINK(
4480         [
4481           #include <fcntl.h>
4482           #include <sys/stat.h>
4483         ],
4484         [
4485           struct timespec ts[2] = { { 0, UTIME_OMIT }, { 1, 1 } };
4486           int i = utimensat(AT_FDCWD, "path", ts, 0);
4487         ],
4488         [glibcxx_cv_utimensat=yes],
4489         [glibcxx_cv_utimensat=no])
4490     ])
4491     if test $glibcxx_cv_utimensat = yes; then
4492       AC_DEFINE(_GLIBCXX_USE_UTIMENSAT, 1, [Define if utimensat and UTIME_OMIT are available in <sys/stat.h> and AT_FDCWD in <fcntl.h>.])
4493     fi
4494     AC_MSG_RESULT($glibcxx_cv_utimensat)
4496     AC_MSG_CHECKING([for utime])
4497     AC_CACHE_VAL(glibcxx_cv_utime, [dnl
4498       GCC_TRY_COMPILE_OR_LINK(
4499         [
4500           #include <utime.h>
4501         ],
4502         [
4503           struct utimbuf t = { 1, 1 };
4504           int i = utime("path", &t);
4505         ],
4506         [glibcxx_cv_utime=yes],
4507         [glibcxx_cv_utime=no])
4508     ])
4509     if test $glibcxx_cv_utime = yes; then
4510       AC_DEFINE(_GLIBCXX_USE_UTIME, 1, [Define if utime is available in <utime.h>.])
4511     fi
4512     AC_MSG_RESULT($glibcxx_cv_utime)
4514     AC_MSG_CHECKING([for lstat])
4515     AC_CACHE_VAL(glibcxx_cv_lstat, [dnl
4516       GCC_TRY_COMPILE_OR_LINK(
4517         [ #include <sys/stat.h> ],
4518         [
4519           struct stat st;
4520           int i = lstat("path", &st);
4521         ],
4522         [glibcxx_cv_lstat=yes],
4523         [glibcxx_cv_lstat=no])
4524     ])
4525     if test $glibcxx_cv_lstat = yes; then
4526       AC_DEFINE(_GLIBCXX_USE_LSTAT, 1, [Define if lstat is available in <sys/stat.h>.])
4527     fi
4528     AC_MSG_RESULT($glibcxx_cv_lstat)
4530     AC_MSG_CHECKING([for struct stat.st_mtim.tv_nsec])
4531     AC_CACHE_VAL(glibcxx_cv_st_mtim, [dnl
4532       GCC_TRY_COMPILE_OR_LINK(
4533         [ #include <sys/stat.h> ],
4534         [
4535           struct stat st;
4536           return st.st_mtim.tv_nsec;
4537         ],
4538         [glibcxx_cv_st_mtim=yes],
4539         [glibcxx_cv_st_mtim=no])
4540     ])
4541     if test $glibcxx_cv_st_mtim = yes; then
4542       AC_DEFINE(_GLIBCXX_USE_ST_MTIM, 1, [Define if struct stat has timespec members.])
4543     fi
4544     AC_MSG_RESULT($glibcxx_cv_st_mtim)
4546     AC_MSG_CHECKING([for fchmod])
4547     AC_CACHE_VAL(glibcxx_cv_fchmod, [dnl
4548       GCC_TRY_COMPILE_OR_LINK(
4549         [#include <sys/stat.h>],
4550         [fchmod(1, S_IWUSR);],
4551         [glibcxx_cv_fchmod=yes],
4552         [glibcxx_cv_fchmod=no])
4553     ])
4554     if test $glibcxx_cv_fchmod = yes; then
4555       AC_DEFINE(_GLIBCXX_USE_FCHMOD, 1, [Define if fchmod is available in <sys/stat.h>.])
4556     fi
4557     AC_MSG_RESULT($glibcxx_cv_fchmod)
4559     AC_MSG_CHECKING([for fchmodat])
4560     AC_CACHE_VAL(glibcxx_cv_fchmodat, [dnl
4561       GCC_TRY_COMPILE_OR_LINK(
4562         [
4563           #include <fcntl.h>
4564           #include <sys/stat.h>
4565         ],
4566         [fchmodat(AT_FDCWD, "", 0, AT_SYMLINK_NOFOLLOW);],
4567         [glibcxx_cv_fchmodat=yes],
4568         [glibcxx_cv_fchmodat=no])
4569     ])
4570     if test $glibcxx_cv_fchmodat = yes; then
4571       AC_DEFINE(_GLIBCXX_USE_FCHMODAT, 1, [Define if fchmodat is available in <sys/stat.h>.])
4572     fi
4573     AC_MSG_RESULT($glibcxx_cv_fchmodat)
4575     AC_MSG_CHECKING([for sendfile that can copy files])
4576     AC_CACHE_VAL(glibcxx_cv_sendfile, [dnl
4577       case "${target_os}" in
4578         gnu* | linux* | solaris*)
4579           GCC_TRY_COMPILE_OR_LINK(
4580             [#include <sys/sendfile.h>],
4581             [sendfile(1, 2, (off_t*)0, sizeof 1);],
4582             [glibcxx_cv_sendfile=yes],
4583             [glibcxx_cv_sendfile=no])
4584           ;;
4585         *)
4586           glibcxx_cv_sendfile=no
4587           ;;
4588       esac
4589     ])
4590     if test $glibcxx_cv_sendfile = yes; then
4591       AC_DEFINE(_GLIBCXX_USE_SENDFILE, 1, [Define if sendfile is available in <sys/sendfile.h>.])
4592     fi
4593     AC_MSG_RESULT($glibcxx_cv_sendfile)
4595     AC_MSG_CHECKING([for link])
4596     AC_CACHE_VAL(glibcxx_cv_link, [dnl
4597       GCC_TRY_COMPILE_OR_LINK(
4598         [#include <unistd.h>],
4599         [link("", "");],
4600         [glibcxx_cv_link=yes],
4601         [glibcxx_cv_link=no])
4602     ])
4603     if test $glibcxx_cv_link = yes; then
4604       AC_DEFINE(HAVE_LINK, 1, [Define if link is available in <unistd.h>.])
4605     fi
4606     AC_MSG_RESULT($glibcxx_cv_link)
4608     AC_MSG_CHECKING([for readlink])
4609     AC_CACHE_VAL(glibcxx_cv_readlink, [dnl
4610       GCC_TRY_COMPILE_OR_LINK(
4611         [#include <unistd.h>],
4612         [char buf[32]; readlink("", buf, sizeof(buf));],
4613         [glibcxx_cv_readlink=yes],
4614         [glibcxx_cv_readlink=no])
4615     ])
4616     if test $glibcxx_cv_readlink = yes; then
4617       AC_DEFINE(HAVE_READLINK, 1, [Define if readlink is available in <unistd.h>.])
4618     fi
4619     AC_MSG_RESULT($glibcxx_cv_readlink)
4621     AC_MSG_CHECKING([for symlink])
4622     AC_CACHE_VAL(glibcxx_cv_symlink, [dnl
4623       GCC_TRY_COMPILE_OR_LINK(
4624         [#include <unistd.h>],
4625         [symlink("", "");],
4626         [glibcxx_cv_symlink=yes],
4627         [glibcxx_cv_symlink=no])
4628     ])
4629     if test $glibcxx_cv_symlink = yes; then
4630       AC_DEFINE(HAVE_SYMLINK, 1, [Define if symlink is available in <unistd.h>.])
4631     fi
4632     AC_MSG_RESULT($glibcxx_cv_symlink)
4634     AC_MSG_CHECKING([for truncate])
4635     AC_CACHE_VAL(glibcxx_cv_truncate, [dnl
4636       GCC_TRY_COMPILE_OR_LINK(
4637         [#include <unistd.h>],
4638         [truncate("", 99);],
4639         [glibcxx_cv_truncate=yes],
4640         [glibcxx_cv_truncate=no])
4641     ])
4642     if test $glibcxx_cv_truncate = yes; then
4643       AC_DEFINE(HAVE_TRUNCATE, 1, [Define if truncate is available in <unistd.h>.])
4644     fi
4645     AC_MSG_RESULT($glibcxx_cv_truncate)
4647     CXXFLAGS="$ac_save_CXXFLAGS"
4648     AC_LANG_RESTORE
4649   fi
4653 dnl Check how size_t is mangled.  Copied from libitm.
4655 AC_DEFUN([GLIBCXX_CHECK_SIZE_T_MANGLING], [
4656   AC_CACHE_CHECK([how size_t is mangled],
4657                  glibcxx_cv_size_t_mangling, [
4658     AC_TRY_COMPILE([], [extern __SIZE_TYPE__ x; extern unsigned long x;],
4659                    [glibcxx_cv_size_t_mangling=m], [
4660       AC_TRY_COMPILE([], [extern __SIZE_TYPE__ x; extern unsigned int x;],
4661                      [glibcxx_cv_size_t_mangling=j], [
4662         AC_TRY_COMPILE([],
4663                        [extern __SIZE_TYPE__ x; extern unsigned long long x;],
4664                        [glibcxx_cv_size_t_mangling=y], [
4665           AC_TRY_COMPILE([],
4666                          [extern __SIZE_TYPE__ x; extern unsigned short x;],
4667                          [glibcxx_cv_size_t_mangling=t], [
4668             AC_TRY_COMPILE([],
4669                            [extern __SIZE_TYPE__ x; extern __int20 unsigned x;],
4670                            [glibcxx_cv_size_t_mangling=u6uint20],
4671                            [glibcxx_cv_size_t_mangling=x])
4672           ])
4673         ])
4674       ])
4675     ])
4676   ])
4677   if test $glibcxx_cv_size_t_mangling = x; then
4678     AC_MSG_ERROR([Unknown underlying type for size_t])
4679   fi
4680   AC_DEFINE_UNQUOTED(_GLIBCXX_MANGLE_SIZE_T, [$glibcxx_cv_size_t_mangling],
4681     [Define to the letter to which size_t is mangled.])
4685 dnl Determine whether std::exception_ptr symbols should be exported with
4686 dnl the symbol versions from GCC 4.6.0 or GCC 7.1.0, depending on which
4687 dnl release first added support for std::exception_ptr. Originally it was
4688 dnl only supported for targets with always-lock-free atomics for int, but
4689 dnl since GCC 7.1 it is supported for all targets.
4691 AC_DEFUN([GLIBCXX_CHECK_EXCEPTION_PTR_SYMVER], [
4692   if test $enable_symvers != no; then
4693     AC_MSG_CHECKING([for first version to support std::exception_ptr])
4694     case ${target} in
4695       aarch64-*-* | alpha-*-* | hppa*-*-* | i?86-*-* | x86_64-*-* | \
4696       m68k-*-* | powerpc*-*-* | s390*-*-* | *-*-solaris* )
4697         ac_exception_ptr_since_gcc46=yes
4698         ;;
4699       *)
4700         # If the value of this macro changes then we will need to hardcode
4701         # yes/no here for additional targets based on the original value.
4702         AC_TRY_COMPILE([], [
4703           #if __GCC_ATOMIC_INT_LOCK_FREE <= 1
4704           # error atomic int not always lock free
4705           #endif
4706           ],
4707           [ac_exception_ptr_since_gcc46=yes],
4708           [ac_exception_ptr_since_gcc46=no])
4709         ;;
4710     esac
4711     if test x"$ac_exception_ptr_since_gcc46" = x"yes" ; then
4712       AC_DEFINE(HAVE_EXCEPTION_PTR_SINCE_GCC46, 1,
4713         [Define to 1 if GCC 4.6 supported std::exception_ptr for the target])
4714       AC_MSG_RESULT([4.6.0])
4715     else
4716       AC_MSG_RESULT([7.1.0])
4717     fi
4718   fi
4721 # Macros from the top-level gcc directory.
4722 m4_include([../config/gc++filt.m4])
4723 m4_include([../config/tls.m4])
4724 m4_include([../config/gthr.m4])
4725 m4_include([../config/cet.m4])