[Ada] Fix interaction of 128-bit integer types and -gnato2 mode
[official-gcc.git] / libstdc++-v3 / acinclude.m4
blob1c0a4c130525466bf12fd6892fb624d0b95636de
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/c++20 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/[. ][0-9]\{8\}$//;s/.* \([^ ]\{1,\}\)$/\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     # cygwin and mingw uses PE, which has no ELF relro support,
277     # multi target ld may confuse configure machinery
278     case "$host" in
279     *-*-cygwin*)
280      ;;
281     *-*-mingw*)
282      ;;
283     *)
284       AC_MSG_CHECKING([for ld that supports -Wl,-z,relro])
285       cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"`
286       if test -n "$cxx_z_relo"; then
287         OPT_LDFLAGS="-Wl,-z,relro"
288         ac_ld_relro=yes
289       fi
290       AC_MSG_RESULT($ac_ld_relro)
291     esac
292   fi
294   # Set linker optimization flags.
295   if test x"$with_gnu_ld" = x"yes"; then
296     OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
297   fi
299   AC_SUBST(SECTION_LDFLAGS)
300   AC_SUBST(OPT_LDFLAGS)
305 dnl Check for headers for, and arguments to, the setrlimit() function.
306 dnl Used only in testsuite_hooks.h.  Called from GLIBCXX_CONFIGURE_TESTSUITE.
308 dnl Defines:
309 dnl  _GLIBCXX_RES_LIMITS if we can set artificial resource limits
310 dnl  various HAVE_LIMIT_* for individual limit names
312 AC_DEFUN([GLIBCXX_CHECK_SETRLIMIT_ancilliary], [
313   AC_MSG_CHECKING([for RLIMIT_$1])
314   AC_TRY_COMPILE(
315     [#include <unistd.h>
316      #include <sys/time.h>
317      #include <sys/resource.h>
318     ],
319     [ int f = RLIMIT_$1 ; ],
320     [glibcxx_mresult=1], [glibcxx_mresult=0])
321   AC_DEFINE_UNQUOTED(HAVE_LIMIT_$1, $glibcxx_mresult,
322                      [Only used in build directory testsuite_hooks.h.])
323   if test $glibcxx_mresult = 1 ; then res=yes ; else res=no ; fi
324   AC_MSG_RESULT($res)
327 AC_DEFUN([GLIBCXX_CHECK_SETRLIMIT], [
328   AC_LANG_SAVE
329   AC_LANG_CPLUSPLUS
330   setrlimit_have_headers=yes
331   AC_CHECK_HEADERS(unistd.h sys/time.h sys/resource.h,
332                    [],
333                    [setrlimit_have_headers=no])
334   # If don't have the headers, then we can't run the tests now, and we
335   # won't be seeing any of these during testsuite compilation.
336   if test $setrlimit_have_headers = yes; then
337     # Can't do these in a loop, else the resulting syntax is wrong.
338     GLIBCXX_CHECK_SETRLIMIT_ancilliary(DATA)
339     GLIBCXX_CHECK_SETRLIMIT_ancilliary(RSS)
340     GLIBCXX_CHECK_SETRLIMIT_ancilliary(VMEM)
341     GLIBCXX_CHECK_SETRLIMIT_ancilliary(AS)
342     GLIBCXX_CHECK_SETRLIMIT_ancilliary(FSIZE)
344     # Check for rlimit, setrlimit.
345     AC_CACHE_VAL(glibcxx_cv_setrlimit, [
346       AC_TRY_COMPILE(
347         [#include <unistd.h>
348          #include <sys/time.h>
349          #include <sys/resource.h>
350         ],
351         [struct rlimit r;
352          setrlimit(0, &r);],
353         [glibcxx_cv_setrlimit=yes], [glibcxx_cv_setrlimit=no])
354     ])
355   fi
357   AC_MSG_CHECKING([for testsuite resource limits support])
358   if test $setrlimit_have_headers = yes && test $glibcxx_cv_setrlimit = yes; then
359     ac_res_limits=yes
360     AC_DEFINE(_GLIBCXX_RES_LIMITS, 1,
361               [Define if using setrlimit to set resource limits during
362               "make check"])
363   else
364     ac_res_limits=no
365   fi
366   AC_LANG_RESTORE
367   AC_MSG_RESULT($ac_res_limits)
372 dnl Check whether S_ISREG (Posix) or S_IFREG is available in <sys/stat.h>.
373 dnl Define HAVE_S_ISREG / HAVE_S_IFREG appropriately.
375 AC_DEFUN([GLIBCXX_CHECK_S_ISREG_OR_S_IFREG], [
377   AC_LANG_SAVE
378   AC_LANG_CPLUSPLUS
379   ac_save_CXXFLAGS="$CXXFLAGS"
380   CXXFLAGS="$CXXFLAGS -fno-exceptions"
382   AC_MSG_CHECKING([for S_ISREG or S_IFREG])
383   AC_CACHE_VAL(glibcxx_cv_S_ISREG, [
384     GCC_TRY_COMPILE_OR_LINK(
385       [#include <sys/stat.h>],
386       [struct stat buffer;
387        fstat(0, &buffer);
388        S_ISREG(buffer.st_mode);],
389       [glibcxx_cv_S_ISREG=yes],
390       [glibcxx_cv_S_ISREG=no])
391   ])
392   AC_CACHE_VAL(glibcxx_cv_S_IFREG, [
393     GCC_TRY_COMPILE_OR_LINK(
394       [#include <sys/stat.h>],
395       [struct stat buffer;
396        fstat(0, &buffer);
397        S_IFREG & buffer.st_mode;],
398       [glibcxx_cv_S_IFREG=yes],
399       [glibcxx_cv_S_IFREG=no])
400   ])
401   res=no
402   if test $glibcxx_cv_S_ISREG = yes; then
403     AC_DEFINE(HAVE_S_ISREG, 1,
404               [Define if S_ISREG is available in <sys/stat.h>.])
405     res=S_ISREG
406   elif test $glibcxx_cv_S_IFREG = yes; then
407     AC_DEFINE(HAVE_S_IFREG, 1,
408               [Define if S_IFREG is available in <sys/stat.h>.])
409     res=S_IFREG
410   fi
411   AC_MSG_RESULT($res)
413   CXXFLAGS="$ac_save_CXXFLAGS"
414   AC_LANG_RESTORE
419 dnl Check whether poll is available in <poll.h>, and define HAVE_POLL.
421 AC_DEFUN([GLIBCXX_CHECK_POLL], [
423   AC_LANG_SAVE
424   AC_LANG_CPLUSPLUS
425   ac_save_CXXFLAGS="$CXXFLAGS"
426   CXXFLAGS="$CXXFLAGS -fno-exceptions"
428   AC_MSG_CHECKING([for poll])
429   AC_CACHE_VAL(glibcxx_cv_POLL, [
430     GCC_TRY_COMPILE_OR_LINK(
431       [#include <poll.h>],
432       [struct pollfd pfd[1];
433        pfd[0].events = POLLIN;
434        poll(pfd, 1, 0);],
435       [glibcxx_cv_POLL=yes],
436       [glibcxx_cv_POLL=no])
437   ])
438   if test $glibcxx_cv_POLL = yes; then
439     AC_DEFINE(HAVE_POLL, 1, [Define if poll is available in <poll.h>.])
440   fi
441   AC_MSG_RESULT($glibcxx_cv_POLL)
443   CXXFLAGS="$ac_save_CXXFLAGS"
444   AC_LANG_RESTORE
449 dnl Check whether writev is available in <sys/uio.h>, and define HAVE_WRITEV.
451 AC_DEFUN([GLIBCXX_CHECK_WRITEV], [
453   AC_LANG_SAVE
454   AC_LANG_CPLUSPLUS
455   ac_save_CXXFLAGS="$CXXFLAGS"
456   CXXFLAGS="$CXXFLAGS -fno-exceptions"
458   AC_MSG_CHECKING([for writev])
459   AC_CACHE_VAL(glibcxx_cv_WRITEV, [
460     GCC_TRY_COMPILE_OR_LINK(
461       [#include <sys/uio.h>],
462       [struct iovec iov[2];
463        writev(0, iov, 0);],
464       [glibcxx_cv_WRITEV=yes],
465       [glibcxx_cv_WRITEV=no])
466   ])
467   if test $glibcxx_cv_WRITEV = yes; then
468     AC_DEFINE(HAVE_WRITEV, 1, [Define if writev is available in <sys/uio.h>.])
469   fi
470   AC_MSG_RESULT($glibcxx_cv_WRITEV)
472   CXXFLAGS="$ac_save_CXXFLAGS"
473   AC_LANG_RESTORE
478 dnl Check whether int64_t is available in <stdint.h>, and define HAVE_INT64_T.
479 dnl Also check whether int64_t is actually a typedef to long or long long.
481 AC_DEFUN([GLIBCXX_CHECK_INT64_T], [
483   AC_LANG_SAVE
484   AC_LANG_CPLUSPLUS
486   AC_MSG_CHECKING([for int64_t])
487   AC_CACHE_VAL(glibcxx_cv_INT64_T, [
488     AC_TRY_COMPILE(
489       [#include <stdint.h>],
490       [int64_t var;],
491       [glibcxx_cv_INT64_T=yes],
492       [glibcxx_cv_INT64_T=no])
493   ])
495   if test $glibcxx_cv_INT64_T = yes; then
496     AC_DEFINE(HAVE_INT64_T, 1, [Define if int64_t is available in <stdint.h>.])
497     AC_MSG_RESULT($glibcxx_cv_INT64_T)
499     AC_MSG_CHECKING([for int64_t as long])
500     AC_CACHE_VAL(glibcxx_cv_int64_t_long, [
501       AC_TRY_COMPILE(
502         [#include <stdint.h>
503         template<typename, typename> struct same { enum { value = -1 }; };
504         template<typename Tp> struct same<Tp, Tp> { enum { value = 1 }; };
505         int array[same<int64_t, long>::value];], [],
506         [glibcxx_cv_int64_t_long=yes], [glibcxx_cv_int64_t_long=no])
507     ])
509     if test $glibcxx_cv_int64_t_long = yes; then
510       AC_DEFINE(HAVE_INT64_T_LONG, 1, [Define if int64_t is a long.])
511       AC_MSG_RESULT($glibcxx_cv_int64_t_long)
512     fi
514     AC_MSG_CHECKING([for int64_t as long long])
515     AC_CACHE_VAL(glibcxx_cv_int64_t_long_long, [
516       AC_TRY_COMPILE(
517         [#include <stdint.h>
518         template<typename, typename> struct same { enum { value = -1 }; };
519         template<typename Tp> struct same<Tp, Tp> { enum { value = 1 }; };
520         int array[same<int64_t, long long>::value];], [],
521         [glibcxx_cv_int64_t_long_long=yes], [glibcxx_cv_int64_t_long_long=no])
522     ])
524     if test $glibcxx_cv_int64_t_long_long = yes; then
525       AC_DEFINE(HAVE_INT64_T_LONG_LONG, 1, [Define if int64_t is a long long.])
526       AC_MSG_RESULT($glibcxx_cv_int64_t_long_long)
527     fi
528   fi
530   AC_LANG_RESTORE
535 dnl Check whether LFS support is available.
537 AC_DEFUN([GLIBCXX_CHECK_LFS], [
538   AC_LANG_SAVE
539   AC_LANG_CPLUSPLUS
540   ac_save_CXXFLAGS="$CXXFLAGS"
541   CXXFLAGS="$CXXFLAGS -fno-exceptions"
542   AC_MSG_CHECKING([for LFS support])
543   AC_CACHE_VAL(glibcxx_cv_LFS, [
544     GCC_TRY_COMPILE_OR_LINK(
545       [#include <unistd.h>
546        #include <stdio.h>
547        #include <sys/stat.h>
548       ],
549       [FILE* fp;
550        fopen64("t", "w");
551        fseeko64(fp, 0, SEEK_CUR);
552        ftello64(fp);
553        lseek64(1, 0, SEEK_CUR);
554        struct stat64 buf;
555        fstat64(1, &buf);],
556       [glibcxx_cv_LFS=yes],
557       [glibcxx_cv_LFS=no])
558   ])
559   if test $glibcxx_cv_LFS = yes; then
560     AC_DEFINE(_GLIBCXX_USE_LFS, 1, [Define if LFS support is available.])
561   fi
562   AC_MSG_RESULT($glibcxx_cv_LFS)
563   CXXFLAGS="$ac_save_CXXFLAGS"
564   AC_LANG_RESTORE
569 dnl Check for whether a fully dynamic basic_string implementation should
570 dnl be turned on, that does not put empty objects in per-process static
571 dnl memory (mostly useful together with shared memory allocators, see PR
572 dnl libstdc++/16612 for details).
574 dnl --enable-fully-dynamic-string defines _GLIBCXX_FULLY_DYNAMIC_STRING to 1
575 dnl --disable-fully-dynamic-string defines _GLIBCXX_FULLY_DYNAMIC_STRING to 0
576 dnl otherwise undefined
577 dnl  +  Usage:  GLIBCXX_ENABLE_FULLY_DYNAMIC_STRING[(DEFAULT)]
578 dnl       Where DEFAULT is either `yes' or `no'.
580 AC_DEFUN([GLIBCXX_ENABLE_FULLY_DYNAMIC_STRING], [
581   GLIBCXX_ENABLE(fully-dynamic-string,$1,,[do not put empty strings in per-process static memory])
582   if test $enable_fully_dynamic_string = yes; then
583     enable_fully_dynamic_string_def=1
584   else
585     enable_fully_dynamic_string_def=0
586   fi
587   AC_DEFINE_UNQUOTED([_GLIBCXX_FULLY_DYNAMIC_STRING], [${enable_fully_dynamic_string_def}],
588               [Define to 1 if a fully dynamic basic_string is wanted, 0 to disable, undefined for platform defaults])
593 dnl Does any necessary configuration of the testsuite directory.  Generates
594 dnl the testsuite_hooks.h header.
596 dnl GLIBCXX_ENABLE_SYMVERS and GLIBCXX_IS_NATIVE must be done before this.
598 dnl Sets:
599 dnl  enable_abi_check
600 dnl  GLIBCXX_TEST_WCHAR_T
601 dnl  GLIBCXX_TEST_THREAD
602 dnl Substs:
603 dnl  baseline_dir
604 dnl  baseline_subdir_switch
606 AC_DEFUN([GLIBCXX_CONFIGURE_TESTSUITE], [
607   # Do checks for resource limit functions.
608   GLIBCXX_CHECK_SETRLIMIT
610   if $GLIBCXX_IS_NATIVE ; then
611     # Look for setenv, so that extended locale tests can be performed.
612     GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_3(setenv)
613   fi
615   if $GLIBCXX_IS_NATIVE && test $is_hosted = yes &&
616      test $enable_symvers != no; then
617     case "$host" in
618       *-*-cygwin*)
619         enable_abi_check=no ;;
620       *)
621         enable_abi_check=yes ;;
622     esac
623   else
624     # Only build this as native, since automake does not understand
625     # CXX_FOR_BUILD.
626     enable_abi_check=no
627   fi
629   # Export file names for ABI checking.
630   baseline_dir="$glibcxx_srcdir/config/abi/post/${abi_baseline_pair}"
631   AC_SUBST(baseline_dir)
632   baseline_subdir_switch="$abi_baseline_subdir_switch"
633   AC_SUBST(baseline_subdir_switch)
638 dnl Does any necessary configuration for docbook in the docs directory.
640 dnl XSLTPROC must be set before this
642 dnl Sets:
643 dnl  glibcxx_stylesheets
644 dnl Substs:
645 dnl  XSL_STYLE_DIR
647 AC_DEFUN([GLIBCXX_CONFIGURE_DOCBOOK], [
649 glibcxx_docbook_url=http://docbook.sourceforge.net/release/xsl-ns/current/
651 AC_MSG_CHECKING([for local stylesheet directory])
652 glibcxx_local_stylesheets=no
653 if test x${XMLCATALOG} = xyes && xsl_style_dir=`xmlcatalog "" $glibcxx_docbook_url 2>/dev/null`
654 then
655   XSL_STYLE_DIR=`echo $xsl_style_dir | sed -n 's;^file://;;p'`
656   glibcxx_local_stylesheets=yes
657 else
658   for dir in \
659     /usr/share/sgml/docbook/xsl-ns-stylesheets \
660     /usr/share/xml/docbook/stylesheet/docbook-xsl-ns \
661     /usr/share/xml/docbook/stylesheet/nwalsh5/current \
662     /usr/share/xml/docbook/stylesheet/nwalsh/current
663   do
664     if test -d $dir; then
665       glibcxx_local_stylesheets=yes
666       XSL_STYLE_DIR=$dir
667       break
668     fi
669   done
671 AC_MSG_RESULT($glibcxx_local_stylesheets)
673 if test x"$glibcxx_local_stylesheets" = x"yes"; then
674   AC_SUBST(XSL_STYLE_DIR)
675   AC_MSG_NOTICE($XSL_STYLE_DIR)
677   AC_MSG_CHECKING([for docbook stylesheets for documentation creation])
678   glibcxx_stylesheets=no
679   if test x${XMLCATALOG} = xno || xmlcatalog "" $glibcxx_docbook_url/xhtml/docbook.xsl >/dev/null 2>&1; then
680     if test x${XSLTPROC} = xyes && echo '<title/>' | xsltproc --noout --nonet --xinclude $glibcxx_docbook_url/xhtml/docbook.xsl - 2>/dev/null; then
681       glibcxx_stylesheets=yes
682     fi
683   fi
684   AC_MSG_RESULT($glibcxx_stylesheets)
686 else
687   glibcxx_stylesheets=no
690 # Check for epub3 dependencies.
691 AC_MSG_CHECKING([for epub3 stylesheets for documentation creation])
692 glibcxx_epub_stylesheets=no
693 if test x"$glibcxx_local_stylesheets" = x"yes"; then
694    if test -f "$XSL_STYLE_DIR/epub3/chunk.xsl"; then
695       glibcxx_epub_stylesheets=yes
696    fi
698 AC_MSG_RESULT($glibcxx_epub_stylesheets)
699 AM_CONDITIONAL(BUILD_EPUB, test x"$glibcxx_epub_stylesheets" = x"yes")
705 dnl Set up *_INCLUDES variables for all sundry Makefile.am's.
707 dnl Substs:
708 dnl  GLIBCXX_INCLUDES
709 dnl  TOPLEVEL_INCLUDES
711 AC_DEFUN([GLIBCXX_EXPORT_INCLUDES], [
712   # Used for every C++ compile we perform.
713   GLIBCXX_INCLUDES="\
714 -I$glibcxx_builddir/include/$host_alias \
715 -I$glibcxx_builddir/include \
716 -I$glibcxx_srcdir/libsupc++"
718   # For Canadian crosses, pick this up too.
719   if test $CANADIAN = yes; then
720     GLIBCXX_INCLUDES="$GLIBCXX_INCLUDES -I\${includedir}"
721   fi
723   # Stuff in the actual top level.  Currently only used by libsupc++ to
724   # get unwind* headers from the libgcc dir.
725   #TOPLEVEL_INCLUDES='-I$(toplevel_srcdir)/libgcc -I$(toplevel_srcdir)/include'
726   TOPLEVEL_INCLUDES='-I$(toplevel_srcdir)/libgcc'
728   # Now, export this to all the little Makefiles....
729   AC_SUBST(GLIBCXX_INCLUDES)
730   AC_SUBST(TOPLEVEL_INCLUDES)
735 dnl Set up *_FLAGS and *FLAGS variables for all sundry Makefile.am's.
736 dnl (SECTION_FLAGS is done under CHECK_COMPILER_FEATURES.)
738 dnl Substs:
739 dnl  OPTIMIZE_CXXFLAGS
740 dnl  WARN_FLAGS
742 AC_DEFUN([GLIBCXX_EXPORT_FLAGS], [
743   # Optimization flags that are probably a good idea for thrill-seekers. Just
744   # uncomment the lines below and make, everything else is ready to go...
745   # Alternatively OPTIMIZE_CXXFLAGS can be set in configure.host.
746   # OPTIMIZE_CXXFLAGS = -O3 -fstrict-aliasing -fvtable-gc
747   AC_SUBST(OPTIMIZE_CXXFLAGS)
749   WARN_FLAGS="-Wall -Wextra -Wwrite-strings -Wcast-qual -Wabi=2"
750   AC_SUBST(WARN_FLAGS)
755 dnl All installation directory information is determined here.
757 dnl Substs:
758 dnl  gxx_install_dir
759 dnl  glibcxx_prefixdir
760 dnl  glibcxx_toolexecdir
761 dnl  glibcxx_toolexeclibdir
763 dnl Assumes cross_compiling bits already done, and with_cross_host in
764 dnl particular.
766 dnl This logic must match gcc/configure.ac's setting of gcc_gxx_include_dir.
767 dnl config/gxx-include-dir.m4 must be kept consistant with this as well.
768 AC_DEFUN([GLIBCXX_EXPORT_INSTALL_INFO], [
769   glibcxx_toolexecdir=no
770   glibcxx_toolexeclibdir=no
771   glibcxx_prefixdir=$prefix
773   AC_MSG_CHECKING([for gxx-include-dir])
774   AC_ARG_WITH([gxx-include-dir],
775     AC_HELP_STRING([--with-gxx-include-dir=DIR],
776                    [installation directory for include files]),
777     [case "$withval" in
778       yes) AC_MSG_ERROR([Missing directory for --with-gxx-include-dir]) ;;
779       no)  gxx_include_dir=no ;;
780       *)   gxx_include_dir=$withval ;;
781      esac],
782     [gxx_include_dir=no])
783   AC_MSG_RESULT($gxx_include_dir)
785   AC_MSG_CHECKING([for --enable-version-specific-runtime-libs])
786   AC_ARG_ENABLE([version-specific-runtime-libs],
787     AC_HELP_STRING([--enable-version-specific-runtime-libs],
788                    [Specify that runtime libraries should be installed in a compiler-specific directory]),
789     [case "$enableval" in
790       yes) version_specific_libs=yes ;;
791       no)  version_specific_libs=no ;;
792       *)   AC_MSG_ERROR([Unknown argument to enable/disable version-specific libs]);;
793      esac],
794     [version_specific_libs=no])
795   AC_MSG_RESULT($version_specific_libs)
797   GCC_WITH_TOOLEXECLIBDIR
799   # Default case for install directory for include files.
800   if test $version_specific_libs = no && test $gxx_include_dir = no; then
801     gxx_include_dir='include/c++/${gcc_version}'
802     if test -n "$with_cross_host" &&
803        test x"$with_cross_host" != x"no"; then
804       gxx_include_dir='${prefix}/${target_alias}/'"$gxx_include_dir"
805     else
806       gxx_include_dir='${prefix}/'"$gxx_include_dir"
807     fi
808   fi
810   # Version-specific runtime libs processing.
811   if test $version_specific_libs = yes; then
812     # Need the gcc compiler version to know where to install libraries
813     # and header files if --enable-version-specific-runtime-libs option
814     # is selected.  FIXME: these variables are misnamed, there are
815     # no executables installed in _toolexecdir or _toolexeclibdir.
816     if test x"$gxx_include_dir" = x"no"; then
817       gxx_include_dir='${libdir}/gcc/${host_alias}/${gcc_version}/include/c++'
818     fi
819     glibcxx_toolexecdir='${libdir}/gcc/${host_alias}'
820     glibcxx_toolexeclibdir='${toolexecdir}/${gcc_version}$(MULTISUBDIR)'
821   fi
823   # Calculate glibcxx_toolexecdir, glibcxx_toolexeclibdir
824   # Install a library built with a cross compiler in tooldir, not libdir.
825   if test x"$glibcxx_toolexecdir" = x"no"; then
826     if test -n "$with_cross_host" &&
827        test x"$with_cross_host" != x"no"; then
828       glibcxx_toolexecdir='${exec_prefix}/${host_alias}'
829       case ${with_toolexeclibdir} in
830         no)
831           glibcxx_toolexeclibdir='${toolexecdir}/lib'
832           ;;
833         *)
834           glibcxx_toolexeclibdir=${with_toolexeclibdir}
835           ;;
836       esac
837     else
838       glibcxx_toolexecdir='${libdir}/gcc/${host_alias}'
839       glibcxx_toolexeclibdir='${libdir}'
840     fi
841     multi_os_directory=`$CXX -print-multi-os-directory`
842     case $multi_os_directory in
843       .) ;; # Avoid trailing /.
844       *) glibcxx_toolexeclibdir=$glibcxx_toolexeclibdir/$multi_os_directory ;;
845     esac
846   fi
848   AC_MSG_CHECKING([for install location])
849   AC_MSG_RESULT($gxx_include_dir)
851   AC_SUBST(glibcxx_prefixdir)
852   AC_SUBST(gxx_include_dir)
853   AC_SUBST(glibcxx_toolexecdir)
854   AC_SUBST(glibcxx_toolexeclibdir)
859 dnl GLIBCXX_ENABLE
860 dnl    (FEATURE, DEFAULT, HELP-ARG, HELP-STRING)
861 dnl    (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, permit a|b|c)
862 dnl    (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, SHELL-CODE-HANDLER)
864 dnl See manual/appendix_porting.html#appendix.porting.build_hacking for
865 dnl documentation.
867 m4_define([GLIBCXX_ENABLE],[dnl
868 m4_define([_g_switch],[--enable-$1])dnl
869 m4_define([_g_help],[AC_HELP_STRING([_g_switch$3],[$4 @<:@default=$2@:>@])])dnl
870  AC_ARG_ENABLE([$1],m4_dquote(_g_help),
871   m4_bmatch([$5],
872    [^permit ],
873      [[
874       case "$enableval" in
875        m4_bpatsubst([$5],[permit ])) ;;
876        *) AC_MSG_ERROR(Unknown argument to enable/disable $1) ;;
877           dnl Idea for future:  generate a URL pointing to
878           dnl "onlinedocs/configopts.html#whatever"
879       esac
880      ]],
881    [^$],
882      [[
883       case "$enableval" in
884        yes|no) ;;
885        *) AC_MSG_ERROR(Argument to enable/disable $1 must be yes or no) ;;
886       esac
887      ]],
888    [[$5]]),
889   [enable_]m4_bpatsubst([$1],-,_)[=][$2])
890 m4_undefine([_g_switch])dnl
891 m4_undefine([_g_help])dnl
896 dnl Check for ISO/IEC 9899:1999 "C99" support.
898 dnl --enable-c99 defines _GLIBCXX_USE_C99
899 dnl --disable-c99 leaves _GLIBCXX_USE_C99 undefined
900 dnl  +  Usage:  GLIBCXX_ENABLE_C99[(DEFAULT)]
901 dnl       Where DEFAULT is either `yes' or `no'.
902 dnl  +  If 'C99' stuff is not available, ignores DEFAULT and sets `no'.
904 AC_DEFUN([GLIBCXX_ENABLE_C99], [
905   GLIBCXX_ENABLE(c99,$1,,[turns on ISO/IEC 9899:1999 support])
907   if test x"$enable_c99" = x"yes"; then
908     AC_LANG_SAVE
909     AC_LANG_CPLUSPLUS
911     # Use -std=c++98 (instead of -std=gnu++98) because leaving __STRICT_ANSI__
912     # undefined may cause fake C99 facilities, like pre-standard snprintf,
913     # to be spuriously enabled.
914     ac_save_CXXFLAGS="$CXXFLAGS"
915     CXXFLAGS="$CXXFLAGS -std=c++98"
916     ac_save_LIBS="$LIBS"
917     ac_save_gcc_no_link="$gcc_no_link"
919     if test x$gcc_no_link != xyes; then
920       # Use -fno-exceptions to that the C driver can link these tests without
921       # hitting undefined references to personality routines.
922       CXXFLAGS="$CXXFLAGS -fno-exceptions"
923       AC_CHECK_LIB(m, sin, [LIBS="$LIBS -lm"], [
924         # Use the default compile-only tests in GCC_TRY_COMPILE_OR_LINK
925         gcc_no_link=yes
926       ])
927     fi
929     # Check for the existence of <math.h> functions used if C99 is enabled.
930     AC_MSG_CHECKING([for ISO C99 support in <math.h> for C++98])
931     AC_CACHE_VAL(glibcxx_cv_c99_math_cxx98, [
932       GCC_TRY_COMPILE_OR_LINK(
933         [#include <math.h>
934          volatile double d1, d2;
935          volatile int i;],
936         [i = fpclassify(d1);
937          i = isfinite(d1);
938          i = isinf(d1);
939          i = isnan(d1);
940          i = isnormal(d1);
941          i = signbit(d1);
942          i = isgreater(d1, d2);
943          i = isgreaterequal(d1, d2);
944          i = isless(d1, d2);
945          i = islessequal(d1, d2);
946          i = islessgreater(d1, d2);
947          i = islessgreater(d1, d2);
948          i = isunordered(d1, d2);
949         ], [glibcxx_cv_c99_math_cxx98=yes], [glibcxx_cv_c99_math_cxx98=no])
950     ])
951     AC_MSG_RESULT($glibcxx_cv_c99_math_cxx98)
952     if test x"$glibcxx_cv_c99_math_cxx98" = x"yes"; then
953       AC_DEFINE(_GLIBCXX98_USE_C99_MATH, 1,
954         [Define if C99 functions or macros in <math.h> should be imported
955         in <cmath> in namespace std for C++98.])
956     fi
958     # Check for the existence of <complex.h> complex math functions.
959     # This is necessary even though libstdc++ uses the builtin versions
960     # of these functions, because if the builtin cannot be used, a reference
961     # to the library function is emitted.
962     AC_CHECK_HEADERS(tgmath.h, ac_has_tgmath_h=yes, ac_has_tgmath_h=no)
963     AC_CHECK_HEADERS(complex.h, ac_has_complex_h=yes, ac_has_complex_h=no)
964     if test x"$ac_has_complex_h" = x"yes"; then
965       AC_MSG_CHECKING([for ISO C99 support in <complex.h> for C++98])
966       AC_CACHE_VAL(glibcxx_cv_c99_complex_cxx98, [
967         GCC_TRY_COMPILE_OR_LINK(
968           [#include <complex.h>
969            typedef __complex__ float float_type;
970            typedef __complex__ double double_type;
971            typedef __complex__ long double ld_type;
972            volatile float_type tmpf;
973            volatile double_type tmpd;
974            volatile ld_type tmpld;
975            volatile float f;
976            volatile double d;
977            volatile long double ld;],
978           [f = cabsf(tmpf);
979            f = cargf(tmpf);
980            tmpf = ccosf(tmpf);
981            tmpf = ccoshf(tmpf);
982            tmpf = cexpf(tmpf);
983            tmpf = clogf(tmpf);
984            tmpf = csinf(tmpf);
985            tmpf = csinhf(tmpf);
986            tmpf = csqrtf(tmpf);
987            tmpf = ctanf(tmpf);
988            tmpf = ctanhf(tmpf);
989            tmpf = cpowf(tmpf, tmpf);
990            tmpf = cprojf(tmpf);
991            d = cabs(tmpd);
992            d = carg(tmpd);
993            tmpd = ccos(tmpd);
994            tmpd = ccosh(tmpd);
995            tmpd = cexp(tmpd);
996            tmpd = clog(tmpd);
997            tmpd = csin(tmpd);
998            tmpd = csinh(tmpd);
999            tmpd = csqrt(tmpd);
1000            tmpd = ctan(tmpd);
1001            tmpd = ctanh(tmpd);
1002            tmpd = cpow(tmpd, tmpd);
1003            tmpd = cproj(tmpd);
1004            ld = cabsl(tmpld);
1005            ld = cargl(tmpld);
1006            tmpld = ccosl(tmpld);
1007            tmpld = ccoshl(tmpld);
1008            tmpld = cexpl(tmpld);
1009            tmpld = clogl(tmpld);
1010            tmpld = csinl(tmpld);
1011            tmpld = csinhl(tmpld);
1012            tmpld = csqrtl(tmpld);
1013            tmpld = ctanl(tmpld);
1014            tmpld = ctanhl(tmpld);
1015            tmpld = cpowl(tmpld, tmpld);
1016            tmpld = cprojl(tmpld);
1017           ], [glibcxx_cv_c99_complex_cxx98=yes], [glibcxx_cv_c99_complex_cxx98=no])
1018       ])
1019     fi
1020     AC_MSG_RESULT($glibcxx_cv_c99_complex_cxx98)
1021     if test x"$glibcxx_cv_c99_complex_cxx98" = x"yes"; then
1022       AC_DEFINE(_GLIBCXX98_USE_C99_COMPLEX, 1,
1023         [Define if C99 functions in <complex.h> should be used in
1024         <complex> for C++98. Using compiler builtins for these functions
1025         requires corresponding C99 library functions to be present.])
1026     fi
1028     # Check for the existence in <stdio.h> of vscanf, et. al.
1029     AC_MSG_CHECKING([for ISO C99 support in <stdio.h> for C++98])
1030     AC_CACHE_VAL(glibcxx_cv_c99_stdio_cxx98, [
1031       GCC_TRY_COMPILE_OR_LINK(
1032         [#include <stdio.h>
1033          #include <stdarg.h>
1034          void foo(char* fmt, ...)
1035          {
1036            va_list args; va_start(args, fmt);
1037            vfscanf(stderr, "%i", args);
1038            vscanf("%i", args);
1039            vsnprintf(fmt, 0, "%i", args);
1040            vsscanf(fmt, "%i", args);
1041            snprintf(fmt, 0, "%i");
1042          }], [],
1043         [glibcxx_cv_c99_stdio_cxx98=yes], [glibcxx_cv_c99_stdio_cxx98=no])
1044     ])
1045     AC_MSG_RESULT($glibcxx_cv_c99_stdio_cxx98)
1046     if test x"$glibcxx_cv_c99_stdio_cxx98" = x"yes"; then
1047       AC_DEFINE(_GLIBCXX98_USE_C99_STDIO, 1,
1048         [Define if C99 functions or macros in <stdio.h> should be imported
1049         in <cstdio> in namespace std for C++98.])
1050     fi
1052     # Check for the existence in <stdlib.h> of lldiv_t, et. al.
1053     AC_MSG_CHECKING([for ISO C99 support in <stdlib.h> for C++98])
1054     AC_CACHE_VAL(glibcxx_cv_c99_stdlib_cxx98, [
1055       GCC_TRY_COMPILE_OR_LINK(
1056         [#include <stdlib.h>
1057          volatile float f;
1058          volatile long double ld;
1059          volatile unsigned long long ll;
1060          lldiv_t mydivt;],
1061         [char* tmp;
1062          f = strtof("gnu", &tmp);
1063          ld = strtold("gnu", &tmp);
1064          ll = strtoll("gnu", &tmp, 10);
1065          ll = strtoull("gnu", &tmp, 10);
1066          ll = llabs(10);
1067          mydivt = lldiv(10,1);
1068          ll = mydivt.quot;
1069          ll = mydivt.rem;
1070          ll = atoll("10");
1071          _Exit(0);
1072         ], [glibcxx_cv_c99_stdlib_cxx98=yes], [glibcxx_cv_c99_stdlib_cxx98=no])
1073     ])
1074     AC_MSG_RESULT($glibcxx_cv_c99_stdlib_cxx98)
1075     if test x"$glibcxx_cv_c99_stdlib_cxx98" = x"yes"; then
1076       AC_DEFINE(_GLIBCXX98_USE_C99_STDLIB, 1,
1077         [Define if C99 functions or macros in <stdlib.h> should be imported
1078         in <cstdlib> in namespace std for C++98.])
1079     fi
1081     # Check for the existence in <wchar.h> of wcstold, etc.
1082     if test x"$ac_has_wchar_h" = xyes &&
1083        test x"$ac_has_wctype_h" = xyes; then
1084       AC_MSG_CHECKING([for ISO C99 support in <wchar.h> for C++98])
1085       AC_CACHE_VAL(glibcxx_cv_c99_wchar_cxx98, [
1086         AC_TRY_COMPILE([#include <wchar.h>
1087           namespace test
1088           {
1089             using ::wcstold;
1090             using ::wcstoll;
1091             using ::wcstoull;
1092           }
1093         ], [], [glibcxx_cv_c99_wchar_cxx98=yes], [glibcxx_cv_c99_wchar_cxx98=no])
1094       ])
1096       # Checks for wide character functions that may not be present.
1097       # Injection of these is wrapped with guard macros.
1098       # NB: only put functions here, instead of immediately above, if
1099       # absolutely necessary.
1100       AC_TRY_COMPILE([#include <wchar.h>
1101         namespace test { using ::vfwscanf; }], [],
1102         [AC_DEFINE(HAVE_VFWSCANF, 1, [Defined if vfwscanf exists.])], [])
1104       AC_TRY_COMPILE([#include <wchar.h>
1105         namespace test { using ::vswscanf; }], [],
1106         [AC_DEFINE(HAVE_VSWSCANF, 1, [Defined if vswscanf exists.])], [])
1108       AC_TRY_COMPILE([#include <wchar.h>
1109         namespace test { using ::vwscanf; }], [],
1110         [AC_DEFINE(HAVE_VWSCANF, 1, [Defined if vwscanf exists.])], [])
1112       AC_TRY_COMPILE([#include <wchar.h>
1113         namespace test { using ::wcstof; }], [],
1114         [AC_DEFINE(HAVE_WCSTOF, 1, [Defined if wcstof exists.])], [])
1116       AC_TRY_COMPILE([#include <wctype.h>],
1117         [wint_t t; int i = iswblank(t);],
1118         [AC_DEFINE(HAVE_ISWBLANK, 1, [Defined if iswblank exists.])], [])
1120       AC_MSG_RESULT($glibcxx_cv_c99_wchar_cxx98)
1121       if test x"$glibcxx_cv_c99_wchar_cxx98" = x"yes"; then
1122         AC_DEFINE(_GLIBCXX98_USE_C99_WCHAR, 1,
1123           [Define if C99 functions or macros in <wchar.h> should be imported
1124           in <cwchar> in namespace std for C++98.])
1125       fi
1126     fi
1128     # Option parsed, now set things appropriately.
1129     if test x"$glibcxx_cv_c99_math_cxx98" = x"no" ||
1130        test x"$glibcxx_cv_c99_complex_cxx98" = x"no" ||
1131        test x"$glibcxx_cv_c99_stdio_cxx98" = x"no" ||
1132        test x"$glibcxx_cv_c99_stdlib_cxx98" = x"no" ||
1133        test x"$glibcxx_cv_c99_wchar_cxx98" = x"no"; then
1134       enable_c99=no;
1135     else
1136       AC_DEFINE(_GLIBCXX_USE_C99, 1,
1137         [Define if C99 functions or macros from <wchar.h>, <math.h>,
1138         <complex.h>, <stdio.h>, and <stdlib.h> can be used or exposed.])
1139     fi
1141     gcc_no_link="$ac_save_gcc_no_link"
1142     LIBS="$ac_save_LIBS"
1143     CXXFLAGS="$ac_save_CXXFLAGS"
1144     AC_LANG_RESTORE
1146     AC_LANG_SAVE
1147     AC_LANG_CPLUSPLUS
1149     # Use -std=c++11 and test again for C99 library feature in C++11 mode.
1150     # For the reasons given above we use -std=c++11 not -std=gnu++11.
1151     ac_save_CXXFLAGS="$CXXFLAGS"
1152     CXXFLAGS="$CXXFLAGS -std=c++11"
1153     ac_save_LIBS="$LIBS"
1154     ac_save_gcc_no_link="$gcc_no_link"
1156     if test x$gcc_no_link != xyes; then
1157       # Use -fno-exceptions to that the C driver can link these tests without
1158       # hitting undefined references to personality routines.
1159       CXXFLAGS="$CXXFLAGS -fno-exceptions"
1160       AC_CHECK_LIB(m, sin, [LIBS="$LIBS -lm"], [
1161         # Use the default compile-only tests in GCC_TRY_COMPILE_OR_LINK
1162         gcc_no_link=yes
1163       ])
1164     fi
1166     # Check for the existence of <math.h> functions used if C99 is enabled.
1167     AC_MSG_CHECKING([for ISO C99 support in <math.h> for C++11])
1168     AC_CACHE_VAL(glibcxx_cv_c99_math_cxx11, [
1169       GCC_TRY_COMPILE_OR_LINK(
1170         [#include <math.h>
1171          volatile double d1, d2;
1172          volatile int i;],
1173         [i = fpclassify(d1);
1174          i = isfinite(d1);
1175          i = isinf(d1);
1176          i = isnan(d1);
1177          i = isnormal(d1);
1178          i = signbit(d1);
1179          i = isgreater(d1, d2);
1180          i = isgreaterequal(d1, d2);
1181          i = isless(d1, d2);
1182          i = islessequal(d1, d2);
1183          i = islessgreater(d1, d2);
1184          i = islessgreater(d1, d2);
1185          i = isunordered(d1, d2);
1186         ], [glibcxx_cv_c99_math_cxx11=yes], [glibcxx_cv_c99_math_cxx11=no])
1187     ])
1188     AC_MSG_RESULT($glibcxx_cv_c99_math_cxx11)
1189     if test x"$glibcxx_cv_c99_math_cxx11" = x"yes"; then
1190       AC_DEFINE(_GLIBCXX11_USE_C99_MATH, 1,
1191         [Define if C99 functions or macros in <math.h> should be imported
1192         in <cmath> in namespace std for C++11.])
1193     fi
1195     # Check for the existence of <complex.h> complex math functions.
1196     # This is necessary even though libstdc++ uses the builtin versions
1197     # of these functions, because if the builtin cannot be used, a reference
1198     # to the library function is emitted.
1199     AC_CHECK_HEADERS(tgmath.h, ac_has_tgmath_h=yes, ac_has_tgmath_h=no)
1200     AC_CHECK_HEADERS(complex.h, ac_has_complex_h=yes, ac_has_complex_h=no)
1201     if test x"$ac_has_complex_h" = x"yes"; then
1202       AC_MSG_CHECKING([for ISO C99 support in <complex.h> for C++11])
1203       AC_CACHE_VAL(glibcxx_cv_c99_complex_cxx11, [
1204         GCC_TRY_COMPILE_OR_LINK(
1205           [#include <complex.h>
1206            typedef __complex__ float float_type;
1207            typedef __complex__ double double_type;
1208            typedef __complex__ long double ld_type;
1209            volatile float_type tmpf;
1210            volatile double_type tmpd;
1211            volatile ld_type tmpld;
1212            volatile float f;
1213            volatile double d;
1214            volatile long double ld;],
1215           [f = cabsf(tmpf);
1216            f = cargf(tmpf);
1217            tmpf = ccosf(tmpf);
1218            tmpf = ccoshf(tmpf);
1219            tmpf = cexpf(tmpf);
1220            tmpf = clogf(tmpf);
1221            tmpf = csinf(tmpf);
1222            tmpf = csinhf(tmpf);
1223            tmpf = csqrtf(tmpf);
1224            tmpf = ctanf(tmpf);
1225            tmpf = ctanhf(tmpf);
1226            tmpf = cpowf(tmpf, tmpf);
1227            tmpf = cprojf(tmpf);
1228            d = cabs(tmpd);
1229            d = carg(tmpd);
1230            tmpd = ccos(tmpd);
1231            tmpd = ccosh(tmpd);
1232            tmpd = cexp(tmpd);
1233            tmpd = clog(tmpd);
1234            tmpd = csin(tmpd);
1235            tmpd = csinh(tmpd);
1236            tmpd = csqrt(tmpd);
1237            tmpd = ctan(tmpd);
1238            tmpd = ctanh(tmpd);
1239            tmpd = cpow(tmpd, tmpd);
1240            tmpd = cproj(tmpd);
1241            ld = cabsl(tmpld);
1242            ld = cargl(tmpld);
1243            tmpld = ccosl(tmpld);
1244            tmpld = ccoshl(tmpld);
1245            tmpld = cexpl(tmpld);
1246            tmpld = clogl(tmpld);
1247            tmpld = csinl(tmpld);
1248            tmpld = csinhl(tmpld);
1249            tmpld = csqrtl(tmpld);
1250            tmpld = ctanl(tmpld);
1251            tmpld = ctanhl(tmpld);
1252            tmpld = cpowl(tmpld, tmpld);
1253            tmpld = cprojl(tmpld);
1254           ], [glibcxx_cv_c99_complex_cxx11=yes], [glibcxx_cv_c99_complex_cxx11=no])
1255       ])
1256     fi
1257     AC_MSG_RESULT($glibcxx_cv_c99_complex_cxx11)
1258     if test x"$glibcxx_cv_c99_complex_cxx11" = x"yes"; then
1259       AC_DEFINE(_GLIBCXX11_USE_C99_COMPLEX, 1,
1260         [Define if C99 functions in <complex.h> should be used in
1261         <complex> for C++11. Using compiler builtins for these functions
1262         requires corresponding C99 library functions to be present.])
1263     fi
1265     # Check for the existence in <stdio.h> of vscanf, et. al.
1266     AC_MSG_CHECKING([for ISO C99 support in <stdio.h> for C++11])
1267     AC_CACHE_VAL(glibcxx_cv_c99_stdio_cxx11, [
1268       GCC_TRY_COMPILE_OR_LINK(
1269         [#include <stdio.h>
1270          #include <stdarg.h>
1271          void foo(char* fmt, ...)
1272          {
1273            va_list args; va_start(args, fmt);
1274            vfscanf(stderr, "%i", args);
1275            vscanf("%i", args);
1276            vsnprintf(fmt, 0, "%i", args);
1277            vsscanf(fmt, "%i", args);
1278            snprintf(fmt, 0, "%i");
1279          }], [],
1280         [glibcxx_cv_c99_stdio_cxx11=yes], [glibcxx_cv_c99_stdio_cxx11=no])
1281     ])
1282     AC_MSG_RESULT($glibcxx_cv_c99_stdio_cxx11)
1283     if test x"$glibcxx_cv_c99_stdio_cxx11" = x"yes"; then
1284       AC_DEFINE(_GLIBCXX11_USE_C99_STDIO, 1,
1285         [Define if C99 functions or macros in <stdio.h> should be imported
1286         in <cstdio> in namespace std for C++11.])
1287     fi
1289     # Check for the existence in <stdlib.h> of lldiv_t, et. al.
1290     AC_MSG_CHECKING([for ISO C99 support in <stdlib.h> for C++11])
1291     AC_CACHE_VAL(glibcxx_cv_c99_stdlib_cxx11, [
1292       GCC_TRY_COMPILE_OR_LINK(
1293         [#include <stdlib.h>
1294          volatile float f;
1295          volatile long double ld;
1296          volatile unsigned long long ll;
1297          lldiv_t mydivt;],
1298         [char* tmp;
1299          f = strtof("gnu", &tmp);
1300          ld = strtold("gnu", &tmp);
1301          ll = strtoll("gnu", &tmp, 10);
1302          ll = strtoull("gnu", &tmp, 10);
1303          ll = llabs(10);
1304          mydivt = lldiv(10,1);
1305          ll = mydivt.quot;
1306          ll = mydivt.rem;
1307          ll = atoll("10");
1308          _Exit(0);
1309         ], [glibcxx_cv_c99_stdlib_cxx11=yes], [glibcxx_cv_c99_stdlib_cxx11=no])
1310     ])
1311     AC_MSG_RESULT($glibcxx_cv_c99_stdlib_cxx11)
1312     if test x"$glibcxx_cv_c99_stdlib_cxx11" = x"yes"; then
1313       AC_DEFINE(_GLIBCXX11_USE_C99_STDLIB, 1,
1314         [Define if C99 functions or macros in <stdlib.h> should be imported
1315         in <cstdlib> in namespace std for C++11.])
1316     fi
1318     # Check for the existence in <wchar.h> of wcstold, etc.
1319     if test x"$ac_has_wchar_h" = xyes &&
1320        test x"$ac_has_wctype_h" = xyes; then
1321       AC_MSG_CHECKING([for ISO C99 support in <wchar.h> for C++11])
1322       AC_CACHE_VAL(glibcxx_cv_c99_wchar_cxx11, [
1323         AC_TRY_COMPILE([#include <wchar.h>
1324           namespace test
1325           {
1326             using ::wcstold;
1327             using ::wcstoll;
1328             using ::wcstoull;
1329           }
1330         ], [], [glibcxx_cv_c99_wchar_cxx11=yes], [glibcxx_cv_c99_wchar_cxx11=no])
1331       ])
1333       # Checks for wide character functions that may not be present.
1334       # Injection of these is wrapped with guard macros.
1335       # NB: only put functions here, instead of immediately above, if
1336       # absolutely necessary.
1337       AC_TRY_COMPILE([#include <wchar.h>
1338         namespace test { using ::vfwscanf; }], [],
1339         [AC_DEFINE(HAVE_VFWSCANF, 1, [Defined if vfwscanf exists.])], [])
1341       AC_TRY_COMPILE([#include <wchar.h>
1342         namespace test { using ::vswscanf; }], [],
1343         [AC_DEFINE(HAVE_VSWSCANF, 1, [Defined if vswscanf exists.])], [])
1345       AC_TRY_COMPILE([#include <wchar.h>
1346         namespace test { using ::vwscanf; }], [],
1347         [AC_DEFINE(HAVE_VWSCANF, 1, [Defined if vwscanf exists.])], [])
1349       AC_TRY_COMPILE([#include <wchar.h>
1350         namespace test { using ::wcstof; }], [],
1351         [AC_DEFINE(HAVE_WCSTOF, 1, [Defined if wcstof exists.])], [])
1353       AC_TRY_COMPILE([#include <wctype.h>],
1354         [wint_t t; int i = iswblank(t);],
1355         [AC_DEFINE(HAVE_ISWBLANK, 1, [Defined if iswblank exists.])], [])
1357       AC_MSG_RESULT($glibcxx_cv_c99_wchar_cxx11)
1358       if test x"$glibcxx_cv_c99_wchar_cxx11" = x"yes"; then
1359         AC_DEFINE(_GLIBCXX11_USE_C99_WCHAR, 1,
1360           [Define if C99 functions or macros in <wchar.h> should be imported
1361           in <cwchar> in namespace std for C++11.])
1362       fi
1363     fi
1365     gcc_no_link="$ac_save_gcc_no_link"
1366     LIBS="$ac_save_LIBS"
1367     CXXFLAGS="$ac_save_CXXFLAGS"
1368     AC_LANG_RESTORE
1369   fi
1371   AC_MSG_CHECKING([for fully enabled ISO C99 support])
1372   AC_MSG_RESULT($enable_c99)
1377 dnl Check for clock_gettime, nanosleep and sched_yield, used in the
1378 dnl implementation of 20.11.7 [time.clock], and 30.3.2 [thread.thread.this]
1379 dnl in the C++11 standard.
1381 dnl --enable-libstdcxx-time
1382 dnl --enable-libstdcxx-time=yes
1383 dnl        checks for the availability of monotonic and realtime clocks,
1384 dnl        nanosleep and sched_yield in libc.
1385 dnl --enable-libstdcxx-time=rt
1386 dnl        also searches (and, if needed, links) librt.  Note that this is
1387 dnl        not always desirable because, in glibc 2.16 and earlier, for
1388 dnl        example, in turn it triggers the linking of libpthread too,
1389 dnl        which activates locking,
1390 dnl        a large overhead for single-thread programs.
1391 dnl --enable-libstdcxx-time=no
1392 dnl --disable-libstdcxx-time
1393 dnl        disables the checks completely
1395 dnl N.B. Darwin provides nanosleep but doesn't support the whole POSIX
1396 dnl Timers option, so doesn't define _POSIX_TIMERS. Because the test
1397 dnl below fails Darwin unconditionally defines _GLIBCXX_USE_NANOSLEEP in
1398 dnl os_defines.h and also defines _GLIBCXX_USE_SCHED_YIELD.
1400 AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_TIME], [
1402   GLIBCXX_ENABLE(libstdcxx-time,auto,[[[=KIND]]],
1403     [use KIND for check type],
1404     [permit yes|no|rt])
1406   AC_LANG_SAVE
1407   AC_LANG_CPLUSPLUS
1408   ac_save_CXXFLAGS="$CXXFLAGS"
1409   CXXFLAGS="$CXXFLAGS -fno-exceptions"
1410   ac_save_LIBS="$LIBS"
1412   ac_has_clock_monotonic=no
1413   ac_has_clock_realtime=no
1414   ac_has_nanosleep=no
1415   ac_has_sched_yield=no
1417   if test x"$enable_libstdcxx_time" = x"auto"; then
1419     case "${target_os}" in
1420       cygwin*)
1421         ac_has_nanosleep=yes
1422         ;;
1423       darwin*)
1424         ac_has_nanosleep=yes
1425         ac_has_sched_yield=yes
1426         ;;
1427       # VxWorks has nanosleep as soon as the kernel is configured with
1428       # INCLUDE_POSIX_TIMERS, which is normally/most-often the case.
1429       vxworks*)
1430         ac_has_nanosleep=yes
1431         ;;
1432       gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
1433         # Don't use link test for freestanding library, in case gcc_no_link=yes
1434         if test x"$is_hosted" = xyes; then
1435           # Versions of glibc before 2.17 needed -lrt for clock_gettime.
1436           AC_SEARCH_LIBS(clock_gettime, [rt])
1437           if test x"$ac_cv_search_clock_gettime" = x"none required"; then
1438             ac_has_clock_monotonic=yes
1439             ac_has_clock_realtime=yes
1440           fi
1441         fi
1442         ac_has_nanosleep=yes
1443         ac_has_sched_yield=yes
1444         ;;
1445       freebsd*|netbsd*|dragonfly*|rtems*)
1446         ac_has_clock_monotonic=yes
1447         ac_has_clock_realtime=yes
1448         ac_has_nanosleep=yes
1449         ac_has_sched_yield=yes
1450         ;;
1451       openbsd*)
1452         ac_has_clock_monotonic=yes
1453         ac_has_clock_realtime=yes
1454         ac_has_nanosleep=yes
1455         ;;
1456       solaris*)
1457         ac_has_clock_monotonic=yes
1458         ac_has_clock_realtime=yes
1459         ac_has_nanosleep=yes
1460         ac_has_sched_yield=yes
1461         ;;
1462       uclinux*)
1463         ac_has_nanosleep=yes
1464         ac_has_sched_yield=yes
1465     esac
1467   elif test x"$enable_libstdcxx_time" != x"no"; then
1469     if test x"$enable_libstdcxx_time" = x"rt"; then
1470       AC_SEARCH_LIBS(clock_gettime, [rt])
1471       AC_SEARCH_LIBS(nanosleep, [rt])
1472     else
1473       AC_CHECK_FUNC(clock_gettime)
1474       AC_CHECK_FUNC(nanosleep)
1475     fi
1477     case "$ac_cv_search_clock_gettime" in
1478       -l*) GLIBCXX_LIBS=$ac_cv_search_clock_gettime
1479       ;;
1480     esac
1481     case "$ac_cv_search_nanosleep" in
1482       -l*) GLIBCXX_LIBS="$GLIBCXX_LIBS $ac_cv_search_nanosleep"
1483       ;;
1484     esac
1486     AC_SEARCH_LIBS(sched_yield, [rt])
1488     case "$ac_cv_search_sched_yield" in
1489       -lrt*)
1490       if test x"$enable_libstdcxx_time" = x"rt"; then
1491         GLIBCXX_LIBS="$GLIBCXX_LIBS $ac_cv_search_sched_yield"
1492         ac_has_sched_yield=yes
1493       fi
1494       ;;
1495       *)
1496       ac_has_sched_yield=yes
1497       ;;
1498     esac
1500     AC_CHECK_HEADERS(unistd.h, ac_has_unistd_h=yes, ac_has_unistd_h=no)
1502     if test x"$ac_has_unistd_h" = x"yes"; then
1503       AC_MSG_CHECKING([for monotonic clock])
1504       AC_TRY_LINK(
1505         [#include <unistd.h>
1506          #include <time.h>
1507         ],
1508         [#if _POSIX_TIMERS > 0 && defined(_POSIX_MONOTONIC_CLOCK)
1509           timespec tp;
1510          #endif
1511           clock_gettime(CLOCK_MONOTONIC, &tp);
1512         ], [ac_has_clock_monotonic=yes], [ac_has_clock_monotonic=no])
1514       AC_MSG_RESULT($ac_has_clock_monotonic)
1516       AC_MSG_CHECKING([for realtime clock])
1517       AC_TRY_LINK(
1518         [#include <unistd.h>
1519          #include <time.h>
1520         ],
1521         [#if _POSIX_TIMERS > 0
1522           timespec tp;
1523          #endif
1524           clock_gettime(CLOCK_REALTIME, &tp);
1525         ], [ac_has_clock_realtime=yes], [ac_has_clock_realtime=no])
1527       AC_MSG_RESULT($ac_has_clock_realtime)
1529       AC_MSG_CHECKING([for nanosleep])
1530       AC_TRY_LINK(
1531         [#include <unistd.h>
1532          #include <time.h>
1533         ],
1534         [#if _POSIX_TIMERS > 0
1535           timespec tp;
1536          #endif
1537           nanosleep(&tp, 0);
1538         ], [ac_has_nanosleep=yes], [ac_has_nanosleep=no])
1540       AC_MSG_RESULT($ac_has_nanosleep)
1541     fi
1542   fi
1544   if test x"$ac_has_clock_monotonic" != x"yes"; then
1545     case ${target_os} in
1546       linux* | uclinux*)
1547         AC_MSG_CHECKING([for clock_gettime syscall])
1548         AC_TRY_COMPILE(
1549           [#include <unistd.h>
1550            #include <time.h>
1551            #include <sys/syscall.h>
1552           ],
1553           [#if _POSIX_TIMERS > 0 && defined(_POSIX_MONOTONIC_CLOCK)
1554             timespec tp;
1555            #endif
1556            syscall(SYS_clock_gettime, CLOCK_MONOTONIC, &tp);
1557            syscall(SYS_clock_gettime, CLOCK_REALTIME, &tp);
1558           ], [ac_has_clock_gettime_syscall=yes], [ac_has_clock_gettime_syscall=no])
1559         AC_MSG_RESULT($ac_has_clock_gettime_syscall)
1560         if test x"$ac_has_clock_gettime_syscall" = x"yes"; then
1561           AC_DEFINE(_GLIBCXX_USE_CLOCK_GETTIME_SYSCALL, 1,
1562           [Defined if clock_gettime syscall has monotonic and realtime clock support. ])
1563           ac_has_clock_monotonic=yes
1564           ac_has_clock_realtime=yes
1565           AC_MSG_CHECKING([for struct timespec that matches syscall])
1566           AC_TRY_COMPILE(
1567             [#include <time.h>
1568              #include <sys/syscall.h>
1569             ],
1570             [#ifdef SYS_clock_gettime64
1571              #if SYS_clock_gettime64 != SYS_clock_gettime
1572              // We need to use SYS_clock_gettime and libc appears to
1573              // also know about the SYS_clock_gettime64 syscall.
1574              // Check that userspace doesn't use time64 version of timespec.
1575              static_assert(sizeof(timespec::tv_sec) == sizeof(long),
1576                "struct timespec must be compatible with SYS_clock_gettime");
1577              #endif
1578              #endif
1579             ],
1580             [ac_timespec_matches_syscall=yes],
1581             [ac_timespec_matches_syscall=no])
1582           AC_MSG_RESULT($ac_timespec_matches_syscall)
1583           if test x"$ac_timespec_matches_syscall" = no; then
1584             AC_MSG_ERROR([struct timespec is not compatible with SYS_clock_gettime, please report a bug to http://gcc.gnu.org/bugzilla])
1585           fi
1586         fi;;
1587     esac
1588   fi
1590   if test x"$ac_has_clock_monotonic" = x"yes"; then
1591     AC_DEFINE(_GLIBCXX_USE_CLOCK_MONOTONIC, 1,
1592       [ Defined if clock_gettime has monotonic clock support. ])
1593   fi
1595   if test x"$ac_has_clock_realtime" = x"yes"; then
1596     AC_DEFINE(_GLIBCXX_USE_CLOCK_REALTIME, 1,
1597       [ Defined if clock_gettime has realtime clock support. ])
1598   fi
1600   if test x"$ac_has_sched_yield" = x"yes"; then
1601     AC_DEFINE(_GLIBCXX_USE_SCHED_YIELD, 1,
1602               [ Defined if sched_yield is available. ])
1603   fi
1605   if test x"$ac_has_nanosleep" = x"yes"; then
1606     AC_DEFINE(_GLIBCXX_USE_NANOSLEEP, 1,
1607       [ Defined if nanosleep is available. ])
1608   else
1609       AC_MSG_CHECKING([for sleep])
1610       AC_TRY_COMPILE([#include <unistd.h>],
1611                      [sleep(1)],
1612                      [ac_has_sleep=yes],[ac_has_sleep=no])
1613       if test x"$ac_has_sleep" = x"yes"; then
1614         AC_DEFINE(HAVE_SLEEP,1, [Defined if sleep exists.])
1615       fi
1616       AC_MSG_RESULT($ac_has_sleep)
1617       AC_MSG_CHECKING([for usleep])
1618       AC_TRY_COMPILE([#include <unistd.h>],
1619                      [sleep(1);
1620                       usleep(100);],
1621                      [ac_has_usleep=yes],[ac_has_usleep=no])
1622       if test x"$ac_has_usleep" = x"yes"; then
1623         AC_DEFINE(HAVE_USLEEP,1, [Defined if usleep exists.])
1624       fi
1625       AC_MSG_RESULT($ac_has_usleep)
1626   fi
1628   if test x"$ac_has_nanosleep$ac_has_sleep" = x"nono"; then
1629       ac_no_sleep=yes
1630       AC_MSG_CHECKING([for Sleep])
1631       AC_TRY_COMPILE([#include <windows.h>],
1632                      [Sleep(1)],
1633                      [ac_has_win32_sleep=yes],[ac_has_win32_sleep=no])
1634       if test x"$ac_has_win32_sleep" = x"yes"; then
1635         AC_DEFINE(HAVE_WIN32_SLEEP,1, [Defined if Sleep exists.])
1636         ac_no_sleep=no
1637       fi
1638       AC_MSG_RESULT($ac_has_win32_sleep)
1639   fi
1641   if test x"$ac_no_sleep" = x"yes"; then
1642     AC_DEFINE(NO_SLEEP,1, [Defined if no way to sleep is available.])
1643   fi
1645   AC_SUBST(GLIBCXX_LIBS)
1647   CXXFLAGS="$ac_save_CXXFLAGS"
1648   LIBS="$ac_save_LIBS"
1649   AC_LANG_RESTORE
1653 dnl Check for gettimeofday, used in the implementation of 20.11.7
1654 dnl [time.clock] in the C++11 standard.
1656 AC_DEFUN([GLIBCXX_CHECK_GETTIMEOFDAY], [
1658   AC_MSG_CHECKING([for gettimeofday])
1660   AC_LANG_SAVE
1661   AC_LANG_CPLUSPLUS
1662   ac_save_CXXFLAGS="$CXXFLAGS"
1663   CXXFLAGS="$CXXFLAGS -fno-exceptions"
1665   ac_has_gettimeofday=no;
1666   AC_CHECK_HEADERS(sys/time.h, ac_has_sys_time_h=yes, ac_has_sys_time_h=no)
1667   if test x"$ac_has_sys_time_h" = x"yes"; then
1668     AC_MSG_CHECKING([for gettimeofday])
1669     GCC_TRY_COMPILE_OR_LINK([#include <sys/time.h>],
1670       [timeval tv; gettimeofday(&tv, 0);],
1671       [ac_has_gettimeofday=yes], [ac_has_gettimeofday=no])
1673     AC_MSG_RESULT($ac_has_gettimeofday)
1674   fi
1676   if test x"$ac_has_gettimeofday" = x"yes"; then
1677     AC_DEFINE(_GLIBCXX_USE_GETTIMEOFDAY, 1,
1678       [ Defined if gettimeofday is available. ])
1679   fi
1681   CXXFLAGS="$ac_save_CXXFLAGS"
1682   AC_LANG_RESTORE
1686 dnl Check for ISO/IEC 9899:1999 "C99" support to ISO/IEC DTR 19768 "TR1"
1687 dnl facilities in Chapter 8, "C compatibility".
1689 AC_DEFUN([GLIBCXX_CHECK_C99_TR1], [
1691   AC_LANG_SAVE
1692   AC_LANG_CPLUSPLUS
1694   # Use -std=c++98 because the default (-std=gnu++98) leaves __STRICT_ANSI__
1695   # undefined and fake C99 facilities may be spuriously enabled.
1696   ac_save_CXXFLAGS="$CXXFLAGS"
1697   CXXFLAGS="$CXXFLAGS -std=c++98"
1699   # Check for the existence of <complex.h> complex math functions used
1700   # by tr1/complex.
1701   AC_CHECK_HEADERS(complex.h, ac_has_complex_h=yes, ac_has_complex_h=no)
1702   ac_c99_complex_tr1=no;
1703   if test x"$ac_has_complex_h" = x"yes"; then
1704     AC_MSG_CHECKING([for ISO C99 support to TR1 in <complex.h>])
1705     AC_TRY_COMPILE([#include <complex.h>],
1706                    [typedef __complex__ float float_type; float_type tmpf;
1707                     cacosf(tmpf);
1708                     casinf(tmpf);
1709                     catanf(tmpf);
1710                     cacoshf(tmpf);
1711                     casinhf(tmpf);
1712                     catanhf(tmpf);
1713                     typedef __complex__ double double_type; double_type tmpd;
1714                     cacos(tmpd);
1715                     casin(tmpd);
1716                     catan(tmpd);
1717                     cacosh(tmpd);
1718                     casinh(tmpd);
1719                     catanh(tmpd);
1720                     typedef __complex__ long double ld_type; ld_type tmpld;
1721                     cacosl(tmpld);
1722                     casinl(tmpld);
1723                     catanl(tmpld);
1724                     cacoshl(tmpld);
1725                     casinhl(tmpld);
1726                     catanhl(tmpld);
1727                    ],[ac_c99_complex_tr1=yes], [ac_c99_complex_tr1=no])
1728   fi
1729   AC_MSG_RESULT($ac_c99_complex_tr1)
1730   if test x"$ac_c99_complex_tr1" = x"yes"; then
1731     AC_DEFINE(_GLIBCXX_USE_C99_COMPLEX_TR1, 1,
1732               [Define if C99 functions in <complex.h> should be used in
1733               <tr1/complex>. Using compiler builtins for these functions
1734               requires corresponding C99 library functions to be present.])
1735   fi
1737   # Check for the existence of <ctype.h> functions.
1738   AC_MSG_CHECKING([for ISO C99 support to TR1 in <ctype.h>])
1739   AC_CACHE_VAL(glibcxx_cv_c99_ctype_tr1, [
1740   AC_TRY_COMPILE([#include <ctype.h>],
1741                  [int ch;
1742                   int ret;
1743                   ret = isblank(ch);
1744                  ],[glibcxx_cv_c99_ctype_tr1=yes],
1745                    [glibcxx_cv_c99_ctype_tr1=no])
1746   ])
1747   AC_MSG_RESULT($glibcxx_cv_c99_ctype_tr1)
1748   if test x"$glibcxx_cv_c99_ctype_tr1" = x"yes"; then
1749     AC_DEFINE(_GLIBCXX_USE_C99_CTYPE_TR1, 1,
1750               [Define if C99 functions in <ctype.h> should be imported in
1751               <tr1/cctype> in namespace std::tr1.])
1752   fi
1754   # Check for the existence of <fenv.h> functions.
1755   AC_CHECK_HEADERS(fenv.h, ac_has_fenv_h=yes, ac_has_fenv_h=no)
1756   ac_c99_fenv_tr1=no;
1757   if test x"$ac_has_fenv_h" = x"yes"; then
1758     AC_MSG_CHECKING([for ISO C99 support to TR1 in <fenv.h>])
1759     AC_TRY_COMPILE([#include <fenv.h>],
1760                    [int except, mode;
1761                     fexcept_t* pflag;
1762                     fenv_t* penv;
1763                     int ret;
1764                     ret = feclearexcept(except);
1765                     ret = fegetexceptflag(pflag, except);
1766                     ret = feraiseexcept(except);
1767                     ret = fesetexceptflag(pflag, except);
1768                     ret = fetestexcept(except);
1769                     ret = fegetround();
1770                     ret = fesetround(mode);
1771                     ret = fegetenv(penv);
1772                     ret = feholdexcept(penv);
1773                     ret = fesetenv(penv);
1774                     ret = feupdateenv(penv);
1775                    ],[ac_c99_fenv_tr1=yes], [ac_c99_fenv_tr1=no])
1776   fi
1777   AC_MSG_RESULT($ac_c99_fenv_tr1)
1778   if test x"$ac_c99_fenv_tr1" = x"yes"; then
1779     AC_DEFINE(_GLIBCXX_USE_C99_FENV_TR1, 1,
1780               [Define if C99 functions in <fenv.h> should be imported in
1781               <tr1/cfenv> in namespace std::tr1.])
1782   fi
1784   # Check for the existence of <stdint.h> types.
1785   AC_MSG_CHECKING([for ISO C99 support to TR1 in <stdint.h>])
1786   AC_CACHE_VAL(glibcxx_cv_c99_stdint_tr1, [
1787   AC_TRY_COMPILE([#define __STDC_LIMIT_MACROS
1788                   #define __STDC_CONSTANT_MACROS
1789                   #include <stdint.h>],
1790                  [typedef int8_t          my_int8_t;
1791                   my_int8_t               i8 = INT8_MIN;
1792                   i8 = INT8_MAX;
1793                   typedef int16_t         my_int16_t;
1794                   my_int16_t              i16 = INT16_MIN;
1795                   i16 = INT16_MAX;
1796                   typedef int32_t         my_int32_t;
1797                   my_int32_t              i32 = INT32_MIN;
1798                   i32 = INT32_MAX;
1799                   typedef int64_t         my_int64_t;
1800                   my_int64_t              i64 = INT64_MIN;
1801                   i64 = INT64_MAX;
1802                   typedef int_fast8_t     my_int_fast8_t;
1803                   my_int_fast8_t          if8 = INT_FAST8_MIN;
1804                   if8 = INT_FAST8_MAX;
1805                   typedef int_fast16_t    my_int_fast16_t;
1806                   my_int_fast16_t         if16 = INT_FAST16_MIN;
1807                   if16 = INT_FAST16_MAX;
1808                   typedef int_fast32_t    my_int_fast32_t;
1809                   my_int_fast32_t         if32 = INT_FAST32_MIN;
1810                   if32 = INT_FAST32_MAX;
1811                   typedef int_fast64_t    my_int_fast64_t;
1812                   my_int_fast64_t         if64 = INT_FAST64_MIN;
1813                   if64 = INT_FAST64_MAX;
1814                   typedef int_least8_t    my_int_least8_t;
1815                   my_int_least8_t         il8 = INT_LEAST8_MIN;
1816                   il8 = INT_LEAST8_MAX;
1817                   typedef int_least16_t   my_int_least16_t;
1818                   my_int_least16_t        il16 = INT_LEAST16_MIN;
1819                   il16 = INT_LEAST16_MAX;
1820                   typedef int_least32_t   my_int_least32_t;
1821                   my_int_least32_t        il32 = INT_LEAST32_MIN;
1822                   il32 = INT_LEAST32_MAX;
1823                   typedef int_least64_t   my_int_least64_t;
1824                   my_int_least64_t        il64 = INT_LEAST64_MIN;
1825                   il64 = INT_LEAST64_MAX;
1826                   typedef intmax_t        my_intmax_t;
1827                   my_intmax_t             im = INTMAX_MAX;
1828                   im = INTMAX_MIN;
1829                   typedef intptr_t        my_intptr_t;
1830                   my_intptr_t             ip = INTPTR_MAX;
1831                   ip = INTPTR_MIN;
1832                   typedef uint8_t         my_uint8_t;
1833                   my_uint8_t              ui8 = UINT8_MAX;
1834                   ui8 = UINT8_MAX;
1835                   typedef uint16_t        my_uint16_t;
1836                   my_uint16_t             ui16 = UINT16_MAX;
1837                   ui16 = UINT16_MAX;
1838                   typedef uint32_t        my_uint32_t;
1839                   my_uint32_t             ui32 = UINT32_MAX;
1840                   ui32 = UINT32_MAX;
1841                   typedef uint64_t        my_uint64_t;
1842                   my_uint64_t             ui64 = UINT64_MAX;
1843                   ui64 = UINT64_MAX;
1844                   typedef uint_fast8_t    my_uint_fast8_t;
1845                   my_uint_fast8_t         uif8 = UINT_FAST8_MAX;
1846                   uif8 = UINT_FAST8_MAX;
1847                   typedef uint_fast16_t   my_uint_fast16_t;
1848                   my_uint_fast16_t        uif16 = UINT_FAST16_MAX;
1849                   uif16 = UINT_FAST16_MAX;
1850                   typedef uint_fast32_t   my_uint_fast32_t;
1851                   my_uint_fast32_t        uif32 = UINT_FAST32_MAX;
1852                   uif32 = UINT_FAST32_MAX;
1853                   typedef uint_fast64_t   my_uint_fast64_t;
1854                   my_uint_fast64_t        uif64 = UINT_FAST64_MAX;
1855                   uif64 = UINT_FAST64_MAX;
1856                   typedef uint_least8_t   my_uint_least8_t;
1857                   my_uint_least8_t        uil8 = UINT_LEAST8_MAX;
1858                   uil8 = UINT_LEAST8_MAX;
1859                   typedef uint_least16_t  my_uint_least16_t;
1860                   my_uint_least16_t       uil16 = UINT_LEAST16_MAX;
1861                   uil16 = UINT_LEAST16_MAX;
1862                   typedef uint_least32_t  my_uint_least32_t;
1863                   my_uint_least32_t       uil32 = UINT_LEAST32_MAX;
1864                   uil32 = UINT_LEAST32_MAX;
1865                   typedef uint_least64_t  my_uint_least64_t;
1866                   my_uint_least64_t       uil64 = UINT_LEAST64_MAX;
1867                   uil64 = UINT_LEAST64_MAX;
1868                   typedef uintmax_t       my_uintmax_t;
1869                   my_uintmax_t            uim = UINTMAX_MAX;
1870                   uim = UINTMAX_MAX;
1871                   typedef uintptr_t       my_uintptr_t;
1872                   my_uintptr_t            uip = UINTPTR_MAX;
1873                   uip = UINTPTR_MAX;
1874                  ],[glibcxx_cv_c99_stdint_tr1=yes],
1875                    [glibcxx_cv_c99_stdint_tr1=no])
1876   ])
1877   AC_MSG_RESULT($glibcxx_cv_c99_stdint_tr1)
1878   if test x"$glibcxx_cv_c99_stdint_tr1" = x"yes"; then
1879     AC_DEFINE(_GLIBCXX_USE_C99_STDINT_TR1, 1,
1880               [Define if C99 types in <stdint.h> should be imported in
1881               <tr1/cstdint> in namespace std::tr1.])
1882   fi
1884   # Check for the existence of <math.h> functions.
1885   AC_MSG_CHECKING([for ISO C99 support to TR1 in <math.h>])
1886   AC_CACHE_VAL(glibcxx_cv_c99_math_tr1, [
1887   AC_TRY_COMPILE([#include <math.h>],
1888                  [typedef double_t  my_double_t;
1889                   typedef float_t   my_float_t;
1890                   acosh(0.0);
1891                   acoshf(0.0f);
1892                   acoshl(0.0l);
1893                   asinh(0.0);
1894                   asinhf(0.0f);
1895                   asinhl(0.0l);
1896                   atanh(0.0);
1897                   atanhf(0.0f);
1898                   atanhl(0.0l);
1899                   cbrt(0.0);
1900                   cbrtf(0.0f);
1901                   cbrtl(0.0l);
1902                   copysign(0.0, 0.0);
1903                   copysignf(0.0f, 0.0f);
1904                   copysignl(0.0l, 0.0l);
1905                   erf(0.0);
1906                   erff(0.0f);
1907                   erfl(0.0l);
1908                   erfc(0.0);
1909                   erfcf(0.0f);
1910                   erfcl(0.0l);
1911                   exp2(0.0);
1912                   exp2f(0.0f);
1913                   exp2l(0.0l);
1914                   expm1(0.0);
1915                   expm1f(0.0f);
1916                   expm1l(0.0l);
1917                   fdim(0.0, 0.0);
1918                   fdimf(0.0f, 0.0f);
1919                   fdiml(0.0l, 0.0l);
1920                   fma(0.0, 0.0, 0.0);
1921                   fmaf(0.0f, 0.0f, 0.0f);
1922                   fmal(0.0l, 0.0l, 0.0l);
1923                   fmax(0.0, 0.0);
1924                   fmaxf(0.0f, 0.0f);
1925                   fmaxl(0.0l, 0.0l);
1926                   fmin(0.0, 0.0);
1927                   fminf(0.0f, 0.0f);
1928                   fminl(0.0l, 0.0l);
1929                   hypot(0.0, 0.0);
1930                   hypotf(0.0f, 0.0f);
1931                   hypotl(0.0l, 0.0l);
1932                   ilogb(0.0);
1933                   ilogbf(0.0f);
1934                   ilogbl(0.0l);
1935                   lgamma(0.0);
1936                   lgammaf(0.0f);
1937                   lgammal(0.0l);
1938                   #ifndef __APPLE__ /* see below */
1939                   llrint(0.0);
1940                   llrintf(0.0f);
1941                   llrintl(0.0l);
1942                   llround(0.0);
1943                   llroundf(0.0f);
1944                   llroundl(0.0l);
1945                   #endif
1946                   log1p(0.0);
1947                   log1pf(0.0f);
1948                   log1pl(0.0l);
1949                   log2(0.0);
1950                   log2f(0.0f);
1951                   log2l(0.0l);
1952                   logb(0.0);
1953                   logbf(0.0f);
1954                   logbl(0.0l);
1955                   lrint(0.0);
1956                   lrintf(0.0f);
1957                   lrintl(0.0l);
1958                   lround(0.0);
1959                   lroundf(0.0f);
1960                   lroundl(0.0l);
1961                   nan(0);
1962                   nanf(0);
1963                   nanl(0);
1964                   nearbyint(0.0);
1965                   nearbyintf(0.0f);
1966                   nearbyintl(0.0l);
1967                   nextafter(0.0, 0.0);
1968                   nextafterf(0.0f, 0.0f);
1969                   nextafterl(0.0l, 0.0l);
1970                   nexttoward(0.0, 0.0);
1971                   nexttowardf(0.0f, 0.0f);
1972                   nexttowardl(0.0l, 0.0l);
1973                   remainder(0.0, 0.0);
1974                   remainderf(0.0f, 0.0f);
1975                   remainderl(0.0l, 0.0l);
1976                   remquo(0.0, 0.0, 0);
1977                   remquof(0.0f, 0.0f, 0);
1978                   remquol(0.0l, 0.0l, 0);
1979                   rint(0.0);
1980                   rintf(0.0f);
1981                   rintl(0.0l);
1982                   round(0.0);
1983                   roundf(0.0f);
1984                   roundl(0.0l);
1985                   scalbln(0.0, 0l);
1986                   scalblnf(0.0f, 0l);
1987                   scalblnl(0.0l, 0l);
1988                   scalbn(0.0, 0);
1989                   scalbnf(0.0f, 0);
1990                   scalbnl(0.0l, 0);
1991                   tgamma(0.0);
1992                   tgammaf(0.0f);
1993                   tgammal(0.0l);
1994                   trunc(0.0);
1995                   truncf(0.0f);
1996                   truncl(0.0l);
1997                  ],[glibcxx_cv_c99_math_tr1=yes], [glibcxx_cv_c99_math_tr1=no])
1998   ])
1999   AC_MSG_RESULT($glibcxx_cv_c99_math_tr1)
2000   if test x"$glibcxx_cv_c99_math_tr1" = x"yes"; then
2001     AC_DEFINE(_GLIBCXX_USE_C99_MATH_TR1, 1,
2002               [Define if C99 functions or macros in <math.h> should be imported
2003               in <tr1/cmath> in namespace std::tr1.])
2005     case "${target_os}" in
2006       darwin*)
2007         AC_MSG_CHECKING([for ISO C99 rounding functions in <math.h>])
2008         AC_CACHE_VAL(glibcxx_cv_c99_math_llround, [
2009           AC_TRY_COMPILE([#include <math.h>],
2010                  [llrint(0.0);
2011                   llrintf(0.0f);
2012                   llrintl(0.0l);
2013                   llround(0.0);
2014                   llroundf(0.0f);
2015                   llroundl(0.0l);
2016                  ],
2017                  [glibcxx_cv_c99_math_llround=yes],
2018                  [glibcxx_cv_c99_math_llround=no])
2019           ])
2020         AC_MSG_RESULT($glibcxx_cv_c99_math_llround)
2021         ;;
2022     esac
2023     if test x"$glibcxx_cv_c99_math_llround" = x"no"; then
2024       AC_DEFINE(_GLIBCXX_NO_C99_ROUNDING_FUNCS, 1,
2025                 [Define if C99 llrint and llround functions are missing from <math.h>.])
2026     fi
2027   fi
2029   # Check for the existence of <inttypes.h> functions (NB: doesn't make
2030   # sense if the glibcxx_cv_c99_stdint_tr1 check fails, per C99, 7.8/1).
2031   ac_c99_inttypes_tr1=no;
2032   if test x"$glibcxx_cv_c99_stdint_tr1" = x"yes"; then
2033     AC_MSG_CHECKING([for ISO C99 support to TR1 in <inttypes.h>])
2034     AC_TRY_COMPILE([#include <inttypes.h>],
2035                    [intmax_t i, numer, denom, base;
2036                     const char* s;
2037                     char** endptr;
2038                     intmax_t ret = imaxabs(i);
2039                     imaxdiv_t dret = imaxdiv(numer, denom);
2040                     ret = strtoimax(s, endptr, base);
2041                     uintmax_t uret = strtoumax(s, endptr, base);
2042                    ],[ac_c99_inttypes_tr1=yes], [ac_c99_inttypes_tr1=no])
2043   fi
2044   AC_MSG_RESULT($ac_c99_inttypes_tr1)
2045   if test x"$ac_c99_inttypes_tr1" = x"yes"; then
2046     AC_DEFINE(_GLIBCXX_USE_C99_INTTYPES_TR1, 1,
2047               [Define if C99 functions in <inttypes.h> should be imported in
2048               <tr1/cinttypes> in namespace std::tr1.])
2049   fi
2051   # Check for the existence of wchar_t <inttypes.h> functions (NB: doesn't
2052   # make sense if the glibcxx_cv_c99_stdint_tr1 check fails, per C99, 7.8/1).
2053   ac_c99_inttypes_wchar_t_tr1=no;
2054   if test x"$glibcxx_cv_c99_stdint_tr1" = x"yes"; then
2055     AC_MSG_CHECKING([for wchar_t ISO C99 support to TR1 in <inttypes.h>])
2056     AC_TRY_COMPILE([#include <inttypes.h>],
2057                    [intmax_t base;
2058                     const wchar_t* s;
2059                     wchar_t** endptr;
2060                     intmax_t ret = wcstoimax(s, endptr, base);
2061                     uintmax_t uret = wcstoumax(s, endptr, base);
2062                    ],[ac_c99_inttypes_wchar_t_tr1=yes],
2063                      [ac_c99_inttypes_wchar_t_tr1=no])
2064   fi
2065   AC_MSG_RESULT($ac_c99_inttypes_wchar_t_tr1)
2066   if test x"$ac_c99_inttypes_wchar_t_tr1" = x"yes"; then
2067     AC_DEFINE(_GLIBCXX_USE_C99_INTTYPES_WCHAR_T_TR1, 1,
2068               [Define if wchar_t C99 functions in <inttypes.h> should be
2069               imported in <tr1/cinttypes> in namespace std::tr1.])
2070   fi
2072   # Check for the existence of the <stdbool.h> header.
2073   AC_CHECK_HEADERS(stdbool.h)
2075   # Check for the existence of the <stdalign.h> header.
2076   AC_CHECK_HEADERS(stdalign.h)
2078   CXXFLAGS="$ac_save_CXXFLAGS"
2079   AC_LANG_RESTORE
2083 dnl Check for uchar.h and usability.
2085 AC_DEFUN([GLIBCXX_CHECK_UCHAR_H], [
2087   # Test uchar.h.
2088   AC_CHECK_HEADERS(uchar.h, ac_has_uchar_h=yes, ac_has_uchar_h=no)
2090   AC_LANG_SAVE
2091   AC_LANG_CPLUSPLUS
2092   ac_save_CXXFLAGS="$CXXFLAGS"
2093   CXXFLAGS="$CXXFLAGS -std=c++11"
2095   if test x"$ac_has_uchar_h" = x"yes"; then
2096     AC_MSG_CHECKING([for ISO C11 support for <uchar.h>])
2097     AC_TRY_COMPILE([#include <uchar.h>
2098                     #ifdef __STDC_UTF_16__
2099                     long i = __STDC_UTF_16__;
2100                     #endif
2101                     #ifdef __STDC_UTF_32__
2102                     long j = __STDC_UTF_32__;
2103                     #endif
2104                     namespace test
2105                     {
2106                       using ::c16rtomb;
2107                       using ::c32rtomb;
2108                       using ::mbrtoc16;
2109                       using ::mbrtoc32;
2110                     }
2111                    ],
2112                    [], [ac_c11_uchar_cxx11=yes], [ac_c11_uchar_cxx11=no])
2113   else
2114     ac_c11_uchar_cxx11=no
2115   fi
2116   AC_MSG_RESULT($ac_c11_uchar_cxx11)
2117   if test x"$ac_c11_uchar_cxx11" = x"yes"; then
2118     AC_DEFINE(_GLIBCXX_USE_C11_UCHAR_CXX11, 1,
2119               [Define if C11 functions in <uchar.h> should be imported into
2120               namespace std in <cuchar>.])
2121   fi
2123   CXXFLAGS="$ac_save_CXXFLAGS"
2124   AC_LANG_RESTORE
2129 dnl Check whether "/dev/random" and "/dev/urandom" are available for
2130 dnl class std::random_device from C++ 2011 [rand.device], and
2131 dnl random_device of "TR1" (Chapter 5.1, "Random number generation").
2133 AC_DEFUN([GLIBCXX_CHECK_DEV_RANDOM], [
2135   AC_MSG_CHECKING([for "/dev/random" and "/dev/urandom" for std::random_device])
2136   AC_CACHE_VAL(glibcxx_cv_dev_random, [
2137     if test -r /dev/random && test -r /dev/urandom; then
2138   ## For MSys environment the test above is detected as false-positive
2139   ## on mingw-targets.  So disable it explicitly for them.
2140       case ${target_os} in
2141         *mingw*) glibcxx_cv_dev_random=no ;;
2142         *) glibcxx_cv_dev_random=yes ;;
2143       esac
2144     else
2145       glibcxx_cv_dev_random=no;
2146     fi
2147   ])
2148   AC_MSG_RESULT($glibcxx_cv_dev_random)
2150   if test x"$glibcxx_cv_dev_random" = x"yes"; then
2151     AC_DEFINE(_GLIBCXX_USE_DEV_RANDOM, 1,
2152               [Define if /dev/random and /dev/urandom are available for
2153                std::random_device.])
2154     AC_DEFINE(_GLIBCXX_USE_RANDOM_TR1, 1,
2155               [Define if /dev/random and /dev/urandom are available for
2156                the random_device of TR1 (Chapter 5.1).])
2157   fi
2162 dnl Compute the EOF, SEEK_CUR, and SEEK_END integer constants.
2164 AC_DEFUN([GLIBCXX_COMPUTE_STDIO_INTEGER_CONSTANTS], [
2166   AC_CACHE_CHECK([for the value of EOF], glibcxx_cv_stdio_eof, [
2167   AC_COMPUTE_INT([glibcxx_cv_stdio_eof], [[EOF]],
2168                  [#include <stdio.h>],
2169                  [AC_MSG_ERROR([computing EOF failed])])
2170   ])
2171   AC_DEFINE_UNQUOTED(_GLIBCXX_STDIO_EOF, $glibcxx_cv_stdio_eof,
2172                      [Define to the value of the EOF integer constant.])
2174   AC_CACHE_CHECK([for the value of SEEK_CUR], glibcxx_cv_stdio_seek_cur, [
2175   AC_COMPUTE_INT([glibcxx_cv_stdio_seek_cur], [[SEEK_CUR]],
2176                  [#include <stdio.h>],
2177                  [AC_MSG_ERROR([computing SEEK_CUR failed])])
2178   ])
2179   AC_DEFINE_UNQUOTED(_GLIBCXX_STDIO_SEEK_CUR, $glibcxx_cv_stdio_seek_cur,
2180                      [Define to the value of the SEEK_CUR integer constant.])
2182   AC_CACHE_CHECK([for the value of SEEK_END], glibcxx_cv_stdio_seek_end, [
2183   AC_COMPUTE_INT([glibcxx_cv_stdio_seek_end], [[SEEK_END]],
2184                  [#include <stdio.h>],
2185                  [AC_MSG_ERROR([computing SEEK_END failed])])
2186   ])
2187   AC_DEFINE_UNQUOTED(_GLIBCXX_STDIO_SEEK_END, $glibcxx_cv_stdio_seek_end,
2188                      [Define to the value of the SEEK_END integer constant.])
2192 dnl Check whether required C++ overloads are present in <stdio.h>.
2194 AC_DEFUN([GLIBCXX_CHECK_STDIO_PROTO], [
2196   AC_LANG_SAVE
2197   AC_LANG_CPLUSPLUS
2198   # Use C++11 because a conforming <stdio.h> won't define gets for C++14,
2199   # and we don't need a declaration for C++14 anyway.
2200   ac_save_CXXFLAGS="$CXXFLAGS"
2201   CXXFLAGS="$CXXFLAGS -std=gnu++11"
2203   AC_MSG_CHECKING([for gets declaration])
2204   AC_CACHE_VAL(glibcxx_cv_gets, [
2205   AC_COMPILE_IFELSE([AC_LANG_SOURCE(
2206           [#include <stdio.h>
2207            namespace test
2208            {
2209               using ::gets;
2210            }
2211         ])],
2212         [glibcxx_cv_gets=yes],
2213         [glibcxx_cv_gets=no]
2214       )])
2216   if test $glibcxx_cv_gets = yes; then
2217     AC_DEFINE(HAVE_GETS, 1, [Define if gets is available in <stdio.h> before C++14.])
2218   fi
2219   AC_MSG_RESULT($glibcxx_cv_gets)
2221   CXXFLAGS="$ac_save_CXXFLAGS"
2222   AC_LANG_RESTORE
2226 dnl Check whether required C++11 overloads for floating point and integral
2227 dnl types are present in <math.h>.
2229 AC_DEFUN([GLIBCXX_CHECK_MATH11_PROTO], [
2231   AC_LANG_SAVE
2232   AC_LANG_CPLUSPLUS
2233   ac_save_CXXFLAGS="$CXXFLAGS"
2234   CXXFLAGS="$CXXFLAGS -std=c++11"
2236   case "$host" in
2237     *-*-solaris2.*)
2238       # Solaris 12 Build 86, Solaris 11.3 SRU 3.6, and Solaris 10 Patch
2239       # 11996[67]-02 introduced the C++11 <math.h> floating point overloads.
2240       AC_MSG_CHECKING([for C++11 <math.h> floating point overloads])
2241       AC_CACHE_VAL(glibcxx_cv_math11_fp_overload, [
2242         AC_COMPILE_IFELSE([AC_LANG_SOURCE(
2243           [#include <math.h>
2244            #undef isfinite
2245            namespace std {
2246              inline bool isfinite(float __x)
2247              { return __builtin_isfinite(__x); }
2248            }
2249         ])],
2250         [glibcxx_cv_math11_fp_overload=no],
2251         [glibcxx_cv_math11_fp_overload=yes]
2252       )])
2254       # autoheader cannot handle indented templates.
2255       AH_VERBATIM([__CORRECT_ISO_CPP11_MATH_H_PROTO_FP],
2256         [/* Define if all C++11 floating point overloads are available in <math.h>.  */
2257 #if __cplusplus >= 201103L
2258 #undef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2259 #endif])
2261       if test $glibcxx_cv_math11_fp_overload = yes; then
2262         AC_DEFINE(__CORRECT_ISO_CPP11_MATH_H_PROTO_FP)
2263       fi
2264       AC_MSG_RESULT([$glibcxx_cv_math11_fp_overload])
2266       # Solaris 12 Build 90, Solaris 11.3 SRU 5.6, and Solaris 10 Patch
2267       # 11996[67]-02 introduced the C++11 <math.h> integral type overloads.
2268       AC_MSG_CHECKING([for C++11 <math.h> integral type overloads])
2269       AC_CACHE_VAL(glibcxx_cv_math11_int_overload, [
2270         AC_COMPILE_IFELSE([AC_LANG_SOURCE(
2271           [#include <math.h>
2272            namespace std {
2273              template<typename _Tp>
2274                struct __is_integer;
2275              template<>
2276                struct __is_integer<int>
2277                {
2278                  enum { __value = 1 };
2279                };
2280            }
2281            namespace __gnu_cxx {
2282              template<bool, typename>
2283                struct __enable_if;
2284              template<typename _Tp>
2285                struct __enable_if<true, _Tp>
2286                { typedef _Tp __type; };
2287            }
2288            namespace std {
2289              template<typename _Tp>
2290                constexpr typename __gnu_cxx::__enable_if
2291                          <__is_integer<_Tp>::__value, double>::__type
2292                log2(_Tp __x)
2293                { return __builtin_log2(__x); }
2294            }
2295            int
2296            main (void)
2297            {
2298              int i = 1000;
2299              return std::log2(i);
2300            }
2301         ])],
2302         [glibcxx_cv_math11_int_overload=no],
2303         [glibcxx_cv_math11_int_overload=yes]
2304       )])
2306       # autoheader cannot handle indented templates.
2307       AH_VERBATIM([__CORRECT_ISO_CPP11_MATH_H_PROTO_INT],
2308         [/* Define if all C++11 integral type overloads are available in <math.h>.  */
2309 #if __cplusplus >= 201103L
2310 #undef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2311 #endif])
2313       if test $glibcxx_cv_math11_int_overload = yes; then
2314         AC_DEFINE(__CORRECT_ISO_CPP11_MATH_H_PROTO_INT)
2315       fi
2316       AC_MSG_RESULT([$glibcxx_cv_math11_int_overload])
2317       ;;
2318     *)
2319       # If <math.h> defines the obsolete isinf(double) and isnan(double)
2320       # functions (instead of or as well as the C99 generic macros) then we
2321       # can't define std::isinf(double) and std::isnan(double) in <cmath>
2322       # and must use the ones from <math.h> instead.
2323       AC_MSG_CHECKING([for obsolete isinf function in <math.h>])
2324         AC_CACHE_VAL(glibcxx_cv_obsolete_isinf, [
2325           AC_COMPILE_IFELSE([AC_LANG_SOURCE(
2326             [#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS
2327              #include <math.h>
2328              #undef isinf
2329              namespace std {
2330                using ::isinf;
2331                bool isinf(float);
2332                bool isinf(long double);
2333              }
2334              using std::isinf;
2335              bool b = isinf(0.0);
2336           ])],
2337           [glibcxx_cv_obsolete_isinf=yes],
2338           [glibcxx_cv_obsolete_isinf=no]
2339         )])
2340       AC_MSG_RESULT([$glibcxx_cv_obsolete_isinf])
2341       if test $glibcxx_cv_obsolete_isinf = yes; then
2342         AC_DEFINE(HAVE_OBSOLETE_ISINF, 1,
2343                   [Define if <math.h> defines obsolete isinf function.])
2344       fi
2346       AC_MSG_CHECKING([for obsolete isnan function in <math.h>])
2347         AC_CACHE_VAL(glibcxx_cv_obsolete_isnan, [
2348           AC_COMPILE_IFELSE([AC_LANG_SOURCE(
2349             [#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS
2350              #include <math.h>
2351              #undef isnan
2352              namespace std {
2353                using ::isnan;
2354                bool isnan(float);
2355                bool isnan(long double);
2356              }
2357              using std::isnan;
2358              bool b = isnan(0.0);
2359           ])],
2360           [glibcxx_cv_obsolete_isnan=yes],
2361           [glibcxx_cv_obsolete_isnan=no]
2362         )])
2363       AC_MSG_RESULT([$glibcxx_cv_obsolete_isnan])
2364       if test $glibcxx_cv_obsolete_isnan = yes; then
2365         AC_DEFINE(HAVE_OBSOLETE_ISNAN, 1,
2366                   [Define if <math.h> defines obsolete isnan function.])
2367       fi
2368       ;;
2369   esac
2371   CXXFLAGS="$ac_save_CXXFLAGS"
2372   AC_LANG_RESTORE
2376 dnl Check for what type of C headers to use.
2378 dnl --enable-cheaders= [does stuff].
2379 dnl --disable-cheaders [does not do anything, really].
2380 dnl  +  Usage:  GLIBCXX_ENABLE_CHEADERS[(DEFAULT)]
2381 dnl       Where DEFAULT is either 'c' or 'c_global' or 'c_std'.
2383 dnl To use the obsolete 'c_std' headers use --enable-cheaders-obsolete as
2384 dnl well as --enable-cheaders=c_std, otherwise configure will fail.
2386 AC_DEFUN([GLIBCXX_ENABLE_CHEADERS], [
2387   GLIBCXX_ENABLE(cheaders-obsolete,no,,
2388     [allow use of obsolete "C" headers for g++])
2389   GLIBCXX_ENABLE(cheaders,$1,[[[=KIND]]],
2390     [construct "C" headers for g++], [permit c|c_global|c_std])
2391   AC_MSG_NOTICE("C" header strategy set to $enable_cheaders)
2392   if test $enable_cheaders = c_std ; then
2393     AC_MSG_WARN([the --enable-cheaders=c_std configuration is obsolete, c_global should be used instead])
2394     AC_MSG_WARN([if you are unable to use c_global please report a bug or inform libstdc++@gcc.gnu.org])
2395     if test $enable_cheaders_obsolete != yes ; then
2396       AC_MSG_ERROR(use --enable-cheaders-obsolete to use c_std "C" headers)
2397     fi
2398   fi
2400   C_INCLUDE_DIR='${glibcxx_srcdir}/include/'$enable_cheaders
2402   # Allow overrides to configure.host here.
2403   if test $enable_cheaders = c_global; then
2404      c_compatibility=yes
2405   fi
2407   AC_SUBST(C_INCLUDE_DIR)
2408   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_C, test $enable_cheaders = c)
2409   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_C_STD, test $enable_cheaders = c_std)
2410   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_C_GLOBAL, test $enable_cheaders = c_global)
2411   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_COMPATIBILITY, test $c_compatibility = yes)
2416 dnl Check for which locale library to use.  The choice is mapped to
2417 dnl a subdirectory of config/locale.
2419 dnl Default is generic.
2421 AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [
2422   GLIBCXX_ENABLE(clocale,auto,[[[=MODEL]]],
2423     [use MODEL for target locale package],
2424     [permit generic|gnu|ieee_1003.1-2001|newlib|yes|no|auto])
2426   # Deal with gettext issues.  Default to not using it (=no) until we detect
2427   # support for it later.  Let the user turn it off via --e/d, but let that
2428   # default to on for easier handling.
2429   USE_NLS=no
2430   AC_ARG_ENABLE(nls,
2431     AC_HELP_STRING([--enable-nls],[use Native Language Support (default)]),
2432     [],
2433     [enable_nls=yes])
2435   # Either a known package, or "auto"
2436   if test $enable_clocale = no || test $enable_clocale = yes; then
2437      enable_clocale=auto
2438   fi
2439   enable_clocale_flag=$enable_clocale
2441   # Probe for locale model to use if none specified.
2442   # Default to "generic".
2443   if test $enable_clocale_flag = auto; then
2444     case ${target_os} in
2445       linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
2446         enable_clocale_flag=gnu
2447         ;;
2448       darwin*)
2449         enable_clocale_flag=darwin
2450         ;;
2451       dragonfly* | freebsd*)
2452         enable_clocale_flag=dragonfly
2453         ;;
2454       openbsd*)
2455         enable_clocale_flag=newlib
2456         ;;
2457       *)
2458         if test x"$with_newlib" = x"yes"; then
2459           enable_clocale_flag=newlib
2460         else
2461           enable_clocale_flag=generic
2462         fi
2463         ;;
2464     esac
2465   fi
2467   # Sanity check model, and test for special functionality.
2468   if test $enable_clocale_flag = gnu; then
2469     AC_EGREP_CPP([_GLIBCXX_ok], [
2470     #include <features.h>
2471     #if (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)) && !defined(__UCLIBC__)
2472       _GLIBCXX_ok
2473     #endif
2474     ], enable_clocale_flag=gnu, enable_clocale_flag=generic)
2476     # Set it to scream when it hurts.
2477     ac_save_CFLAGS="$CFLAGS"
2478     CFLAGS="-Wimplicit-function-declaration -Werror"
2480     # Use strxfrm_l if available.
2481     AC_TRY_COMPILE([#define _GNU_SOURCE 1
2482                     #include <string.h>
2483                     #include <locale.h>],
2484                     [char s[128]; __locale_t loc; strxfrm_l(s, "C", 5, loc);],
2485                     AC_DEFINE(HAVE_STRXFRM_L, 1,
2486                     [Define if strxfrm_l is available in <string.h>.]),)
2488     # Use strerror_l if available.
2489     AC_TRY_COMPILE([#define _GNU_SOURCE 1
2490                     #include <string.h>
2491                     #include <locale.h>],
2492                     [__locale_t loc; strerror_l(5, loc);],
2493                     AC_DEFINE(HAVE_STRERROR_L, 1,
2494                     [Define if strerror_l is available in <string.h>.]),)
2496     CFLAGS="$ac_save_CFLAGS"
2497   fi
2499   # Perhaps use strerror_r if available, and strerror_l isn't.
2500   ac_save_CFLAGS="$CFLAGS"
2501   CFLAGS="-Wimplicit-function-declaration -Werror"
2502   AC_TRY_COMPILE([#define _GNU_SOURCE 1
2503                   #include <string.h>
2504                   #include <locale.h>],
2505                   [char s[128]; strerror_r(5, s, 128);],
2506                   AC_DEFINE(HAVE_STRERROR_R, 1,
2507                   [Define if strerror_r is available in <string.h>.]),)
2508   CFLAGS="$ac_save_CFLAGS"
2510   # Set configure bits for specified locale package
2511   AC_MSG_CHECKING([for C locale to use])
2512   case ${enable_clocale_flag} in
2513     generic)
2514       AC_MSG_RESULT(generic)
2516       CLOCALE_H=config/locale/generic/c_locale.h
2517       CLOCALE_CC=config/locale/generic/c_locale.cc
2518       CCODECVT_CC=config/locale/generic/codecvt_members.cc
2519       CCOLLATE_CC=config/locale/generic/collate_members.cc
2520       CCTYPE_CC=config/locale/generic/ctype_members.cc
2521       CMESSAGES_H=config/locale/generic/messages_members.h
2522       CMESSAGES_CC=config/locale/generic/messages_members.cc
2523       CMONEY_CC=config/locale/generic/monetary_members.cc
2524       CNUMERIC_CC=config/locale/generic/numeric_members.cc
2525       CTIME_H=config/locale/generic/time_members.h
2526       CTIME_CC=config/locale/generic/time_members.cc
2527       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2528       ;;
2529     darwin)
2530       AC_MSG_RESULT(darwin)
2532       CLOCALE_H=config/locale/generic/c_locale.h
2533       CLOCALE_CC=config/locale/generic/c_locale.cc
2534       CCODECVT_CC=config/locale/generic/codecvt_members.cc
2535       CCOLLATE_CC=config/locale/generic/collate_members.cc
2536       CCTYPE_CC=config/locale/darwin/ctype_members.cc
2537       CMESSAGES_H=config/locale/generic/messages_members.h
2538       CMESSAGES_CC=config/locale/generic/messages_members.cc
2539       CMONEY_CC=config/locale/generic/monetary_members.cc
2540       CNUMERIC_CC=config/locale/generic/numeric_members.cc
2541       CTIME_H=config/locale/generic/time_members.h
2542       CTIME_CC=config/locale/generic/time_members.cc
2543       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2544       ;;
2546     dragonfly)
2547       AC_MSG_RESULT(dragonfly or freebsd)
2549       CLOCALE_H=config/locale/dragonfly/c_locale.h
2550       CLOCALE_CC=config/locale/dragonfly/c_locale.cc
2551       CCODECVT_CC=config/locale/dragonfly/codecvt_members.cc
2552       CCOLLATE_CC=config/locale/dragonfly/collate_members.cc
2553       CCTYPE_CC=config/locale/dragonfly/ctype_members.cc
2554       CMESSAGES_H=config/locale/generic/messages_members.h
2555       CMESSAGES_CC=config/locale/generic/messages_members.cc
2556       CMONEY_CC=config/locale/dragonfly/monetary_members.cc
2557       CNUMERIC_CC=config/locale/dragonfly/numeric_members.cc
2558       CTIME_H=config/locale/dragonfly/time_members.h
2559       CTIME_CC=config/locale/dragonfly/time_members.cc
2560       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2561       ;;
2563     gnu)
2564       AC_MSG_RESULT(gnu)
2566       # Declare intention to use gettext, and add support for specific
2567       # languages.
2568       # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT
2569       ALL_LINGUAS="de fr"
2571       # Don't call AM-GNU-GETTEXT here. Instead, assume glibc.
2572       AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no)
2573       if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
2574         USE_NLS=yes
2575       fi
2576       # Export the build objects.
2577       for ling in $ALL_LINGUAS; do \
2578         glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \
2579         glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \
2580       done
2581       AC_SUBST(glibcxx_MOFILES)
2582       AC_SUBST(glibcxx_POFILES)
2584       CLOCALE_H=config/locale/gnu/c_locale.h
2585       CLOCALE_CC=config/locale/gnu/c_locale.cc
2586       CCODECVT_CC=config/locale/gnu/codecvt_members.cc
2587       CCOLLATE_CC=config/locale/gnu/collate_members.cc
2588       CCTYPE_CC=config/locale/gnu/ctype_members.cc
2589       CMESSAGES_H=config/locale/gnu/messages_members.h
2590       CMESSAGES_CC=config/locale/gnu/messages_members.cc
2591       CMONEY_CC=config/locale/gnu/monetary_members.cc
2592       CNUMERIC_CC=config/locale/gnu/numeric_members.cc
2593       CTIME_H=config/locale/gnu/time_members.h
2594       CTIME_CC=config/locale/gnu/time_members.cc
2595       CLOCALE_INTERNAL_H=config/locale/gnu/c++locale_internal.h
2596       ;;
2597     ieee_1003.1-2001)
2598       AC_MSG_RESULT(IEEE 1003.1)
2600       CLOCALE_H=config/locale/ieee_1003.1-2001/c_locale.h
2601       CLOCALE_CC=config/locale/ieee_1003.1-2001/c_locale.cc
2602       CCODECVT_CC=config/locale/generic/codecvt_members.cc
2603       CCOLLATE_CC=config/locale/generic/collate_members.cc
2604       CCTYPE_CC=config/locale/generic/ctype_members.cc
2605       CMESSAGES_H=config/locale/ieee_1003.1-2001/messages_members.h
2606       CMESSAGES_CC=config/locale/ieee_1003.1-2001/messages_members.cc
2607       CMONEY_CC=config/locale/generic/monetary_members.cc
2608       CNUMERIC_CC=config/locale/generic/numeric_members.cc
2609       CTIME_H=config/locale/generic/time_members.h
2610       CTIME_CC=config/locale/generic/time_members.cc
2611       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2612       ;;
2613     newlib)
2614       AC_MSG_RESULT(newlib)
2616       CLOCALE_H=config/locale/generic/c_locale.h
2617       CLOCALE_CC=config/locale/generic/c_locale.cc
2618       CCODECVT_CC=config/locale/generic/codecvt_members.cc
2619       CCOLLATE_CC=config/locale/generic/collate_members.cc
2620       CCTYPE_CC=config/locale/newlib/ctype_members.cc
2621       CMESSAGES_H=config/locale/generic/messages_members.h
2622       CMESSAGES_CC=config/locale/generic/messages_members.cc
2623       CMONEY_CC=config/locale/generic/monetary_members.cc
2624       CNUMERIC_CC=config/locale/generic/numeric_members.cc
2625       CTIME_H=config/locale/generic/time_members.h
2626       CTIME_CC=config/locale/generic/time_members.cc
2627       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2628       ;;
2629   esac
2631   # This is where the testsuite looks for locale catalogs, using the
2632   # -DLOCALEDIR define during testsuite compilation.
2633   glibcxx_localedir=${glibcxx_builddir}/po/share/locale
2634   AC_SUBST(glibcxx_localedir)
2636   # A standalone libintl (e.g., GNU libintl) may be in use.
2637   if test $USE_NLS = yes; then
2638     AC_CHECK_HEADERS([libintl.h], [], USE_NLS=no)
2639     AC_SEARCH_LIBS(gettext, intl, [], USE_NLS=no)
2640   fi
2641   if test $USE_NLS = yes; then
2642     AC_DEFINE(_GLIBCXX_USE_NLS, 1,
2643               [Define if NLS translations are to be used.])
2644   fi
2646   AC_SUBST(USE_NLS)
2647   AC_SUBST(CLOCALE_H)
2648   AC_SUBST(CMESSAGES_H)
2649   AC_SUBST(CCODECVT_CC)
2650   AC_SUBST(CCOLLATE_CC)
2651   AC_SUBST(CCTYPE_CC)
2652   AC_SUBST(CMESSAGES_CC)
2653   AC_SUBST(CMONEY_CC)
2654   AC_SUBST(CNUMERIC_CC)
2655   AC_SUBST(CTIME_H)
2656   AC_SUBST(CTIME_CC)
2657   AC_SUBST(CLOCALE_CC)
2658   AC_SUBST(CLOCALE_INTERNAL_H)
2663 dnl Check for which std::allocator base class to use.  The choice is
2664 dnl mapped from a subdirectory of include/ext.
2666 dnl Default is new.
2668 AC_DEFUN([GLIBCXX_ENABLE_ALLOCATOR], [
2669   AC_MSG_CHECKING([for std::allocator base class])
2670   GLIBCXX_ENABLE(libstdcxx-allocator,auto,[[[=KIND]]],
2671     [use KIND for target std::allocator base],
2672     [permit new|malloc|mt|bitmap|pool|yes|no|auto])
2674   # If they didn't use this option switch, or if they specified --enable
2675   # with no specific model, we'll have to look for one.  If they
2676   # specified --disable (???), do likewise.
2677   if test $enable_libstdcxx_allocator = no ||
2678      test $enable_libstdcxx_allocator = yes;
2679   then
2680      enable_libstdcxx_allocator=auto
2681   fi
2683   # Either a known package, or "auto". Auto implies the default choice
2684   # for a particular platform.
2685   enable_libstdcxx_allocator_flag=$enable_libstdcxx_allocator
2687   # Probe for host-specific support if no specific model is specified.
2688   # Default to "new".
2689   if test $enable_libstdcxx_allocator_flag = auto; then
2690     case ${target_os} in
2691       linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
2692         enable_libstdcxx_allocator_flag=new
2693         ;;
2694       *)
2695         enable_libstdcxx_allocator_flag=new
2696         ;;
2697     esac
2698   fi
2699   AC_MSG_RESULT($enable_libstdcxx_allocator_flag)
2702   # Set configure bits for specified locale package
2703   case ${enable_libstdcxx_allocator_flag} in
2704     bitmap)
2705       ALLOCATOR_H=config/allocator/bitmap_allocator_base.h
2706       ALLOCATOR_NAME=__gnu_cxx::bitmap_allocator
2707       ;;
2708     malloc)
2709       ALLOCATOR_H=config/allocator/malloc_allocator_base.h
2710       ALLOCATOR_NAME=__gnu_cxx::malloc_allocator
2711       ;;
2712     mt)
2713       ALLOCATOR_H=config/allocator/mt_allocator_base.h
2714       ALLOCATOR_NAME=__gnu_cxx::__mt_alloc
2715       ;;
2716     new)
2717       ALLOCATOR_H=config/allocator/new_allocator_base.h
2718       ALLOCATOR_NAME=__gnu_cxx::new_allocator
2719       ;;
2720     pool)
2721       ALLOCATOR_H=config/allocator/pool_allocator_base.h
2722       ALLOCATOR_NAME=__gnu_cxx::__pool_alloc
2723       ;;
2724   esac
2726   GLIBCXX_CONDITIONAL(ENABLE_ALLOCATOR_NEW,
2727                       test $enable_libstdcxx_allocator_flag = new)
2728   AC_SUBST(ALLOCATOR_H)
2729   AC_SUBST(ALLOCATOR_NAME)
2734 dnl Check for whether the Boost-derived checks should be turned on.
2736 dnl --enable-concept-checks turns them on.
2737 dnl --disable-concept-checks leaves them off.
2738 dnl  +  Usage:  GLIBCXX_ENABLE_CONCEPT_CHECKS[(DEFAULT)]
2739 dnl       Where DEFAULT is either `yes' or `no'.
2741 AC_DEFUN([GLIBCXX_ENABLE_CONCEPT_CHECKS], [
2742   GLIBCXX_ENABLE(concept-checks,$1,,[use Boost-derived template checks])
2743   if test $enable_concept_checks = yes; then
2744     AC_DEFINE(_GLIBCXX_CONCEPT_CHECKS, 1,
2745               [Define to use concept checking code from the boost libraries.])
2746   fi
2750 dnl Use extern templates.
2752 dnl --enable-extern-template defines _GLIBCXX_EXTERN_TEMPLATE to 1
2753 dnl --disable-extern-template defines _GLIBCXX_EXTERN_TEMPLATE to 0
2755 dnl  +  Usage:  GLIBCXX_ENABLE_TEMPLATE[(DEFAULT)]
2756 dnl       Where DEFAULT is `yes' or `no'.
2758 AC_DEFUN([GLIBCXX_ENABLE_EXTERN_TEMPLATE], [
2760   GLIBCXX_ENABLE(extern-template,$1,,[enable extern template])
2762   AC_MSG_CHECKING([for extern template support])
2763   AC_MSG_RESULT([$enable_extern_template])
2765   GLIBCXX_CONDITIONAL(ENABLE_EXTERN_TEMPLATE, test $enable_extern_template = yes)
2769 dnl Use vtable verification.
2771 dnl --enable-vtable-verify defines _GLIBCXX_VTABLE_VERIFY to 1
2772 dnl --disable-vtable-verify defines _GLIBCXX_VTABLE_VERIFY to 0
2774 dnl  +  Usage:  GLIBCXX_ENABLE_VTABLE_VERIFY[(DEFAULT)]
2775 dnl       Where DEFAULT is `yes' or `no'.
2777 AC_DEFUN([GLIBCXX_ENABLE_VTABLE_VERIFY], [
2779   GLIBCXX_ENABLE(vtable-verify,$1,,[enable vtable verify])
2781   AC_MSG_CHECKING([for vtable verify support])
2782   AC_MSG_RESULT([$enable_vtable_verify])
2784   vtv_cygmin=no
2785   if test $enable_vtable_verify = yes; then
2786     case ${target_os} in
2787       cygwin*|mingw32*)
2788         VTV_CXXFLAGS="-fvtable-verify=std -Wl,-lvtv,-u_vtable_map_vars_start,-u_vtable_map_vars_end"
2789         VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,--rpath -Wl,${toplevel_builddir}/libvtv/.libs"
2790         vtv_cygmin=yes
2791         ;;
2792       darwin*)
2793         VTV_CXXFLAGS="-fvtable-verify=std -Wl,-u,_vtable_map_vars_start -Wl,-u,_vtable_map_vars_end"
2794         VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,-rpath,${toplevel_builddir}/libvtv/.libs"
2795         ;;
2796       solaris2*)
2797         VTV_CXXFLAGS="-fvtable-verify=std -Wl,-u_vtable_map_vars_start,-u_vtable_map_vars_end"
2798         VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,-R -Wl,${toplevel_builddir}/libvtv/.libs"
2799         ;;
2800       *)
2801         VTV_CXXFLAGS="-fvtable-verify=std -Wl,-u_vtable_map_vars_start,-u_vtable_map_vars_end"
2802         VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,--rpath -Wl,${toplevel_builddir}/libvtv/.libs"
2803         ;;
2804     esac
2805     VTV_PCH_CXXFLAGS="-fvtable-verify=std"
2806   else
2807     VTV_CXXFLAGS=
2808     VTV_PCH_CXXFLAGS=
2809     VTV_CXXLINKFLAGS=
2810   fi
2812   AC_SUBST(VTV_CXXFLAGS)
2813   AC_SUBST(VTV_PCH_CXXFLAGS)
2814   AC_SUBST(VTV_CXXLINKFLAGS)
2815   AM_CONDITIONAL(VTV_CYGMIN, test x$vtv_cygmin = xyes)
2816   GLIBCXX_CONDITIONAL(ENABLE_VTABLE_VERIFY, test $enable_vtable_verify = yes)
2820 dnl Check for parallel mode pre-requisites, including OpenMP support.
2822 dnl  +  Usage:  GLIBCXX_ENABLE_PARALLEL
2824 AC_DEFUN([GLIBCXX_ENABLE_PARALLEL], [
2826   enable_parallel=no;
2828   # See if configured libgomp/omp.h exists. (libgomp may be in
2829   # noconfigdirs but not explicitly disabled.)
2830   if echo " ${TARGET_CONFIGDIRS} " | grep " libgomp " > /dev/null 2>&1 ; then
2831     enable_parallel=yes;
2832   else
2833     AC_MSG_NOTICE([target-libgomp not built])
2834   fi
2836   AC_MSG_CHECKING([for parallel mode support])
2837   AC_MSG_RESULT([$enable_parallel])
2842 dnl Check for which I/O library to use:  stdio and POSIX, or pure stdio.
2844 dnl Default is stdio_posix.
2846 AC_DEFUN([GLIBCXX_ENABLE_CSTDIO], [
2847   AC_MSG_CHECKING([for underlying I/O to use])
2848   GLIBCXX_ENABLE(cstdio,stdio,[[[=PACKAGE]]],
2849     [use target-specific I/O package], [permit stdio|stdio_posix|stdio_pure])
2851   # The only available I/O model is based on stdio, via basic_file_stdio.
2852   # The default "stdio" is actually "stdio + POSIX" because it uses fdopen(3)
2853   # to get a file descriptor and then uses read(3) and write(3) with it.
2854   # The "stdio_pure" model doesn't use fdopen and only uses FILE* for I/O.
2855   case ${enable_cstdio} in
2856     stdio*)
2857       CSTDIO_H=config/io/c_io_stdio.h
2858       BASIC_FILE_H=config/io/basic_file_stdio.h
2859       BASIC_FILE_CC=config/io/basic_file_stdio.cc
2860       AC_MSG_RESULT(stdio)
2862       if test "x$enable_cstdio" = "xstdio_pure" ; then
2863         AC_DEFINE(_GLIBCXX_USE_STDIO_PURE, 1,
2864                   [Define to restrict std::__basic_file<> to stdio APIs.])
2865       fi
2866       ;;
2867   esac
2869   AC_SUBST(CSTDIO_H)
2870   AC_SUBST(BASIC_FILE_H)
2871   AC_SUBST(BASIC_FILE_CC)
2876 dnl Check for "unusual" flags to pass to the compiler while building.
2878 dnl --enable-cxx-flags='-foo -bar -baz' is a general method for passing
2879 dnl     experimental flags such as -fpch, -fIMI, -Dfloat=char, etc.
2880 dnl --disable-cxx-flags passes nothing.
2881 dnl  +  See http://gcc.gnu.org/ml/libstdc++/2000-q2/msg00131.html
2882 dnl         http://gcc.gnu.org/ml/libstdc++/2000-q2/msg00284.html
2883 dnl         http://gcc.gnu.org/ml/libstdc++/2000-q1/msg00035.html
2884 dnl  +  Usage:  GLIBCXX_ENABLE_CXX_FLAGS(default flags)
2885 dnl       If "default flags" is an empty string, the effect is the same
2886 dnl       as --disable or --enable=no.
2888 AC_DEFUN([GLIBCXX_ENABLE_CXX_FLAGS], [dnl
2889   AC_MSG_CHECKING([for extra compiler flags for building])
2890   GLIBCXX_ENABLE(cxx-flags,$1,[=FLAGS],
2891     [pass compiler FLAGS when building library],
2892     [case "x$enable_cxx_flags" in
2893       xno | x)   enable_cxx_flags= ;;
2894       x-*)       ;;
2895       *)         AC_MSG_ERROR(_g_switch needs compiler flags as arguments) ;;
2896      esac])
2898   # Run through flags (either default or command-line) and set anything
2899   # extra (e.g., #defines) that must accompany particular g++ options.
2900   if test -n "$enable_cxx_flags"; then
2901     for f in $enable_cxx_flags; do
2902       case "$f" in
2903         -fhonor-std)  ;;
2904         -*)  ;;
2905         *)   # and we're trying to pass /what/ exactly?
2906              AC_MSG_ERROR([compiler flags start with a -]) ;;
2907       esac
2908     done
2909   fi
2911   EXTRA_CXX_FLAGS="$enable_cxx_flags"
2912   AC_MSG_RESULT($EXTRA_CXX_FLAGS)
2913   AC_SUBST(EXTRA_CXX_FLAGS)
2918 dnl Check to see if debugging libraries are to be built.
2920 dnl --enable-libstdcxx-debug
2921 dnl builds a separate set of debugging libraries in addition to the
2922 dnl normal (shared, static) libstdc++ binaries.
2924 dnl --disable-libstdcxx-debug
2925 dnl builds only one (non-debug) version of libstdc++.
2927 dnl --enable-libstdcxx-debug-flags=FLAGS
2928 dnl iff --enable-debug == yes, then use FLAGS to build the debug library.
2930 dnl  +  Usage:  GLIBCXX_ENABLE_DEBUG[(DEFAULT)]
2931 dnl       Where DEFAULT is either `yes' or `no'.
2933 AC_DEFUN([GLIBCXX_ENABLE_DEBUG], [
2934   AC_MSG_CHECKING([for additional debug build])
2935   skip_debug_build=
2936   GLIBCXX_ENABLE(libstdcxx-debug,$1,,[build extra debug library])
2937   if test x$enable_libstdcxx_debug = xyes; then
2938     if test -f $toplevel_builddir/../stage_final \
2939       && test -f $toplevel_builddir/../stage_current; then
2940       stage_final=`cat $toplevel_builddir/../stage_final`
2941       stage_current=`cat $toplevel_builddir/../stage_current`
2942       if test x$stage_current != x$stage_final ; then
2943         skip_debug_build=" (skipped for bootstrap stage $stage_current)"
2944         enable_libstdcxx_debug=no
2945       fi
2946     fi
2947   fi
2948   AC_MSG_RESULT($enable_libstdcxx_debug$skip_debug_build)
2949   GLIBCXX_CONDITIONAL(GLIBCXX_BUILD_DEBUG, test $enable_libstdcxx_debug = yes)
2954 dnl Check for explicit debug flags.
2956 dnl --enable-libstdcxx-debug-flags='-O1'
2957 dnl is a general method for passing flags to be used when
2958 dnl building debug libraries with --enable-libstdcxx-debug.
2960 dnl --disable-libstdcxx-debug-flags does nothing.
2961 dnl  +  Usage:  GLIBCXX_ENABLE_DEBUG_FLAGS(default flags)
2962 dnl       If "default flags" is an empty string, the effect is the same
2963 dnl       as --disable or --enable=no.
2965 AC_DEFUN([GLIBCXX_ENABLE_DEBUG_FLAGS], [
2966   GLIBCXX_ENABLE(libstdcxx-debug-flags,[$1],[=FLAGS],
2967     [pass compiler FLAGS when building debug library],
2968     [case "x$enable_libstdcxx_debug_flags" in
2969       xno | x)    enable_libstdcxx_debug_flags= ;;
2970       x-*)        ;;
2971       *)          AC_MSG_ERROR(_g_switch needs compiler flags as arguments) ;;
2972      esac])
2974   # Option parsed, now set things appropriately
2975   DEBUG_FLAGS="$enable_libstdcxx_debug_flags"
2976   AC_SUBST(DEBUG_FLAGS)
2978   AC_MSG_NOTICE([Debug build flags set to $DEBUG_FLAGS])
2983 dnl Check if the user only wants a freestanding library implementation.
2985 dnl --disable-hosted-libstdcxx will turn off most of the library build,
2986 dnl installing only the headers required by [17.4.1.3] and the language
2987 dnl support library.  More than that will be built (to keep the Makefiles
2988 dnl conveniently clean), but not installed.
2990 dnl Sets:
2991 dnl  is_hosted  (yes/no)
2993 dnl Defines:
2994 dnl  _GLIBCXX_HOSTED   (always defined, either to 1 or 0)
2996 AC_DEFUN([GLIBCXX_ENABLE_HOSTED], [
2997   AC_ARG_ENABLE([hosted-libstdcxx],
2998     AC_HELP_STRING([--disable-hosted-libstdcxx],
2999                    [only build freestanding C++ runtime support]),,
3000     [case "$host" in
3001         arm*-*-symbianelf*)
3002             enable_hosted_libstdcxx=no
3003             ;;
3004         *)
3005             enable_hosted_libstdcxx=yes
3006             ;;
3007      esac])
3008   if test "$enable_hosted_libstdcxx" = no; then
3009     AC_MSG_NOTICE([Only freestanding libraries will be built])
3010     is_hosted=no
3011     hosted_define=0
3012     enable_abi_check=no
3013     enable_libstdcxx_pch=no
3014   else
3015     is_hosted=yes
3016     hosted_define=1
3017   fi
3018   GLIBCXX_CONDITIONAL(GLIBCXX_HOSTED, test $is_hosted = yes)
3019   AC_DEFINE_UNQUOTED(_GLIBCXX_HOSTED, $hosted_define,
3020     [Define to 1 if a full hosted library is built, or 0 if freestanding.])
3025 dnl Check if the user wants a non-verbose library implementation.
3027 dnl --disable-libstdcxx-verbose will turn off descriptive messages to
3028 dnl standard error on termination.
3030 dnl Defines:
3031 dnl  _GLIBCXX_VERBOSE (always defined, either to 1 or 0)
3033 AC_DEFUN([GLIBCXX_ENABLE_VERBOSE], [
3034   AC_ARG_ENABLE([libstdcxx-verbose],
3035     AC_HELP_STRING([--disable-libstdcxx-verbose],
3036                    [disable termination messages to standard error]),,
3037                    [enable_libstdcxx_verbose=yes])
3038   if test x"$enable_libstdcxx_verbose" = xyes; then
3039     verbose_define=1
3040   else
3041     AC_MSG_NOTICE([verbose termination messages are disabled])
3042     verbose_define=0
3043   fi
3044   AC_DEFINE_UNQUOTED(_GLIBCXX_VERBOSE, $verbose_define,
3045     [Define to 1 if a verbose library is built, or 0 otherwise.])
3050 dnl Check for template specializations for the 'long long' type.
3051 dnl The result determines only whether 'long long' I/O is enabled; things
3052 dnl like numeric_limits<> specializations are always available.
3054 dnl --enable-long-long defines _GLIBCXX_USE_LONG_LONG
3055 dnl --disable-long-long leaves _GLIBCXX_USE_LONG_LONG undefined
3056 dnl  +  Usage:  GLIBCXX_ENABLE_LONG_LONG[(DEFAULT)]
3057 dnl       Where DEFAULT is either `yes' or `no'.
3059 AC_DEFUN([GLIBCXX_ENABLE_LONG_LONG], [
3060   GLIBCXX_ENABLE(long-long,$1,,[enable template specializations for 'long long'])
3061   if test $enable_long_long = yes; then
3062     AC_DEFINE(_GLIBCXX_USE_LONG_LONG, 1,
3063               [Define if code specialized for long long should be used.])
3064   fi
3065   AC_MSG_CHECKING([for enabled long long specializations])
3066   AC_MSG_RESULT([$enable_long_long])
3071 dnl Check for decimal floating point.
3072 dnl See:
3073 dnl http://gcc.gnu.org/onlinedocs/gcc/Decimal-Float.html#Decimal-Float
3075 dnl This checks to see if the host supports decimal floating point types.
3077 dnl Defines:
3078 dnl  _GLIBCXX_USE_DECIMAL_FLOAT
3080 AC_DEFUN([GLIBCXX_ENABLE_DECIMAL_FLOAT], [
3082   # Fake what AC_TRY_COMPILE does, without linking as this is
3083   # unnecessary for this test.
3085     cat > conftest.$ac_ext << EOF
3086 [#]line __oline__ "configure"
3087 int main()
3089   _Decimal32 d1;
3090   _Decimal64 d2;
3091   _Decimal128 d3;
3092   return 0;
3096     AC_MSG_CHECKING([for ISO/IEC TR 24733 ])
3097     if AC_TRY_EVAL(ac_compile); then
3098       AC_DEFINE(_GLIBCXX_USE_DECIMAL_FLOAT, 1,
3099       [Define if ISO/IEC TR 24733 decimal floating point types are supported on this host.])
3100       enable_dfp=yes
3101     else
3102       enable_dfp=no
3103     fi
3104     AC_MSG_RESULT($enable_dfp)
3105     rm -f conftest*
3109 dnl Check for GNU 128-bit integer and floating point types.
3111 dnl Note: also checks that the types aren't standard types.
3113 dnl Defines:
3114 dnl  _GLIBCXX_USE_INT128
3115 dnl  ENABLE_FLOAT128
3117 AC_DEFUN([GLIBCXX_ENABLE_INT128_FLOAT128], [
3119   AC_LANG_SAVE
3120   AC_LANG_CPLUSPLUS
3122   # Fake what AC_TRY_COMPILE does, without linking as this is
3123   # unnecessary for this test.
3125     cat > conftest.$ac_ext << EOF
3126 [#]line __oline__ "configure"
3127 template<typename T1, typename T2>
3128   struct same
3129   { typedef T2 type; };
3131 template<typename T>
3132   struct same<T, T>;
3134 int main()
3136   typename same<long, __int128>::type                i1;
3137   typename same<long long, __int128>::type           i2;
3141     AC_MSG_CHECKING([for __int128])
3142     if AC_TRY_EVAL(ac_compile); then
3143       AC_DEFINE(_GLIBCXX_USE_INT128, 1,
3144       [Define if __int128 is supported on this host.])
3145       enable_int128=yes
3146     else
3147       enable_int128=no
3148     fi
3149     AC_MSG_RESULT($enable_int128)
3150     rm -f conftest*
3152     cat > conftest.$ac_ext << EOF
3153 [#]line __oline__ "configure"
3154 template<typename T1, typename T2>
3155   struct same
3156   { typedef T2 type; };
3158 template<typename T>
3159   struct same<T, T>;
3161 int main()
3163   typename same<double, __float128>::type      f1;
3164   typename same<long double, __float128>::type f2;
3168     AC_MSG_CHECKING([for __float128])
3169     if AC_TRY_EVAL(ac_compile); then
3170       enable_float128=yes
3171     else
3172       enable_float128=no
3173     fi
3174     AC_MSG_RESULT($enable_float128)
3175     GLIBCXX_CONDITIONAL(ENABLE_FLOAT128, test $enable_float128 = yes)
3176     rm -f conftest*
3178   AC_LANG_RESTORE
3182 dnl Check for template specializations for the 'wchar_t' type.
3184 dnl --enable-wchar_t defines _GLIBCXX_USE_WCHAR_T
3185 dnl --disable-wchar_t leaves _GLIBCXX_USE_WCHAR_T undefined
3186 dnl  +  Usage:  GLIBCXX_ENABLE_WCHAR_T[(DEFAULT)]
3187 dnl       Where DEFAULT is either `yes' or `no'.
3189 dnl Necessary support must also be present.
3191 AC_DEFUN([GLIBCXX_ENABLE_WCHAR_T], [
3192   GLIBCXX_ENABLE(wchar_t,$1,,[enable template specializations for 'wchar_t'])
3194   # Test wchar.h for mbstate_t, which is needed for char_traits and fpos.
3195   AC_CHECK_HEADERS(wchar.h, ac_has_wchar_h=yes, ac_has_wchar_h=no)
3196   AC_MSG_CHECKING([for mbstate_t])
3197   AC_TRY_COMPILE([#include <wchar.h>],
3198   [mbstate_t teststate;],
3199   have_mbstate_t=yes, have_mbstate_t=no)
3200   AC_MSG_RESULT($have_mbstate_t)
3201   if test x"$have_mbstate_t" = xyes; then
3202     AC_DEFINE(HAVE_MBSTATE_T,1,[Define if mbstate_t exists in wchar.h.])
3203   fi
3205   # Test it always, for use in GLIBCXX_ENABLE_C99, together with
3206   # ac_has_wchar_h.
3207   AC_CHECK_HEADERS(wctype.h, ac_has_wctype_h=yes, ac_has_wctype_h=no)
3209   if test x"$enable_wchar_t" = x"yes"; then
3211     AC_LANG_SAVE
3212     AC_LANG_CPLUSPLUS
3214     if test x"$ac_has_wchar_h" = xyes &&
3215        test x"$ac_has_wctype_h" = xyes; then
3216       AC_TRY_COMPILE([#include <wchar.h>
3217                       #include <stddef.h>
3218                       wint_t i;
3219                       long l = WEOF;
3220                       long j = WCHAR_MIN;
3221                       long k = WCHAR_MAX;
3222                       namespace test
3223                       {
3224                         using ::btowc;
3225                         using ::fgetwc;
3226                         using ::fgetws;
3227                         using ::fputwc;
3228                         using ::fputws;
3229                         using ::fwide;
3230                         using ::fwprintf;
3231                         using ::fwscanf;
3232                         using ::getwc;
3233                         using ::getwchar;
3234                         using ::mbrlen;
3235                         using ::mbrtowc;
3236                         using ::mbsinit;
3237                         using ::mbsrtowcs;
3238                         using ::putwc;
3239                         using ::putwchar;
3240                         using ::swprintf;
3241                         using ::swscanf;
3242                         using ::ungetwc;
3243                         using ::vfwprintf;
3244                         using ::vswprintf;
3245                         using ::vwprintf;
3246                         using ::wcrtomb;
3247                         using ::wcscat;
3248                         using ::wcschr;
3249                         using ::wcscmp;
3250                         using ::wcscoll;
3251                         using ::wcscpy;
3252                         using ::wcscspn;
3253                         using ::wcsftime;
3254                         using ::wcslen;
3255                         using ::wcsncat;
3256                         using ::wcsncmp;
3257                         using ::wcsncpy;
3258                         using ::wcspbrk;
3259                         using ::wcsrchr;
3260                         using ::wcsrtombs;
3261                         using ::wcsspn;
3262                         using ::wcsstr;
3263                         using ::wcstod;
3264                         using ::wcstok;
3265                         using ::wcstol;
3266                         using ::wcstoul;
3267                         using ::wcsxfrm;
3268                         using ::wctob;
3269                         using ::wmemchr;
3270                         using ::wmemcmp;
3271                         using ::wmemcpy;
3272                         using ::wmemmove;
3273                         using ::wmemset;
3274                         using ::wprintf;
3275                         using ::wscanf;
3276                       }
3277                      ],[],[], [enable_wchar_t=no])
3278     else
3279       enable_wchar_t=no
3280     fi
3282     AC_LANG_RESTORE
3283   fi
3285   if test x"$enable_wchar_t" = x"yes"; then
3286     AC_DEFINE(_GLIBCXX_USE_WCHAR_T, 1,
3287               [Define if code specialized for wchar_t should be used.])
3288   fi
3290   AC_MSG_CHECKING([for enabled wchar_t specializations])
3291   AC_MSG_RESULT([$enable_wchar_t])
3296 dnl Check to see if building and using a C++ precompiled header can be done.
3298 dnl --enable-libstdcxx-pch=yes
3299 dnl default, this shows intent to use stdc++.h.gch If it looks like it
3300 dnl may work, after some light-hearted attempts to puzzle out compiler
3301 dnl support, flip bits on in include/Makefile.am
3303 dnl --disable-libstdcxx-pch
3304 dnl turns off attempts to use or build stdc++.h.gch.
3306 dnl Substs:
3307 dnl  glibcxx_PCHFLAGS
3309 AC_DEFUN([GLIBCXX_ENABLE_PCH], [
3310   GLIBCXX_ENABLE(libstdcxx-pch,$1,,[build pre-compiled libstdc++ headers])
3311   if test $enable_libstdcxx_pch = yes; then
3312     AC_CACHE_CHECK([for compiler with PCH support],
3313       [glibcxx_cv_prog_CXX_pch],
3314       [ac_save_CXXFLAGS="$CXXFLAGS"
3315        CXXFLAGS="$CXXFLAGS -Werror -Winvalid-pch -Wno-deprecated"
3316        AC_LANG_SAVE
3317        AC_LANG_CPLUSPLUS
3318        echo '#include <math.h>' > conftest.h
3319        if $CXX $CXXFLAGS $CPPFLAGS -x c++-header conftest.h \
3320                           -o conftest.h.gch 1>&5 2>&1 &&
3321                 echo '#error "pch failed"' > conftest.h &&
3322           echo '#include "conftest.h"' > conftest.cc &&
3323                $CXX -c $CXXFLAGS $CPPFLAGS conftest.cc 1>&5 2>&1 ;
3324        then
3325          glibcxx_cv_prog_CXX_pch=yes
3326        else
3327          glibcxx_cv_prog_CXX_pch=no
3328        fi
3329        rm -f conftest*
3330        CXXFLAGS=$ac_save_CXXFLAGS
3331        AC_LANG_RESTORE
3332       ])
3333     enable_libstdcxx_pch=$glibcxx_cv_prog_CXX_pch
3334   fi
3336   AC_MSG_CHECKING([for enabled PCH])
3337   AC_MSG_RESULT([$enable_libstdcxx_pch])
3339   GLIBCXX_CONDITIONAL(GLIBCXX_BUILD_PCH, test $enable_libstdcxx_pch = yes)
3340   if test $enable_libstdcxx_pch = yes; then
3341     glibcxx_PCHFLAGS="-include bits/stdc++.h"
3342   else
3343     glibcxx_PCHFLAGS=""
3344   fi
3345   AC_SUBST(glibcxx_PCHFLAGS)
3350 dnl Check for atomic builtins.
3351 dnl See:
3352 dnl http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html
3354 dnl This checks to see if the host supports the compiler-generated
3355 dnl builtins for atomic operations for various integral sizes. Note, this
3356 dnl is intended to be an all-or-nothing switch, so all the atomic operations
3357 dnl that are used should be checked.
3359 dnl Note:
3360 dnl libgomp and libgfortran use a link test, see CHECK_SYNC_FETCH_AND_ADD.
3362 AC_DEFUN([GLIBCXX_ENABLE_ATOMIC_BUILTINS], [
3363   AC_LANG_SAVE
3364   AC_LANG_CPLUSPLUS
3365   old_CXXFLAGS="$CXXFLAGS"
3367   # Do link tests if possible, instead asm tests, limited to some platforms
3368   # see discussion in PR target/40134, PR libstdc++/40133 and the thread
3369   # starting at http://gcc.gnu.org/ml/gcc-patches/2009-07/msg00322.html
3370   atomic_builtins_link_tests=no
3371   if test x$gcc_no_link != xyes; then
3372     # Can do link tests. Limit to some tested platforms
3373     case "$host" in
3374       *-*-linux* | *-*-uclinux* | *-*-kfreebsd*-gnu | *-*-gnu*)
3375         atomic_builtins_link_tests=yes
3376         ;;
3377     esac
3378   fi
3380   if test x$atomic_builtins_link_tests = xyes; then
3382   # Do link tests.
3384   CXXFLAGS="$CXXFLAGS -fno-exceptions"
3386   AC_MSG_CHECKING([for atomic builtins for bool])
3387   AC_CACHE_VAL(glibcxx_cv_atomic_bool, [
3388     AC_TRY_LINK(
3389       [ ],
3390       [typedef bool atomic_type;
3391        atomic_type c1;
3392        atomic_type c2;
3393        atomic_type c3(0);
3394        // N.B. __atomic_fetch_add is not supported for bool.
3395        __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3396                                    __ATOMIC_RELAXED);
3397        __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3398        __atomic_load_n(&c1, __ATOMIC_RELAXED);
3399       ],
3400       [glibcxx_cv_atomic_bool=yes],
3401       [glibcxx_cv_atomic_bool=no])
3402   ])
3403   AC_MSG_RESULT($glibcxx_cv_atomic_bool)
3405   AC_MSG_CHECKING([for atomic builtins for short])
3406   AC_CACHE_VAL(glibcxx_cv_atomic_short, [
3407     AC_TRY_LINK(
3408       [ ],
3409       [typedef short atomic_type;
3410        atomic_type c1;
3411        atomic_type c2;
3412        atomic_type c3(0);
3413        __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3414        __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3415                                    __ATOMIC_RELAXED);
3416        __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3417        __atomic_load_n(&c1, __ATOMIC_RELAXED);
3418       ],
3419       [glibcxx_cv_atomic_short=yes],
3420       [glibcxx_cv_atomic_short=no])
3421   ])
3422   AC_MSG_RESULT($glibcxx_cv_atomic_short)
3424   AC_MSG_CHECKING([for atomic builtins for int])
3425   AC_CACHE_VAL(glibcxx_cv_atomic_int, [
3426     AC_TRY_LINK(
3427       [ ],
3428       [typedef int atomic_type;
3429        atomic_type c1;
3430        atomic_type c2;
3431        atomic_type c3(0);
3432        __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3433        __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3434                                    __ATOMIC_RELAXED);
3435        __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3436        __atomic_load_n(&c1, __ATOMIC_RELAXED);
3437       ],
3438       [glibcxx_cv_atomic_int=yes],
3439       [glibcxx_cv_atomic_int=no])
3440   ])
3441   AC_MSG_RESULT($glibcxx_cv_atomic_int)
3443   AC_MSG_CHECKING([for atomic builtins for long long])
3444   AC_CACHE_VAL(glibcxx_cv_atomic_long_long, [
3445     AC_TRY_LINK(
3446       [ ],
3447       [typedef long long atomic_type;
3448        atomic_type c1;
3449        atomic_type c2;
3450        atomic_type c3(0);
3451        __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3452        __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3453                                    __ATOMIC_RELAXED);
3454        __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3455        __atomic_load_n(&c1, __ATOMIC_RELAXED);
3456       ],
3457       [glibcxx_cv_atomic_long_long=yes],
3458       [glibcxx_cv_atomic_long_long=no])
3459   ])
3460   AC_MSG_RESULT($glibcxx_cv_atomic_long_long)
3462   else
3464   # Do asm tests.
3466   # Compile unoptimized.
3467   CXXFLAGS='-O0 -S'
3469   # Fake what AC_TRY_COMPILE does.
3471     cat > conftest.$ac_ext << EOF
3472 [#]line __oline__ "configure"
3473 int main()
3475   typedef bool atomic_type;
3476   atomic_type c1;
3477   atomic_type c2;
3478   atomic_type c3(0);
3479   // N.B. __atomic_fetch_add is not supported for bool.
3480   __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3481                               __ATOMIC_RELAXED);
3482   __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3483   __atomic_load_n(&c1, __ATOMIC_RELAXED);
3485   return 0;
3489     AC_MSG_CHECKING([for atomic builtins for bool])
3490     if AC_TRY_EVAL(ac_compile); then
3491       if grep __atomic_ conftest.s >/dev/null 2>&1 ; then
3492         glibcxx_cv_atomic_bool=no
3493       else
3494         glibcxx_cv_atomic_bool=yes
3495       fi
3496     fi
3497     AC_MSG_RESULT($glibcxx_cv_atomic_bool)
3498     rm -f conftest*
3500     cat > conftest.$ac_ext << EOF
3501 [#]line __oline__ "configure"
3502 int main()
3504   typedef short atomic_type;
3505   atomic_type c1;
3506   atomic_type c2;
3507   atomic_type c3(0);
3508   __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3509   __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3510                               __ATOMIC_RELAXED);
3511   __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3512   __atomic_load_n(&c1, __ATOMIC_RELAXED);
3514   return 0;
3518     AC_MSG_CHECKING([for atomic builtins for short])
3519     if AC_TRY_EVAL(ac_compile); then
3520       if grep __atomic_ conftest.s >/dev/null 2>&1 ; then
3521         glibcxx_cv_atomic_short=no
3522       else
3523         glibcxx_cv_atomic_short=yes
3524       fi
3525     fi
3526     AC_MSG_RESULT($glibcxx_cv_atomic_short)
3527     rm -f conftest*
3529     cat > conftest.$ac_ext << EOF
3530 [#]line __oline__ "configure"
3531 int main()
3533   // NB: _Atomic_word not necessarily int.
3534   typedef int atomic_type;
3535   atomic_type c1;
3536   atomic_type c2;
3537   atomic_type c3(0);
3538   __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3539   __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3540                               __ATOMIC_RELAXED);
3541   __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3542   __atomic_load_n(&c1, __ATOMIC_RELAXED);
3544   return 0;
3548     AC_MSG_CHECKING([for atomic builtins for int])
3549     if AC_TRY_EVAL(ac_compile); then
3550       if grep __atomic_ conftest.s >/dev/null 2>&1 ; then
3551         glibcxx_cv_atomic_int=no
3552       else
3553         glibcxx_cv_atomic_int=yes
3554       fi
3555     fi
3556     AC_MSG_RESULT($glibcxx_cv_atomic_int)
3557     rm -f conftest*
3559     cat > conftest.$ac_ext << EOF
3560 [#]line __oline__ "configure"
3561 int main()
3563   typedef long long atomic_type;
3564   atomic_type c1;
3565   atomic_type c2;
3566   atomic_type c3(0);
3567   __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3568   __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3569                               __ATOMIC_RELAXED);
3570   __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3571   __atomic_load_n(&c1, __ATOMIC_RELAXED);
3573   return 0;
3577     AC_MSG_CHECKING([for atomic builtins for long long])
3578     if AC_TRY_EVAL(ac_compile); then
3579       if grep __atomic_ conftest.s >/dev/null 2>&1 ; then
3580         glibcxx_cv_atomic_long_long=no
3581       else
3582         glibcxx_cv_atomic_long_long=yes
3583       fi
3584     fi
3585     AC_MSG_RESULT($glibcxx_cv_atomic_long_long)
3586     rm -f conftest*
3588   fi
3590   CXXFLAGS="$old_CXXFLAGS"
3591   AC_LANG_RESTORE
3593   # Set atomicity_dir to builtins if all but the long long test above passes,
3594   # or if the builtins were already chosen (e.g. by configure.host).
3595   if { test "$glibcxx_cv_atomic_bool" = yes \
3596      && test "$glibcxx_cv_atomic_short" = yes \
3597      && test "$glibcxx_cv_atomic_int" = yes; } \
3598      || test "$atomicity_dir" = "cpu/generic/atomicity_builtins"; then
3599     AC_DEFINE(_GLIBCXX_ATOMIC_BUILTINS, 1,
3600     [Define if the compiler supports C++11 atomics.])
3601     atomicity_dir=cpu/generic/atomicity_builtins
3602   fi
3604   # If still generic, set to mutex.
3605   if test $atomicity_dir = "cpu/generic" ; then
3606     atomicity_dir=cpu/generic/atomicity_mutex
3607     AC_MSG_WARN([No native atomic operations are provided for this platform.])
3608       if test "x$target_thread_file" = xsingle; then
3609         AC_MSG_WARN([They cannot be faked when thread support is disabled.])
3610         AC_MSG_WARN([Thread-safety of certain classes is not guaranteed.])
3611       else
3612         AC_MSG_WARN([They will be faked using a mutex.])
3613         AC_MSG_WARN([Performance of certain classes will degrade as a result.])
3614       fi
3615   fi
3620 dnl Set default lock policy for synchronizing shared_ptr reference counting.
3622 dnl --with-libstdcxx-lock-policy=auto
3623 dnl     Use atomic operations for shared_ptr reference counting only if
3624 dnl     the default target supports atomic compare-and-swap.
3625 dnl --with-libstdcxx-lock-policy=atomic
3626 dnl     Use atomic operations for shared_ptr reference counting.
3627 dnl --with-libstdcxx-lock-policy=mutex
3628 dnl     Use a mutex to synchronize shared_ptr reference counting.
3630 dnl This controls the value of __gnu_cxx::__default_lock_policy, which
3631 dnl determines how shared_ptr reference counts are synchronized.
3632 dnl The option "atomic" means that atomic operations should be used,
3633 dnl "mutex" means that a mutex will be used. The default option, "auto",
3634 dnl will check if the target supports the compiler-generated builtins
3635 dnl for atomic compare-and-swap operations for 2-byte and 4-byte integers,
3636 dnl and will use "atomic" if supported, "mutex" otherwise.
3637 dnl This option is ignored if the thread model used by GCC is "single",
3638 dnl as no synchronization is used at all in that case.
3639 dnl This option affects the library ABI (except in the "single" thread model).
3641 dnl Defines _GLIBCXX_HAVE_ATOMIC_LOCK_POLICY to 1 if atomics should be used.
3643 AC_DEFUN([GLIBCXX_ENABLE_LOCK_POLICY], [
3645   AC_ARG_WITH([libstdcxx-lock-policy],
3646     AC_HELP_STRING([--with-libstdcxx-lock-policy={atomic,mutex,auto}],
3647       [synchronization policy for shared_ptr reference counting [default=auto]]),
3648               [libstdcxx_atomic_lock_policy=$withval],
3649               [libstdcxx_atomic_lock_policy=auto])
3651   case "$libstdcxx_atomic_lock_policy" in
3652     atomic|mutex|auto) ;;
3653     *) AC_MSG_ERROR([Invalid argument for --with-libstdcxx-lock-policy]) ;;
3654   esac
3655   AC_MSG_CHECKING([for lock policy for shared_ptr reference counts])
3657   if test x"$libstdcxx_atomic_lock_policy" = x"auto"; then
3658     AC_LANG_SAVE
3659     AC_LANG_CPLUSPLUS
3660     ac_save_CXXFLAGS="$CXXFLAGS"
3662     dnl Why do we care about 2-byte CAS on targets with 4-byte _Atomic_word?!
3663     AC_TRY_COMPILE([
3664     #if ! defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2
3665     # error "No 2-byte compare-and-swap"
3666     #elif ! defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
3667     # error "No 4-byte compare-and-swap"
3668     #endif
3669     ],,
3670     [libstdcxx_atomic_lock_policy=atomic],
3671     [libstdcxx_atomic_lock_policy=mutex])
3672     AC_LANG_RESTORE
3673     CXXFLAGS="$ac_save_CXXFLAGS"
3674   fi
3676   if test x"$libstdcxx_atomic_lock_policy" = x"atomic"; then
3677     AC_MSG_RESULT(atomic)
3678     AC_DEFINE(HAVE_ATOMIC_LOCK_POLICY,1,
3679       [Defined if shared_ptr reference counting should use atomic operations.])
3680   else
3681     AC_MSG_RESULT(mutex)
3682   fi
3687 dnl Allow visibility attributes to be used on namespaces, objects, etc.
3689 dnl --enable-libstdcxx-visibility enables attempt to use visibility attributes.
3690 dnl --disable-libstdcxx-visibility turns off all use of visibility attributes.
3691 dnl  +  Usage:  GLIBCXX_ENABLE_LIBSTDCXX_VISIBILITY[(DEFAULT)]
3692 dnl       Where DEFAULT is 'yes'.
3694 AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_VISIBILITY], [
3695 GLIBCXX_ENABLE(libstdcxx-visibility,$1,,[enables visibility safe usage])
3697 if test x$enable_libstdcxx_visibility = xyes ; then
3698   dnl all hail libgfortran
3699   dnl Check whether the target supports hidden visibility.
3700   AC_CACHE_CHECK([whether the target supports hidden visibility],
3701                  glibcxx_cv_have_attribute_visibility, [
3702   save_CFLAGS="$CFLAGS"
3703   CFLAGS="$CFLAGS -Werror"
3704   AC_TRY_COMPILE([void __attribute__((visibility("hidden"))) foo(void) { }],
3705                  [], glibcxx_cv_have_attribute_visibility=yes,
3706                  glibcxx_cv_have_attribute_visibility=no)
3707   CFLAGS="$save_CFLAGS"])
3708   if test $glibcxx_cv_have_attribute_visibility = no; then
3709     enable_libstdcxx_visibility=no
3710   fi
3713 GLIBCXX_CONDITIONAL(ENABLE_VISIBILITY, test $enable_libstdcxx_visibility = yes)
3714 AC_MSG_NOTICE([visibility supported: $enable_libstdcxx_visibility])
3719 dnl Add version tags to symbols in shared library (or not), additionally
3720 dnl marking other symbols as private/local (or not).
3722 dnl Sets libtool_VERSION, and determines shared library SONAME.
3724 dnl  This depends on GLIBCXX CHECK_LINKER_FEATURES, but without it assumes no.
3726 dnl --enable-symvers=style adds a version script to the linker call when
3727 dnl       creating the shared library.  The choice of version script is
3728 dnl       controlled by 'style'.
3729 dnl --disable-symvers does not.
3731 dnl  +  Usage:  GLIBCXX_ENABLE_SYMVERS[(DEFAULT)]
3732 dnl       Where DEFAULT is either 'yes' or 'no'.  Passing `yes' tries to
3733 dnl       choose a default style based on linker characteristics.  Passing
3734 dnl       'no' disables versioning.
3736 AC_DEFUN([GLIBCXX_ENABLE_SYMVERS], [
3738 GLIBCXX_ENABLE(symvers,$1,[[[=STYLE]]],
3739   [enables symbol versioning of the shared library],
3740   [permit yes|no|gnu|gnu-versioned-namespace|darwin|darwin-export|sun])
3742 # If we never went through the GLIBCXX_CHECK_LINKER_FEATURES macro, then we
3743 # don't know enough about $LD to do tricks...
3744 AC_REQUIRE([GLIBCXX_CHECK_LINKER_FEATURES])
3745 # Sun style symbol versions needs GNU c++filt for make_sunver.pl to work
3746 # with extern "C++" in version scripts.
3747 AC_REQUIRE([GCC_PROG_GNU_CXXFILT])
3749 # Turn a 'yes' into a suitable default.
3750 if test x$enable_symvers = xyes ; then
3751   if test $enable_shared = no || test "x$LD" = x || test x$gcc_no_link = xyes; then
3752     enable_symvers=no
3753   else
3754     if test $with_gnu_ld = yes ; then
3755       case ${target_os} in
3756         hpux*)
3757           enable_symvers=no ;;
3758         *)
3759           enable_symvers=gnu ;;
3760       esac
3761     else
3762       case ${target_os} in
3763         darwin*)
3764           enable_symvers=darwin ;;
3765         # Sun symbol versioning exists since Solaris 2.5.
3766         solaris2.[[5-9]]* | solaris2.1[[0-9]]*)
3767           # make_sunver.pl needs GNU c++filt to support extern "C++" in
3768           # version scripts, so disable symbol versioning if none can be
3769           # found.
3770           if test -z "$ac_cv_path_CXXFILT"; then
3771             AC_MSG_WARN([=== You have requested Sun symbol versioning, but])
3772             AC_MSG_WARN([=== no GNU c++filt could  be found.])
3773             AC_MSG_WARN([=== Symbol versioning will be disabled.])
3774             enable_symvers=no
3775           else
3776             enable_symvers=sun
3777           fi
3778           ;;
3779         *)
3780           enable_symvers=no ;;
3781       esac
3782     fi
3783   fi
3786 # Check to see if 'darwin' or 'darwin-export' can win.
3787 if test x$enable_symvers = xdarwin-export ; then
3788     enable_symvers=darwin
3791 # Check if 'sun' was requested on non-Solaris 2 platforms.
3792 if test x$enable_symvers = xsun ; then
3793   case ${target_os} in
3794     solaris2*)
3795       # All fine.
3796       ;;
3797     *)
3798       # Unlikely to work.
3799       AC_MSG_WARN([=== You have requested Sun symbol versioning, but])
3800       AC_MSG_WARN([=== you are not targetting Solaris 2.])
3801       AC_MSG_WARN([=== Symbol versioning will be disabled.])
3802       enable_symvers=no
3803       ;;
3804   esac
3807 # Check to see if 'gnu' can win.
3808 if test $enable_symvers = gnu ||
3809   test $enable_symvers = gnu-versioned-namespace ||
3810   test $enable_symvers = sun; then
3811   # Check to see if libgcc_s exists, indicating that shared libgcc is possible.
3812   AC_MSG_CHECKING([for shared libgcc])
3813   ac_save_CFLAGS="$CFLAGS"
3814   CFLAGS=' -lgcc_s'
3815   AC_TRY_LINK(, [return 0;], glibcxx_shared_libgcc=yes, glibcxx_shared_libgcc=no)
3816   CFLAGS="$ac_save_CFLAGS"
3817   if test $glibcxx_shared_libgcc = no; then
3818     cat > conftest.c <<EOF
3819 int main (void) { return 0; }
3821 changequote(,)dnl
3822     glibcxx_libgcc_s_suffix=`${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \
3823                              -shared -shared-libgcc -o conftest.so \
3824                              conftest.c -v 2>&1 >/dev/null \
3825                              | sed -n 's/^.* -lgcc_s\([^ ]*\) .*$/\1/p'`
3826 changequote([,])dnl
3827     rm -f conftest.c conftest.so
3828     if test x${glibcxx_libgcc_s_suffix+set} = xset; then
3829       CFLAGS=" -lgcc_s$glibcxx_libgcc_s_suffix"
3830       AC_TRY_LINK(, [return 0;], glibcxx_shared_libgcc=yes)
3831       CFLAGS="$ac_save_CFLAGS"
3832     fi
3833   fi
3834   AC_MSG_RESULT($glibcxx_shared_libgcc)
3836   # For GNU ld, we need at least this version.  The format is described in
3837   # GLIBCXX_CHECK_LINKER_FEATURES above.
3838   glibcxx_min_gnu_ld_version=21400
3840   # If no shared libgcc, can't win.
3841   if test $glibcxx_shared_libgcc != yes; then
3842       AC_MSG_WARN([=== You have requested GNU symbol versioning, but])
3843       AC_MSG_WARN([=== you are not building a shared libgcc_s.])
3844       AC_MSG_WARN([=== Symbol versioning will be disabled.])
3845       enable_symvers=no
3846   elif test $with_gnu_ld != yes && test $enable_symvers = sun; then
3847     : All interesting versions of Sun ld support sun style symbol versioning.
3848   elif test $with_gnu_ld != yes ; then
3849     # just fail for now
3850     AC_MSG_WARN([=== You have requested GNU symbol versioning, but])
3851     AC_MSG_WARN([=== you are not using the GNU linker.])
3852     AC_MSG_WARN([=== Symbol versioning will be disabled.])
3853     enable_symvers=no
3854   elif test $glibcxx_ld_is_gold = yes ; then
3855     : All versions of gold support symbol versioning.
3856   elif test $glibcxx_gnu_ld_version -lt $glibcxx_min_gnu_ld_version ; then
3857     # The right tools, the right setup, but too old.  Fallbacks?
3858     AC_MSG_WARN(=== Linker version $glibcxx_gnu_ld_version is too old for)
3859     AC_MSG_WARN(=== full symbol versioning support in this release of GCC.)
3860     AC_MSG_WARN(=== You would need to upgrade your binutils to version)
3861     AC_MSG_WARN(=== $glibcxx_min_gnu_ld_version or later and rebuild GCC.)
3862     AC_MSG_WARN([=== Symbol versioning will be disabled.])
3863     enable_symvers=no
3864   fi
3867 # For libtool versioning info, format is CURRENT:REVISION:AGE
3868 libtool_VERSION=6:29:0
3870 # Everything parsed; figure out what files and settings to use.
3871 case $enable_symvers in
3872   no)
3873     SYMVER_FILE=config/abi/pre/none.ver
3874     ;;
3875   gnu)
3876     SYMVER_FILE=config/abi/pre/gnu.ver
3877     AC_DEFINE(_GLIBCXX_SYMVER_GNU, 1,
3878               [Define to use GNU versioning in the shared library.])
3879     ;;
3880   gnu-versioned-namespace)
3881     libtool_VERSION=8:0:0
3882     SYMVER_FILE=config/abi/pre/gnu-versioned-namespace.ver
3883     AC_DEFINE(_GLIBCXX_SYMVER_GNU_NAMESPACE, 1,
3884               [Define to use GNU namespace versioning in the shared library.])
3885     ;;
3886   darwin)
3887     SYMVER_FILE=config/abi/pre/gnu.ver
3888     AC_DEFINE(_GLIBCXX_SYMVER_DARWIN, 1,
3889               [Define to use darwin versioning in the shared library.])
3890     ;;
3891   sun)
3892     SYMVER_FILE=config/abi/pre/gnu.ver
3893     AC_DEFINE(_GLIBCXX_SYMVER_SUN, 1,
3894               [Define to use Sun versioning in the shared library.])
3895     ;;
3896 esac
3898 if test x$enable_symvers != xno ; then
3899   AC_DEFINE(_GLIBCXX_SYMVER, 1,
3900          [Define to use symbol versioning in the shared library.])
3903 AC_CACHE_CHECK([whether the target supports .symver directive],
3904                glibcxx_cv_have_as_symver_directive, [
3905   AC_TRY_COMPILE([void foo (void); __asm (".symver foo, bar@SYMVER");],
3906                  [], glibcxx_cv_have_as_symver_directive=yes,
3907                  glibcxx_cv_have_as_symver_directive=no)])
3908 if test $glibcxx_cv_have_as_symver_directive = yes; then
3909   AC_DEFINE(HAVE_AS_SYMVER_DIRECTIVE, 1,
3910     [Define to 1 if the target assembler supports .symver directive.])
3913 AC_SUBST(SYMVER_FILE)
3914 AC_SUBST(port_specific_symbol_files)
3915 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS, test $enable_symvers != no)
3916 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_GNU, test $enable_symvers = gnu)
3917 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_GNU_NAMESPACE, test $enable_symvers = gnu-versioned-namespace)
3918 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_DARWIN, test $enable_symvers = darwin)
3919 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_SUN, test $enable_symvers = sun)
3920 AC_MSG_NOTICE(versioning on shared library symbols is $enable_symvers)
3922 if test $enable_symvers != no ; then
3923    case ${target_os} in
3924      # The Solaris 2 runtime linker doesn't support the GNU extension of
3925      # binding the same symbol to different versions
3926      solaris2*)
3927        ;;
3928      # Other platforms with GNU symbol versioning (GNU/Linux, more?) do.
3929      *)
3930        AC_DEFINE(HAVE_SYMVER_SYMBOL_RENAMING_RUNTIME_SUPPORT, 1,
3931          [Define to 1 if the target runtime linker supports binding the same symbol to different versions.])
3932        ;;
3933     esac
3936 # Now, set up compatibility support, if any.
3937 # In addition, need this to deal with std::size_t mangling in
3938 # src/compatibility.cc.  In a perfect world, could use
3939 # typeid(std::size_t).name()[0] to do direct substitution.
3940 AC_MSG_CHECKING([for size_t as unsigned int])
3941 ac_save_CFLAGS="$CFLAGS"
3942 CFLAGS="-Werror"
3943 AC_TRY_COMPILE(, [__SIZE_TYPE__* stp; unsigned int* uip; stp = uip;],
3944                  [glibcxx_size_t_is_i=yes], [glibcxx_size_t_is_i=no])
3945 CFLAGS=$ac_save_CFLAGS
3946 if test "$glibcxx_size_t_is_i" = yes; then
3947   AC_DEFINE(_GLIBCXX_SIZE_T_IS_UINT, 1, [Define if size_t is unsigned int.])
3949 AC_MSG_RESULT([$glibcxx_size_t_is_i])
3951 AC_MSG_CHECKING([for ptrdiff_t as int])
3952 ac_save_CFLAGS="$CFLAGS"
3953 CFLAGS="-Werror"
3954 AC_TRY_COMPILE(, [__PTRDIFF_TYPE__* ptp; int* ip; ptp = ip;],
3955                  [glibcxx_ptrdiff_t_is_i=yes], [glibcxx_ptrdiff_t_is_i=no])
3956 CFLAGS=$ac_save_CFLAGS
3957 if test "$glibcxx_ptrdiff_t_is_i" = yes; then
3958   AC_DEFINE(_GLIBCXX_PTRDIFF_T_IS_INT, 1, [Define if ptrdiff_t is int.])
3960 AC_MSG_RESULT([$glibcxx_ptrdiff_t_is_i])
3965 dnl Setup to use the gcc gthr.h thread-specific memory and mutex model.
3966 dnl We must stage the required headers so that they will be installed
3967 dnl with the library (unlike libgcc, the STL implementation is provided
3968 dnl solely within headers).  Since we must not inject random user-space
3969 dnl macro names into user-provided C++ code, we first stage into <file>-in
3970 dnl and process to <file> with an output command.  The reason for a two-
3971 dnl stage process here is to correctly handle $srcdir!=$objdir without
3972 dnl having to write complex code (the sed commands to clean the macro
3973 dnl namespace are complex and fragile enough as it is).  We must also
3974 dnl add a relative path so that -I- is supported properly.
3976 dnl Substs:
3977 dnl  thread_header
3979 AC_DEFUN([GLIBCXX_ENABLE_THREADS], [
3980   AC_MSG_CHECKING([for thread model used by GCC])
3981   target_thread_file=`$CXX -v 2>&1 | sed -n 's/^Thread model: //p'`
3982   AC_MSG_RESULT([$target_thread_file])
3983   GCC_AC_THREAD_HEADER([$target_thread_file])
3988 dnl Check if gthread implementation defines the types and functions
3989 dnl required by the c++0x thread library.  Conforming gthread
3990 dnl implementations can define __GTHREADS_CXX0X to enable use with c++0x.
3992 dnl GLIBCXX_ENABLE_SYMVERS must be done before this.
3994 AC_DEFUN([GLIBCXX_CHECK_GTHREADS], [
3995   GLIBCXX_ENABLE(libstdcxx-threads,auto,,[enable C++11 threads support])
3997   if test x$enable_libstdcxx_threads = xauto ||
3998      test x$enable_libstdcxx_threads = xyes; then
4000   AC_LANG_SAVE
4001   AC_LANG_CPLUSPLUS
4003   ac_save_CXXFLAGS="$CXXFLAGS"
4004   CXXFLAGS="$CXXFLAGS -fno-exceptions \
4005         -I${toplevel_srcdir}/libgcc -I${toplevel_builddir}/libgcc"
4007   target_thread_file=`$CXX -v 2>&1 | sed -n 's/^Thread model: //p'`
4008   case $target_thread_file in
4009     posix)
4010       CXXFLAGS="$CXXFLAGS -DSUPPORTS_WEAK -DGTHREAD_USE_WEAK -D_PTHREADS"
4011   esac
4013   AC_MSG_CHECKING([whether it can be safely assumed that mutex_timedlock is available])
4015   AC_TRY_COMPILE([#include <unistd.h>],
4016     [
4017       // In case of POSIX threads check _POSIX_TIMEOUTS.
4018       #if (defined(_PTHREADS) \
4019           && (!defined(_POSIX_TIMEOUTS) || _POSIX_TIMEOUTS <= 0))
4020       #error
4021       #endif
4022     ], [ac_gthread_use_mutex_timedlock=1], [ac_gthread_use_mutex_timedlock=0])
4024   AC_DEFINE_UNQUOTED(_GTHREAD_USE_MUTEX_TIMEDLOCK, $ac_gthread_use_mutex_timedlock,
4025                      [Define to 1 if mutex_timedlock is available.])
4027   if test $ac_gthread_use_mutex_timedlock = 1 ; then res_mutex_timedlock=yes ;
4028   else res_mutex_timedlock=no ; fi
4029   AC_MSG_RESULT([$res_mutex_timedlock])
4031   AC_MSG_CHECKING([for gthreads library])
4033   AC_TRY_COMPILE([#include "gthr.h"],
4034     [
4035       #ifndef __GTHREADS_CXX0X
4036       #error
4037       #endif
4038     ], [ac_has_gthreads=yes], [ac_has_gthreads=no])
4039   else
4040     ac_has_gthreads=no
4041   fi
4043   AC_MSG_RESULT([$ac_has_gthreads])
4045   if test x"$ac_has_gthreads" = x"yes"; then
4046     AC_DEFINE(_GLIBCXX_HAS_GTHREADS, 1,
4047               [Define if gthreads library is available.])
4049     # Also check for pthread_rwlock_t for std::shared_timed_mutex in C++14
4050     # but only do so if we're using pthread in the gthread library.
4051     # On VxWorks for example, pthread_rwlock_t is defined in sys/types.h
4052     # but the pthread library is not there by default and the gthread library
4053     # does not use it.
4054     AC_TRY_COMPILE([#include "gthr.h"],
4055     [
4056       #if (!defined(_PTHREADS))
4057       #error
4058       #endif
4059     ], [ac_gthread_use_pthreads=yes], [ac_gthread_use_pthreads=no])
4060     if test x"$ac_gthread_use_pthreads" = x"yes"; then
4061       AC_CHECK_TYPE([pthread_rwlock_t],
4062              [AC_DEFINE([_GLIBCXX_USE_PTHREAD_RWLOCK_T], 1,
4063              [Define if POSIX read/write locks are available in <gthr.h>.])],
4064              [],
4065              [#include "gthr.h"])
4066     fi
4067   fi
4069   AC_CHECK_HEADER(semaphore.h, [
4070     AC_MSG_CHECKING([for POSIX Semaphores and sem_timedwait])
4071     AC_TRY_COMPILE([
4072         #include <unistd.h>
4073         #include <semaphore.h>
4074         #include <limits.h>
4075       ],
4076       [
4077         #if !defined _POSIX_TIMEOUTS || _POSIX_TIMEOUTS <= 0
4078         # error "POSIX Timeouts option not supported"
4079         #elif !defined _POSIX_SEMAPHORES || _POSIX_SEMAPHORES <= 0
4080         # error "POSIX Semaphores option not supported"
4081         #else
4082         #if defined SEM_VALUE_MAX
4083         constexpr int sem_value_max = SEM_VALUE_MAX;
4084         #elif defined _POSIX_SEM_VALUE_MAX
4085         constexpr int sem_value_max = _POSIX_SEM_VALUE_MAX;
4086         #else
4087         # error "SEM_VALUE_MAX not available"
4088         #endif
4089         sem_t sem;
4090         sem_init(&sem, 0, sem_value_max);
4091         struct timespec ts = { 0 };
4092         sem_timedwait(&sem, &ts);
4093         #endif
4094       ],
4095       [ac_have_posix_semaphore=yes],
4096       [ac_have_posix_semaphore=no])],
4097       [ac_have_posix_semaphore=no])
4099   if test $ac_have_posix_semaphore = yes ; then
4100     AC_DEFINE(HAVE_POSIX_SEMAPHORE,
4101               1,
4102               [Define to 1 if POSIX Semaphores with sem_timedwait are available in <semaphore.h>.])
4103   fi
4104   AC_MSG_RESULT([$ac_have_posix_semaphore])
4106   CXXFLAGS="$ac_save_CXXFLAGS"
4107   AC_LANG_RESTORE
4111 # Check whether LC_MESSAGES is available in <locale.h>.
4112 # Ulrich Drepper <drepper@cygnus.com>, 1995.
4114 # This file file be copied and used freely without restrictions.  It can
4115 # be used in projects which are not available under the GNU Public License
4116 # but which still want to provide support for the GNU gettext functionality.
4117 # Please note that the actual code is *not* freely available.
4118 AC_DEFUN([AC_LC_MESSAGES], [
4119   AC_CHECK_HEADER(locale.h, [
4120     AC_CACHE_CHECK([for LC_MESSAGES], ac_cv_val_LC_MESSAGES,
4121       [AC_TRY_COMPILE([#include <locale.h>], [return LC_MESSAGES],
4122        ac_cv_val_LC_MESSAGES=yes, ac_cv_val_LC_MESSAGES=no)])
4123     if test $ac_cv_val_LC_MESSAGES = yes; then
4124       AC_DEFINE(HAVE_LC_MESSAGES, 1,
4125                 [Define if LC_MESSAGES is available in <locale.h>.])
4126     fi
4127   ])
4131 dnl Check whether rdrand is supported in the assembler.
4132 AC_DEFUN([GLIBCXX_CHECK_X86_RDRAND], [
4133   AC_MSG_CHECKING([for rdrand support in assembler])
4134   AC_CACHE_VAL(ac_cv_x86_rdrand, [
4135   ac_cv_x86_rdrand=no
4136   case "$target" in
4137     i?86-*-* | \
4138     x86_64-*-*)
4139     AC_TRY_COMPILE(, [asm("rdrand %eax");],
4140                 [ac_cv_x86_rdrand=yes], [ac_cv_x86_rdrand=no])
4141   esac
4142   ])
4143   if test $ac_cv_x86_rdrand = yes; then
4144     AC_DEFINE(_GLIBCXX_X86_RDRAND, 1,
4145                 [ Defined if as can handle rdrand. ])
4146   fi
4147   AC_MSG_RESULT($ac_cv_x86_rdrand)
4151 dnl Check whether rdseed is supported in the assembler.
4152 AC_DEFUN([GLIBCXX_CHECK_X86_RDSEED], [
4153   AC_MSG_CHECKING([for rdseed support in assembler])
4154   AC_CACHE_VAL(ac_cv_x86_rdseed, [
4155   ac_cv_x86_rdseed=no
4156   case "$target" in
4157     i?86-*-* | \
4158     x86_64-*-*)
4159     AC_TRY_COMPILE(, [asm("rdseed %eax");],
4160                 [ac_cv_x86_rdseed=yes], [ac_cv_x86_rdseed=no])
4161   esac
4162   ])
4163   if test $ac_cv_x86_rdseed = yes; then
4164     AC_DEFINE(_GLIBCXX_X86_RDSEED, 1,
4165                 [ Defined if as can handle rdseed. ])
4166   fi
4167   AC_MSG_RESULT($ac_cv_x86_rdseed)
4171 dnl Check whether get_nprocs is available in <sys/sysinfo.h>, and define _GLIBCXX_USE_GET_NPROCS.
4173 AC_DEFUN([GLIBCXX_CHECK_GET_NPROCS], [
4175   AC_LANG_SAVE
4176   AC_LANG_CPLUSPLUS
4177   ac_save_CXXFLAGS="$CXXFLAGS"
4178   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4180   AC_MSG_CHECKING([for get_nprocs])
4181   AC_CACHE_VAL(glibcxx_cv_GET_NPROCS, [
4182     GCC_TRY_COMPILE_OR_LINK(
4183       [#include <sys/sysinfo.h>],
4184       [int n = get_nprocs();],
4185       [glibcxx_cv_GET_NPROCS=yes],
4186       [glibcxx_cv_GET_NPROCS=no])
4187   ])
4188   if test $glibcxx_cv_GET_NPROCS = yes; then
4189     AC_DEFINE(_GLIBCXX_USE_GET_NPROCS, 1, [Define if get_nprocs is available in <sys/sysinfo.h>.])
4190   fi
4191   AC_MSG_RESULT($glibcxx_cv_GET_NPROCS)
4193   CXXFLAGS="$ac_save_CXXFLAGS"
4194   AC_LANG_RESTORE
4198 dnl Check whether sysconf(_SC_NPROCESSORS_ONLN) is available in <unistd.h>, and define _GLIBCXX_USE_SC_NPROCESSORS_ONLN.
4200 AC_DEFUN([GLIBCXX_CHECK_SC_NPROCESSORS_ONLN], [
4202   AC_LANG_SAVE
4203   AC_LANG_CPLUSPLUS
4204   ac_save_CXXFLAGS="$CXXFLAGS"
4205   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4207   AC_MSG_CHECKING([for _SC_NPROCESSORS_ONLN])
4208   AC_CACHE_VAL(glibcxx_cv_SC_NPROCESSORS_ONLN, [
4209     GCC_TRY_COMPILE_OR_LINK(
4210       [#include <unistd.h>],
4211       [int n = sysconf(_SC_NPROCESSORS_ONLN);],
4212       [glibcxx_cv_SC_NPROCESSORS_ONLN=yes],
4213       [glibcxx_cv_SC_NPROCESSORS_ONLN=no])
4214   ])
4215   if test $glibcxx_cv_SC_NPROCESSORS_ONLN = yes; then
4216     AC_DEFINE(_GLIBCXX_USE_SC_NPROCESSORS_ONLN, 1, [Define if _SC_NPROCESSORS_ONLN  is available in <unistd.h>.])
4217   fi
4218   AC_MSG_RESULT($glibcxx_cv_SC_NPROCESSORS_ONLN)
4220   CXXFLAGS="$ac_save_CXXFLAGS"
4221   AC_LANG_RESTORE
4225 dnl Check whether sysconf(_SC_NPROC_ONLN) is available in <unistd.h>, and define _GLIBCXX_USE_SC_NPROC_ONLN.
4227 AC_DEFUN([GLIBCXX_CHECK_SC_NPROC_ONLN], [
4229   AC_LANG_SAVE
4230   AC_LANG_CPLUSPLUS
4231   ac_save_CXXFLAGS="$CXXFLAGS"
4232   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4234   AC_MSG_CHECKING([for _SC_NPROC_ONLN])
4235   AC_CACHE_VAL(glibcxx_cv_SC_NPROC_ONLN, [
4236     GCC_TRY_COMPILE_OR_LINK(
4237       [#include <unistd.h>],
4238       [int n = sysconf(_SC_NPROC_ONLN);],
4239       [glibcxx_cv_SC_NPROC_ONLN=yes],
4240       [glibcxx_cv_SC_NPROC_ONLN=no])
4241   ])
4242   if test $glibcxx_cv_SC_NPROC_ONLN = yes; then
4243     AC_DEFINE(_GLIBCXX_USE_SC_NPROC_ONLN, 1, [Define if _SC_NPROC_ONLN  is available in <unistd.h>.])
4244   fi
4245   AC_MSG_RESULT($glibcxx_cv_SC_NPROC_ONLN)
4247   CXXFLAGS="$ac_save_CXXFLAGS"
4248   AC_LANG_RESTORE
4252 dnl Check whether pthread_num_processors_np is available in <pthread.h>, and define _GLIBCXX_USE_PTHREADS_NUM_PROCESSORS_NP.
4254 AC_DEFUN([GLIBCXX_CHECK_PTHREADS_NUM_PROCESSORS_NP], [
4256   AC_LANG_SAVE
4257   AC_LANG_CPLUSPLUS
4258   ac_save_CXXFLAGS="$CXXFLAGS"
4259   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4261   AC_MSG_CHECKING([for pthreads_num_processors_np])
4262   AC_CACHE_VAL(glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP, [
4263     GCC_TRY_COMPILE_OR_LINK(
4264       [#include <pthread.h>],
4265       [int n = pthread_num_processors_np();],
4266       [glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP=yes],
4267       [glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP=no])
4268   ])
4269   if test $glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP = yes; then
4270     AC_DEFINE(_GLIBCXX_USE_PTHREADS_NUM_PROCESSORS_NP, 1, [Define if pthreads_num_processors_np is available in <pthread.h>.])
4271   fi
4272   AC_MSG_RESULT($glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP)
4274   CXXFLAGS="$ac_save_CXXFLAGS"
4275   AC_LANG_RESTORE
4279 dnl Check whether pthread_cond_clockwait is available in <pthread.h> for std::condition_variable to use,
4280 dnl and define _GLIBCXX_USE_PTHREAD_COND_CLOCKWAIT.
4282 AC_DEFUN([GLIBCXX_CHECK_PTHREAD_COND_CLOCKWAIT], [
4284   AC_LANG_SAVE
4285   AC_LANG_CPLUSPLUS
4286   ac_save_CXXFLAGS="$CXXFLAGS"
4287   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4288   ac_save_LIBS="$LIBS"
4289   LIBS="$LIBS -lpthread"
4291   AC_MSG_CHECKING([for pthread_cond_clockwait])
4292   AC_CACHE_VAL(glibcxx_cv_PTHREAD_COND_CLOCKWAIT, [
4293     GCC_TRY_COMPILE_OR_LINK(
4294       [#include <pthread.h>],
4295       [pthread_mutex_t mutex; pthread_cond_t cond; struct timespec ts; int n = pthread_cond_clockwait(&cond, &mutex, 0, &ts);],
4296       [glibcxx_cv_PTHREAD_COND_CLOCKWAIT=yes],
4297       [glibcxx_cv_PTHREAD_COND_CLOCKWAIT=no])
4298   ])
4299   if test $glibcxx_cv_PTHREAD_COND_CLOCKWAIT = yes; then
4300     AC_DEFINE(_GLIBCXX_USE_PTHREAD_COND_CLOCKWAIT, 1, [Define if pthread_cond_clockwait is available in <pthread.h>.])
4301   fi
4302   AC_MSG_RESULT($glibcxx_cv_PTHREAD_COND_CLOCKWAIT)
4304   CXXFLAGS="$ac_save_CXXFLAGS"
4305   LIBS="$ac_save_LIBS"
4306   AC_LANG_RESTORE
4310 dnl Check whether pthread_mutex_clocklock is available in <pthread.h> for std::timed_mutex to use,
4311 dnl and define _GLIBCXX_USE_PTHREAD_MUTEX_CLOCKLOCK.
4313 AC_DEFUN([GLIBCXX_CHECK_PTHREAD_MUTEX_CLOCKLOCK], [
4315   AC_LANG_SAVE
4316   AC_LANG_CPLUSPLUS
4317   ac_save_CXXFLAGS="$CXXFLAGS"
4318   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4319   ac_save_LIBS="$LIBS"
4320   LIBS="$LIBS -lpthread"
4322   AC_MSG_CHECKING([for pthread_mutex_clocklock])
4323   AC_CACHE_VAL(glibcxx_cv_PTHREAD_MUTEX_CLOCKLOCK, [
4324     GCC_TRY_COMPILE_OR_LINK(
4325       [#include <pthread.h>],
4326       [pthread_mutex_t mutex; struct timespec ts; int n = pthread_mutex_clocklock(&mutex, CLOCK_REALTIME, &ts);],
4327       [glibcxx_cv_PTHREAD_MUTEX_CLOCKLOCK=yes],
4328       [glibcxx_cv_PTHREAD_MUTEX_CLOCKLOCK=no])
4329   ])
4330   if test $glibcxx_cv_PTHREAD_MUTEX_CLOCKLOCK = yes; then
4331     AC_DEFINE(_GLIBCXX_USE_PTHREAD_MUTEX_CLOCKLOCK, 1, [Define if pthread_mutex_clocklock is available in <pthread.h>.])
4332   fi
4333   AC_MSG_RESULT($glibcxx_cv_PTHREAD_MUTEX_CLOCKLOCK)
4335   CXXFLAGS="$ac_save_CXXFLAGS"
4336   LIBS="$ac_save_LIBS"
4337   AC_LANG_RESTORE
4341 dnl Check whether pthread_mutex_clocklock is available in <pthread.h> for std::timed_mutex to use,
4342 dnl and define _GLIBCXX_USE_PTHREAD_MUTEX_CLOCKLOCK.
4344 AC_DEFUN([GLIBCXX_CHECK_PTHREAD_RWLOCK_CLOCKLOCK], [
4346   AC_LANG_SAVE
4347   AC_LANG_CPLUSPLUS
4348   ac_save_CXXFLAGS="$CXXFLAGS"
4349   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4350   ac_save_LIBS="$LIBS"
4351   LIBS="$LIBS -lpthread"
4353   AC_MSG_CHECKING([for pthread_rwlock_clockrdlock, pthread_wlock_clockwrlock])
4354   AC_CACHE_VAL(glibcxx_cv_PTHREAD_RWLOCK_CLOCKLOCK, [
4355     GCC_TRY_COMPILE_OR_LINK(
4356       [#include <pthread.h>],
4357       [pthread_rwlock_t rwl; struct timespec ts;]
4358       [int n = pthread_rwlock_clockrdlock(&rwl, CLOCK_REALTIME, &ts);]
4359       [int m = pthread_rwlock_clockwrlock(&rwl, CLOCK_REALTIME, &ts);],
4360       [glibcxx_cv_PTHREAD_RWLOCK_CLOCKLOCK=yes],
4361       [glibcxx_cv_PTHREAD_RWLOCK_CLOCKLOCK=no])
4362   ])
4363   if test $glibcxx_cv_PTHREAD_RWLOCK_CLOCKLOCK = yes; then
4364     AC_DEFINE(_GLIBCXX_USE_PTHREAD_RWLOCK_CLOCKLOCK, 1, [Define if pthread_rwlock_clockrdlock and pthread_rwlock_clockwrlock are available in <pthread.h>.])
4365   fi
4366   AC_MSG_RESULT($glibcxx_cv_PTHREAD_RWLOCK_CLOCKLOCK)
4368   CXXFLAGS="$ac_save_CXXFLAGS"
4369   LIBS="$ac_save_LIBS"
4370   AC_LANG_RESTORE
4374 dnl Check whether sysctl is available in <pthread.h>, and define _GLIBCXX_USE_SYSCTL_HW_NCPU.
4376 AC_DEFUN([GLIBCXX_CHECK_SYSCTL_HW_NCPU], [
4378   AC_LANG_SAVE
4379   AC_LANG_CPLUSPLUS
4380   ac_save_CXXFLAGS="$CXXFLAGS"
4381   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4383   AC_MSG_CHECKING([for hw.ncpu sysctl])
4384   AC_CACHE_VAL(glibcxx_cv_SYSCTL_HW_NCPU, [
4385     GCC_TRY_COMPILE_OR_LINK(
4386       [
4387        #include <stddef.h>
4388        #include <sys/sysctl.h>
4389        ],
4390       [
4391        int count;
4392        size_t size = sizeof(count);
4393        int mib[] = { CTL_HW, HW_NCPU };
4394        sysctl(mib, 2, &count, &size, NULL, 0);
4395       ],
4396       [glibcxx_cv_SYSCTL_HW_NCPU=yes],
4397       [glibcxx_cv_SYSCTL_HW_NCPU=no])
4398   ])
4399   if test $glibcxx_cv_SYSCTL_HW_NCPU = yes; then
4400     AC_DEFINE(_GLIBCXX_USE_SYSCTL_HW_NCPU, 1, [Define if sysctl(), CTL_HW and HW_NCPU are available in <sys/sysctl.h>.])
4401   fi
4402   AC_MSG_RESULT($glibcxx_cv_SYSCTL_HW_NCPU)
4404   CXXFLAGS="$ac_save_CXXFLAGS"
4405   AC_LANG_RESTORE
4409 dnl Check to see if python pretty printing can be activated.
4411 dnl --with-python-dir=dir
4412 dnl installs directory into $prefix/dir
4413 AC_DEFUN([GLIBCXX_ENABLE_PYTHON], [
4415 AC_MSG_CHECKING([for custom python install directory])
4416 AC_ARG_WITH([python-dir],
4417             AS_HELP_STRING([--with-python-dir],
4418                            [the location to install Python modules. This path is relative starting from the prefix.]),
4419             [with_python_dir=$withval], [with_python_dir="no"])
4420 AC_MSG_RESULT(${with_python_dir})
4422 # Needed for installing Python modules during make install.
4423 python_mod_dir="${with_python_dir}"
4424 AC_SUBST(python_mod_dir)
4425 GLIBCXX_CONDITIONAL(ENABLE_PYTHONDIR, test $python_mod_dir != no)
4429 dnl Check to see if -Werror is disabled.
4431 dnl --enable-werror/--disable-werror
4432 AC_DEFUN([GLIBCXX_ENABLE_WERROR], [
4433   AC_MSG_CHECKING([for -Werror])
4434   GLIBCXX_ENABLE(werror,$1,,[turns on -Werror])
4435   AC_MSG_RESULT($enable_werror)
4436   GLIBCXX_CONDITIONAL(ENABLE_WERROR, test $enable_werror = yes)
4440 dnl Check whether obsolescent tmpnam is available in <stdio.h>,
4441 dnl and define _GLIBCXX_USE_TMPNAM.
4443 AC_DEFUN([GLIBCXX_CHECK_TMPNAM], [dnl
4445   AC_LANG_SAVE
4446   AC_LANG_CPLUSPLUS
4447   ac_save_CXXFLAGS="$CXXFLAGS"
4448   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4450   AC_MSG_CHECKING([for tmpnam])
4451   AC_CACHE_VAL(glibcxx_cv_TMPNAM, [dnl
4452     GCC_TRY_COMPILE_OR_LINK(
4453       [#include <stdio.h>],
4454       [char *tmp = tmpnam(NULL);],
4455       [glibcxx_cv_TMPNAM=yes],
4456       [glibcxx_cv_TMPNAM=no])
4457   ])
4458   if test $glibcxx_cv_TMPNAM = yes; then
4459     AC_DEFINE(_GLIBCXX_USE_TMPNAM, 1, [Define if obsolescent tmpnam is available in <stdio.h>.])
4460   fi
4461   AC_MSG_RESULT($glibcxx_cv_TMPNAM)
4463   CXXFLAGS="$ac_save_CXXFLAGS"
4464   AC_LANG_RESTORE
4468 dnl Check to see if sys/sdt.h exists and that it is suitable for use.
4469 dnl Some versions of sdt.h were not compatible with C++11.
4471 AC_DEFUN([GLIBCXX_CHECK_SDT_H], [
4472   AC_MSG_CHECKING([for suitable sys/sdt.h])
4473   # Note that this test has to be run with the C language.
4474   # Otherwise, sdt.h will try to include some headers from
4475   # libstdc++ itself.
4476   AC_LANG_SAVE
4477   AC_LANG_C
4478   AC_CACHE_VAL(glibcxx_cv_sys_sdt_h, [
4479     # Because we have to run the test in C, we use grep rather
4480     # than the compiler to check for the bug.  The bug is that
4481     # were strings without trailing whitespace, causing g++
4482     # to look for operator"".  The pattern searches for the fixed
4483     # output.
4484     AC_EGREP_CPP([ \",\" ], [
4485       #include <sys/sdt.h>
4486       int f() { STAP_PROBE(hi, bob); }
4487     ], [glibcxx_cv_sys_sdt_h=yes], [glibcxx_cv_sys_sdt_h=no])
4488   ])
4489   AC_LANG_RESTORE
4490   if test $glibcxx_cv_sys_sdt_h = yes; then
4491     AC_DEFINE(HAVE_SYS_SDT_H, 1,
4492               [Define to 1 if you have a suitable <sys/sdt.h> header file])
4493   fi
4494   AC_MSG_RESULT($glibcxx_cv_sys_sdt_h)
4498 dnl Control whether the library should define symbols for old and new ABIs.
4499 dnl This affects definitions of strings, stringstreams and locale facets.
4501 dnl --disable-libstdcxx-dual-abi will use old ABI for all types.
4503 dnl Defines:
4504 dnl  _GLIBCXX_USE_DUAL_ABI (always defined, either to 1 or 0)
4506 AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_DUAL_ABI], [
4507   GLIBCXX_ENABLE(libstdcxx-dual-abi,$1,,[support two versions of std::string])
4508   if test x$enable_symvers = xgnu-versioned-namespace; then
4509     # gnu-versioned-namespace is incompatible with the dual ABI.
4510     enable_libstdcxx_dual_abi="no"
4511   fi
4512   if test x"$enable_libstdcxx_dual_abi" != xyes; then
4513     AC_MSG_NOTICE([dual ABI is disabled])
4514     default_libstdcxx_abi="gcc4-compatible"
4515   fi
4516   GLIBCXX_CONDITIONAL(ENABLE_DUAL_ABI, test $enable_libstdcxx_dual_abi = yes)
4520 dnl Check to see which ABI should be enabled by default.
4522 dnl --with-default-libstdcxx-abi={gcc4-compatible,new}
4524 dnl Defines:
4525 dnl  _GLIBCXX_USE_CXX11_ABI (always defined, either to 1 or 0)
4527 AC_DEFUN([GLIBCXX_DEFAULT_ABI], [
4528   if test x$enable_libstdcxx_dual_abi = xyes; then
4529   AC_MSG_CHECKING([for default std::string ABI to use])
4530   AC_ARG_WITH([default-libstdcxx-abi],
4531     AS_HELP_STRING([--with-default-libstdcxx-abi],
4532                    [set the std::string ABI to use by default]),
4533     [case "$withval" in
4534       gcc4-compatible)  default_libstdcxx_abi="gcc4-compatible" ;;
4535       new|cxx11)  default_libstdcxx_abi="new" ;;
4536       c++*|gnu++*) AC_MSG_ERROR([Supported arguments for --with-default-libstdcxx-abi have changed, use "new" or "gcc4-compatible"]) ;;
4537       *) AC_MSG_ERROR([Invalid argument for --with-default-libstdcxx-abi]) ;;
4538      esac
4539      ],
4540     [default_libstdcxx_abi="new"])
4541   AC_MSG_RESULT(${default_libstdcxx_abi})
4542   fi
4543   if test $default_libstdcxx_abi = "new"; then
4544     glibcxx_cxx11_abi=1
4545     glibcxx_cxx98_abi=0
4546   else
4547     glibcxx_cxx11_abi=0
4548     glibcxx_cxx98_abi=1
4549   fi
4550   AC_SUBST(glibcxx_cxx98_abi)
4551   GLIBCXX_CONDITIONAL(ENABLE_CXX11_ABI, test $glibcxx_cxx11_abi = 1)
4555 dnl Check to see whether to build libstdc++fs.a
4557 dnl --enable-libstdcxx-filesystem-ts
4559 AC_DEFUN([GLIBCXX_ENABLE_FILESYSTEM_TS], [
4560   GLIBCXX_ENABLE(libstdcxx-filesystem-ts,auto,,
4561     [turns on ISO/IEC TS 18822 support],
4562     [permit yes|no|auto])
4564   AC_MSG_CHECKING([whether to build Filesystem TS support])
4565   if test x"$ac_cv_header_dirent_h" != x"yes"; then
4566     enable_libstdcxx_filesystem_ts=no
4567   fi
4568   if test x"$enable_libstdcxx_filesystem_ts" = x"auto"; then
4569     case "${target_os}" in
4570       freebsd*|netbsd*|openbsd*|dragonfly*|darwin*)
4571         enable_libstdcxx_filesystem_ts=yes
4572         ;;
4573       gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
4574         enable_libstdcxx_filesystem_ts=yes
4575         ;;
4576       rtems*)
4577         enable_libstdcxx_filesystem_ts=yes
4578         ;;
4579       solaris*)
4580         enable_libstdcxx_filesystem_ts=yes
4581         ;;
4582       mingw*)
4583         enable_libstdcxx_filesystem_ts=yes
4584         ;;
4585       *)
4586         enable_libstdcxx_filesystem_ts=no
4587         ;;
4588     esac
4589   fi
4590   AC_MSG_RESULT($enable_libstdcxx_filesystem_ts)
4591   GLIBCXX_CONDITIONAL(ENABLE_FILESYSTEM_TS, test $enable_libstdcxx_filesystem_ts = yes)
4595 dnl Check whether the library calls required by the C++17 Filesystem library
4596 dnl and the Filesystem TS are present.
4597 dnl Defines:
4598 dnl  HAVE_STRUCT_DIRENT_D_TYPE
4599 dnl  _GLIBCXX_USE_REALPATH
4600 dnl  _GLIBCXX_USE_UTIMENSAT
4601 dnl  _GLIBCXX_USE_ST_MTIM
4602 dnl  _GLIBCXX_USE_FCHMOD
4603 dnl  _GLIBCXX_USE_FCHMODAT
4604 dnl  _GLIBCXX_USE_SENDFILE
4605 dnl  HAVE_LINK
4606 dnl  HAVE_READLINK
4607 dnl  HAVE_SYMLINK
4609 AC_DEFUN([GLIBCXX_CHECK_FILESYSTEM_DEPS], [dnl
4611   AC_LANG_SAVE
4612   AC_LANG_CPLUSPLUS
4613   ac_save_CXXFLAGS="$CXXFLAGS"
4614   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4616   AC_MSG_CHECKING([for struct dirent.d_type])
4617   AC_CACHE_VAL(glibcxx_cv_dirent_d_type, [dnl
4618     GCC_TRY_COMPILE_OR_LINK(
4619       [#include <dirent.h>],
4620       [
4621        struct dirent d;
4622        if (sizeof d.d_type) return 0;
4623       ],
4624       [glibcxx_cv_dirent_d_type=yes],
4625       [glibcxx_cv_dirent_d_type=no])
4626   ])
4627   if test $glibcxx_cv_dirent_d_type = yes; then
4628     AC_DEFINE(HAVE_STRUCT_DIRENT_D_TYPE, 1, [Define to 1 if `d_type' is a member of `struct dirent'.])
4629   fi
4630   AC_MSG_RESULT($glibcxx_cv_dirent_d_type)
4632   AC_MSG_CHECKING([for realpath])
4633   AC_CACHE_VAL(glibcxx_cv_realpath, [dnl
4634     GCC_TRY_COMPILE_OR_LINK(
4635       [
4636        #include <limits.h>
4637        #include <stdlib.h>
4638        #include <unistd.h>
4639       ],
4640       [
4641        #if _XOPEN_VERSION < 500
4642        #error
4643        #elif _XOPEN_VERSION >= 700 || defined(PATH_MAX)
4644        char *tmp = realpath((const char*)NULL, (char*)NULL);
4645        #else
4646        #error
4647        #endif
4648       ],
4649       [glibcxx_cv_realpath=yes],
4650       [glibcxx_cv_realpath=no])
4651   ])
4652   if test $glibcxx_cv_realpath = yes; then
4653     AC_DEFINE(_GLIBCXX_USE_REALPATH, 1, [Define if usable realpath is available in <stdlib.h>.])
4654   fi
4655   AC_MSG_RESULT($glibcxx_cv_realpath)
4657   AC_MSG_CHECKING([for utimensat])
4658   AC_CACHE_VAL(glibcxx_cv_utimensat, [dnl
4659     GCC_TRY_COMPILE_OR_LINK(
4660       [
4661         #include <fcntl.h>
4662         #include <sys/stat.h>
4663       ],
4664       [
4665         struct timespec ts[2] = { { 0, UTIME_OMIT }, { 1, 1 } };
4666         int i = utimensat(AT_FDCWD, "path", ts, 0);
4667       ],
4668       [glibcxx_cv_utimensat=yes],
4669       [glibcxx_cv_utimensat=no])
4670   ])
4671   if test $glibcxx_cv_utimensat = yes; then
4672     AC_DEFINE(_GLIBCXX_USE_UTIMENSAT, 1, [Define if utimensat and UTIME_OMIT are available in <sys/stat.h> and AT_FDCWD in <fcntl.h>.])
4673   fi
4674   AC_MSG_RESULT($glibcxx_cv_utimensat)
4676   AC_MSG_CHECKING([for utime])
4677   AC_CACHE_VAL(glibcxx_cv_utime, [dnl
4678     GCC_TRY_COMPILE_OR_LINK(
4679       [
4680         #include <utime.h>
4681       ],
4682       [
4683         struct utimbuf t = { 1, 1 };
4684         int i = utime("path", &t);
4685       ],
4686       [glibcxx_cv_utime=yes],
4687       [glibcxx_cv_utime=no])
4688   ])
4689   if test $glibcxx_cv_utime = yes; then
4690     AC_DEFINE(_GLIBCXX_USE_UTIME, 1, [Define if utime is available in <utime.h>.])
4691   fi
4692   AC_MSG_RESULT($glibcxx_cv_utime)
4694   AC_MSG_CHECKING([for lstat])
4695   AC_CACHE_VAL(glibcxx_cv_lstat, [dnl
4696     GCC_TRY_COMPILE_OR_LINK(
4697       [ #include <sys/stat.h> ],
4698       [
4699         struct stat st;
4700         int i = lstat("path", &st);
4701       ],
4702       [glibcxx_cv_lstat=yes],
4703       [glibcxx_cv_lstat=no])
4704   ])
4705   if test $glibcxx_cv_lstat = yes; then
4706     AC_DEFINE(_GLIBCXX_USE_LSTAT, 1, [Define if lstat is available in <sys/stat.h>.])
4707   fi
4708   AC_MSG_RESULT($glibcxx_cv_lstat)
4710   AC_MSG_CHECKING([for struct stat.st_mtim.tv_nsec])
4711   AC_CACHE_VAL(glibcxx_cv_st_mtim, [dnl
4712     GCC_TRY_COMPILE_OR_LINK(
4713       [ #include <sys/stat.h> ],
4714       [
4715         struct stat st;
4716         return st.st_mtim.tv_nsec;
4717       ],
4718       [glibcxx_cv_st_mtim=yes],
4719       [glibcxx_cv_st_mtim=no])
4720   ])
4721   if test $glibcxx_cv_st_mtim = yes; then
4722     AC_DEFINE(_GLIBCXX_USE_ST_MTIM, 1, [Define if struct stat has timespec members.])
4723   fi
4724   AC_MSG_RESULT($glibcxx_cv_st_mtim)
4726   AC_MSG_CHECKING([for fchmod])
4727   AC_CACHE_VAL(glibcxx_cv_fchmod, [dnl
4728     GCC_TRY_COMPILE_OR_LINK(
4729       [#include <sys/stat.h>],
4730       [fchmod(1, S_IWUSR);],
4731       [glibcxx_cv_fchmod=yes],
4732       [glibcxx_cv_fchmod=no])
4733   ])
4734   if test $glibcxx_cv_fchmod = yes; then
4735     AC_DEFINE(_GLIBCXX_USE_FCHMOD, 1, [Define if fchmod is available in <sys/stat.h>.])
4736   fi
4737   AC_MSG_RESULT($glibcxx_cv_fchmod)
4739   AC_MSG_CHECKING([for fchmodat])
4740   AC_CACHE_VAL(glibcxx_cv_fchmodat, [dnl
4741     GCC_TRY_COMPILE_OR_LINK(
4742       [
4743         #include <fcntl.h>
4744         #include <sys/stat.h>
4745       ],
4746       [fchmodat(AT_FDCWD, "", 0, AT_SYMLINK_NOFOLLOW);],
4747       [glibcxx_cv_fchmodat=yes],
4748       [glibcxx_cv_fchmodat=no])
4749   ])
4750   if test $glibcxx_cv_fchmodat = yes; then
4751     AC_DEFINE(_GLIBCXX_USE_FCHMODAT, 1, [Define if fchmodat is available in <sys/stat.h>.])
4752   fi
4753   AC_MSG_RESULT($glibcxx_cv_fchmodat)
4755   AC_MSG_CHECKING([for sendfile that can copy files])
4756   AC_CACHE_VAL(glibcxx_cv_sendfile, [dnl
4757     case "${target_os}" in
4758       gnu* | linux* | solaris* | uclinux*)
4759         GCC_TRY_COMPILE_OR_LINK(
4760           [#include <sys/sendfile.h>],
4761           [sendfile(1, 2, (off_t*)0, sizeof 1);],
4762           [glibcxx_cv_sendfile=yes],
4763           [glibcxx_cv_sendfile=no])
4764         ;;
4765       *)
4766         glibcxx_cv_sendfile=no
4767         ;;
4768     esac
4769   ])
4770   if test $glibcxx_cv_sendfile = yes; then
4771     AC_DEFINE(_GLIBCXX_USE_SENDFILE, 1, [Define if sendfile is available in <sys/sendfile.h>.])
4772   fi
4773   AC_MSG_RESULT($glibcxx_cv_sendfile)
4775   AC_MSG_CHECKING([for link])
4776   AC_CACHE_VAL(glibcxx_cv_link, [dnl
4777     GCC_TRY_COMPILE_OR_LINK(
4778       [#include <unistd.h>],
4779       [link("", "");],
4780       [glibcxx_cv_link=yes],
4781       [glibcxx_cv_link=no])
4782   ])
4783   if test $glibcxx_cv_link = yes; then
4784     AC_DEFINE(HAVE_LINK, 1, [Define if link is available in <unistd.h>.])
4785   fi
4786   AC_MSG_RESULT($glibcxx_cv_link)
4788   AC_MSG_CHECKING([for readlink])
4789   AC_CACHE_VAL(glibcxx_cv_readlink, [dnl
4790     GCC_TRY_COMPILE_OR_LINK(
4791       [#include <unistd.h>],
4792       [char buf[32]; readlink("", buf, sizeof(buf));],
4793       [glibcxx_cv_readlink=yes],
4794       [glibcxx_cv_readlink=no])
4795   ])
4796   if test $glibcxx_cv_readlink = yes; then
4797     AC_DEFINE(HAVE_READLINK, 1, [Define if readlink is available in <unistd.h>.])
4798   fi
4799   AC_MSG_RESULT($glibcxx_cv_readlink)
4801   AC_MSG_CHECKING([for symlink])
4802   AC_CACHE_VAL(glibcxx_cv_symlink, [dnl
4803     GCC_TRY_COMPILE_OR_LINK(
4804       [#include <unistd.h>],
4805       [symlink("", "");],
4806       [glibcxx_cv_symlink=yes],
4807       [glibcxx_cv_symlink=no])
4808   ])
4809   if test $glibcxx_cv_symlink = yes; then
4810     AC_DEFINE(HAVE_SYMLINK, 1, [Define if symlink is available in <unistd.h>.])
4811   fi
4812   AC_MSG_RESULT($glibcxx_cv_symlink)
4814   AC_MSG_CHECKING([for truncate])
4815   AC_CACHE_VAL(glibcxx_cv_truncate, [dnl
4816     GCC_TRY_COMPILE_OR_LINK(
4817       [#include <unistd.h>],
4818       [truncate("", 99);],
4819       [glibcxx_cv_truncate=yes],
4820       [glibcxx_cv_truncate=no])
4821   ])
4822   if test $glibcxx_cv_truncate = yes; then
4823     AC_DEFINE(HAVE_TRUNCATE, 1, [Define if truncate is available in <unistd.h>.])
4824   fi
4825   AC_MSG_RESULT($glibcxx_cv_truncate)
4827   CXXFLAGS="$ac_save_CXXFLAGS"
4828   AC_LANG_RESTORE
4832 dnl Check how size_t is mangled.  Copied from libitm.
4834 AC_DEFUN([GLIBCXX_CHECK_SIZE_T_MANGLING], [
4835   AC_CACHE_CHECK([how size_t is mangled],
4836                  glibcxx_cv_size_t_mangling, [
4837     AC_TRY_COMPILE([], [extern __SIZE_TYPE__ x; extern unsigned long x;],
4838                    [glibcxx_cv_size_t_mangling=m], [
4839       AC_TRY_COMPILE([], [extern __SIZE_TYPE__ x; extern unsigned int x;],
4840                      [glibcxx_cv_size_t_mangling=j], [
4841         AC_TRY_COMPILE([],
4842                        [extern __SIZE_TYPE__ x; extern unsigned long long x;],
4843                        [glibcxx_cv_size_t_mangling=y], [
4844           AC_TRY_COMPILE([],
4845                          [extern __SIZE_TYPE__ x; extern unsigned short x;],
4846                          [glibcxx_cv_size_t_mangling=t], [
4847             AC_TRY_COMPILE([],
4848                            [extern __SIZE_TYPE__ x; extern __int20 unsigned x;],
4849                            [glibcxx_cv_size_t_mangling=u6uint20],
4850                            [glibcxx_cv_size_t_mangling=x])
4851           ])
4852         ])
4853       ])
4854     ])
4855   ])
4856   if test $glibcxx_cv_size_t_mangling = x; then
4857     AC_MSG_ERROR([Unknown underlying type for size_t])
4858   fi
4859   AC_DEFINE_UNQUOTED(_GLIBCXX_MANGLE_SIZE_T, [$glibcxx_cv_size_t_mangling],
4860     [Define to the letter to which size_t is mangled.])
4864 dnl Determine whether std::exception_ptr symbols should be exported with
4865 dnl the symbol versions from GCC 4.6.0 or GCC 7.1.0, depending on which
4866 dnl release first added support for std::exception_ptr. Originally it was
4867 dnl only supported for targets with always-lock-free atomics for int, but
4868 dnl since GCC 7.1 it is supported for all targets.
4870 AC_DEFUN([GLIBCXX_CHECK_EXCEPTION_PTR_SYMVER], [
4871   if test $enable_symvers != no; then
4872     AC_MSG_CHECKING([for first version to support std::exception_ptr])
4873     case ${target} in
4874       aarch64-*-* | alpha-*-* | hppa*-*-* | i?86-*-* | x86_64-*-* | \
4875       m68k-*-* | powerpc*-*-* | s390*-*-* | *-*-solaris* )
4876         ac_exception_ptr_since_gcc46=yes
4877         ;;
4878       *)
4879         # If the value of this macro changes then we will need to hardcode
4880         # yes/no here for additional targets based on the original value.
4881         AC_TRY_COMPILE([], [
4882           #if __GCC_ATOMIC_INT_LOCK_FREE <= 1
4883           # error atomic int not always lock free
4884           #endif
4885           ],
4886           [ac_exception_ptr_since_gcc46=yes],
4887           [ac_exception_ptr_since_gcc46=no])
4888         ;;
4889     esac
4890     if test x"$ac_exception_ptr_since_gcc46" = x"yes" ; then
4891       AC_DEFINE(HAVE_EXCEPTION_PTR_SINCE_GCC46, 1,
4892         [Define to 1 if GCC 4.6 supported std::exception_ptr for the target])
4893       AC_MSG_RESULT([4.6.0])
4894     else
4895       AC_MSG_RESULT([7.1.0])
4896     fi
4897   fi
4900 # Macros from the top-level gcc directory.
4901 m4_include([../config/gc++filt.m4])
4902 m4_include([../config/tls.m4])
4903 m4_include([../config/gthr.m4])
4904 m4_include([../config/cet.m4])