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