2 dnl GLIBCXX_CONDITIONAL (NAME, SHELL-TEST)
4 dnl Exactly like AM_CONDITIONAL, but delays evaluation of the test until the
5 dnl end of configure. This lets tested variables be reassigned, and the
6 dnl conditional will depend on the final state of the variable. For a simple
7 dnl example of why this is needed, see GLIBCXX_ENABLE_HOSTED.
9 m4_define([_m4_divert(glibcxx_diversion)], 8000)dnl
10 AC_DEFUN([GLIBCXX_CONDITIONAL], [dnl
11 m4_divert_text([glibcxx_diversion],dnl
12 AM_CONDITIONAL([$1],[$2])
15 AC_DEFUN([GLIBCXX_EVALUATE_CONDITIONALS], [m4_undivert([glibcxx_diversion])])dnl
19 dnl Check to see what architecture and operating system we are compiling
20 dnl for. Also, if architecture- or OS-specific flags are required for
21 dnl compilation, pick them up here.
23 AC_DEFUN([GLIBCXX_CHECK_HOST], [
24 . $glibcxx_srcdir/configure.host
25 AC_MSG_NOTICE([CPU config directory is $cpu_include_dir])
26 AC_MSG_NOTICE([OS config directory is $os_include_dir])
30 dnl Initialize the rest of the library configury. At this point we have
31 dnl variables like $host.
36 dnl glibcxx_builddir (absolute path)
37 dnl glibcxx_srcdir (absolute path)
38 dnl toplevel_builddir (absolute path)
39 dnl toplevel_srcdir (absolute path)
42 dnl with_target_subdir
44 dnl - the variables in GLIBCXX_CHECK_HOST / configure.host
45 dnl - default settings for all AM_CONFITIONAL test variables
46 dnl - lots of tools, like CC and CXX
48 AC_DEFUN([GLIBCXX_CONFIGURE], [
49 # Keep these sync'd with the list in Makefile.am. The first provides an
50 # expandable list at autoconf time; the second provides an expandable list
51 # (i.e., shell variable) at configure time.
52 m4_define([glibcxx_SUBDIRS],[include libsupc++ src src/c++98 src/c++11 src/c++17 src/c++20 src/filesystem src/libbacktrace src/experimental doc po testsuite python])
53 SUBDIRS='glibcxx_SUBDIRS'
55 # These need to be absolute paths, yet at the same time need to
56 # canonicalize only relative paths, because then amd will not unmount
57 # drives. Thus the use of PWDCMD: set it to 'pawd' or 'amq -w' if using amd.
58 glibcxx_builddir=`${PWDCMD-pwd}`
60 [\\/$]* | ?:[\\/]*) glibcxx_srcdir=${srcdir} ;;
61 *) glibcxx_srcdir=`cd "$srcdir" && ${PWDCMD-pwd} || echo "$srcdir"` ;;
63 toplevel_builddir=${glibcxx_builddir}/..
64 toplevel_srcdir=${glibcxx_srcdir}/..
65 AC_SUBST(glibcxx_builddir)
66 AC_SUBST(glibcxx_srcdir)
67 AC_SUBST(toplevel_builddir)
68 AC_SUBST(toplevel_srcdir)
70 # We use these options to decide which functions to include. They are
71 # set from the top level.
72 AC_ARG_WITH([target-subdir],
73 AC_HELP_STRING([--with-target-subdir=SUBDIR],
74 [configuring in a subdirectory]))
76 AC_ARG_WITH([cross-host],
77 AC_HELP_STRING([--with-cross-host=HOST],
78 [configuring with a cross compiler]))
81 AC_HELP_STRING([--with-newlib],
82 [assume newlib as a system C library]))
84 # Will set LN_S to either 'ln -s', 'ln', or 'cp -p' (if linking isn't
85 # available). Uncomment the next line to force a particular method.
91 AC_CHECK_TOOL(RANLIB, ranlib, ranlib-not-found-in-path-error)
95 # Set up safe default values for all subsequent AM_CONDITIONAL tests
96 # which are themselves conditionally expanded.
97 ## (Right now, this only matters for enable_wchar_t, but nothing prevents
98 ## other macros from doing the same. This should be automated.) -pme
100 # Check for C library flavor since GNU/Linux platforms use different
101 # configuration directories depending on the C library in use.
102 AC_EGREP_CPP([_using_uclibc], [
107 ], uclibc=yes, uclibc=no)
109 AC_EGREP_CPP([_using_bionic], [
114 ], bionic=yes, bionic=no)
116 # Find platform-specific directories containing configuration info.
117 # Also possibly modify flags used elsewhere, as needed by the platform.
123 dnl Tests for newer compiler features, or features that are present in newer
124 dnl compiler versions but not older compiler versions still in use, should
128 dnl WERROR='-Werror' if requested and possible; g++'s that lack the
129 dnl new inlining code or the new system_header pragma will die on -Werror.
130 dnl Leave it out by default and use maint-mode to use it.
131 dnl SECTION_FLAGS='-ffunction-sections -fdata-sections' if
132 dnl compiler supports it and the user has not requested debug mode.
134 AC_DEFUN([GLIBCXX_CHECK_COMPILER_FEATURES], [
135 # All these tests are for C++; save the language and the compiler flags.
136 # The CXXFLAGS thing is suspicious, but based on similar bits previously
137 # found in GLIBCXX_CONFIGURE.
140 ac_test_CXXFLAGS="${CXXFLAGS+set}"
141 ac_save_CXXFLAGS="$CXXFLAGS"
143 # Check for -ffunction-sections -fdata-sections
144 AC_MSG_CHECKING([for g++ that supports -ffunction-sections -fdata-sections])
145 CXXFLAGS='-g -Werror -ffunction-sections -fdata-sections'
146 AC_TRY_COMPILE([int foo; void bar() { };],, [ac_fdsections=yes], [ac_fdsections=no])
147 if test "$ac_test_CXXFLAGS" = set; then
148 CXXFLAGS="$ac_save_CXXFLAGS"
150 # this is the suspicious part
153 if test x"$ac_fdsections" = x"yes"; then
154 SECTION_FLAGS='-ffunction-sections -fdata-sections'
156 AC_MSG_RESULT($ac_fdsections)
159 AC_SUBST(SECTION_FLAGS)
164 dnl If GNU ld is in use, check to see if tricky linker opts can be used. If
165 dnl the native linker is in use, all variables will be defined to something
166 dnl safe (like an empty string).
169 dnl SECTION_LDFLAGS='-Wl,--gc-sections' if possible
170 dnl OPT_LDFLAGS='-Wl,-O1' and '-z,relro' if possible
171 dnl LD (as a side effect of testing)
174 dnl glibcxx_ld_is_gold (set to "no" or "yes")
175 dnl glibcxx_ld_is_mold (set to "no" or "yes")
176 dnl glibcxx_gnu_ld_version (possibly)
178 dnl The last will be a single integer, e.g., version 1.23.45.0.67.89 will
179 dnl set glibcxx_gnu_ld_version to 12345. Zeros cause problems.
181 AC_DEFUN([GLIBCXX_CHECK_LINKER_FEATURES], [
182 # If we're not using GNU ld, then there's no point in even trying these
183 # tests. Check for that first. We should have already tested for gld
184 # by now (in libtool), but require it now just to be safe...
185 test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS=''
186 test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''
187 AC_REQUIRE([AC_PROG_LD])
188 AC_REQUIRE([AC_PROG_AWK])
190 # The name set by libtool depends on the version of libtool. Shame on us
191 # for depending on an impl detail, but c'est la vie. Older versions used
192 # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
193 # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
194 # makes sense). We'll test with_gnu_ld everywhere else, so if that isn't
195 # set (hence we're using an older libtool), then set it.
196 if test x${with_gnu_ld+set} != xset; then
197 if test x${ac_cv_prog_gnu_ld+set} != xset; then
198 # We got through "ac_require(ac_prog_ld)" and still not set? Huh?
201 with_gnu_ld=$ac_cv_prog_gnu_ld
205 # Start by getting the version number. I think the libtool test already
206 # does some of this, but throws away the result.
207 glibcxx_ld_is_gold=no
208 glibcxx_ld_is_mold=no
209 if test x"$with_gnu_ld" = x"yes"; then
210 AC_MSG_CHECKING([for ld version])
212 if $LD --version 2>/dev/null | grep 'GNU gold' >/dev/null 2>&1; then
213 glibcxx_ld_is_gold=yes
214 elif $LD --version 2>/dev/null | grep 'mold' >/dev/null 2>&1; then
215 glibcxx_ld_is_mold=yes
217 ldver=`$LD --version 2>/dev/null |
218 sed -e 's/[. ][0-9]\{8\}$//;s/.* \([^ ]\{1,\}\)$/\1/; q'`
220 glibcxx_gnu_ld_version=`echo $ldver | \
221 $AWK -F. '{ if (NF<3) [$]3=0; print ([$]1*100+[$]2)*100+[$]3 }'`
222 AC_MSG_RESULT($glibcxx_gnu_ld_version)
226 glibcxx_have_gc_sections=no
227 if test "$glibcxx_ld_is_gold" = "yes" || test "$glibcxx_ld_is_mold" = "yes" ; then
228 if $LD --help 2>/dev/null | grep gc-sections >/dev/null 2>&1; then
229 glibcxx_have_gc_sections=yes
232 glibcxx_gcsections_min_ld=21602
233 if test x"$with_gnu_ld" = x"yes" &&
234 test $glibcxx_gnu_ld_version -gt $glibcxx_gcsections_min_ld ; then
235 glibcxx_have_gc_sections=yes
238 if test "$glibcxx_have_gc_sections" = "yes"; then
239 # Sufficiently young GNU ld it is! Joy and bunny rabbits!
240 # NB: This flag only works reliably after 2.16.1. Configure tests
241 # for this are difficult, so hard wire a value that should work.
243 ac_test_CFLAGS="${CFLAGS+set}"
244 ac_save_CFLAGS="$CFLAGS"
245 CFLAGS='-Wl,--gc-sections'
247 # Check for -Wl,--gc-sections
248 AC_MSG_CHECKING([for ld that supports -Wl,--gc-sections])
249 AC_TRY_LINK([ int one(void) { return 1; }
250 int two(void) { return 2; }
251 ], [ two(); ] , [ac_gcsections=yes], [ac_gcsections=no])
252 if test "$ac_gcsections" = "yes"; then
255 if $CC -c conftest.c; then
256 if $LD --gc-sections -o conftest conftest.o 2>&1 | \
257 grep "Warning: gc-sections option ignored" > /dev/null; then
261 rm -f conftest.c conftest.o conftest
263 if test "$ac_gcsections" = "yes"; then
264 SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS"
266 AC_MSG_RESULT($ac_gcsections)
268 if test "$ac_test_CFLAGS" = set; then
269 CFLAGS="$ac_save_CFLAGS"
271 # this is the suspicious part
277 # Note this is only for shared objects.
279 if test x"$with_gnu_ld" = x"yes"; then
280 # cygwin and mingw uses PE, which has no ELF relro support,
281 # multi target ld may confuse configure machinery
288 AC_MSG_CHECKING([for ld that supports -Wl,-z,relro])
289 cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"`
290 if test -n "$cxx_z_relo"; then
291 OPT_LDFLAGS="-Wl,-z,relro"
294 AC_MSG_RESULT($ac_ld_relro)
298 # Set linker optimization flags.
299 if test x"$with_gnu_ld" = x"yes"; then
300 OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
303 AC_SUBST(SECTION_LDFLAGS)
304 AC_SUBST(OPT_LDFLAGS)
309 dnl Check for headers for, and arguments to, the setrlimit() function.
310 dnl Used only in testsuite_hooks.h. Called from GLIBCXX_CONFIGURE_TESTSUITE.
313 dnl _GLIBCXX_RES_LIMITS if we can set artificial resource limits
314 dnl various HAVE_LIMIT_* for individual limit names
316 AC_DEFUN([GLIBCXX_CHECK_SETRLIMIT_ancilliary], [
317 AC_MSG_CHECKING([for RLIMIT_$1])
320 #include <sys/time.h>
321 #include <sys/resource.h>
323 [ int f = RLIMIT_$1 ; ],
324 [glibcxx_mresult=1], [glibcxx_mresult=0])
325 AC_DEFINE_UNQUOTED(HAVE_LIMIT_$1, $glibcxx_mresult,
326 [Only used in build directory testsuite_hooks.h.])
327 if test $glibcxx_mresult = 1 ; then res=yes ; else res=no ; fi
331 AC_DEFUN([GLIBCXX_CHECK_SETRLIMIT], [
334 setrlimit_have_headers=yes
335 AC_CHECK_HEADERS(unistd.h sys/time.h sys/resource.h,
337 [setrlimit_have_headers=no])
338 # If don't have the headers, then we can't run the tests now, and we
339 # won't be seeing any of these during testsuite compilation.
340 if test $setrlimit_have_headers = yes; then
341 # Can't do these in a loop, else the resulting syntax is wrong.
342 GLIBCXX_CHECK_SETRLIMIT_ancilliary(DATA)
343 GLIBCXX_CHECK_SETRLIMIT_ancilliary(RSS)
344 GLIBCXX_CHECK_SETRLIMIT_ancilliary(VMEM)
345 GLIBCXX_CHECK_SETRLIMIT_ancilliary(AS)
346 GLIBCXX_CHECK_SETRLIMIT_ancilliary(FSIZE)
348 # Check for rlimit, setrlimit.
349 AC_CACHE_CHECK([for testsuite resource limits support],
350 glibcxx_cv_setrlimit, [
353 #include <sys/time.h>
354 #include <sys/resource.h>
358 [glibcxx_cv_setrlimit=yes], [glibcxx_cv_setrlimit=no])
361 if test $glibcxx_cv_setrlimit = yes; then
362 AC_DEFINE(_GLIBCXX_RES_LIMITS, 1,
363 [Define if using setrlimit to set resource limits during
372 dnl Check whether S_ISREG (Posix) or S_IFREG is available in <sys/stat.h>.
373 dnl Define HAVE_S_ISREG / HAVE_S_IFREG appropriately.
375 AC_DEFUN([GLIBCXX_CHECK_S_ISREG_OR_S_IFREG], [
379 ac_save_CXXFLAGS="$CXXFLAGS"
380 CXXFLAGS="$CXXFLAGS -fno-exceptions"
382 AC_MSG_CHECKING([for S_ISREG or S_IFREG])
383 AC_CACHE_VAL(glibcxx_cv_S_ISREG, [
384 GCC_TRY_COMPILE_OR_LINK(
385 [#include <sys/stat.h>],
388 S_ISREG(buffer.st_mode);],
389 [glibcxx_cv_S_ISREG=yes],
390 [glibcxx_cv_S_ISREG=no])
392 AC_CACHE_VAL(glibcxx_cv_S_IFREG, [
393 GCC_TRY_COMPILE_OR_LINK(
394 [#include <sys/stat.h>],
397 S_IFREG & buffer.st_mode;],
398 [glibcxx_cv_S_IFREG=yes],
399 [glibcxx_cv_S_IFREG=no])
402 if test $glibcxx_cv_S_ISREG = yes; then
403 AC_DEFINE(HAVE_S_ISREG, 1,
404 [Define if S_ISREG is available in <sys/stat.h>.])
406 elif test $glibcxx_cv_S_IFREG = yes; then
407 AC_DEFINE(HAVE_S_IFREG, 1,
408 [Define if S_IFREG is available in <sys/stat.h>.])
413 CXXFLAGS="$ac_save_CXXFLAGS"
419 dnl Check whether poll is available in <poll.h>, and define HAVE_POLL.
421 AC_DEFUN([GLIBCXX_CHECK_POLL], [
425 ac_save_CXXFLAGS="$CXXFLAGS"
426 CXXFLAGS="$CXXFLAGS -fno-exceptions"
428 AC_CACHE_CHECK([for poll], glibcxx_cv_POLL, [
429 GCC_TRY_COMPILE_OR_LINK(
431 [struct pollfd pfd[1];
432 pfd[0].events = POLLIN;
434 [glibcxx_cv_POLL=yes],
435 [glibcxx_cv_POLL=no])
437 if test $glibcxx_cv_POLL = yes; then
438 AC_DEFINE(HAVE_POLL, 1, [Define if poll is available in <poll.h>.])
441 CXXFLAGS="$ac_save_CXXFLAGS"
447 dnl Check whether writev is available in <sys/uio.h>, and define HAVE_WRITEV.
449 AC_DEFUN([GLIBCXX_CHECK_WRITEV], [
453 ac_save_CXXFLAGS="$CXXFLAGS"
454 CXXFLAGS="$CXXFLAGS -fno-exceptions"
456 AC_CACHE_CHECK([for writev], glibcxx_cv_WRITEV, [
457 GCC_TRY_COMPILE_OR_LINK(
458 [#include <sys/uio.h>],
459 [struct iovec iov[2];
461 [glibcxx_cv_WRITEV=yes],
462 [glibcxx_cv_WRITEV=no])
464 if test $glibcxx_cv_WRITEV = yes; then
465 AC_DEFINE(HAVE_WRITEV, 1, [Define if writev is available in <sys/uio.h>.])
468 CXXFLAGS="$ac_save_CXXFLAGS"
474 dnl Check whether LFS support is available.
476 AC_DEFUN([GLIBCXX_CHECK_LFS], [
479 ac_save_CXXFLAGS="$CXXFLAGS"
480 CXXFLAGS="$CXXFLAGS -fno-exceptions"
481 AC_CACHE_CHECK([for LFS support], glibcxx_cv_LFS, [
482 GCC_TRY_COMPILE_OR_LINK(
485 #include <sys/stat.h>
489 fseeko64(fp, 0, SEEK_CUR);
491 lseek64(1, 0, SEEK_CUR);
494 [glibcxx_cv_LFS=yes],
497 if test $glibcxx_cv_LFS = yes; then
498 AC_DEFINE(_GLIBCXX_USE_LFS, 1, [Define if LFS support is available.])
501 AC_CACHE_CHECK([for fseeko and ftello], glibcxx_cv_posix_lfs, [
502 GCC_TRY_COMPILE_OR_LINK(
506 fseeko(fp, 0, SEEK_CUR);
509 [glibcxx_cv_posix_lfs=yes],
510 [glibcxx_cv_posix_lfs=no])
512 if test $glibcxx_cv_posix_lfs = yes; then
513 AC_DEFINE(_GLIBCXX_USE_FSEEKO_FTELLO, 1, [Define if fseeko and ftello are available.])
516 CXXFLAGS="$ac_save_CXXFLAGS"
522 dnl Check whether the old Copy-On-Write basic_string should allocate a new
523 dnl empty representation for every default-constructed basic_string. Without
524 dnl this option, COW strings share a single empty rep in static storage,
525 dnl but this only works if the linker can guarantee the static storage has
526 dnl a unique definition in the process. It also doesn't work if basic_string
527 dnl objects are stored in shared memory (see PR libstdc++/16612).
528 dnl When fully dynamic strings are enabled, the static storage is not used
529 dnl and a new empty string with reference-count == 1 is allocated each time.
530 dnl Enabling this changes the libstdc++.so ABI.
532 dnl --enable-fully-dynamic-string defines _GLIBCXX_FULLY_DYNAMIC_STRING to 1
533 dnl --disable-fully-dynamic-string defines _GLIBCXX_FULLY_DYNAMIC_STRING to 0
534 dnl otherwise the macro is not defined.
535 dnl + Usage: GLIBCXX_ENABLE_FULLY_DYNAMIC_STRING[(DEFAULT)]
536 dnl Where DEFAULT is either `yes' or `no'.
538 AC_DEFUN([GLIBCXX_ENABLE_FULLY_DYNAMIC_STRING], [
539 GLIBCXX_ENABLE(fully-dynamic-string,$1,,[do not put empty strings in per-process static memory], [permit yes|no])
540 if test $enable_fully_dynamic_string = yes; then
541 enable_fully_dynamic_string_def=1
543 enable_fully_dynamic_string_def=0
545 AC_DEFINE_UNQUOTED([_GLIBCXX_FULLY_DYNAMIC_STRING], [${enable_fully_dynamic_string_def}],
546 [Define to 1 if a fully dynamic basic_string is wanted, 0 to disable, undefined for platform defaults])
551 dnl Does any necessary configuration of the testsuite directory. Generates
552 dnl the testsuite_hooks.h header.
554 dnl GLIBCXX_ENABLE_SYMVERS and GLIBCXX_IS_NATIVE must be done before this.
558 dnl GLIBCXX_TEST_WCHAR_T
559 dnl GLIBCXX_TEST_THREAD
562 dnl baseline_subdir_switch
564 AC_DEFUN([GLIBCXX_CONFIGURE_TESTSUITE], [
565 # Do checks for resource limit functions.
566 GLIBCXX_CHECK_SETRLIMIT
568 if $GLIBCXX_IS_NATIVE ; then
569 # Look for setenv, so that extended locale tests can be performed.
570 GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_3(setenv)
573 if $GLIBCXX_IS_NATIVE && test $is_hosted = yes &&
574 test $enable_symvers != no; then
577 enable_abi_check=no ;;
579 enable_abi_check=yes ;;
582 # Only build this as native, since automake does not understand
587 # Export file names for ABI checking.
588 baseline_dir="$glibcxx_srcdir/config/abi/post/${abi_baseline_pair}"
589 AC_SUBST(baseline_dir)
590 baseline_subdir_switch="$abi_baseline_subdir_switch"
591 AC_SUBST(baseline_subdir_switch)
596 dnl Does any necessary configuration for docbook in the docs directory.
598 dnl XSLTPROC must be set before this
601 dnl glibcxx_stylesheets
605 AC_DEFUN([GLIBCXX_CONFIGURE_DOCBOOK], [
607 glibcxx_docbook_url=http://docbook.sourceforge.net/release/xsl-ns/current/
609 AC_MSG_CHECKING([for local stylesheet directory])
610 glibcxx_local_stylesheets=no
611 if test x${XMLCATALOG} = xyes && xsl_style_dir=`xmlcatalog "" $glibcxx_docbook_url 2>/dev/null`
613 XSL_STYLE_DIR=`echo $xsl_style_dir | sed -n 's;^file://;;p'`
614 glibcxx_local_stylesheets=yes
617 /usr/share/sgml/docbook/xsl-ns-stylesheets \
618 /usr/share/xml/docbook/stylesheet/docbook-xsl-ns \
619 /usr/share/xml/docbook/stylesheet/nwalsh5/current \
620 /usr/share/xml/docbook/stylesheet/nwalsh/current
622 if test -d $dir; then
623 glibcxx_local_stylesheets=yes
629 AC_MSG_RESULT($glibcxx_local_stylesheets)
631 if test x"$glibcxx_local_stylesheets" = x"yes"; then
632 AC_SUBST(XSL_STYLE_DIR)
633 AC_MSG_NOTICE($XSL_STYLE_DIR)
635 AC_MSG_CHECKING([for docbook stylesheets for documentation creation])
636 glibcxx_stylesheets=no
637 if test x${XMLCATALOG} = xno || xmlcatalog "" $glibcxx_docbook_url/xhtml/docbook.xsl >/dev/null 2>&1; then
638 if test x${XSLTPROC} = xyes && echo '<title/>' | xsltproc --noout --nonet --xinclude $glibcxx_docbook_url/xhtml/docbook.xsl - 2>/dev/null; then
639 glibcxx_stylesheets=yes
642 AC_MSG_RESULT($glibcxx_stylesheets)
645 glibcxx_stylesheets=no
648 # Check for epub3 dependencies.
649 AC_MSG_CHECKING([for epub3 stylesheets for documentation creation])
650 glibcxx_epub_stylesheets=no
651 if test x"$glibcxx_local_stylesheets" = x"yes"; then
652 if test -f "$XSL_STYLE_DIR/epub3/chunk.xsl"; then
653 glibcxx_epub_stylesheets=yes
656 AC_MSG_RESULT($glibcxx_epub_stylesheets)
657 AM_CONDITIONAL(BUILD_EPUB, test x"$glibcxx_epub_stylesheets" = x"yes")
663 dnl Set up *_INCLUDES variables for all sundry Makefile.am's.
667 dnl TOPLEVEL_INCLUDES
669 AC_DEFUN([GLIBCXX_EXPORT_INCLUDES], [
670 # Used for every C++ compile we perform.
672 -I$glibcxx_builddir/include/$host_alias \
673 -I$glibcxx_builddir/include \
674 -I$glibcxx_srcdir/libsupc++"
676 # For Canadian crosses, pick this up too.
677 if test $CANADIAN = yes; then
678 GLIBCXX_INCLUDES="$GLIBCXX_INCLUDES -I\${includedir}"
681 # Stuff in the actual top level. Currently only used by libsupc++ to
682 # get unwind* headers from the libgcc dir.
683 #TOPLEVEL_INCLUDES='-I$(toplevel_srcdir)/libgcc -I$(toplevel_srcdir)/include'
684 TOPLEVEL_INCLUDES='-I$(toplevel_srcdir)/libgcc'
686 # Now, export this to all the little Makefiles....
687 AC_SUBST(GLIBCXX_INCLUDES)
688 AC_SUBST(TOPLEVEL_INCLUDES)
693 dnl Set up *_FLAGS and *FLAGS variables for all sundry Makefile.am's.
694 dnl (SECTION_FLAGS is done under CHECK_COMPILER_FEATURES.)
698 dnl OPTIMIZE_CXXFLAGS
701 AC_DEFUN([GLIBCXX_EXPORT_FLAGS], [
704 # Optimization flags that are probably a good idea for thrill-seekers. Just
705 # uncomment the lines below and make, everything else is ready to go...
706 # Alternatively OPTIMIZE_CXXFLAGS can be set in configure.host.
707 # OPTIMIZE_CXXFLAGS = -O3 -fstrict-aliasing -fvtable-gc
708 AC_SUBST(OPTIMIZE_CXXFLAGS)
710 WARN_FLAGS="-Wall -Wextra -Wwrite-strings -Wcast-qual -Wabi=2"
716 dnl All installation directory information is determined here.
720 dnl glibcxx_prefixdir
721 dnl glibcxx_toolexecdir
722 dnl glibcxx_toolexeclibdir
724 dnl Assumes cross_compiling bits already done, and with_cross_host in
727 dnl This logic must match gcc/configure.ac's setting of gcc_gxx_include_dir.
728 dnl config/gxx-include-dir.m4 must be kept consistant with this as well.
729 AC_DEFUN([GLIBCXX_EXPORT_INSTALL_INFO], [
730 glibcxx_toolexecdir=no
731 glibcxx_toolexeclibdir=no
732 glibcxx_prefixdir=$prefix
734 AC_MSG_CHECKING([for gxx-include-dir])
735 AC_ARG_WITH([gxx-include-dir],
736 AC_HELP_STRING([--with-gxx-include-dir=DIR],
737 [installation directory for include files]),
739 yes) AC_MSG_ERROR([Missing directory for --with-gxx-include-dir]) ;;
740 no) gxx_include_dir=no ;;
741 *) gxx_include_dir=$withval ;;
743 [gxx_include_dir=no])
744 AC_MSG_RESULT($gxx_include_dir)
746 AC_MSG_CHECKING([for --enable-version-specific-runtime-libs])
747 AC_ARG_ENABLE([version-specific-runtime-libs],
748 AC_HELP_STRING([--enable-version-specific-runtime-libs],
749 [Specify that runtime libraries should be installed in a compiler-specific directory]),
750 [case "$enableval" in
751 yes) version_specific_libs=yes ;;
752 no) version_specific_libs=no ;;
753 *) AC_MSG_ERROR([Unknown argument to enable/disable version-specific libs]);;
755 [version_specific_libs=no])
756 AC_MSG_RESULT($version_specific_libs)
758 GCC_WITH_TOOLEXECLIBDIR
760 # Default case for install directory for include files.
761 if test $version_specific_libs = no && test $gxx_include_dir = no; then
762 gxx_include_dir='include/c++/${gcc_version}'
763 if test -n "$with_cross_host" &&
764 test x"$with_cross_host" != x"no"; then
765 gxx_include_dir='${prefix}/${target_alias}/'"$gxx_include_dir"
767 gxx_include_dir='${prefix}/'"$gxx_include_dir"
771 # Version-specific runtime libs processing.
772 if test $version_specific_libs = yes; then
773 # Need the gcc compiler version to know where to install libraries
774 # and header files if --enable-version-specific-runtime-libs option
775 # is selected. FIXME: these variables are misnamed, there are
776 # no executables installed in _toolexecdir or _toolexeclibdir.
777 if test x"$gxx_include_dir" = x"no"; then
778 gxx_include_dir='${libdir}/gcc/${host_alias}/${gcc_version}/include/c++'
780 glibcxx_toolexecdir='${libdir}/gcc/${host_alias}'
781 glibcxx_toolexeclibdir='${toolexecdir}/${gcc_version}$(MULTISUBDIR)'
784 # Calculate glibcxx_toolexecdir, glibcxx_toolexeclibdir
785 # Install a library built with a cross compiler in tooldir, not libdir.
786 if test x"$glibcxx_toolexecdir" = x"no"; then
787 if test -n "$with_cross_host" &&
788 test x"$with_cross_host" != x"no"; then
789 glibcxx_toolexecdir='${exec_prefix}/${host_alias}'
790 case ${with_toolexeclibdir} in
792 glibcxx_toolexeclibdir='${toolexecdir}/lib'
795 glibcxx_toolexeclibdir=${with_toolexeclibdir}
799 glibcxx_toolexecdir='${libdir}/gcc/${host_alias}'
800 glibcxx_toolexeclibdir='${libdir}'
802 multi_os_directory=`$CXX -print-multi-os-directory`
803 case $multi_os_directory in
804 .) ;; # Avoid trailing /.
805 *) glibcxx_toolexeclibdir=$glibcxx_toolexeclibdir/$multi_os_directory ;;
809 AC_MSG_CHECKING([for install location])
810 AC_MSG_RESULT($gxx_include_dir)
812 AC_SUBST(glibcxx_prefixdir)
813 AC_SUBST(gxx_include_dir)
814 AC_SUBST(glibcxx_toolexecdir)
815 AC_SUBST(glibcxx_toolexeclibdir)
821 dnl (FEATURE, DEFAULT, HELP-ARG, HELP-STRING)
822 dnl (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, permit a|b|c)
823 dnl (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, SHELL-CODE-HANDLER)
825 dnl See manual/appendix_porting.html#appendix.porting.build_hacking for
828 m4_define([GLIBCXX_ENABLE],[dnl
829 m4_define([_g_switch],[--enable-$1])dnl
830 m4_define([_g_help],[AC_HELP_STRING([_g_switch$3],[$4 @<:@default=$2@:>@])])dnl
831 AC_ARG_ENABLE([$1],m4_dquote(_g_help),
836 m4_bpatsubst([$5],[permit ])) ;;
837 *) AC_MSG_ERROR(Unknown argument to enable/disable $1) ;;
838 dnl Idea for future: generate a URL pointing to
839 dnl "onlinedocs/configopts.html#whatever"
846 *) AC_MSG_ERROR(Argument to enable/disable $1 must be yes or no) ;;
850 [enable_]m4_bpatsubst([$1],-,_)[=][$2])
851 m4_undefine([_g_switch])dnl
852 m4_undefine([_g_help])dnl
857 dnl Check for ISO/IEC 9899:1999 "C99" support.
859 dnl --enable-c99 defines _GLIBCXX_USE_C99
860 dnl --disable-c99 leaves _GLIBCXX_USE_C99 undefined
861 dnl + Usage: GLIBCXX_ENABLE_C99[(DEFAULT)]
862 dnl Where DEFAULT is either `yes' or `no'.
863 dnl + If 'C99' stuff is not available, ignores DEFAULT and sets `no'.
865 AC_DEFUN([GLIBCXX_ENABLE_C99], [
866 GLIBCXX_ENABLE(c99,$1,,[turns on ISO/IEC 9899:1999 support])
868 if test x"$enable_c99" = x"yes"; then
872 # Use -std=c++98 (instead of -std=gnu++98) because leaving __STRICT_ANSI__
873 # undefined may cause fake C99 facilities, like pre-standard snprintf,
874 # to be spuriously enabled.
875 ac_save_CXXFLAGS="$CXXFLAGS"
876 CXXFLAGS="$CXXFLAGS -std=c++98"
878 ac_save_gcc_no_link="$gcc_no_link"
880 if test x$gcc_no_link != xyes; then
881 # Use -fno-exceptions to that the C driver can link these tests without
882 # hitting undefined references to personality routines.
883 CXXFLAGS="$CXXFLAGS -fno-exceptions"
884 AC_CHECK_LIB(m, sin, [LIBS="$LIBS -lm"], [
885 # Use the default compile-only tests in GCC_TRY_COMPILE_OR_LINK
890 # Check for the existence of <math.h> functions used if C99 is enabled.
891 AC_CACHE_CHECK([for ISO C99 support in <math.h> for C++98],
892 glibcxx_cv_c99_math_cxx98, [
893 GCC_TRY_COMPILE_OR_LINK(
895 volatile double d1, d2;
903 i = isgreater(d1, d2);
904 i = isgreaterequal(d1, d2);
906 i = islessequal(d1, d2);
907 i = islessgreater(d1, d2);
908 i = islessgreater(d1, d2);
909 i = isunordered(d1, d2);
910 ], [glibcxx_cv_c99_math_cxx98=yes], [glibcxx_cv_c99_math_cxx98=no])
912 if test x"$glibcxx_cv_c99_math_cxx98" = x"yes"; then
913 AC_DEFINE(_GLIBCXX98_USE_C99_MATH, 1,
914 [Define if C99 functions or macros in <math.h> should be imported
915 in <cmath> in namespace std for C++98.])
918 # Check for the existence of <complex.h> complex math functions.
919 # This is necessary even though libstdc++ uses the builtin versions
920 # of these functions, because if the builtin cannot be used, a reference
921 # to the library function is emitted.
922 AC_CHECK_HEADERS(tgmath.h, ac_has_tgmath_h=yes, ac_has_tgmath_h=no)
923 AC_CHECK_HEADERS(complex.h, ac_has_complex_h=yes, ac_has_complex_h=no)
924 if test x"$ac_has_complex_h" = x"yes"; then
925 AC_CACHE_CHECK([for ISO C99 support in <complex.h> for C++98],
926 glibcxx_cv_c99_complex_cxx98, [
927 GCC_TRY_COMPILE_OR_LINK(
928 [#include <complex.h>
929 typedef __complex__ float float_type;
930 typedef __complex__ double double_type;
931 typedef __complex__ long double ld_type;
932 volatile float_type tmpf;
933 volatile double_type tmpd;
934 volatile ld_type tmpld;
937 volatile long double ld;],
949 tmpf = cpowf(tmpf, tmpf);
962 tmpd = cpow(tmpd, tmpd);
966 tmpld = ccosl(tmpld);
967 tmpld = ccoshl(tmpld);
968 tmpld = cexpl(tmpld);
969 tmpld = clogl(tmpld);
970 tmpld = csinl(tmpld);
971 tmpld = csinhl(tmpld);
972 tmpld = csqrtl(tmpld);
973 tmpld = ctanl(tmpld);
974 tmpld = ctanhl(tmpld);
975 tmpld = cpowl(tmpld, tmpld);
976 tmpld = cprojl(tmpld);
977 ], [glibcxx_cv_c99_complex_cxx98=yes], [glibcxx_cv_c99_complex_cxx98=no])
980 if test x"$glibcxx_cv_c99_complex_cxx98" = x"yes"; then
981 AC_DEFINE(_GLIBCXX98_USE_C99_COMPLEX, 1,
982 [Define if C99 functions in <complex.h> should be used in
983 <complex> for C++98. Using compiler builtins for these functions
984 requires corresponding C99 library functions to be present.])
987 # Check for the existence in <stdio.h> of vscanf, et. al.
988 AC_CACHE_CHECK([for ISO C99 support in <stdio.h> for C++98],
989 glibcxx_cv_c99_stdio_cxx98, [
990 GCC_TRY_COMPILE_OR_LINK(
993 void foo(char* fmt, ...)
995 va_list args; va_start(args, fmt);
996 vfscanf(stderr, "%i", args);
998 vsnprintf(fmt, 0, "%i", args);
999 vsscanf(fmt, "%i", args);
1000 snprintf(fmt, 0, "%i");
1002 [glibcxx_cv_c99_stdio_cxx98=yes], [glibcxx_cv_c99_stdio_cxx98=no])
1004 if test x"$glibcxx_cv_c99_stdio_cxx98" = x"yes"; then
1005 AC_DEFINE(_GLIBCXX98_USE_C99_STDIO, 1,
1006 [Define if C99 functions or macros in <stdio.h> should be imported
1007 in <cstdio> in namespace std for C++98.])
1010 # Check for the existence in <stdlib.h> of lldiv_t, et. al.
1011 AC_CACHE_CHECK([for ISO C99 support in <stdlib.h> for C++98],
1012 glibcxx_cv_c99_stdlib_cxx98, [
1013 GCC_TRY_COMPILE_OR_LINK(
1014 [#include <stdlib.h>
1016 volatile long double ld;
1017 volatile unsigned long long ll;
1020 f = strtof("gnu", &tmp);
1021 ld = strtold("gnu", &tmp);
1022 ll = strtoll("gnu", &tmp, 10);
1023 ll = strtoull("gnu", &tmp, 10);
1025 mydivt = lldiv(10,1);
1030 ], [glibcxx_cv_c99_stdlib_cxx98=yes], [glibcxx_cv_c99_stdlib_cxx98=no])
1032 if test x"$glibcxx_cv_c99_stdlib_cxx98" = x"yes"; then
1033 AC_DEFINE(_GLIBCXX98_USE_C99_STDLIB, 1,
1034 [Define if C99 functions or macros in <stdlib.h> should be imported
1035 in <cstdlib> in namespace std for C++98.])
1038 # Check for the existence in <wchar.h> of wcstold, etc.
1039 if test x"$ac_has_wchar_h" = xyes &&
1040 test x"$ac_has_wctype_h" = xyes; then
1041 AC_CACHE_CHECK([for ISO C99 support in <wchar.h> for C++98],
1042 glibcxx_cv_c99_wchar_cxx98, [
1043 AC_TRY_COMPILE([#include <wchar.h>
1050 ], [], [glibcxx_cv_c99_wchar_cxx98=yes], [glibcxx_cv_c99_wchar_cxx98=no])
1053 # Checks for wide character functions that may not be present.
1054 # Injection of these is wrapped with guard macros.
1055 # NB: only put functions here, instead of immediately above, if
1056 # absolutely necessary.
1057 AC_TRY_COMPILE([#include <wchar.h>
1058 namespace test { using ::vfwscanf; }], [],
1059 [AC_DEFINE(HAVE_VFWSCANF, 1, [Defined if vfwscanf exists.])], [])
1061 AC_TRY_COMPILE([#include <wchar.h>
1062 namespace test { using ::vswscanf; }], [],
1063 [AC_DEFINE(HAVE_VSWSCANF, 1, [Defined if vswscanf exists.])], [])
1065 AC_TRY_COMPILE([#include <wchar.h>
1066 namespace test { using ::vwscanf; }], [],
1067 [AC_DEFINE(HAVE_VWSCANF, 1, [Defined if vwscanf exists.])], [])
1069 AC_TRY_COMPILE([#include <wchar.h>
1070 namespace test { using ::wcstof; }], [],
1071 [AC_DEFINE(HAVE_WCSTOF, 1, [Defined if wcstof exists.])], [])
1073 AC_TRY_COMPILE([#include <wctype.h>],
1074 [wint_t t; int i = iswblank(t);],
1075 [AC_DEFINE(HAVE_ISWBLANK, 1, [Defined if iswblank exists.])], [])
1077 if test x"$glibcxx_cv_c99_wchar_cxx98" = x"yes"; then
1078 AC_DEFINE(_GLIBCXX98_USE_C99_WCHAR, 1,
1079 [Define if C99 functions or macros in <wchar.h> should be imported
1080 in <cwchar> in namespace std for C++98.])
1084 # Option parsed, now set things appropriately.
1085 if test x"$glibcxx_cv_c99_math_cxx98" = x"no" ||
1086 test x"$glibcxx_cv_c99_complex_cxx98" = x"no" ||
1087 test x"$glibcxx_cv_c99_stdio_cxx98" = x"no" ||
1088 test x"$glibcxx_cv_c99_stdlib_cxx98" = x"no" ||
1089 test x"$glibcxx_cv_c99_wchar_cxx98" = x"no"; then
1092 AC_DEFINE(_GLIBCXX_USE_C99, 1,
1093 [Define if C99 functions or macros from <wchar.h>, <math.h>,
1094 <complex.h>, <stdio.h>, and <stdlib.h> can be used or exposed.])
1097 gcc_no_link="$ac_save_gcc_no_link"
1098 LIBS="$ac_save_LIBS"
1099 CXXFLAGS="$ac_save_CXXFLAGS"
1105 # Use -std=c++11 and test again for C99 library feature in C++11 mode.
1106 # For the reasons given above we use -std=c++11 not -std=gnu++11.
1107 ac_save_CXXFLAGS="$CXXFLAGS"
1108 CXXFLAGS="$CXXFLAGS -std=c++11"
1109 ac_save_LIBS="$LIBS"
1110 ac_save_gcc_no_link="$gcc_no_link"
1112 if test x$gcc_no_link != xyes; then
1113 # Use -fno-exceptions to that the C driver can link these tests without
1114 # hitting undefined references to personality routines.
1115 CXXFLAGS="$CXXFLAGS -fno-exceptions"
1116 AC_CHECK_LIB(m, sin, [LIBS="$LIBS -lm"], [
1117 # Use the default compile-only tests in GCC_TRY_COMPILE_OR_LINK
1122 # Check for the existence of <stdint.h> types.
1123 AC_CACHE_CHECK([for ISO C99 support in <stdint.h> for C++11],
1124 glibcxx_cv_c99_stdint, [
1125 AC_TRY_COMPILE([#define __STDC_LIMIT_MACROS
1126 #define __STDC_CONSTANT_MACROS
1127 #include <stdint.h>],
1128 [typedef int8_t my_int8_t;
1129 my_int8_t i8 = INT8_MIN;
1131 typedef int16_t my_int16_t;
1132 my_int16_t i16 = INT16_MIN;
1134 typedef int32_t my_int32_t;
1135 my_int32_t i32 = INT32_MIN;
1137 typedef int64_t my_int64_t;
1138 my_int64_t i64 = INT64_MIN;
1140 typedef int_fast8_t my_int_fast8_t;
1141 my_int_fast8_t if8 = INT_FAST8_MIN;
1142 if8 = INT_FAST8_MAX;
1143 typedef int_fast16_t my_int_fast16_t;
1144 my_int_fast16_t if16 = INT_FAST16_MIN;
1145 if16 = INT_FAST16_MAX;
1146 typedef int_fast32_t my_int_fast32_t;
1147 my_int_fast32_t if32 = INT_FAST32_MIN;
1148 if32 = INT_FAST32_MAX;
1149 typedef int_fast64_t my_int_fast64_t;
1150 my_int_fast64_t if64 = INT_FAST64_MIN;
1151 if64 = INT_FAST64_MAX;
1152 typedef int_least8_t my_int_least8_t;
1153 my_int_least8_t il8 = INT_LEAST8_MIN;
1154 il8 = INT_LEAST8_MAX;
1155 typedef int_least16_t my_int_least16_t;
1156 my_int_least16_t il16 = INT_LEAST16_MIN;
1157 il16 = INT_LEAST16_MAX;
1158 typedef int_least32_t my_int_least32_t;
1159 my_int_least32_t il32 = INT_LEAST32_MIN;
1160 il32 = INT_LEAST32_MAX;
1161 typedef int_least64_t my_int_least64_t;
1162 my_int_least64_t il64 = INT_LEAST64_MIN;
1163 il64 = INT_LEAST64_MAX;
1164 typedef intmax_t my_intmax_t;
1165 my_intmax_t im = INTMAX_MAX;
1167 typedef intptr_t my_intptr_t;
1168 my_intptr_t ip = INTPTR_MAX;
1170 typedef uint8_t my_uint8_t;
1171 my_uint8_t ui8 = UINT8_MAX;
1173 typedef uint16_t my_uint16_t;
1174 my_uint16_t ui16 = UINT16_MAX;
1176 typedef uint32_t my_uint32_t;
1177 my_uint32_t ui32 = UINT32_MAX;
1179 typedef uint64_t my_uint64_t;
1180 my_uint64_t ui64 = UINT64_MAX;
1182 typedef uint_fast8_t my_uint_fast8_t;
1183 my_uint_fast8_t uif8 = UINT_FAST8_MAX;
1184 uif8 = UINT_FAST8_MAX;
1185 typedef uint_fast16_t my_uint_fast16_t;
1186 my_uint_fast16_t uif16 = UINT_FAST16_MAX;
1187 uif16 = UINT_FAST16_MAX;
1188 typedef uint_fast32_t my_uint_fast32_t;
1189 my_uint_fast32_t uif32 = UINT_FAST32_MAX;
1190 uif32 = UINT_FAST32_MAX;
1191 typedef uint_fast64_t my_uint_fast64_t;
1192 my_uint_fast64_t uif64 = UINT_FAST64_MAX;
1193 uif64 = UINT_FAST64_MAX;
1194 typedef uint_least8_t my_uint_least8_t;
1195 my_uint_least8_t uil8 = UINT_LEAST8_MAX;
1196 uil8 = UINT_LEAST8_MAX;
1197 typedef uint_least16_t my_uint_least16_t;
1198 my_uint_least16_t uil16 = UINT_LEAST16_MAX;
1199 uil16 = UINT_LEAST16_MAX;
1200 typedef uint_least32_t my_uint_least32_t;
1201 my_uint_least32_t uil32 = UINT_LEAST32_MAX;
1202 uil32 = UINT_LEAST32_MAX;
1203 typedef uint_least64_t my_uint_least64_t;
1204 my_uint_least64_t uil64 = UINT_LEAST64_MAX;
1205 uil64 = UINT_LEAST64_MAX;
1206 typedef uintmax_t my_uintmax_t;
1207 my_uintmax_t uim = UINTMAX_MAX;
1209 typedef uintptr_t my_uintptr_t;
1210 my_uintptr_t uip = UINTPTR_MAX;
1212 ],[glibcxx_cv_c99_stdint=yes],
1213 [glibcxx_cv_c99_stdint=no])
1215 if test x"$glibcxx_cv_c99_stdint" = x"yes"; then
1216 AC_DEFINE(_GLIBCXX_USE_C99_STDINT, 1,
1217 [Define if C99 types in <stdint.h> should be imported in
1218 <cstdint> in namespace std for C++11.])
1221 # Check for the existence of <inttypes.h> functions (NB: doesn't make
1222 # sense if the glibcxx_cv_c99_stdint check fails, per C99, 7.8/1).
1224 if test x"$glibcxx_cv_c99_stdint" = x"yes"; then
1225 AC_MSG_CHECKING([for ISO C99 support for C++11 in <inttypes.h>])
1226 AC_TRY_COMPILE([#include <inttypes.h>],
1227 [intmax_t i, numer, denom, base;
1230 intmax_t ret = imaxabs(i);
1231 imaxdiv_t dret = imaxdiv(numer, denom);
1232 ret = strtoimax(s, endptr, base);
1233 uintmax_t uret = strtoumax(s, endptr, base);
1234 ],[ac_c99_inttypes=yes], [ac_c99_inttypes=no])
1235 AC_MSG_RESULT($ac_c99_inttypes)
1237 if test x"$ac_c99_inttypes" = x"yes"; then
1238 AC_DEFINE(_GLIBCXX_USE_C99_INTTYPES, 1,
1239 [Define if C99 functions in <inttypes.h> should be imported in
1240 <cinttypes> in namespace std in C++11.])
1243 # Check for the existence of wchar_t <inttypes.h> functions (NB: doesn't
1244 # make sense if the glibcxx_cv_c99_stdint check fails, per C99, 7.8/1).
1245 ac_c99_inttypes_wchar_t=no;
1246 if test x"$glibcxx_cv_c99_stdint" = x"yes"; then
1247 AC_MSG_CHECKING([for wchar_t ISO C99 support for C++11 in <inttypes.h>])
1248 AC_TRY_COMPILE([#include <inttypes.h>],
1252 intmax_t ret = wcstoimax(s, endptr, base);
1253 uintmax_t uret = wcstoumax(s, endptr, base);
1254 ],[ac_c99_inttypes_wchar_t=yes],
1255 [ac_c99_inttypes_wchar_t=no])
1256 AC_MSG_RESULT($ac_c99_inttypes_wchar_t)
1258 if test x"$ac_c99_inttypes_wchar_t" = x"yes"; then
1259 AC_DEFINE(_GLIBCXX_USE_C99_INTTYPES_WCHAR_T, 1,
1260 [Define if wchar_t C99 functions in <inttypes.h> should be
1261 imported in <cinttypes> in namespace std in C++11.])
1264 # Check for the existence of <math.h> generic macros used if C99 is enabled.
1265 AC_CACHE_CHECK([for ISO C99 generic macro support in <math.h> for C++11],
1266 glibcxx_cv_c99_math_cxx11, [
1267 GCC_TRY_COMPILE_OR_LINK(
1269 volatile double d1, d2;
1271 [i = fpclassify(d1);
1277 i = isgreater(d1, d2);
1278 i = isgreaterequal(d1, d2);
1280 i = islessequal(d1, d2);
1281 i = islessgreater(d1, d2);
1282 i = islessgreater(d1, d2);
1283 i = isunordered(d1, d2);
1284 ], [glibcxx_cv_c99_math_cxx11=yes], [glibcxx_cv_c99_math_cxx11=no])
1286 if test x"$glibcxx_cv_c99_math_cxx11" = x"yes"; then
1287 AC_DEFINE(_GLIBCXX11_USE_C99_MATH, 1,
1288 [Define if C99 generic macros in <math.h> should be imported
1289 in <cmath> in namespace std for C++11.])
1292 # Check for the existence of <math.h> typedefs.
1293 AC_CACHE_CHECK([for ISO C99 float types for C++11 in <math.h>],
1294 glibcxx_cv_c99_flt_eval_types, [
1295 AC_TRY_COMPILE([#include <math.h>],
1297 typedef double_t my_double_t;
1298 typedef float_t my_float_t;
1300 [glibcxx_cv_c99_flt_eval_types=yes],
1301 [glibcxx_cv_c99_flt_eval_types=no])
1303 if test x"$glibcxx_cv_c99_flt_eval_types" = x"yes"; then
1304 AC_DEFINE(HAVE_C99_FLT_EVAL_TYPES, 1,
1305 [Define if C99 float_t and double_t in <math.h> should be
1306 imported in <cmath> in namespace std for C++11.])
1309 # Check for the existence of <math.h> functions.
1310 AC_CACHE_CHECK([for ISO C99 function support for C++11 in <math.h>],
1311 glibcxx_cv_c99_math_funcs, [
1312 AC_TRY_COMPILE([#include <math.h>],
1324 // Exponential and logarithmic
1349 // Power and absolute-value
1385 #ifndef __APPLE__ /* see below */
1397 remainder(0.0, 0.0);
1398 remainderf(0.0f, 0.0f);
1399 remainderl(0.0l, 0.0l);
1400 remquo(0.0, 0.0, 0);
1401 remquof(0.0f, 0.0f, 0);
1402 remquol(0.0l, 0.0l, 0);
1405 copysignf(0.0f, 0.0f);
1406 copysignl(0.0l, 0.0l);
1410 nextafter(0.0, 0.0);
1411 nextafterf(0.0f, 0.0f);
1412 nextafterl(0.0l, 0.0l);
1413 nexttoward(0.0, 0.0);
1414 nexttowardf(0.0f, 0.0f);
1415 nexttowardl(0.0l, 0.0l);
1416 // Max, min, positive difference
1428 fmaf(0.0f, 0.0f, 0.0f);
1429 fmal(0.0l, 0.0l, 0.0l);
1431 [glibcxx_cv_c99_math_funcs=yes],
1432 [glibcxx_cv_c99_math_funcs=no])
1434 if test x"$glibcxx_cv_c99_math_funcs" = x"yes"; then
1435 AC_DEFINE(_GLIBCXX_USE_C99_MATH_FUNCS, 1,
1436 [Define if C99 functions in <math.h> should be imported
1437 in <cmath> in namespace std for C++11.])
1439 case "${target_os}" in
1441 AC_CACHE_CHECK([for ISO C99 rounding functions in <math.h>],
1442 glibcxx_cv_c99_math_llround, [
1443 AC_TRY_COMPILE([#include <math.h>],
1451 [glibcxx_cv_c99_math_llround=yes],
1452 [glibcxx_cv_c99_math_llround=no])
1456 if test x"$glibcxx_cv_c99_math_llround" = x"no"; then
1457 AC_DEFINE(_GLIBCXX_NO_C99_ROUNDING_FUNCS, 1,
1458 [Define if C99 llrint and llround functions are missing from <math.h>.])
1462 # Check for the existence of <complex.h> complex math functions.
1463 # This is necessary even though libstdc++ uses the builtin versions
1464 # of these functions, because if the builtin cannot be used, a reference
1465 # to the library function is emitted.
1466 AC_CHECK_HEADERS(tgmath.h, ac_has_tgmath_h=yes, ac_has_tgmath_h=no)
1467 AC_CHECK_HEADERS(complex.h, ac_has_complex_h=yes, ac_has_complex_h=no)
1468 if test x"$ac_has_complex_h" = x"yes"; then
1469 AC_CACHE_CHECK([for ISO C99 support in <complex.h> for C++11],
1470 glibcxx_cv_c99_complex_cxx11, [
1471 GCC_TRY_COMPILE_OR_LINK(
1472 [#include <complex.h>
1473 typedef __complex__ float float_type;
1474 typedef __complex__ double double_type;
1475 typedef __complex__ long double ld_type;
1476 volatile float_type tmpf;
1477 volatile double_type tmpd;
1478 volatile ld_type tmpld;
1481 volatile long double ld;],
1485 tmpf = ccoshf(tmpf);
1489 tmpf = csinhf(tmpf);
1490 tmpf = csqrtf(tmpf);
1492 tmpf = ctanhf(tmpf);
1493 tmpf = cpowf(tmpf, tmpf);
1494 tmpf = cprojf(tmpf);
1506 tmpd = cpow(tmpd, tmpd);
1510 tmpld = ccosl(tmpld);
1511 tmpld = ccoshl(tmpld);
1512 tmpld = cexpl(tmpld);
1513 tmpld = clogl(tmpld);
1514 tmpld = csinl(tmpld);
1515 tmpld = csinhl(tmpld);
1516 tmpld = csqrtl(tmpld);
1517 tmpld = ctanl(tmpld);
1518 tmpld = ctanhl(tmpld);
1519 tmpld = cpowl(tmpld, tmpld);
1520 tmpld = cprojl(tmpld);
1521 ], [glibcxx_cv_c99_complex_cxx11=yes], [glibcxx_cv_c99_complex_cxx11=no])
1524 if test x"$glibcxx_cv_c99_complex_cxx11" = x"yes"; then
1525 AC_DEFINE(_GLIBCXX11_USE_C99_COMPLEX, 1,
1526 [Define if C99 functions in <complex.h> should be used in
1527 <complex> for C++11. Using compiler builtins for these functions
1528 requires corresponding C99 library functions to be present.])
1531 # Check for the existence of <complex.h> complex inverse trigonometric
1532 # math functions used by <complex> for C++11 and later.
1533 ac_c99_complex_arc=no;
1534 if test x"$ac_has_complex_h" = x"yes"; then
1535 AC_MSG_CHECKING([for ISO C99 support for inverse trig functions in <complex.h>])
1536 AC_TRY_COMPILE([#include <complex.h>],
1537 [typedef __complex__ float float_type; float_type tmpf;
1544 typedef __complex__ double double_type; double_type tmpd;
1551 typedef __complex__ long double ld_type; ld_type tmpld;
1558 ],[ac_c99_complex_arc=yes], [ac_c99_complex_arc=no])
1560 AC_MSG_RESULT($ac_c99_complex_arc)
1561 if test x"$ac_c99_complex_arc" = x"yes"; then
1562 AC_DEFINE(_GLIBCXX_USE_C99_COMPLEX_ARC, 1,
1563 [Define if C99 inverse trig functions in <complex.h> should be
1564 used in <complex>. Using compiler builtins for these functions
1565 requires corresponding C99 library functions to be present.])
1568 # Check for the existence in <stdio.h> of vscanf, et. al.
1569 AC_CACHE_CHECK([for ISO C99 support in <stdio.h> for C++11],
1570 glibcxx_cv_c99_stdio_cxx11, [
1571 GCC_TRY_COMPILE_OR_LINK(
1574 void foo(char* fmt, ...)
1576 va_list args; va_start(args, fmt);
1577 vfscanf(stderr, "%i", args);
1579 vsnprintf(fmt, 0, "%i", args);
1580 vsscanf(fmt, "%i", args);
1581 snprintf(fmt, 0, "%i");
1583 [glibcxx_cv_c99_stdio_cxx11=yes], [glibcxx_cv_c99_stdio_cxx11=no])
1585 if test x"$glibcxx_cv_c99_stdio_cxx11" = x"yes"; then
1586 AC_DEFINE(_GLIBCXX11_USE_C99_STDIO, 1,
1587 [Define if C99 functions or macros in <stdio.h> should be imported
1588 in <cstdio> in namespace std for C++11.])
1591 # Check for the existence in <stdlib.h> of lldiv_t, et. al.
1592 AC_CACHE_CHECK([for ISO C99 support in <stdlib.h> for C++11],
1593 glibcxx_cv_c99_stdlib_cxx11, [
1594 GCC_TRY_COMPILE_OR_LINK(
1595 [#include <stdlib.h>
1597 volatile long double ld;
1598 volatile unsigned long long ll;
1601 f = strtof("gnu", &tmp);
1602 ld = strtold("gnu", &tmp);
1603 ll = strtoll("gnu", &tmp, 10);
1604 ll = strtoull("gnu", &tmp, 10);
1606 mydivt = lldiv(10,1);
1611 ], [glibcxx_cv_c99_stdlib_cxx11=yes], [glibcxx_cv_c99_stdlib_cxx11=no])
1613 if test x"$glibcxx_cv_c99_stdlib_cxx11" = x"yes"; then
1614 AC_DEFINE(_GLIBCXX11_USE_C99_STDLIB, 1,
1615 [Define if C99 functions or macros in <stdlib.h> should be imported
1616 in <cstdlib> in namespace std for C++11.])
1619 # Check for the existence in <wchar.h> of wcstold, etc.
1620 if test x"$ac_has_wchar_h" = xyes &&
1621 test x"$ac_has_wctype_h" = xyes; then
1622 AC_CACHE_CHECK([for ISO C99 support in <wchar.h> for C++11],
1623 glibcxx_cv_c99_wchar_cxx11, [
1624 AC_TRY_COMPILE([#include <wchar.h>
1631 ], [], [glibcxx_cv_c99_wchar_cxx11=yes], [glibcxx_cv_c99_wchar_cxx11=no])
1634 # Checks for wide character functions that may not be present.
1635 # Injection of these is wrapped with guard macros.
1636 # NB: only put functions here, instead of immediately above, if
1637 # absolutely necessary.
1638 AC_TRY_COMPILE([#include <wchar.h>
1639 namespace test { using ::vfwscanf; }], [],
1640 [AC_DEFINE(HAVE_VFWSCANF, 1, [Defined if vfwscanf exists.])], [])
1642 AC_TRY_COMPILE([#include <wchar.h>
1643 namespace test { using ::vswscanf; }], [],
1644 [AC_DEFINE(HAVE_VSWSCANF, 1, [Defined if vswscanf exists.])], [])
1646 AC_TRY_COMPILE([#include <wchar.h>
1647 namespace test { using ::vwscanf; }], [],
1648 [AC_DEFINE(HAVE_VWSCANF, 1, [Defined if vwscanf exists.])], [])
1650 AC_TRY_COMPILE([#include <wchar.h>
1651 namespace test { using ::wcstof; }], [],
1652 [AC_DEFINE(HAVE_WCSTOF, 1, [Defined if wcstof exists.])], [])
1654 AC_TRY_COMPILE([#include <wctype.h>],
1655 [wint_t t; int i = iswblank(t);],
1656 [AC_DEFINE(HAVE_ISWBLANK, 1, [Defined if iswblank exists.])], [])
1658 if test x"$glibcxx_cv_c99_wchar_cxx11" = x"yes"; then
1659 AC_DEFINE(_GLIBCXX11_USE_C99_WCHAR, 1,
1660 [Define if C99 functions or macros in <wchar.h> should be imported
1661 in <cwchar> in namespace std for C++11.])
1665 # Check for the existence of <ctype.h> functions.
1666 AC_CACHE_CHECK([for ISO C99 support for C++11 in <ctype.h>],
1667 glibcxx_cv_c99_ctype, [
1668 AC_TRY_COMPILE([#include <ctype.h>],
1672 ],[glibcxx_cv_c99_ctype=yes],
1673 [glibcxx_cv_c99_ctype=no])
1675 if test x"$glibcxx_cv_c99_ctype" = x"yes"; then
1676 AC_DEFINE(_GLIBCXX_USE_C99_CTYPE, 1,
1677 [Define if C99 functions in <ctype.h> should be imported in
1678 <cctype> in namespace std for C++11.])
1681 # Check for the existence of <fenv.h> functions.
1682 AC_CHECK_HEADERS(fenv.h, ac_has_fenv_h=yes, ac_has_fenv_h=no)
1684 if test x"$ac_has_fenv_h" = x"yes"; then
1685 AC_MSG_CHECKING([for ISO C99 support for C++11 in <fenv.h>])
1686 AC_TRY_COMPILE([#include <fenv.h>],
1691 ret = feclearexcept(except);
1692 ret = fegetexceptflag(pflag, except);
1693 ret = feraiseexcept(except);
1694 ret = fesetexceptflag(pflag, except);
1695 ret = fetestexcept(except);
1697 ret = fesetround(mode);
1698 ret = fegetenv(penv);
1699 ret = feholdexcept(penv);
1700 ret = fesetenv(penv);
1701 ret = feupdateenv(penv);
1702 ],[ac_c99_fenv=yes], [ac_c99_fenv=no])
1703 AC_MSG_RESULT($ac_c99_fenv)
1705 if test x"$ac_c99_fenv" = x"yes"; then
1706 AC_DEFINE(_GLIBCXX_USE_C99_FENV, 1,
1707 [Define if C99 functions in <fenv.h> should be imported in
1708 <cfenv> in namespace std for C++11.])
1711 gcc_no_link="$ac_save_gcc_no_link"
1712 LIBS="$ac_save_LIBS"
1713 CXXFLAGS="$ac_save_CXXFLAGS"
1717 AC_MSG_CHECKING([for fully enabled ISO C99 support])
1718 AC_MSG_RESULT($enable_c99)
1723 dnl Check for clock_gettime, nanosleep and sched_yield, used in the
1724 dnl implementation of 20.11.7 [time.clock], and 30.3.2 [thread.thread.this]
1725 dnl in the C++11 standard.
1727 dnl --enable-libstdcxx-time
1728 dnl --enable-libstdcxx-time=yes
1729 dnl checks for the availability of monotonic and realtime clocks,
1730 dnl nanosleep and sched_yield in libc.
1731 dnl --enable-libstdcxx-time=rt
1732 dnl also searches (and, if needed, links) librt. Note that this is
1733 dnl not always desirable because, in glibc 2.16 and earlier, for
1734 dnl example, in turn it triggers the linking of libpthread too,
1735 dnl which activates locking,
1736 dnl a large overhead for single-thread programs.
1737 dnl --enable-libstdcxx-time=no
1738 dnl --disable-libstdcxx-time
1739 dnl disables the checks completely
1741 dnl N.B. Darwin provides nanosleep but doesn't support the whole POSIX
1742 dnl Timers option, so doesn't define _POSIX_TIMERS. Because the test
1743 dnl below fails Darwin unconditionally defines _GLIBCXX_USE_NANOSLEEP in
1744 dnl os_defines.h and also defines _GLIBCXX_USE_SCHED_YIELD.
1746 AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_TIME], [
1748 GLIBCXX_ENABLE(libstdcxx-time,auto,[[[=KIND]]],
1749 [use KIND for check type],
1754 ac_save_CXXFLAGS="$CXXFLAGS"
1755 CXXFLAGS="$CXXFLAGS -fno-exceptions"
1756 ac_save_LIBS="$LIBS"
1758 ac_has_clock_monotonic=no
1759 ac_has_clock_realtime=no
1761 ac_has_sched_yield=no
1763 if test x"$enable_libstdcxx_time" = x"auto"; then
1765 case "${target_os}" in
1767 ac_has_nanosleep=yes
1770 ac_has_win32_sleep=yes
1771 ac_has_sched_yield=yes
1774 ac_has_nanosleep=yes
1775 ac_has_sched_yield=yes
1777 # VxWorks has nanosleep as soon as the kernel is configured with
1778 # INCLUDE_POSIX_TIMERS, which is normally/most-often the case.
1780 ac_has_nanosleep=yes
1782 gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
1783 # Don't use link test for freestanding library, in case gcc_no_link=yes
1784 if test x"$is_hosted" = xyes; then
1785 # Versions of glibc before 2.17 needed -lrt for clock_gettime.
1786 AC_SEARCH_LIBS(clock_gettime, [rt])
1787 if test x"$ac_cv_search_clock_gettime" = x"none required"; then
1788 ac_has_clock_monotonic=yes
1789 ac_has_clock_realtime=yes
1792 ac_has_nanosleep=yes
1793 ac_has_sched_yield=yes
1795 freebsd*|netbsd*|dragonfly*|rtems*)
1796 ac_has_clock_monotonic=yes
1797 ac_has_clock_realtime=yes
1798 ac_has_nanosleep=yes
1799 ac_has_sched_yield=yes
1802 ac_has_clock_monotonic=yes
1803 ac_has_clock_realtime=yes
1804 ac_has_nanosleep=yes
1807 ac_has_clock_monotonic=yes
1808 ac_has_clock_realtime=yes
1809 ac_has_nanosleep=yes
1810 ac_has_sched_yield=yes
1813 ac_has_nanosleep=yes
1814 ac_has_sched_yield=yes
1817 elif test x"$enable_libstdcxx_time" != x"no"; then
1819 if test x"$enable_libstdcxx_time" = x"rt"; then
1820 AC_SEARCH_LIBS(clock_gettime, [rt])
1821 AC_SEARCH_LIBS(nanosleep, [rt])
1823 AC_CHECK_FUNC(clock_gettime)
1824 AC_CHECK_FUNC(nanosleep)
1827 case "$ac_cv_search_clock_gettime" in
1828 -l*) GLIBCXX_LIBS=$ac_cv_search_clock_gettime
1831 case "$ac_cv_search_nanosleep" in
1832 -l*) GLIBCXX_LIBS="$GLIBCXX_LIBS $ac_cv_search_nanosleep"
1836 AC_SEARCH_LIBS(sched_yield, [rt])
1838 case "$ac_cv_search_sched_yield" in
1840 if test x"$enable_libstdcxx_time" = x"rt"; then
1841 GLIBCXX_LIBS="$GLIBCXX_LIBS $ac_cv_search_sched_yield"
1842 ac_has_sched_yield=yes
1846 ac_has_sched_yield=yes
1850 AC_CHECK_HEADERS(unistd.h, ac_has_unistd_h=yes, ac_has_unistd_h=no)
1852 if test x"$ac_has_unistd_h" = x"yes"; then
1853 AC_MSG_CHECKING([for monotonic clock])
1855 [#include <unistd.h>
1858 [#if _POSIX_TIMERS > 0 && defined(_POSIX_MONOTONIC_CLOCK)
1861 clock_gettime(CLOCK_MONOTONIC, &tp);
1862 ], [ac_has_clock_monotonic=yes], [ac_has_clock_monotonic=no])
1864 AC_MSG_RESULT($ac_has_clock_monotonic)
1866 AC_MSG_CHECKING([for realtime clock])
1868 [#include <unistd.h>
1871 [#if _POSIX_TIMERS > 0
1874 clock_gettime(CLOCK_REALTIME, &tp);
1875 ], [ac_has_clock_realtime=yes], [ac_has_clock_realtime=no])
1877 AC_MSG_RESULT($ac_has_clock_realtime)
1879 AC_MSG_CHECKING([for nanosleep])
1881 [#include <unistd.h>
1884 [#if _POSIX_TIMERS > 0
1888 ], [ac_has_nanosleep=yes], [ac_has_nanosleep=no])
1890 AC_MSG_RESULT($ac_has_nanosleep)
1894 if test x"$ac_has_clock_monotonic" != x"yes"; then
1895 case ${target_os} in
1897 AC_MSG_CHECKING([for clock_gettime syscall])
1899 [#include <unistd.h>
1901 #include <sys/syscall.h>
1903 [#if _POSIX_TIMERS > 0 && defined(_POSIX_MONOTONIC_CLOCK)
1906 syscall(SYS_clock_gettime, CLOCK_MONOTONIC, &tp);
1907 syscall(SYS_clock_gettime, CLOCK_REALTIME, &tp);
1908 ], [ac_has_clock_gettime_syscall=yes], [ac_has_clock_gettime_syscall=no])
1909 AC_MSG_RESULT($ac_has_clock_gettime_syscall)
1910 if test x"$ac_has_clock_gettime_syscall" = x"yes"; then
1911 AC_DEFINE(_GLIBCXX_USE_CLOCK_GETTIME_SYSCALL, 1,
1912 [Defined if clock_gettime syscall has monotonic and realtime clock support. ])
1913 ac_has_clock_monotonic=yes
1914 ac_has_clock_realtime=yes
1915 AC_MSG_CHECKING([for struct timespec that matches syscall])
1918 #include <sys/syscall.h>
1920 [#ifdef SYS_clock_gettime64
1921 #if SYS_clock_gettime64 != SYS_clock_gettime
1922 // We need to use SYS_clock_gettime and libc appears to
1923 // also know about the SYS_clock_gettime64 syscall.
1924 // Check that userspace doesn't use time64 version of timespec.
1925 static_assert(sizeof(timespec::tv_sec) == sizeof(long),
1926 "struct timespec must be compatible with SYS_clock_gettime");
1930 [ac_timespec_matches_syscall=yes],
1931 [ac_timespec_matches_syscall=no])
1932 AC_MSG_RESULT($ac_timespec_matches_syscall)
1933 if test x"$ac_timespec_matches_syscall" = no; then
1934 AC_MSG_ERROR([struct timespec is not compatible with SYS_clock_gettime, please report a bug to http://gcc.gnu.org/bugzilla])
1940 if test x"$ac_has_clock_monotonic" = x"yes"; then
1941 AC_DEFINE(_GLIBCXX_USE_CLOCK_MONOTONIC, 1,
1942 [ Defined if clock_gettime has monotonic clock support. ])
1945 if test x"$ac_has_clock_realtime" = x"yes"; then
1946 AC_DEFINE(_GLIBCXX_USE_CLOCK_REALTIME, 1,
1947 [ Defined if clock_gettime has realtime clock support. ])
1950 if test x"$ac_has_sched_yield" = x"yes"; then
1951 AC_DEFINE(_GLIBCXX_USE_SCHED_YIELD, 1,
1952 [ Defined if sched_yield is available. ])
1955 if test x"$ac_has_nanosleep" = x"yes"; then
1956 AC_DEFINE(_GLIBCXX_USE_NANOSLEEP, 1,
1957 [ Defined if nanosleep is available. ])
1958 elif test x"$ac_has_win32_sleep" = x"yes"; then
1959 AC_DEFINE(_GLIBCXX_USE_WIN32_SLEEP, 1,
1960 [Defined if Sleep exists.])
1962 AC_MSG_CHECKING([for sleep])
1963 AC_TRY_COMPILE([#include <unistd.h>],
1965 [ac_has_sleep=yes],[ac_has_sleep=no])
1966 if test x"$ac_has_sleep" = x"yes"; then
1967 AC_DEFINE(HAVE_SLEEP,1, [Defined if sleep exists.])
1969 AC_MSG_RESULT($ac_has_sleep)
1970 AC_MSG_CHECKING([for usleep])
1971 AC_TRY_COMPILE([#include <unistd.h>],
1974 [ac_has_usleep=yes],[ac_has_usleep=no])
1975 if test x"$ac_has_usleep" = x"yes"; then
1976 AC_DEFINE(HAVE_USLEEP,1, [Defined if usleep exists.])
1978 AC_MSG_RESULT($ac_has_usleep)
1981 if test x"$ac_has_nanosleep$ac_has_win32_sleep$ac_has_sleep" = x"nonono"; then
1982 AC_DEFINE(_GLIBCXX_NO_SLEEP,1, [Defined if no way to sleep is available.])
1985 AC_SUBST(GLIBCXX_LIBS)
1987 CXXFLAGS="$ac_save_CXXFLAGS"
1988 LIBS="$ac_save_LIBS"
1993 dnl Check for gettimeofday, used in the implementation of 20.11.7
1994 dnl [time.clock] in the C++11 standard.
1996 AC_DEFUN([GLIBCXX_CHECK_GETTIMEOFDAY], [
1998 AC_MSG_CHECKING([for gettimeofday])
2002 ac_save_CXXFLAGS="$CXXFLAGS"
2003 CXXFLAGS="$CXXFLAGS -fno-exceptions"
2005 ac_has_gettimeofday=no;
2006 AC_CHECK_HEADERS(sys/time.h, ac_has_sys_time_h=yes, ac_has_sys_time_h=no)
2007 if test x"$ac_has_sys_time_h" = x"yes"; then
2008 AC_MSG_CHECKING([for gettimeofday])
2009 GCC_TRY_COMPILE_OR_LINK([#include <sys/time.h>],
2010 [timeval tv; gettimeofday(&tv, 0);],
2011 [ac_has_gettimeofday=yes], [ac_has_gettimeofday=no])
2013 AC_MSG_RESULT($ac_has_gettimeofday)
2016 if test x"$ac_has_gettimeofday" = x"yes"; then
2017 AC_DEFINE(_GLIBCXX_USE_GETTIMEOFDAY, 1,
2018 [ Defined if gettimeofday is available. ])
2021 CXXFLAGS="$ac_save_CXXFLAGS"
2026 dnl Check for ISO/IEC 9899:1999 "C99" support to ISO/IEC DTR 19768 "TR1"
2027 dnl facilities in Chapter 8, "C compatibility".
2029 AC_DEFUN([GLIBCXX_CHECK_C99_TR1], [
2034 # Use -std=c++98 because -std=gnu++98 leaves __STRICT_ANSI__
2035 # undefined and fake C99 facilities may be spuriously enabled.
2036 ac_save_CXXFLAGS="$CXXFLAGS"
2037 CXXFLAGS="$CXXFLAGS -std=c++98"
2039 # Check for the existence of <complex.h> complex math functions used
2041 AC_CHECK_HEADERS(complex.h, ac_has_complex_h=yes, ac_has_complex_h=no)
2042 ac_c99_complex_tr1=no;
2043 if test x"$ac_has_complex_h" = x"yes"; then
2044 AC_MSG_CHECKING([for ISO C99 support to TR1 in <complex.h>])
2045 AC_TRY_COMPILE([#include <complex.h>],
2046 [typedef __complex__ float float_type; float_type tmpf;
2053 typedef __complex__ double double_type; double_type tmpd;
2060 typedef __complex__ long double ld_type; ld_type tmpld;
2067 ],[ac_c99_complex_tr1=yes], [ac_c99_complex_tr1=no])
2069 AC_MSG_RESULT($ac_c99_complex_tr1)
2070 if test x"$ac_c99_complex_tr1" = x"yes"; then
2071 AC_DEFINE(_GLIBCXX_USE_C99_COMPLEX_TR1, 1,
2072 [Define if C99 functions in <complex.h> should be used in
2073 <tr1/complex>. Using compiler builtins for these functions
2074 requires corresponding C99 library functions to be present.])
2077 # Check for the existence of <ctype.h> functions.
2078 AC_CACHE_CHECK([for ISO C99 support to TR1 in <ctype.h>],
2079 glibcxx_cv_c99_ctype_tr1, [
2080 AC_TRY_COMPILE([#include <ctype.h>],
2084 ],[glibcxx_cv_c99_ctype_tr1=yes],
2085 [glibcxx_cv_c99_ctype_tr1=no])
2087 if test x"$glibcxx_cv_c99_ctype_tr1" = x"yes"; then
2088 AC_DEFINE(_GLIBCXX_USE_C99_CTYPE_TR1, 1,
2089 [Define if C99 functions in <ctype.h> should be imported in
2090 <tr1/cctype> in namespace std::tr1.])
2093 # Check for the existence of <fenv.h> functions.
2094 AC_CHECK_HEADERS(fenv.h, ac_has_fenv_h=yes, ac_has_fenv_h=no)
2096 if test x"$ac_has_fenv_h" = x"yes"; then
2097 AC_MSG_CHECKING([for ISO C99 support to TR1 in <fenv.h>])
2098 AC_TRY_COMPILE([#include <fenv.h>],
2103 ret = feclearexcept(except);
2104 ret = fegetexceptflag(pflag, except);
2105 ret = feraiseexcept(except);
2106 ret = fesetexceptflag(pflag, except);
2107 ret = fetestexcept(except);
2109 ret = fesetround(mode);
2110 ret = fegetenv(penv);
2111 ret = feholdexcept(penv);
2112 ret = fesetenv(penv);
2113 ret = feupdateenv(penv);
2114 ],[ac_c99_fenv_tr1=yes], [ac_c99_fenv_tr1=no])
2115 AC_MSG_RESULT($ac_c99_fenv_tr1)
2117 if test x"$ac_c99_fenv_tr1" = x"yes"; then
2118 AC_DEFINE(_GLIBCXX_USE_C99_FENV_TR1, 1,
2119 [Define if C99 functions in <fenv.h> should be imported in
2120 <tr1/cfenv> in namespace std::tr1.])
2123 # Check for the existence of <stdint.h> types.
2124 AC_CACHE_CHECK([for ISO C99 support to TR1 in <stdint.h>],
2125 glibcxx_cv_c99_stdint_tr1, [
2126 AC_TRY_COMPILE([#define __STDC_LIMIT_MACROS
2127 #define __STDC_CONSTANT_MACROS
2128 #include <stdint.h>],
2129 [typedef int8_t my_int8_t;
2130 my_int8_t i8 = INT8_MIN;
2132 typedef int16_t my_int16_t;
2133 my_int16_t i16 = INT16_MIN;
2135 typedef int32_t my_int32_t;
2136 my_int32_t i32 = INT32_MIN;
2138 typedef int64_t my_int64_t;
2139 my_int64_t i64 = INT64_MIN;
2141 typedef int_fast8_t my_int_fast8_t;
2142 my_int_fast8_t if8 = INT_FAST8_MIN;
2143 if8 = INT_FAST8_MAX;
2144 typedef int_fast16_t my_int_fast16_t;
2145 my_int_fast16_t if16 = INT_FAST16_MIN;
2146 if16 = INT_FAST16_MAX;
2147 typedef int_fast32_t my_int_fast32_t;
2148 my_int_fast32_t if32 = INT_FAST32_MIN;
2149 if32 = INT_FAST32_MAX;
2150 typedef int_fast64_t my_int_fast64_t;
2151 my_int_fast64_t if64 = INT_FAST64_MIN;
2152 if64 = INT_FAST64_MAX;
2153 typedef int_least8_t my_int_least8_t;
2154 my_int_least8_t il8 = INT_LEAST8_MIN;
2155 il8 = INT_LEAST8_MAX;
2156 typedef int_least16_t my_int_least16_t;
2157 my_int_least16_t il16 = INT_LEAST16_MIN;
2158 il16 = INT_LEAST16_MAX;
2159 typedef int_least32_t my_int_least32_t;
2160 my_int_least32_t il32 = INT_LEAST32_MIN;
2161 il32 = INT_LEAST32_MAX;
2162 typedef int_least64_t my_int_least64_t;
2163 my_int_least64_t il64 = INT_LEAST64_MIN;
2164 il64 = INT_LEAST64_MAX;
2165 typedef intmax_t my_intmax_t;
2166 my_intmax_t im = INTMAX_MAX;
2168 typedef intptr_t my_intptr_t;
2169 my_intptr_t ip = INTPTR_MAX;
2171 typedef uint8_t my_uint8_t;
2172 my_uint8_t ui8 = UINT8_MAX;
2174 typedef uint16_t my_uint16_t;
2175 my_uint16_t ui16 = UINT16_MAX;
2177 typedef uint32_t my_uint32_t;
2178 my_uint32_t ui32 = UINT32_MAX;
2180 typedef uint64_t my_uint64_t;
2181 my_uint64_t ui64 = UINT64_MAX;
2183 typedef uint_fast8_t my_uint_fast8_t;
2184 my_uint_fast8_t uif8 = UINT_FAST8_MAX;
2185 uif8 = UINT_FAST8_MAX;
2186 typedef uint_fast16_t my_uint_fast16_t;
2187 my_uint_fast16_t uif16 = UINT_FAST16_MAX;
2188 uif16 = UINT_FAST16_MAX;
2189 typedef uint_fast32_t my_uint_fast32_t;
2190 my_uint_fast32_t uif32 = UINT_FAST32_MAX;
2191 uif32 = UINT_FAST32_MAX;
2192 typedef uint_fast64_t my_uint_fast64_t;
2193 my_uint_fast64_t uif64 = UINT_FAST64_MAX;
2194 uif64 = UINT_FAST64_MAX;
2195 typedef uint_least8_t my_uint_least8_t;
2196 my_uint_least8_t uil8 = UINT_LEAST8_MAX;
2197 uil8 = UINT_LEAST8_MAX;
2198 typedef uint_least16_t my_uint_least16_t;
2199 my_uint_least16_t uil16 = UINT_LEAST16_MAX;
2200 uil16 = UINT_LEAST16_MAX;
2201 typedef uint_least32_t my_uint_least32_t;
2202 my_uint_least32_t uil32 = UINT_LEAST32_MAX;
2203 uil32 = UINT_LEAST32_MAX;
2204 typedef uint_least64_t my_uint_least64_t;
2205 my_uint_least64_t uil64 = UINT_LEAST64_MAX;
2206 uil64 = UINT_LEAST64_MAX;
2207 typedef uintmax_t my_uintmax_t;
2208 my_uintmax_t uim = UINTMAX_MAX;
2210 typedef uintptr_t my_uintptr_t;
2211 my_uintptr_t uip = UINTPTR_MAX;
2213 ],[glibcxx_cv_c99_stdint_tr1=yes],
2214 [glibcxx_cv_c99_stdint_tr1=no])
2216 if test x"$glibcxx_cv_c99_stdint_tr1" = x"yes"; then
2217 AC_DEFINE(_GLIBCXX_USE_C99_STDINT_TR1, 1,
2218 [Define if C99 types in <stdint.h> should be imported in
2219 <tr1/cstdint> in namespace std::tr1.])
2222 # Check for the existence of <math.h> functions.
2223 AC_CACHE_CHECK([for ISO C99 support to TR1 in <math.h>],
2224 glibcxx_cv_c99_math_tr1, [
2225 AC_TRY_COMPILE([#include <math.h>],
2226 [typedef double_t my_double_t;
2227 typedef float_t my_float_t;
2241 copysignf(0.0f, 0.0f);
2242 copysignl(0.0l, 0.0l);
2259 fmaf(0.0f, 0.0f, 0.0f);
2260 fmal(0.0l, 0.0l, 0.0l);
2276 #ifndef __APPLE__ /* see below */
2305 nextafter(0.0, 0.0);
2306 nextafterf(0.0f, 0.0f);
2307 nextafterl(0.0l, 0.0l);
2308 nexttoward(0.0, 0.0);
2309 nexttowardf(0.0f, 0.0f);
2310 nexttowardl(0.0l, 0.0l);
2311 remainder(0.0, 0.0);
2312 remainderf(0.0f, 0.0f);
2313 remainderl(0.0l, 0.0l);
2314 remquo(0.0, 0.0, 0);
2315 remquof(0.0f, 0.0f, 0);
2316 remquol(0.0l, 0.0l, 0);
2335 ],[glibcxx_cv_c99_math_tr1=yes], [glibcxx_cv_c99_math_tr1=no])
2337 if test x"$glibcxx_cv_c99_math_tr1" = x"yes"; then
2338 AC_DEFINE(_GLIBCXX_USE_C99_MATH_TR1, 1,
2339 [Define if C99 functions or macros in <math.h> should be imported
2340 in <tr1/cmath> in namespace std::tr1.])
2343 # Check for the existence of <inttypes.h> functions (NB: doesn't make
2344 # sense if the glibcxx_cv_c99_stdint_tr1 check fails, per C99, 7.8/1).
2345 ac_c99_inttypes_tr1=no;
2346 if test x"$glibcxx_cv_c99_stdint_tr1" = x"yes"; then
2347 AC_MSG_CHECKING([for ISO C99 support to TR1 in <inttypes.h>])
2348 AC_TRY_COMPILE([#include <inttypes.h>],
2349 [intmax_t i, numer, denom, base;
2352 intmax_t ret = imaxabs(i);
2353 imaxdiv_t dret = imaxdiv(numer, denom);
2354 ret = strtoimax(s, endptr, base);
2355 uintmax_t uret = strtoumax(s, endptr, base);
2356 ],[ac_c99_inttypes_tr1=yes], [ac_c99_inttypes_tr1=no])
2357 AC_MSG_RESULT($ac_c99_inttypes_tr1)
2359 if test x"$ac_c99_inttypes_tr1" = x"yes"; then
2360 AC_DEFINE(_GLIBCXX_USE_C99_INTTYPES_TR1, 1,
2361 [Define if C99 functions in <inttypes.h> should be imported in
2362 <tr1/cinttypes> in namespace std::tr1.])
2365 # Check for the existence of wchar_t <inttypes.h> functions (NB: doesn't
2366 # make sense if the glibcxx_cv_c99_stdint_tr1 check fails, per C99, 7.8/1).
2367 ac_c99_inttypes_wchar_t_tr1=no;
2368 if test x"$glibcxx_cv_c99_stdint_tr1" = x"yes"; then
2369 AC_MSG_CHECKING([for wchar_t ISO C99 support to TR1 in <inttypes.h>])
2370 AC_TRY_COMPILE([#include <inttypes.h>],
2374 intmax_t ret = wcstoimax(s, endptr, base);
2375 uintmax_t uret = wcstoumax(s, endptr, base);
2376 ],[ac_c99_inttypes_wchar_t_tr1=yes],
2377 [ac_c99_inttypes_wchar_t_tr1=no])
2378 AC_MSG_RESULT($ac_c99_inttypes_wchar_t_tr1)
2380 if test x"$ac_c99_inttypes_wchar_t_tr1" = x"yes"; then
2381 AC_DEFINE(_GLIBCXX_USE_C99_INTTYPES_WCHAR_T_TR1, 1,
2382 [Define if wchar_t C99 functions in <inttypes.h> should be
2383 imported in <tr1/cinttypes> in namespace std::tr1.])
2386 # Check for the existence of the <stdbool.h> header.
2387 AC_CHECK_HEADERS(stdbool.h)
2389 # Check for the existence of the <stdalign.h> header.
2390 AC_CHECK_HEADERS(stdalign.h)
2392 CXXFLAGS="$ac_save_CXXFLAGS"
2397 dnl Check for uchar.h and usability.
2399 AC_DEFUN([GLIBCXX_CHECK_UCHAR_H], [
2402 AC_CHECK_HEADERS(uchar.h, ac_has_uchar_h=yes, ac_has_uchar_h=no)
2406 ac_save_CXXFLAGS="$CXXFLAGS"
2407 CXXFLAGS="$CXXFLAGS -std=c++11"
2409 if test x"$ac_has_uchar_h" = x"yes"; then
2410 AC_MSG_CHECKING([for ISO C11 support for <uchar.h>])
2411 AC_TRY_COMPILE([#include <uchar.h>
2412 #ifdef __STDC_UTF_16__
2413 long i = __STDC_UTF_16__;
2415 #ifdef __STDC_UTF_32__
2416 long j = __STDC_UTF_32__;
2426 [], [ac_c11_uchar_cxx11=yes], [ac_c11_uchar_cxx11=no])
2427 AC_MSG_RESULT($ac_c11_uchar_cxx11)
2429 ac_c11_uchar_cxx11=no
2431 if test x"$ac_c11_uchar_cxx11" = x"yes"; then
2432 AC_DEFINE(_GLIBCXX_USE_C11_UCHAR_CXX11, 1,
2433 [Define if C11 functions in <uchar.h> should be imported into
2434 namespace std in <cuchar>.])
2437 CXXFLAGS="$CXXFLAGS -fchar8_t"
2438 if test x"$ac_has_uchar_h" = x"yes"; then
2439 AC_MSG_CHECKING([for c8rtomb and mbrtoc8 in <uchar.h> with -fchar8_t])
2440 AC_TRY_COMPILE([#include <uchar.h>
2447 [], [ac_uchar_c8rtomb_mbrtoc8_fchar8_t=yes],
2448 [ac_uchar_c8rtomb_mbrtoc8_fchar8_t=no])
2449 AC_MSG_RESULT($ac_uchar_c8rtomb_mbrtoc8_fchar8_t)
2451 ac_uchar_c8rtomb_mbrtoc8_fchar8_t=no
2453 if test x"$ac_uchar_c8rtomb_mbrtoc8_fchar8_t" = x"yes"; then
2454 AC_DEFINE(_GLIBCXX_USE_UCHAR_C8RTOMB_MBRTOC8_FCHAR8_T, 1,
2455 [Define if c8rtomb and mbrtoc8 functions in <uchar.h> should be
2456 imported into namespace std in <cuchar> for -fchar8_t.])
2459 CXXFLAGS="$CXXFLAGS -std=c++20"
2460 if test x"$ac_has_uchar_h" = x"yes"; then
2461 AC_MSG_CHECKING([for c8rtomb and mbrtoc8 in <uchar.h> with -std=c++20])
2462 AC_TRY_COMPILE([#include <uchar.h>
2469 [], [ac_uchar_c8rtomb_mbrtoc8_cxx20=yes],
2470 [ac_uchar_c8rtomb_mbrtoc8_cxx20=no])
2471 AC_MSG_RESULT($ac_uchar_c8rtomb_mbrtoc8_cxx20)
2473 ac_uchar_c8rtomb_mbrtoc8_cxx20=no
2475 if test x"$ac_uchar_c8rtomb_mbrtoc8_cxx20" = x"yes"; then
2476 AC_DEFINE(_GLIBCXX_USE_UCHAR_C8RTOMB_MBRTOC8_CXX20, 1,
2477 [Define if c8rtomb and mbrtoc8 functions in <uchar.h> should be
2478 imported into namespace std in <cuchar> for C++20.])
2481 CXXFLAGS="$ac_save_CXXFLAGS"
2487 dnl Check whether "/dev/random" and "/dev/urandom" are available for
2488 dnl class std::random_device from C++ 2011 [rand.device], and
2489 dnl random_device of "TR1" (Chapter 5.1, "Random number generation").
2491 AC_DEFUN([GLIBCXX_CHECK_DEV_RANDOM], [
2493 AC_CACHE_CHECK([for "/dev/random" and "/dev/urandom" for std::random_device],
2494 glibcxx_cv_dev_random, [
2495 if test -r /dev/random && test -r /dev/urandom; then
2496 ## For MSys environment the test above is detected as false-positive
2497 ## on mingw-targets. So disable it explicitly for them.
2498 case ${target_os} in
2499 *mingw*) glibcxx_cv_dev_random=no ;;
2500 *) glibcxx_cv_dev_random=yes ;;
2503 glibcxx_cv_dev_random=no;
2507 if test x"$glibcxx_cv_dev_random" = x"yes"; then
2508 AC_DEFINE(_GLIBCXX_USE_DEV_RANDOM, 1,
2509 [Define if /dev/random and /dev/urandom are available for
2510 std::random_device.])
2511 AC_DEFINE(_GLIBCXX_USE_RANDOM_TR1, 1,
2512 [Define if /dev/random and /dev/urandom are available for
2513 the random_device of TR1 (Chapter 5.1).])
2519 dnl Compute the EOF, SEEK_CUR, and SEEK_END integer constants.
2521 AC_DEFUN([GLIBCXX_COMPUTE_STDIO_INTEGER_CONSTANTS], [
2523 if test "$is_hosted" = yes; then
2524 AC_CACHE_CHECK([for the value of EOF], glibcxx_cv_stdio_eof, [
2525 AC_COMPUTE_INT([glibcxx_cv_stdio_eof], [[EOF]],
2526 [#include <stdio.h>],
2527 [AC_MSG_ERROR([computing EOF failed])])
2529 AC_DEFINE_UNQUOTED(_GLIBCXX_STDIO_EOF, $glibcxx_cv_stdio_eof,
2530 [Define to the value of the EOF integer constant.])
2532 AC_CACHE_CHECK([for the value of SEEK_CUR], glibcxx_cv_stdio_seek_cur, [
2533 AC_COMPUTE_INT([glibcxx_cv_stdio_seek_cur], [[SEEK_CUR]],
2534 [#include <stdio.h>],
2535 [AC_MSG_ERROR([computing SEEK_CUR failed])])
2537 AC_DEFINE_UNQUOTED(_GLIBCXX_STDIO_SEEK_CUR, $glibcxx_cv_stdio_seek_cur,
2538 [Define to the value of the SEEK_CUR integer constant.])
2540 AC_CACHE_CHECK([for the value of SEEK_END], glibcxx_cv_stdio_seek_end, [
2541 AC_COMPUTE_INT([glibcxx_cv_stdio_seek_end], [[SEEK_END]],
2542 [#include <stdio.h>],
2543 [AC_MSG_ERROR([computing SEEK_END failed])])
2545 AC_DEFINE_UNQUOTED(_GLIBCXX_STDIO_SEEK_END, $glibcxx_cv_stdio_seek_end,
2546 [Define to the value of the SEEK_END integer constant.])
2551 dnl Check whether required C++ overloads are present in <stdio.h>.
2553 AC_DEFUN([GLIBCXX_CHECK_STDIO_PROTO], [
2557 # Use C++11 because a conforming <stdio.h> won't define gets for C++14,
2558 # and we don't need a declaration for C++14 anyway.
2559 ac_save_CXXFLAGS="$CXXFLAGS"
2560 CXXFLAGS="$CXXFLAGS -std=gnu++11"
2562 AC_CACHE_CHECK([for gets declaration], glibcxx_cv_gets, [
2563 AC_COMPILE_IFELSE([AC_LANG_SOURCE(
2570 [glibcxx_cv_gets=yes],
2571 [glibcxx_cv_gets=no]
2574 if test $glibcxx_cv_gets = yes; then
2575 AC_DEFINE(HAVE_GETS, 1, [Define if gets is available in <stdio.h> before C++14.])
2578 CXXFLAGS="$ac_save_CXXFLAGS"
2583 dnl Check whether required C++11 overloads for floating point and integral
2584 dnl types are present in <math.h>.
2586 AC_DEFUN([GLIBCXX_CHECK_MATH11_PROTO], [
2590 ac_save_CXXFLAGS="$CXXFLAGS"
2591 CXXFLAGS="$CXXFLAGS -std=c++11"
2595 # Solaris 12 Build 86, Solaris 11.3 SRU 3.6, and Solaris 10 Patch
2596 # 11996[67]-02 introduced the C++11 <math.h> floating point overloads.
2597 AC_CACHE_CHECK([for C++11 <math.h> floating point overloads],
2598 glibcxx_cv_math11_fp_overload, [
2599 AC_COMPILE_IFELSE([AC_LANG_SOURCE(
2603 inline bool isfinite(float __x)
2604 { return __builtin_isfinite(__x); }
2607 [glibcxx_cv_math11_fp_overload=no],
2608 [glibcxx_cv_math11_fp_overload=yes]
2611 # autoheader cannot handle indented templates.
2612 AH_VERBATIM([__CORRECT_ISO_CPP11_MATH_H_PROTO_FP],
2613 [/* Define if all C++11 floating point overloads are available in <math.h>. */
2614 #if __cplusplus >= 201103L
2615 #undef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2618 if test $glibcxx_cv_math11_fp_overload = yes; then
2619 AC_DEFINE(__CORRECT_ISO_CPP11_MATH_H_PROTO_FP)
2622 # Solaris 12 Build 90, Solaris 11.3 SRU 5.6, and Solaris 10 Patch
2623 # 11996[67]-02 introduced the C++11 <math.h> integral type overloads.
2624 AC_CACHE_CHECK([for C++11 <math.h> integral type overloads],
2625 glibcxx_cv_math11_int_overload, [
2626 AC_COMPILE_IFELSE([AC_LANG_SOURCE(
2629 template<typename _Tp>
2630 struct __is_integer;
2632 struct __is_integer<int>
2634 enum { __value = 1 };
2637 namespace __gnu_cxx {
2638 template<bool, typename>
2640 template<typename _Tp>
2641 struct __enable_if<true, _Tp>
2642 { typedef _Tp __type; };
2645 template<typename _Tp>
2646 constexpr typename __gnu_cxx::__enable_if
2647 <__is_integer<_Tp>::__value, double>::__type
2649 { return __builtin_log2(__x); }
2655 return std::log2(i);
2658 [glibcxx_cv_math11_int_overload=no],
2659 [glibcxx_cv_math11_int_overload=yes]
2662 # autoheader cannot handle indented templates.
2663 AH_VERBATIM([__CORRECT_ISO_CPP11_MATH_H_PROTO_INT],
2664 [/* Define if all C++11 integral type overloads are available in <math.h>. */
2665 #if __cplusplus >= 201103L
2666 #undef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2669 if test $glibcxx_cv_math11_int_overload = yes; then
2670 AC_DEFINE(__CORRECT_ISO_CPP11_MATH_H_PROTO_INT)
2674 # If <math.h> defines the obsolete isinf(double) and isnan(double)
2675 # functions (instead of or as well as the C99 generic macros) then we
2676 # can't define std::isinf(double) and std::isnan(double) in <cmath>
2677 # and must use the ones from <math.h> instead.
2678 AC_CACHE_CHECK([for obsolete isinf function in <math.h>],
2679 glibcxx_cv_obsolete_isinf, [
2680 AC_COMPILE_IFELSE([AC_LANG_SOURCE(
2681 [#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS
2687 bool isinf(long double);
2690 bool b = isinf(0.0);
2692 [glibcxx_cv_obsolete_isinf=yes],
2693 [glibcxx_cv_obsolete_isinf=no]
2695 if test $glibcxx_cv_obsolete_isinf = yes; then
2696 AC_DEFINE(HAVE_OBSOLETE_ISINF, 1,
2697 [Define if <math.h> defines obsolete isinf function.])
2700 AC_CACHE_CHECK([for obsolete isnan function in <math.h>],
2701 glibcxx_cv_obsolete_isnan, [
2702 AC_COMPILE_IFELSE([AC_LANG_SOURCE(
2703 [#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS
2709 bool isnan(long double);
2712 bool b = isnan(0.0);
2714 [glibcxx_cv_obsolete_isnan=yes],
2715 [glibcxx_cv_obsolete_isnan=no]
2717 if test $glibcxx_cv_obsolete_isnan = yes; then
2718 AC_DEFINE(HAVE_OBSOLETE_ISNAN, 1,
2719 [Define if <math.h> defines obsolete isnan function.])
2724 CXXFLAGS="$ac_save_CXXFLAGS"
2729 dnl Check for what type of C headers to use.
2731 dnl --enable-cheaders= [does stuff].
2732 dnl --disable-cheaders [does not do anything, really].
2733 dnl + Usage: GLIBCXX_ENABLE_CHEADERS[(DEFAULT)]
2734 dnl Where DEFAULT is either 'c' or 'c_global' or 'c_std'.
2736 dnl To use the obsolete 'c_std' headers use --enable-cheaders-obsolete as
2737 dnl well as --enable-cheaders=c_std, otherwise configure will fail.
2739 AC_DEFUN([GLIBCXX_ENABLE_CHEADERS], [
2740 GLIBCXX_ENABLE(cheaders-obsolete,no,,
2741 [allow use of obsolete "C" headers for g++])
2742 GLIBCXX_ENABLE(cheaders,$1,[[[=KIND]]],
2743 [construct "C" headers for g++], [permit c|c_global|c_std])
2744 AC_MSG_NOTICE("C" header strategy set to $enable_cheaders)
2745 if test $enable_cheaders = c_std ; then
2746 AC_MSG_WARN([the --enable-cheaders=c_std configuration is obsolete, c_global should be used instead])
2747 AC_MSG_WARN([if you are unable to use c_global please report a bug or inform libstdc++@gcc.gnu.org])
2748 if test $enable_cheaders_obsolete != yes ; then
2749 AC_MSG_ERROR(use --enable-cheaders-obsolete to use c_std "C" headers)
2753 C_INCLUDE_DIR='${glibcxx_srcdir}/include/'$enable_cheaders
2755 # Allow overrides to configure.host here.
2756 if test $enable_cheaders = c_global; then
2760 AC_SUBST(C_INCLUDE_DIR)
2761 GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_C, test $enable_cheaders = c)
2762 GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_C_STD, test $enable_cheaders = c_std)
2763 GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_C_GLOBAL, test $enable_cheaders = c_global)
2764 GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_COMPATIBILITY, test $c_compatibility = yes)
2769 dnl Check for which locale library to use. The choice is mapped to
2770 dnl a subdirectory of config/locale.
2772 dnl Default is generic.
2774 AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [
2775 GLIBCXX_ENABLE(clocale,auto,[[[=MODEL]]],
2776 [use MODEL for target locale package],
2777 [permit generic|gnu|ieee_1003.1-2001|newlib|yes|no|auto])
2779 # Deal with gettext issues. Default to not using it (=no) until we detect
2780 # support for it later. Let the user turn it off via --e/d, but let that
2781 # default to on for easier handling.
2784 AC_HELP_STRING([--enable-nls],[use Native Language Support (default)]),
2788 # Either a known package, or "auto"
2789 if test $enable_clocale = no || test $enable_clocale = yes; then
2792 enable_clocale_flag=$enable_clocale
2794 # Probe for locale model to use if none specified.
2795 # Default to "generic".
2796 if test $enable_clocale_flag = auto; then
2797 case ${target_os} in
2798 linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
2799 enable_clocale_flag=gnu
2802 enable_clocale_flag=darwin
2805 enable_clocale_flag=vxworks
2807 dragonfly* | freebsd*)
2808 enable_clocale_flag=dragonfly
2811 enable_clocale_flag=newlib
2814 if test x"$with_newlib" = x"yes"; then
2815 enable_clocale_flag=newlib
2817 enable_clocale_flag=generic
2823 # Sanity check model, and test for special functionality.
2824 if test $enable_clocale_flag = gnu; then
2825 AC_EGREP_CPP([_GLIBCXX_ok], [
2826 #include <features.h>
2827 #if (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)) && !defined(__UCLIBC__)
2830 ], enable_clocale_flag=gnu, enable_clocale_flag=generic)
2832 # Set it to scream when it hurts.
2833 ac_save_CFLAGS="$CFLAGS"
2834 CFLAGS="-Wimplicit-function-declaration -Werror"
2836 # Use strxfrm_l if available.
2837 AC_TRY_COMPILE([#define _GNU_SOURCE 1
2839 #include <locale.h>],
2840 [char s[128]; __locale_t loc; strxfrm_l(s, "C", 5, loc);],
2841 AC_DEFINE(HAVE_STRXFRM_L, 1,
2842 [Define if strxfrm_l is available in <string.h>.]),)
2844 # Use strerror_l if available.
2845 AC_TRY_COMPILE([#define _GNU_SOURCE 1
2847 #include <locale.h>],
2848 [__locale_t loc; strerror_l(5, loc);],
2849 AC_DEFINE(HAVE_STRERROR_L, 1,
2850 [Define if strerror_l is available in <string.h>.]),)
2852 CFLAGS="$ac_save_CFLAGS"
2855 # Perhaps use strerror_r if available, and strerror_l isn't.
2856 ac_save_CFLAGS="$CFLAGS"
2857 CFLAGS="-Wimplicit-function-declaration -Werror"
2858 AC_TRY_COMPILE([#define _GNU_SOURCE 1
2860 #include <locale.h>],
2861 [char s[128]; strerror_r(5, s, 128);],
2862 AC_DEFINE(HAVE_STRERROR_R, 1,
2863 [Define if strerror_r is available in <string.h>.]),)
2864 CFLAGS="$ac_save_CFLAGS"
2866 # Set configure bits for specified locale package
2867 AC_MSG_CHECKING([for C locale to use])
2868 case ${enable_clocale_flag} in
2870 AC_MSG_RESULT(generic)
2872 CLOCALE_H=config/locale/generic/c_locale.h
2873 CLOCALE_CC=config/locale/generic/c_locale.cc
2874 CCODECVT_CC=config/locale/generic/codecvt_members.cc
2875 CCOLLATE_CC=config/locale/generic/collate_members.cc
2876 CCTYPE_CC=config/locale/generic/ctype_members.cc
2877 CMESSAGES_H=config/locale/generic/messages_members.h
2878 CMESSAGES_CC=config/locale/generic/messages_members.cc
2879 CMONEY_CC=config/locale/generic/monetary_members.cc
2880 CNUMERIC_CC=config/locale/generic/numeric_members.cc
2881 CTIME_H=config/locale/generic/time_members.h
2882 CTIME_CC=config/locale/generic/time_members.cc
2883 CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2886 AC_MSG_RESULT(darwin)
2888 CLOCALE_H=config/locale/generic/c_locale.h
2889 CLOCALE_CC=config/locale/generic/c_locale.cc
2890 CCODECVT_CC=config/locale/generic/codecvt_members.cc
2891 CCOLLATE_CC=config/locale/generic/collate_members.cc
2892 CCTYPE_CC=config/locale/darwin/ctype_members.cc
2893 CMESSAGES_H=config/locale/generic/messages_members.h
2894 CMESSAGES_CC=config/locale/generic/messages_members.cc
2895 CMONEY_CC=config/locale/generic/monetary_members.cc
2896 CNUMERIC_CC=config/locale/generic/numeric_members.cc
2897 CTIME_H=config/locale/generic/time_members.h
2898 CTIME_CC=config/locale/generic/time_members.cc
2899 CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2902 AC_MSG_RESULT(vxworks)
2904 CLOCALE_H=config/locale/generic/c_locale.h
2905 CLOCALE_CC=config/locale/generic/c_locale.cc
2906 CCODECVT_CC=config/locale/generic/codecvt_members.cc
2907 CCOLLATE_CC=config/locale/generic/collate_members.cc
2908 CCTYPE_CC=config/locale/vxworks/ctype_members.cc
2909 CMESSAGES_H=config/locale/generic/messages_members.h
2910 CMESSAGES_CC=config/locale/generic/messages_members.cc
2911 CMONEY_CC=config/locale/generic/monetary_members.cc
2912 CNUMERIC_CC=config/locale/generic/numeric_members.cc
2913 CTIME_H=config/locale/generic/time_members.h
2914 CTIME_CC=config/locale/generic/time_members.cc
2915 CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2918 AC_MSG_RESULT(dragonfly or freebsd)
2920 CLOCALE_H=config/locale/dragonfly/c_locale.h
2921 CLOCALE_CC=config/locale/dragonfly/c_locale.cc
2922 CCODECVT_CC=config/locale/dragonfly/codecvt_members.cc
2923 CCOLLATE_CC=config/locale/dragonfly/collate_members.cc
2924 CCTYPE_CC=config/locale/dragonfly/ctype_members.cc
2925 CMESSAGES_H=config/locale/generic/messages_members.h
2926 CMESSAGES_CC=config/locale/generic/messages_members.cc
2927 CMONEY_CC=config/locale/dragonfly/monetary_members.cc
2928 CNUMERIC_CC=config/locale/dragonfly/numeric_members.cc
2929 CTIME_H=config/locale/dragonfly/time_members.h
2930 CTIME_CC=config/locale/dragonfly/time_members.cc
2931 CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2937 # Declare intention to use gettext, and add support for specific
2939 # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT
2942 # Don't call AM-GNU-GETTEXT here. Instead, assume glibc.
2943 AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no)
2944 if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
2947 # Export the build objects.
2948 for ling in $ALL_LINGUAS; do \
2949 glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \
2950 glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \
2952 AC_SUBST(glibcxx_MOFILES)
2953 AC_SUBST(glibcxx_POFILES)
2955 CLOCALE_H=config/locale/gnu/c_locale.h
2956 CLOCALE_CC=config/locale/gnu/c_locale.cc
2957 CCODECVT_CC=config/locale/gnu/codecvt_members.cc
2958 CCOLLATE_CC=config/locale/gnu/collate_members.cc
2959 CCTYPE_CC=config/locale/gnu/ctype_members.cc
2960 CMESSAGES_H=config/locale/gnu/messages_members.h
2961 CMESSAGES_CC=config/locale/gnu/messages_members.cc
2962 CMONEY_CC=config/locale/gnu/monetary_members.cc
2963 CNUMERIC_CC=config/locale/gnu/numeric_members.cc
2964 CTIME_H=config/locale/gnu/time_members.h
2965 CTIME_CC=config/locale/gnu/time_members.cc
2966 CLOCALE_INTERNAL_H=config/locale/gnu/c++locale_internal.h
2969 AC_MSG_RESULT(IEEE 1003.1)
2971 CLOCALE_H=config/locale/ieee_1003.1-2001/c_locale.h
2972 CLOCALE_CC=config/locale/ieee_1003.1-2001/c_locale.cc
2973 CCODECVT_CC=config/locale/generic/codecvt_members.cc
2974 CCOLLATE_CC=config/locale/generic/collate_members.cc
2975 CCTYPE_CC=config/locale/generic/ctype_members.cc
2976 CMESSAGES_H=config/locale/ieee_1003.1-2001/messages_members.h
2977 CMESSAGES_CC=config/locale/ieee_1003.1-2001/messages_members.cc
2978 CMONEY_CC=config/locale/generic/monetary_members.cc
2979 CNUMERIC_CC=config/locale/generic/numeric_members.cc
2980 CTIME_H=config/locale/generic/time_members.h
2981 CTIME_CC=config/locale/generic/time_members.cc
2982 CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2985 AC_MSG_RESULT(newlib)
2987 CLOCALE_H=config/locale/generic/c_locale.h
2988 CLOCALE_CC=config/locale/generic/c_locale.cc
2989 CCODECVT_CC=config/locale/generic/codecvt_members.cc
2990 CCOLLATE_CC=config/locale/generic/collate_members.cc
2991 CCTYPE_CC=config/locale/newlib/ctype_members.cc
2992 CMESSAGES_H=config/locale/generic/messages_members.h
2993 CMESSAGES_CC=config/locale/generic/messages_members.cc
2994 CMONEY_CC=config/locale/generic/monetary_members.cc
2995 CNUMERIC_CC=config/locale/generic/numeric_members.cc
2996 CTIME_H=config/locale/generic/time_members.h
2997 CTIME_CC=config/locale/generic/time_members.cc
2998 CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
3002 # This is where the testsuite looks for locale catalogs, using the
3003 # -DLOCALEDIR define during testsuite compilation.
3004 glibcxx_localedir=${glibcxx_builddir}/po/share/locale
3005 AC_SUBST(glibcxx_localedir)
3007 # A standalone libintl (e.g., GNU libintl) may be in use.
3008 if test $USE_NLS = yes; then
3009 AC_CHECK_HEADERS([libintl.h], [], USE_NLS=no)
3010 AC_SEARCH_LIBS(gettext, intl, [], USE_NLS=no)
3012 if test $USE_NLS = yes; then
3013 AC_DEFINE(_GLIBCXX_USE_NLS, 1,
3014 [Define if NLS translations are to be used.])
3019 AC_SUBST(CMESSAGES_H)
3020 AC_SUBST(CCODECVT_CC)
3021 AC_SUBST(CCOLLATE_CC)
3023 AC_SUBST(CMESSAGES_CC)
3025 AC_SUBST(CNUMERIC_CC)
3028 AC_SUBST(CLOCALE_CC)
3029 AC_SUBST(CLOCALE_INTERNAL_H)
3034 dnl Check for which std::allocator base class to use. The choice is
3035 dnl mapped from a subdirectory of include/ext.
3039 AC_DEFUN([GLIBCXX_ENABLE_ALLOCATOR], [
3040 AC_MSG_CHECKING([for std::allocator base class])
3041 GLIBCXX_ENABLE(libstdcxx-allocator,auto,[[[=KIND]]],
3042 [use KIND for target std::allocator base],
3043 [permit new|malloc|yes|no|auto])
3045 # If they didn't use this option switch, or if they specified --enable
3046 # with no specific model, we'll have to look for one. If they
3047 # specified --disable (???), do likewise.
3048 if test $enable_libstdcxx_allocator = no ||
3049 test $enable_libstdcxx_allocator = yes;
3051 enable_libstdcxx_allocator=auto
3054 # Either a known package, or "auto". Auto implies the default choice
3055 # for a particular platform.
3056 enable_libstdcxx_allocator_flag=$enable_libstdcxx_allocator
3058 # Probe for host-specific support if no specific model is specified.
3060 if test $enable_libstdcxx_allocator_flag = auto; then
3061 case ${target_os} in
3062 linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
3063 enable_libstdcxx_allocator_flag=new
3066 enable_libstdcxx_allocator_flag=new
3070 AC_MSG_RESULT($enable_libstdcxx_allocator_flag)
3073 # Set configure bits for specified locale package
3074 case ${enable_libstdcxx_allocator_flag} in
3076 ALLOCATOR_H=config/allocator/malloc_allocator_base.h
3077 ALLOCATOR_NAME=__gnu_cxx::malloc_allocator
3080 ALLOCATOR_H=config/allocator/new_allocator_base.h
3081 ALLOCATOR_NAME=__gnu_cxx::new_allocator
3085 GLIBCXX_CONDITIONAL(ENABLE_ALLOCATOR_NEW,
3086 test $enable_libstdcxx_allocator_flag = new)
3087 AC_SUBST(ALLOCATOR_H)
3088 AC_SUBST(ALLOCATOR_NAME)
3093 dnl Check for whether the Boost-derived checks should be turned on.
3095 dnl --enable-concept-checks turns them on.
3096 dnl --disable-concept-checks leaves them off.
3097 dnl + Usage: GLIBCXX_ENABLE_CONCEPT_CHECKS[(DEFAULT)]
3098 dnl Where DEFAULT is either `yes' or `no'.
3100 AC_DEFUN([GLIBCXX_ENABLE_CONCEPT_CHECKS], [
3101 GLIBCXX_ENABLE(concept-checks,$1,,[use Boost-derived template checks])
3102 if test $enable_concept_checks = yes; then
3103 AC_DEFINE(_GLIBCXX_CONCEPT_CHECKS, 1,
3104 [Define to use concept checking code from the boost libraries.])
3109 dnl Use extern templates.
3111 dnl --enable-extern-template defines _GLIBCXX_EXTERN_TEMPLATE to 1
3112 dnl --disable-extern-template defines _GLIBCXX_EXTERN_TEMPLATE to 0
3114 dnl + Usage: GLIBCXX_ENABLE_TEMPLATE[(DEFAULT)]
3115 dnl Where DEFAULT is `yes' or `no'.
3117 AC_DEFUN([GLIBCXX_ENABLE_EXTERN_TEMPLATE], [
3119 GLIBCXX_ENABLE(extern-template,$1,,[enable extern template])
3121 AC_MSG_CHECKING([for extern template support])
3122 AC_MSG_RESULT([$enable_extern_template])
3124 GLIBCXX_CONDITIONAL(ENABLE_EXTERN_TEMPLATE, test $enable_extern_template = yes)
3128 dnl Use vtable verification.
3130 dnl --enable-vtable-verify defines _GLIBCXX_VTABLE_VERIFY to 1
3131 dnl --disable-vtable-verify defines _GLIBCXX_VTABLE_VERIFY to 0
3133 dnl + Usage: GLIBCXX_ENABLE_VTABLE_VERIFY[(DEFAULT)]
3134 dnl Where DEFAULT is `yes' or `no'.
3136 AC_DEFUN([GLIBCXX_ENABLE_VTABLE_VERIFY], [
3138 GLIBCXX_ENABLE(vtable-verify,$1,,[enable vtable verify])
3140 AC_MSG_CHECKING([for vtable verify support])
3141 AC_MSG_RESULT([$enable_vtable_verify])
3144 if test $enable_vtable_verify = yes; then
3145 case ${target_os} in
3147 VTV_CXXFLAGS="-fvtable-verify=std -Wl,-lvtv,-u_vtable_map_vars_start,-u_vtable_map_vars_end"
3148 VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,--rpath -Wl,${toplevel_builddir}/libvtv/.libs"
3152 VTV_CXXFLAGS="-fvtable-verify=std -Wl,-u,_vtable_map_vars_start -Wl,-u,_vtable_map_vars_end"
3153 VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,-rpath,${toplevel_builddir}/libvtv/.libs"
3156 VTV_CXXFLAGS="-fvtable-verify=std -Wl,-u_vtable_map_vars_start,-u_vtable_map_vars_end"
3157 VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,-R -Wl,${toplevel_builddir}/libvtv/.libs"
3160 VTV_CXXFLAGS="-fvtable-verify=std -Wl,-u_vtable_map_vars_start,-u_vtable_map_vars_end"
3161 VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,--rpath -Wl,${toplevel_builddir}/libvtv/.libs"
3164 VTV_PCH_CXXFLAGS="-fvtable-verify=std"
3171 AC_SUBST(VTV_CXXFLAGS)
3172 AC_SUBST(VTV_PCH_CXXFLAGS)
3173 AC_SUBST(VTV_CXXLINKFLAGS)
3174 AM_CONDITIONAL(VTV_CYGMIN, test x$vtv_cygmin = xyes)
3175 GLIBCXX_CONDITIONAL(ENABLE_VTABLE_VERIFY, test $enable_vtable_verify = yes)
3179 dnl Check for parallel mode pre-requisites, including OpenMP support.
3181 dnl + Usage: GLIBCXX_ENABLE_PARALLEL
3183 AC_DEFUN([GLIBCXX_ENABLE_PARALLEL], [
3187 # See if configured libgomp/omp.h exists. (libgomp may be in
3188 # noconfigdirs but not explicitly disabled.)
3189 if echo " ${TARGET_CONFIGDIRS} " | grep " libgomp " > /dev/null 2>&1 ; then
3190 enable_parallel=yes;
3192 AC_MSG_NOTICE([target-libgomp not built])
3195 AC_MSG_CHECKING([for parallel mode support])
3196 AC_MSG_RESULT([$enable_parallel])
3201 dnl Check for which I/O library to use: stdio and POSIX, or pure stdio.
3203 dnl Default is stdio_posix.
3205 AC_DEFUN([GLIBCXX_ENABLE_CSTDIO], [
3206 AC_MSG_CHECKING([for underlying I/O to use])
3207 GLIBCXX_ENABLE(cstdio,stdio,[[[=PACKAGE]]],
3208 [use target-specific I/O package], [permit stdio|stdio_posix|stdio_pure])
3210 # The only available I/O model is based on stdio, via basic_file_stdio.
3211 # The default "stdio" is actually "stdio + POSIX" because it uses fdopen(3)
3212 # to get a file descriptor and then uses read(3) and write(3) with it.
3213 # The "stdio_pure" model doesn't use fdopen and only uses FILE* for I/O.
3214 case ${enable_cstdio} in
3216 CSTDIO_H=config/io/c_io_stdio.h
3217 BASIC_FILE_H=config/io/basic_file_stdio.h
3218 BASIC_FILE_CC=config/io/basic_file_stdio.cc
3220 if test "x$enable_cstdio" = "xstdio_pure" ; then
3221 AC_MSG_RESULT([stdio (without POSIX read/write)])
3222 AC_DEFINE(_GLIBCXX_USE_STDIO_PURE, 1,
3223 [Define to restrict std::__basic_file<> to stdio APIs.])
3225 AC_MSG_RESULT([stdio (with POSIX read/write)])
3231 AC_SUBST(BASIC_FILE_H)
3232 AC_SUBST(BASIC_FILE_CC)
3237 dnl Check for "unusual" flags to pass to the compiler while building.
3239 dnl --enable-cxx-flags='-foo -bar -baz' is a general method for passing
3240 dnl experimental flags such as -fpch, -fIMI, -Dfloat=char, etc.
3241 dnl --disable-cxx-flags passes nothing.
3242 dnl + See http://gcc.gnu.org/ml/libstdc++/2000-q2/msg00131.html
3243 dnl http://gcc.gnu.org/ml/libstdc++/2000-q2/msg00284.html
3244 dnl http://gcc.gnu.org/ml/libstdc++/2000-q1/msg00035.html
3245 dnl + Usage: GLIBCXX_ENABLE_CXX_FLAGS(default flags)
3246 dnl If "default flags" is an empty string, the effect is the same
3247 dnl as --disable or --enable=no.
3249 AC_DEFUN([GLIBCXX_ENABLE_CXX_FLAGS], [dnl
3250 AC_MSG_CHECKING([for extra compiler flags for building])
3251 GLIBCXX_ENABLE(cxx-flags,$1,[=FLAGS],
3252 [pass compiler FLAGS when building library],
3253 [case "x$enable_cxx_flags" in
3254 xno | x) enable_cxx_flags= ;;
3256 *) AC_MSG_ERROR(_g_switch needs compiler flags as arguments) ;;
3259 # Run through flags (either default or command-line) and set anything
3260 # extra (e.g., #defines) that must accompany particular g++ options.
3261 if test -n "$enable_cxx_flags"; then
3262 for f in $enable_cxx_flags; do
3266 *) # and we're trying to pass /what/ exactly?
3267 AC_MSG_ERROR([compiler flags start with a -]) ;;
3272 EXTRA_CXX_FLAGS="$enable_cxx_flags"
3273 AC_MSG_RESULT($EXTRA_CXX_FLAGS)
3274 AC_SUBST(EXTRA_CXX_FLAGS)
3279 dnl Check to see if debugging libraries are to be built.
3281 dnl --enable-libstdcxx-debug
3282 dnl builds a separate set of debugging libraries in addition to the
3283 dnl normal (shared, static) libstdc++ binaries.
3285 dnl --disable-libstdcxx-debug
3286 dnl builds only one (non-debug) version of libstdc++.
3288 dnl --enable-libstdcxx-debug-flags=FLAGS
3289 dnl iff --enable-debug == yes, then use FLAGS to build the debug library.
3291 dnl + Usage: GLIBCXX_ENABLE_DEBUG[(DEFAULT)]
3292 dnl Where DEFAULT is either `yes' or `no'.
3294 AC_DEFUN([GLIBCXX_ENABLE_DEBUG], [
3295 AC_MSG_CHECKING([for additional debug build])
3297 GLIBCXX_ENABLE(libstdcxx-debug,$1,,[build extra debug library])
3298 if test x$enable_libstdcxx_debug = xyes; then
3299 if test -f $toplevel_builddir/../stage_final \
3300 && test -f $toplevel_builddir/../stage_current; then
3301 stage_final=`cat $toplevel_builddir/../stage_final`
3302 stage_current=`cat $toplevel_builddir/../stage_current`
3303 if test x$stage_current != x$stage_final ; then
3304 skip_debug_build=" (skipped for bootstrap stage $stage_current)"
3305 enable_libstdcxx_debug=no
3309 AC_MSG_RESULT($enable_libstdcxx_debug$skip_debug_build)
3310 GLIBCXX_CONDITIONAL(GLIBCXX_BUILD_DEBUG, test $enable_libstdcxx_debug = yes)
3315 dnl Check for explicit debug flags.
3317 dnl --enable-libstdcxx-debug-flags='-O1'
3318 dnl is a general method for passing flags to be used when
3319 dnl building debug libraries with --enable-libstdcxx-debug.
3321 dnl --disable-libstdcxx-debug-flags does nothing.
3322 dnl + Usage: GLIBCXX_ENABLE_DEBUG_FLAGS(default flags)
3323 dnl If "default flags" is an empty string, the effect is the same
3324 dnl as --disable or --enable=no.
3326 AC_DEFUN([GLIBCXX_ENABLE_DEBUG_FLAGS], [
3327 GLIBCXX_ENABLE(libstdcxx-debug-flags,[$1],[=FLAGS],
3328 [pass compiler FLAGS when building debug library],
3329 [case "x$enable_libstdcxx_debug_flags" in
3330 xno | x) enable_libstdcxx_debug_flags= ;;
3332 *) AC_MSG_ERROR(_g_switch needs compiler flags as arguments) ;;
3335 # Option parsed, now set things appropriately
3336 DEBUG_FLAGS="$enable_libstdcxx_debug_flags"
3337 AC_SUBST(DEBUG_FLAGS)
3339 AC_MSG_NOTICE([Debug build flags set to $DEBUG_FLAGS])
3344 dnl Check if the user only wants a freestanding library implementation.
3346 dnl --disable-hosted-libstdcxx will turn off most of the library build,
3347 dnl installing only the headers required by [17.4.1.3] and the language
3348 dnl support library. More than that will be built (to keep the Makefiles
3349 dnl conveniently clean), but not installed.
3351 dnl Also define --disable-libstdcxx-hosted as an alias for
3352 dnl --disable-hosted-libstdcxx but fail if both are given
3353 dnl and their values do not agree.
3356 dnl is_hosted (yes/no)
3359 dnl _GLIBCXX_HOSTED (always defined, either to 1 or 0)
3361 AC_DEFUN([GLIBCXX_ENABLE_HOSTED], [
3362 AC_ARG_ENABLE([hosted-libstdcxx],
3363 AC_HELP_STRING([--disable-hosted-libstdcxx],
3364 [only build freestanding C++ runtime support]),
3365 [enable_hosted_libstdcxx_was_given=yes],
3368 enable_hosted_libstdcxx=no
3371 case "${with_newlib}-${with_headers}" in
3372 no-no) enable_hosted_libstdcxx=no ;;
3373 *) enable_hosted_libstdcxx=yes ;;
3378 # Because most configure args are --enable-libstdcxx-foo add an alias
3379 # of that form for --enable-hosted-libstdcxx.
3380 AC_ARG_ENABLE([libstdcxx-hosted],
3381 AC_HELP_STRING([--disable-libstdcxx-hosted],
3382 [alias for --disable-hosted-libstdcxx]),
3383 [if test "$enable_hosted_libstdcxx_was_given" = yes; then
3384 if test "$enable_hosted_libstdcxx" != "$enableval"; then
3385 AC_MSG_ERROR([--enable-libstdcxx-hosted=$enableval conflicts with --enable-hosted-libstdcxx=$enable_hosted_libstdcxx])
3388 enable_hosted_libstdcxx=${enableval}
3393 if test "$enable_hosted_libstdcxx" = no; then
3394 AC_MSG_NOTICE([Only freestanding libraries will be built])
3398 enable_libstdcxx_pch=no
3399 if test "x$with_headers" = xno; then
3400 freestanding_flags="-ffreestanding"
3404 hosted_define=__STDC_HOSTED__
3406 GLIBCXX_CONDITIONAL(GLIBCXX_HOSTED, test $is_hosted = yes)
3407 AC_DEFINE_UNQUOTED(_GLIBCXX_HOSTED, $hosted_define,
3408 [Define to 1 if a full hosted library is built, or 0 if freestanding.])
3409 FREESTANDING_FLAGS="$freestanding_flags"
3410 AC_SUBST(FREESTANDING_FLAGS)
3415 dnl Check if the user wants a non-verbose library implementation.
3417 dnl --disable-libstdcxx-verbose will turn off descriptive messages to
3418 dnl standard error on termination.
3421 dnl _GLIBCXX_VERBOSE (always defined, either to 1 or 0)
3423 AC_DEFUN([GLIBCXX_ENABLE_VERBOSE], [
3424 AC_ARG_ENABLE([libstdcxx-verbose],
3425 AC_HELP_STRING([--disable-libstdcxx-verbose],
3426 [disable termination messages to standard error]),,
3427 [enable_libstdcxx_verbose=yes])
3428 if test x"$enable_libstdcxx_verbose" = xyes; then
3431 AC_MSG_NOTICE([verbose termination messages are disabled])
3434 AC_DEFINE_UNQUOTED(_GLIBCXX_VERBOSE, $verbose_define,
3435 [Define to 1 if a verbose library is built, or 0 otherwise.])
3440 dnl Check for template specializations for the 'long long' type.
3441 dnl The result determines only whether 'long long' I/O is enabled; things
3442 dnl like numeric_limits<> specializations are always available.
3444 dnl --enable-long-long defines _GLIBCXX_USE_LONG_LONG
3445 dnl --disable-long-long leaves _GLIBCXX_USE_LONG_LONG undefined
3446 dnl + Usage: GLIBCXX_ENABLE_LONG_LONG[(DEFAULT)]
3447 dnl Where DEFAULT is either `yes' or `no'.
3449 AC_DEFUN([GLIBCXX_ENABLE_LONG_LONG], [
3450 GLIBCXX_ENABLE(long-long,$1,,[enable template specializations for 'long long'])
3451 if test $enable_long_long = yes; then
3452 AC_DEFINE(_GLIBCXX_USE_LONG_LONG, 1,
3453 [Define if code specialized for long long should be used.])
3455 AC_MSG_CHECKING([for enabled long long specializations])
3456 AC_MSG_RESULT([$enable_long_long])
3461 dnl Check for decimal floating point.
3463 dnl http://gcc.gnu.org/onlinedocs/gcc/Decimal-Float.html#Decimal-Float
3465 dnl This checks to see if the host supports decimal floating point types.
3468 dnl _GLIBCXX_USE_DECIMAL_FLOAT
3470 AC_DEFUN([GLIBCXX_ENABLE_DECIMAL_FLOAT], [
3472 # Fake what AC_TRY_COMPILE does, without linking as this is
3473 # unnecessary for this test.
3475 cat > conftest.$ac_ext << EOF
3476 [#]line __oline__ "configure"
3486 AC_MSG_CHECKING([for ISO/IEC TR 24733 ])
3487 if AC_TRY_EVAL(ac_compile); then
3488 AC_DEFINE(_GLIBCXX_USE_DECIMAL_FLOAT, 1,
3489 [Define if ISO/IEC TR 24733 decimal floating point types are supported on this host.])
3494 AC_MSG_RESULT($enable_dfp)
3499 dnl Check for GNU 128-bit floating point type.
3501 dnl Note: also checks that the type isn't a standard types.
3506 AC_DEFUN([GLIBCXX_ENABLE_FLOAT128], [
3511 # Fake what AC_TRY_COMPILE does, without linking as this is
3512 # unnecessary for this test.
3514 cat > conftest.$ac_ext << EOF
3515 [#]line __oline__ "configure"
3516 template<typename T1, typename T2>
3518 { typedef T2 type; };
3520 template<typename T>
3525 typename same<double, __float128>::type f1;
3526 typename same<long double, __float128>::type f2;
3530 AC_MSG_CHECKING([for __float128])
3531 if AC_TRY_EVAL(ac_compile); then
3536 AC_MSG_RESULT($enable_float128)
3537 GLIBCXX_CONDITIONAL(ENABLE_FLOAT128, test $enable_float128 = yes)
3544 dnl Check for template specializations for the 'wchar_t' type.
3546 dnl --enable-wchar_t defines _GLIBCXX_USE_WCHAR_T
3547 dnl --disable-wchar_t leaves _GLIBCXX_USE_WCHAR_T undefined
3548 dnl + Usage: GLIBCXX_ENABLE_WCHAR_T[(DEFAULT)]
3549 dnl Where DEFAULT is either `yes' or `no'.
3551 dnl Necessary support must also be present.
3553 AC_DEFUN([GLIBCXX_ENABLE_WCHAR_T], [
3554 GLIBCXX_ENABLE(wchar_t,$1,,[enable template specializations for 'wchar_t'])
3556 # Test wchar.h for mbstate_t, which is needed for char_traits and fpos.
3557 AC_CHECK_HEADERS(wchar.h, ac_has_wchar_h=yes, ac_has_wchar_h=no)
3558 AC_MSG_CHECKING([for mbstate_t])
3559 AC_TRY_COMPILE([#include <wchar.h>],
3560 [mbstate_t teststate;],
3561 have_mbstate_t=yes, have_mbstate_t=no)
3562 AC_MSG_RESULT($have_mbstate_t)
3563 if test x"$have_mbstate_t" = xyes; then
3564 AC_DEFINE(HAVE_MBSTATE_T,1,[Define if mbstate_t exists in wchar.h.])
3567 # Test it always, for use in GLIBCXX_ENABLE_C99, together with
3569 AC_CHECK_HEADERS(wctype.h, ac_has_wctype_h=yes, ac_has_wctype_h=no)
3571 if test x"$enable_wchar_t" = x"yes"; then
3576 if test x"$ac_has_wchar_h" = xyes &&
3577 test x"$ac_has_wctype_h" = xyes; then
3578 AC_TRY_COMPILE([#include <wchar.h>
3639 ],[],[], [enable_wchar_t=no])
3647 if test x"$enable_wchar_t" = x"yes"; then
3648 AC_DEFINE(_GLIBCXX_USE_WCHAR_T, 1,
3649 [Define if code specialized for wchar_t should be used.])
3652 AC_MSG_CHECKING([for enabled wchar_t specializations])
3653 AC_MSG_RESULT([$enable_wchar_t])
3658 dnl Check to see if building and using a C++ precompiled header can be done.
3660 dnl --enable-libstdcxx-pch=yes
3661 dnl default, this shows intent to use stdc++.h.gch If it looks like it
3662 dnl may work, after some light-hearted attempts to puzzle out compiler
3663 dnl support, flip bits on in include/Makefile.am
3665 dnl --disable-libstdcxx-pch
3666 dnl turns off attempts to use or build stdc++.h.gch.
3669 dnl glibcxx_PCHFLAGS
3671 AC_DEFUN([GLIBCXX_ENABLE_PCH], [
3672 GLIBCXX_ENABLE(libstdcxx-pch,$1,,[build pre-compiled libstdc++ headers])
3673 if test $enable_libstdcxx_pch = yes; then
3674 AC_CACHE_CHECK([for compiler with PCH support],
3675 [glibcxx_cv_prog_CXX_pch],
3676 [ac_save_CXXFLAGS="$CXXFLAGS"
3677 CXXFLAGS="$CXXFLAGS -Werror -Winvalid-pch -Wno-deprecated"
3680 echo '#include <math.h>' > conftest.h
3681 if $CXX $CXXFLAGS $CPPFLAGS -x c++-header conftest.h \
3682 -o conftest.h.gch 1>&5 2>&1 &&
3683 echo '#error "pch failed"' > conftest.h &&
3684 echo '#include "conftest.h"' > conftest.cc &&
3685 $CXX -c $CXXFLAGS $CPPFLAGS conftest.cc 1>&5 2>&1 ;
3687 glibcxx_cv_prog_CXX_pch=yes
3689 glibcxx_cv_prog_CXX_pch=no
3692 CXXFLAGS=$ac_save_CXXFLAGS
3695 enable_libstdcxx_pch=$glibcxx_cv_prog_CXX_pch
3698 AC_MSG_CHECKING([for enabled PCH])
3699 AC_MSG_RESULT([$enable_libstdcxx_pch])
3701 GLIBCXX_CONDITIONAL(GLIBCXX_BUILD_PCH, test $enable_libstdcxx_pch = yes)
3702 if test $enable_libstdcxx_pch = yes; then
3703 glibcxx_PCHFLAGS="-include bits/stdc++.h"
3707 AC_SUBST(glibcxx_PCHFLAGS)
3712 dnl Check for atomic builtins.
3714 dnl http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html
3716 dnl This checks to see if the host supports the compiler-generated
3717 dnl builtins for atomic operations for various integral sizes. Note, this
3718 dnl is intended to be an all-or-nothing switch, so all the atomic operations
3719 dnl that are used should be checked.
3722 dnl libgomp and libgfortran use a link test, see CHECK_SYNC_FETCH_AND_ADD.
3724 AC_DEFUN([GLIBCXX_ENABLE_ATOMIC_BUILTINS], [
3727 old_CXXFLAGS="$CXXFLAGS"
3729 # Do link tests if possible, instead asm tests, limited to some platforms
3730 # see discussion in PR target/40134, PR libstdc++/40133 and the thread
3731 # starting at http://gcc.gnu.org/ml/gcc-patches/2009-07/msg00322.html
3732 atomic_builtins_link_tests=no
3733 if test x$gcc_no_link != xyes; then
3734 # Can do link tests. Limit to some tested platforms
3736 *-*-linux* | *-*-uclinux* | *-*-kfreebsd*-gnu | *-*-gnu*)
3737 atomic_builtins_link_tests=yes
3742 if test x$atomic_builtins_link_tests = xyes; then
3746 CXXFLAGS="$CXXFLAGS -fno-exceptions"
3748 AC_CACHE_CHECK([for atomic builtins for bool],
3749 glibcxx_cv_atomic_bool, [
3752 [typedef bool atomic_type;
3756 // N.B. __atomic_fetch_add is not supported for bool.
3757 __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3759 __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3760 __atomic_load_n(&c1, __ATOMIC_RELAXED);
3762 [glibcxx_cv_atomic_bool=yes],
3763 [glibcxx_cv_atomic_bool=no])
3766 AC_CACHE_CHECK([for atomic builtins for short],
3767 glibcxx_cv_atomic_short, [
3770 [typedef short atomic_type;
3774 __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3775 __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3777 __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3778 __atomic_load_n(&c1, __ATOMIC_RELAXED);
3780 [glibcxx_cv_atomic_short=yes],
3781 [glibcxx_cv_atomic_short=no])
3784 AC_CACHE_CHECK([for atomic builtins for int],
3785 glibcxx_cv_atomic_int, [
3788 [typedef int atomic_type;
3792 __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3793 __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3795 __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3796 __atomic_load_n(&c1, __ATOMIC_RELAXED);
3798 [glibcxx_cv_atomic_int=yes],
3799 [glibcxx_cv_atomic_int=no])
3802 AC_CACHE_CHECK([for atomic builtins for long long],
3803 glibcxx_cv_atomic_long_long, [
3806 [typedef long long atomic_type;
3810 __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3811 __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3813 __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3814 __atomic_load_n(&c1, __ATOMIC_RELAXED);
3816 [glibcxx_cv_atomic_long_long=yes],
3817 [glibcxx_cv_atomic_long_long=no])
3824 # Compile unoptimized.
3827 # Fake what AC_TRY_COMPILE does.
3829 cat > conftest.$ac_ext << EOF
3830 [#]line __oline__ "configure"
3833 typedef bool atomic_type;
3837 // N.B. __atomic_fetch_add is not supported for bool.
3838 __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3840 __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3841 __atomic_load_n(&c1, __ATOMIC_RELAXED);
3847 AC_MSG_CHECKING([for atomic builtins for bool])
3848 if AC_TRY_EVAL(ac_compile); then
3849 if grep __atomic_ conftest.s >/dev/null 2>&1 ; then
3850 glibcxx_cv_atomic_bool=no
3852 glibcxx_cv_atomic_bool=yes
3855 AC_MSG_RESULT($glibcxx_cv_atomic_bool)
3858 cat > conftest.$ac_ext << EOF
3859 [#]line __oline__ "configure"
3862 typedef short atomic_type;
3866 __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3867 __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3869 __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3870 __atomic_load_n(&c1, __ATOMIC_RELAXED);
3876 AC_MSG_CHECKING([for atomic builtins for short])
3877 if AC_TRY_EVAL(ac_compile); then
3878 if grep __atomic_ conftest.s >/dev/null 2>&1 ; then
3879 glibcxx_cv_atomic_short=no
3881 glibcxx_cv_atomic_short=yes
3884 AC_MSG_RESULT($glibcxx_cv_atomic_short)
3887 cat > conftest.$ac_ext << EOF
3888 [#]line __oline__ "configure"
3891 // NB: _Atomic_word not necessarily int.
3892 typedef int atomic_type;
3896 __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3897 __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3899 __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3900 __atomic_load_n(&c1, __ATOMIC_RELAXED);
3906 AC_MSG_CHECKING([for atomic builtins for int])
3907 if AC_TRY_EVAL(ac_compile); then
3908 if grep __atomic_ conftest.s >/dev/null 2>&1 ; then
3909 glibcxx_cv_atomic_int=no
3911 glibcxx_cv_atomic_int=yes
3914 AC_MSG_RESULT($glibcxx_cv_atomic_int)
3917 cat > conftest.$ac_ext << EOF
3918 [#]line __oline__ "configure"
3921 typedef long long atomic_type;
3925 __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3926 __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3928 __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3929 __atomic_load_n(&c1, __ATOMIC_RELAXED);
3935 AC_MSG_CHECKING([for atomic builtins for long long])
3936 if AC_TRY_EVAL(ac_compile); then
3937 if grep __atomic_ conftest.s >/dev/null 2>&1 ; then
3938 glibcxx_cv_atomic_long_long=no
3940 glibcxx_cv_atomic_long_long=yes
3943 AC_MSG_RESULT($glibcxx_cv_atomic_long_long)
3948 CXXFLAGS="$old_CXXFLAGS"
3951 # Set atomicity_dir to builtins if all but the long long test above passes,
3952 # or if the builtins were already chosen (e.g. by configure.host).
3953 if { test "$glibcxx_cv_atomic_bool" = yes \
3954 && test "$glibcxx_cv_atomic_short" = yes \
3955 && test "$glibcxx_cv_atomic_int" = yes; } \
3956 || test "$atomicity_dir" = "cpu/generic/atomicity_builtins"; then
3957 AC_DEFINE(_GLIBCXX_ATOMIC_BUILTINS, 1,
3958 [Define if the compiler supports C++11 atomics.])
3959 atomicity_dir=cpu/generic/atomicity_builtins
3962 # If still generic, set to mutex.
3963 if test $atomicity_dir = "cpu/generic" ; then
3964 atomicity_dir=cpu/generic/atomicity_mutex
3965 AC_MSG_WARN([No native atomic operations are provided for this platform.])
3966 if test "x$target_thread_file" = xsingle; then
3967 AC_MSG_WARN([They cannot be faked when thread support is disabled.])
3968 AC_MSG_WARN([Thread-safety of certain classes is not guaranteed.])
3970 AC_MSG_WARN([They will be faked using a mutex.])
3971 AC_MSG_WARN([Performance of certain classes will degrade as a result.])
3978 dnl Set default lock policy for synchronizing shared_ptr reference counting.
3980 dnl --with-libstdcxx-lock-policy=auto
3981 dnl Use atomic operations for shared_ptr reference counting only if
3982 dnl the default target supports atomic compare-and-swap.
3983 dnl --with-libstdcxx-lock-policy=atomic
3984 dnl Use atomic operations for shared_ptr reference counting.
3985 dnl --with-libstdcxx-lock-policy=mutex
3986 dnl Use a mutex to synchronize shared_ptr reference counting.
3988 dnl This controls the value of __gnu_cxx::__default_lock_policy, which
3989 dnl determines how shared_ptr reference counts are synchronized.
3990 dnl The option "atomic" means that atomic operations should be used,
3991 dnl "mutex" means that a mutex will be used. The default option, "auto",
3992 dnl will check if the target supports the compiler-generated builtins
3993 dnl for atomic compare-and-swap operations for 2-byte and 4-byte integers,
3994 dnl and will use "atomic" if supported, "mutex" otherwise.
3995 dnl This option is ignored if the thread model used by GCC is "single",
3996 dnl as no synchronization is used at all in that case.
3997 dnl This option affects the library ABI (except in the "single" thread model).
3999 dnl Defines _GLIBCXX_HAVE_ATOMIC_LOCK_POLICY to 1 if atomics should be used.
4001 AC_DEFUN([GLIBCXX_ENABLE_LOCK_POLICY], [
4003 AC_ARG_WITH([libstdcxx-lock-policy],
4004 AC_HELP_STRING([--with-libstdcxx-lock-policy={atomic,mutex,auto}],
4005 [synchronization policy for shared_ptr reference counting [default=auto]]),
4006 [libstdcxx_atomic_lock_policy=$withval],
4007 [libstdcxx_atomic_lock_policy=auto])
4009 case "$libstdcxx_atomic_lock_policy" in
4010 atomic|mutex|auto) ;;
4011 *) AC_MSG_ERROR([Invalid argument for --with-libstdcxx-lock-policy]) ;;
4013 AC_MSG_CHECKING([for lock policy for shared_ptr reference counts])
4015 if test x"$libstdcxx_atomic_lock_policy" = x"auto"; then
4018 ac_save_CXXFLAGS="$CXXFLAGS"
4020 dnl Why do we care about 2-byte CAS on targets with 4-byte _Atomic_word?!
4021 dnl Why don't we check 8-byte CAS for sparc64, where _Atomic_word is long?!
4022 dnl New targets should only check for CAS for the _Atomic_word type.
4025 # error "Defaulting to mutex-based locks for ABI compatibility"
4027 #if ! defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2
4028 # error "No 2-byte compare-and-swap"
4029 #elif ! defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
4030 # error "No 4-byte compare-and-swap"
4033 [libstdcxx_atomic_lock_policy=atomic],
4034 [libstdcxx_atomic_lock_policy=mutex])
4036 CXXFLAGS="$ac_save_CXXFLAGS"
4039 if test x"$libstdcxx_atomic_lock_policy" = x"atomic"; then
4040 AC_MSG_RESULT(atomic)
4041 AC_DEFINE(HAVE_ATOMIC_LOCK_POLICY,1,
4042 [Defined if shared_ptr reference counting should use atomic operations.])
4044 AC_MSG_RESULT(mutex)
4050 dnl Allow visibility attributes to be used on namespaces, objects, etc.
4052 dnl --enable-libstdcxx-visibility enables attempt to use visibility attributes.
4053 dnl --disable-libstdcxx-visibility turns off all use of visibility attributes.
4054 dnl + Usage: GLIBCXX_ENABLE_LIBSTDCXX_VISIBILITY[(DEFAULT)]
4055 dnl Where DEFAULT is 'yes'.
4057 AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_VISIBILITY], [
4058 GLIBCXX_ENABLE(libstdcxx-visibility,$1,,[enables visibility safe usage])
4060 if test x$enable_libstdcxx_visibility = xyes ; then
4061 dnl all hail libgfortran
4062 dnl Check whether the target supports hidden visibility.
4063 AC_CACHE_CHECK([whether the target supports hidden visibility],
4064 glibcxx_cv_have_attribute_visibility, [
4065 save_CFLAGS="$CFLAGS"
4066 CFLAGS="$CFLAGS -Werror"
4067 AC_TRY_COMPILE([void __attribute__((visibility("hidden"))) foo(void) { }],
4068 [], glibcxx_cv_have_attribute_visibility=yes,
4069 glibcxx_cv_have_attribute_visibility=no)
4070 CFLAGS="$save_CFLAGS"])
4071 if test $glibcxx_cv_have_attribute_visibility = no; then
4072 enable_libstdcxx_visibility=no
4076 GLIBCXX_CONDITIONAL(ENABLE_VISIBILITY, test $enable_libstdcxx_visibility = yes)
4077 AC_MSG_NOTICE([visibility supported: $enable_libstdcxx_visibility])
4082 dnl Add version tags to symbols in shared library (or not), additionally
4083 dnl marking other symbols as private/local (or not).
4085 dnl Sets libtool_VERSION, and determines shared library SONAME.
4087 dnl This depends on GLIBCXX CHECK_LINKER_FEATURES, but without it assumes no.
4089 dnl --enable-symvers=style adds a version script to the linker call when
4090 dnl creating the shared library. The choice of version script is
4091 dnl controlled by 'style'.
4092 dnl --disable-symvers does not.
4094 dnl + Usage: GLIBCXX_ENABLE_SYMVERS[(DEFAULT)]
4095 dnl Where DEFAULT is either 'yes' or 'no'. Passing `yes' tries to
4096 dnl choose a default style based on linker characteristics. Passing
4097 dnl 'no' disables versioning.
4099 AC_DEFUN([GLIBCXX_ENABLE_SYMVERS], [
4101 GLIBCXX_ENABLE(symvers,$1,[[[=STYLE]]],
4102 [enables symbol versioning of the shared library],
4103 [permit yes|no|gnu|gnu-versioned-namespace|darwin|darwin-export|sun])
4105 # If we never went through the GLIBCXX_CHECK_LINKER_FEATURES macro, then we
4106 # don't know enough about $LD to do tricks...
4107 AC_REQUIRE([GLIBCXX_CHECK_LINKER_FEATURES])
4108 # Sun style symbol versions needs GNU c++filt for make_sunver.pl to work
4109 # with extern "C++" in version scripts.
4110 AC_REQUIRE([GCC_PROG_GNU_CXXFILT])
4112 # Turn a 'yes' into a suitable default.
4113 if test x$enable_symvers = xyes ; then
4114 if test $enable_shared = no || test "x$LD" = x || test x$gcc_no_link = xyes; then
4117 if test $with_gnu_ld = yes ; then
4118 case ${target_os} in
4120 enable_symvers=no ;;
4122 enable_symvers=gnu ;;
4125 case ${target_os} in
4127 enable_symvers=darwin ;;
4128 # Sun symbol versioning exists since Solaris 2.5.
4129 solaris2.[[5-9]]* | solaris2.1[[0-9]]*)
4130 # make_sunver.pl needs GNU c++filt to support extern "C++" in
4131 # version scripts, so disable symbol versioning if none can be
4133 if test -z "$ac_cv_path_CXXFILT"; then
4134 AC_MSG_WARN([=== You have requested Sun symbol versioning, but])
4135 AC_MSG_WARN([=== no GNU c++filt could be found.])
4136 AC_MSG_WARN([=== Symbol versioning will be disabled.])
4143 enable_symvers=no ;;
4149 # Check to see if 'darwin' or 'darwin-export' can win.
4150 if test x$enable_symvers = xdarwin-export ; then
4151 enable_symvers=darwin
4154 # Check if 'sun' was requested on non-Solaris 2 platforms.
4155 if test x$enable_symvers = xsun ; then
4156 case ${target_os} in
4162 AC_MSG_WARN([=== You have requested Sun symbol versioning, but])
4163 AC_MSG_WARN([=== you are not targetting Solaris 2.])
4164 AC_MSG_WARN([=== Symbol versioning will be disabled.])
4170 # Check to see if 'gnu' can win.
4171 if test $enable_symvers = gnu ||
4172 test $enable_symvers = gnu-versioned-namespace ||
4173 test $enable_symvers = sun; then
4174 # Check to see if libgcc_s exists, indicating that shared libgcc is possible.
4175 AC_MSG_CHECKING([for shared libgcc])
4176 ac_save_CFLAGS="$CFLAGS"
4178 AC_TRY_LINK(, [return 0;], glibcxx_shared_libgcc=yes, glibcxx_shared_libgcc=no)
4179 CFLAGS="$ac_save_CFLAGS"
4180 if test $glibcxx_shared_libgcc = no; then
4181 cat > conftest.c <<EOF
4182 int main (void) { return 0; }
4185 glibcxx_libgcc_s_suffix=`${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \
4186 -shared -shared-libgcc -o conftest.so \
4187 conftest.c -v 2>&1 >/dev/null \
4188 | sed -n 's/^.* -lgcc_s\([^ ]*\) .*$/\1/p'`
4190 rm -f conftest.c conftest.so
4191 if test x${glibcxx_libgcc_s_suffix+set} = xset; then
4192 CFLAGS=" -lgcc_s$glibcxx_libgcc_s_suffix"
4193 AC_TRY_LINK(, [return 0;], glibcxx_shared_libgcc=yes)
4194 CFLAGS="$ac_save_CFLAGS"
4197 AC_MSG_RESULT($glibcxx_shared_libgcc)
4199 # For GNU ld, we need at least this version. The format is described in
4200 # GLIBCXX_CHECK_LINKER_FEATURES above.
4201 glibcxx_min_gnu_ld_version=21400
4203 # If no shared libgcc, can't win.
4204 if test $glibcxx_shared_libgcc != yes; then
4205 AC_MSG_WARN([=== You have requested GNU symbol versioning, but])
4206 AC_MSG_WARN([=== you are not building a shared libgcc_s.])
4207 AC_MSG_WARN([=== Symbol versioning will be disabled.])
4209 elif test $with_gnu_ld != yes && test $enable_symvers = sun; then
4210 : All interesting versions of Sun ld support sun style symbol versioning.
4211 elif test $with_gnu_ld != yes ; then
4213 AC_MSG_WARN([=== You have requested GNU symbol versioning, but])
4214 AC_MSG_WARN([=== you are not using the GNU linker.])
4215 AC_MSG_WARN([=== Symbol versioning will be disabled.])
4217 elif test $glibcxx_ld_is_gold = yes ; then
4218 : All versions of gold support symbol versioning.
4219 elif test $glibcxx_ld_is_mold = yes ; then
4220 : All versions of mold support symbol versioning.
4221 elif test $glibcxx_gnu_ld_version -lt $glibcxx_min_gnu_ld_version ; then
4222 # The right tools, the right setup, but too old. Fallbacks?
4223 AC_MSG_WARN(=== Linker version $glibcxx_gnu_ld_version is too old for)
4224 AC_MSG_WARN(=== full symbol versioning support in this release of GCC.)
4225 AC_MSG_WARN(=== You would need to upgrade your binutils to version)
4226 AC_MSG_WARN(=== $glibcxx_min_gnu_ld_version or later and rebuild GCC.)
4227 AC_MSG_WARN([=== Symbol versioning will be disabled.])
4232 # For libtool versioning info, format is CURRENT:REVISION:AGE
4233 libtool_VERSION=6:33:0
4235 # Everything parsed; figure out what files and settings to use.
4236 case $enable_symvers in
4238 SYMVER_FILE=config/abi/pre/none.ver
4241 SYMVER_FILE=config/abi/pre/gnu.ver
4242 AC_DEFINE(_GLIBCXX_SYMVER_GNU, 1,
4243 [Define to use GNU versioning in the shared library.])
4245 gnu-versioned-namespace)
4246 libtool_VERSION=8:0:0
4247 SYMVER_FILE=config/abi/pre/gnu-versioned-namespace.ver
4248 AC_DEFINE(_GLIBCXX_SYMVER_GNU_NAMESPACE, 1,
4249 [Define to use GNU namespace versioning in the shared library.])
4252 SYMVER_FILE=config/abi/pre/gnu.ver
4253 AC_DEFINE(_GLIBCXX_SYMVER_DARWIN, 1,
4254 [Define to use darwin versioning in the shared library.])
4257 SYMVER_FILE=config/abi/pre/gnu.ver
4258 AC_DEFINE(_GLIBCXX_SYMVER_SUN, 1,
4259 [Define to use Sun versioning in the shared library.])
4263 if test x$enable_symvers != xno ; then
4264 AC_DEFINE(_GLIBCXX_SYMVER, 1,
4265 [Define to use symbol versioning in the shared library.])
4268 AC_CACHE_CHECK([whether the target supports .symver directive],
4269 glibcxx_cv_have_as_symver_directive, [
4270 AC_TRY_COMPILE([void foo (void); __asm (".symver foo, bar@SYMVER");],
4271 [], glibcxx_cv_have_as_symver_directive=yes,
4272 glibcxx_cv_have_as_symver_directive=no)])
4273 if test $glibcxx_cv_have_as_symver_directive = yes; then
4274 AC_DEFINE(HAVE_AS_SYMVER_DIRECTIVE, 1,
4275 [Define to 1 if the target assembler supports .symver directive.])
4278 AC_SUBST(SYMVER_FILE)
4279 AC_SUBST(port_specific_symbol_files)
4280 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS, test $enable_symvers != no)
4281 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_GNU, test $enable_symvers = gnu)
4282 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_GNU_NAMESPACE, test $enable_symvers = gnu-versioned-namespace)
4283 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_DARWIN, test $enable_symvers = darwin)
4284 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_SUN, test $enable_symvers = sun)
4285 AC_MSG_NOTICE(versioning on shared library symbols is $enable_symvers)
4287 if test $enable_symvers != no ; then
4288 case ${target_os} in
4289 # The Solaris 2 runtime linker doesn't support the GNU extension of
4290 # binding the same symbol to different versions
4293 # Other platforms with GNU symbol versioning (GNU/Linux, more?) do.
4295 AC_DEFINE(HAVE_SYMVER_SYMBOL_RENAMING_RUNTIME_SUPPORT, 1,
4296 [Define to 1 if the target runtime linker supports binding the same symbol to different versions.])
4301 # Now, set up compatibility support, if any.
4302 # In addition, need this to deal with std::size_t mangling in
4303 # src/compatibility.cc. In a perfect world, could use
4304 # typeid(std::size_t).name()[0] to do direct substitution.
4305 AC_MSG_CHECKING([for size_t as unsigned int])
4306 ac_save_CFLAGS="$CFLAGS"
4308 AC_TRY_COMPILE(, [__SIZE_TYPE__* stp; unsigned int* uip; stp = uip;],
4309 [glibcxx_size_t_is_i=yes], [glibcxx_size_t_is_i=no])
4310 CFLAGS=$ac_save_CFLAGS
4311 if test "$glibcxx_size_t_is_i" = yes; then
4312 AC_DEFINE(_GLIBCXX_SIZE_T_IS_UINT, 1, [Define if size_t is unsigned int.])
4314 AC_MSG_RESULT([$glibcxx_size_t_is_i])
4316 AC_MSG_CHECKING([for ptrdiff_t as int])
4317 ac_save_CFLAGS="$CFLAGS"
4319 AC_TRY_COMPILE(, [__PTRDIFF_TYPE__* ptp; int* ip; ptp = ip;],
4320 [glibcxx_ptrdiff_t_is_i=yes], [glibcxx_ptrdiff_t_is_i=no])
4321 CFLAGS=$ac_save_CFLAGS
4322 if test "$glibcxx_ptrdiff_t_is_i" = yes; then
4323 AC_DEFINE(_GLIBCXX_PTRDIFF_T_IS_INT, 1, [Define if ptrdiff_t is int.])
4325 AC_MSG_RESULT([$glibcxx_ptrdiff_t_is_i])
4330 dnl Setup to use the gcc gthr.h thread-specific memory and mutex model.
4331 dnl We must stage the required headers so that they will be installed
4332 dnl with the library (unlike libgcc, the STL implementation is provided
4333 dnl solely within headers). Since we must not inject random user-space
4334 dnl macro names into user-provided C++ code, we first stage into <file>-in
4335 dnl and process to <file> with an output command. The reason for a two-
4336 dnl stage process here is to correctly handle $srcdir!=$objdir without
4337 dnl having to write complex code (the sed commands to clean the macro
4338 dnl namespace are complex and fragile enough as it is). We must also
4339 dnl add a relative path so that -I- is supported properly.
4344 AC_DEFUN([GLIBCXX_ENABLE_THREADS], [
4345 AC_MSG_CHECKING([for thread model used by GCC])
4346 target_thread_file=`$CXX -v 2>&1 | sed -n 's/^Thread model: //p'`
4347 AC_MSG_RESULT([$target_thread_file])
4348 GCC_AC_THREAD_HEADER([$target_thread_file])
4353 dnl Check if gthread implementation defines the types and functions
4354 dnl required by the c++0x thread library. Conforming gthread
4355 dnl implementations can define __GTHREADS_CXX0X to enable use with c++0x.
4357 dnl GLIBCXX_ENABLE_SYMVERS must be done before this.
4359 AC_DEFUN([GLIBCXX_CHECK_GTHREADS], [
4360 GLIBCXX_ENABLE(libstdcxx-threads,auto,,[enable C++11 threads support])
4362 if test x$enable_libstdcxx_threads = xauto ||
4363 test x$enable_libstdcxx_threads = xyes; then
4368 ac_save_CXXFLAGS="$CXXFLAGS"
4369 CXXFLAGS="$CXXFLAGS -fno-exceptions \
4370 -I${toplevel_srcdir}/libgcc -I${toplevel_builddir}/libgcc"
4372 target_thread_file=`$CXX -v 2>&1 | sed -n 's/^Thread model: //p'`
4373 case $target_thread_file in
4375 CXXFLAGS="$CXXFLAGS -DSUPPORTS_WEAK -DGTHREAD_USE_WEAK -D_PTHREADS"
4378 CXXFLAGS="$CXXFLAGS -D_WIN32_THREADS"
4379 # The support of condition variables is disabled by default in
4380 # the Win32 gthreads library, so enable it on explicit request.
4381 if test x$enable_libstdcxx_threads = xyes; then
4382 CXXFLAGS="$CXXFLAGS -D_WIN32_WINNT=0x0600"
4387 AC_MSG_CHECKING([whether it can be safely assumed that mutex_timedlock is available])
4389 AC_TRY_COMPILE([#include <unistd.h>],
4391 // In case of POSIX threads check _POSIX_TIMEOUTS.
4392 #if (defined(_PTHREADS) \
4393 && (!defined(_POSIX_TIMEOUTS) || _POSIX_TIMEOUTS <= 0))
4395 // In case of Win32 threads there is no support.
4396 #elif defined(_WIN32_THREADS)
4399 ], [ac_gthread_use_mutex_timedlock=1], [ac_gthread_use_mutex_timedlock=0])
4401 AC_DEFINE_UNQUOTED(_GTHREAD_USE_MUTEX_TIMEDLOCK, $ac_gthread_use_mutex_timedlock,
4402 [Define to 1 if mutex_timedlock is available.])
4404 if test $ac_gthread_use_mutex_timedlock = 1 ; then res_mutex_timedlock=yes ;
4405 else res_mutex_timedlock=no ; fi
4406 AC_MSG_RESULT([$res_mutex_timedlock])
4408 AC_MSG_CHECKING([for gthreads library])
4410 AC_TRY_COMPILE([#include "gthr.h"],
4412 #ifndef __GTHREADS_CXX0X
4415 ], [ac_has_gthreads=yes], [ac_has_gthreads=no])
4420 AC_MSG_RESULT([$ac_has_gthreads])
4422 if test x"$ac_has_gthreads" = x"yes"; then
4423 AC_DEFINE(_GLIBCXX_HAS_GTHREADS, 1,
4424 [Define if gthreads library is available.])
4426 # Also check for pthread_rwlock_t for std::shared_timed_mutex in C++14
4427 # but only do so if we're using pthread in the gthread library.
4428 # On VxWorks for example, pthread_rwlock_t is defined in sys/types.h
4429 # but the pthread library is not there by default and the gthread library
4431 AC_TRY_COMPILE([#include "gthr.h"],
4433 #if (!defined(_PTHREADS))
4436 ], [ac_gthread_use_pthreads=yes], [ac_gthread_use_pthreads=no])
4437 if test x"$ac_gthread_use_pthreads" = x"yes"; then
4438 AC_CHECK_TYPE([pthread_rwlock_t],
4439 [AC_DEFINE([_GLIBCXX_USE_PTHREAD_RWLOCK_T], 1,
4440 [Define if POSIX read/write locks are available in <gthr.h>.])],
4442 [#include "gthr.h"])
4445 # See above for the rationale.
4446 if test $target_thread_file = win32; then
4447 CPPFLAGS="$CPPFLAGS -D_WIN32_WINNT=0x0600"
4451 AC_CHECK_HEADER(semaphore.h, [
4452 AC_MSG_CHECKING([for POSIX Semaphores and sem_timedwait])
4455 #include <semaphore.h>
4459 #if !defined _POSIX_TIMEOUTS || _POSIX_TIMEOUTS <= 0
4460 # error "POSIX Timeouts option not supported"
4461 #elif !defined _POSIX_SEMAPHORES || _POSIX_SEMAPHORES <= 0
4462 # error "POSIX Semaphores option not supported"
4464 #if defined SEM_VALUE_MAX
4465 constexpr int sem_value_max = SEM_VALUE_MAX;
4466 #elif defined _POSIX_SEM_VALUE_MAX
4467 constexpr int sem_value_max = _POSIX_SEM_VALUE_MAX;
4469 # error "SEM_VALUE_MAX not available"
4472 sem_init(&sem, 0, sem_value_max);
4473 struct timespec ts = { 0 };
4474 sem_timedwait(&sem, &ts);
4477 [ac_have_posix_semaphore=yes],
4478 [ac_have_posix_semaphore=no])],
4479 [ac_have_posix_semaphore=no])
4481 if test $ac_have_posix_semaphore = yes ; then
4482 AC_DEFINE(HAVE_POSIX_SEMAPHORE,
4484 [Define to 1 if POSIX Semaphores with sem_timedwait are available in <semaphore.h>.])
4486 AC_MSG_RESULT([$ac_have_posix_semaphore])
4488 CXXFLAGS="$ac_save_CXXFLAGS"
4493 # Check whether LC_MESSAGES is available in <locale.h>.
4494 # Ulrich Drepper <drepper@cygnus.com>, 1995.
4496 # This file file be copied and used freely without restrictions. It can
4497 # be used in projects which are not available under the GNU Public License
4498 # but which still want to provide support for the GNU gettext functionality.
4499 # Please note that the actual code is *not* freely available.
4500 AC_DEFUN([AC_LC_MESSAGES], [
4501 AC_CHECK_HEADER(locale.h, [
4502 AC_CACHE_CHECK([for LC_MESSAGES], ac_cv_val_LC_MESSAGES,
4503 [AC_TRY_COMPILE([#include <locale.h>], [return LC_MESSAGES],
4504 ac_cv_val_LC_MESSAGES=yes, ac_cv_val_LC_MESSAGES=no)])
4505 if test $ac_cv_val_LC_MESSAGES = yes; then
4506 AC_DEFINE(HAVE_LC_MESSAGES, 1,
4507 [Define if LC_MESSAGES is available in <locale.h>.])
4513 dnl Check whether rdrand is supported in the assembler.
4514 AC_DEFUN([GLIBCXX_CHECK_X86_RDRAND], [
4515 AC_CACHE_CHECK([for rdrand support in assembler],
4521 AC_TRY_COMPILE(, [asm("rdrand %eax");],
4522 [ac_cv_x86_rdrand=yes], [ac_cv_x86_rdrand=no])
4525 if test $ac_cv_x86_rdrand = yes; then
4526 AC_DEFINE(_GLIBCXX_X86_RDRAND, 1,
4527 [ Defined if as can handle rdrand. ])
4532 dnl Check whether rdseed is supported in the assembler.
4533 AC_DEFUN([GLIBCXX_CHECK_X86_RDSEED], [
4534 AC_CACHE_CHECK([for rdseed support in assembler],
4540 AC_TRY_COMPILE(, [asm("rdseed %eax");],
4541 [ac_cv_x86_rdseed=yes], [ac_cv_x86_rdseed=no])
4544 if test $ac_cv_x86_rdseed = yes; then
4545 AC_DEFINE(_GLIBCXX_X86_RDSEED, 1,
4546 [ Defined if as can handle rdseed. ])
4551 dnl Check whether get_nprocs is available in <sys/sysinfo.h>, and define _GLIBCXX_USE_GET_NPROCS.
4553 AC_DEFUN([GLIBCXX_CHECK_GET_NPROCS], [
4557 ac_save_CXXFLAGS="$CXXFLAGS"
4558 CXXFLAGS="$CXXFLAGS -fno-exceptions"
4560 AC_CACHE_CHECK([for get_nprocs],
4561 glibcxx_cv_GET_NPROCS, [
4562 GCC_TRY_COMPILE_OR_LINK(
4563 [#include <sys/sysinfo.h>],
4564 [int n = get_nprocs();],
4565 [glibcxx_cv_GET_NPROCS=yes],
4566 [glibcxx_cv_GET_NPROCS=no])
4568 if test $glibcxx_cv_GET_NPROCS = yes; then
4569 AC_DEFINE(_GLIBCXX_USE_GET_NPROCS, 1, [Define if get_nprocs is available in <sys/sysinfo.h>.])
4572 CXXFLAGS="$ac_save_CXXFLAGS"
4577 dnl Check whether sysconf(_SC_NPROCESSORS_ONLN) is available in <unistd.h>, and define _GLIBCXX_USE_SC_NPROCESSORS_ONLN.
4579 AC_DEFUN([GLIBCXX_CHECK_SC_NPROCESSORS_ONLN], [
4583 ac_save_CXXFLAGS="$CXXFLAGS"
4584 CXXFLAGS="$CXXFLAGS -fno-exceptions"
4586 AC_CACHE_CHECK([for _SC_NPROCESSORS_ONLN],
4587 glibcxx_cv_SC_NPROCESSORS_ONLN, [
4588 GCC_TRY_COMPILE_OR_LINK(
4589 [#include <unistd.h>],
4590 [int n = sysconf(_SC_NPROCESSORS_ONLN);],
4591 [glibcxx_cv_SC_NPROCESSORS_ONLN=yes],
4592 [glibcxx_cv_SC_NPROCESSORS_ONLN=no])
4594 if test $glibcxx_cv_SC_NPROCESSORS_ONLN = yes; then
4595 AC_DEFINE(_GLIBCXX_USE_SC_NPROCESSORS_ONLN, 1, [Define if _SC_NPROCESSORS_ONLN is available in <unistd.h>.])
4598 CXXFLAGS="$ac_save_CXXFLAGS"
4603 dnl Check whether sysconf(_SC_NPROC_ONLN) is available in <unistd.h>, and define _GLIBCXX_USE_SC_NPROC_ONLN.
4605 AC_DEFUN([GLIBCXX_CHECK_SC_NPROC_ONLN], [
4609 ac_save_CXXFLAGS="$CXXFLAGS"
4610 CXXFLAGS="$CXXFLAGS -fno-exceptions"
4612 AC_CACHE_CHECK([for _SC_NPROC_ONLN],
4613 glibcxx_cv_SC_NPROC_ONLN, [
4614 GCC_TRY_COMPILE_OR_LINK(
4615 [#include <unistd.h>],
4616 [int n = sysconf(_SC_NPROC_ONLN);],
4617 [glibcxx_cv_SC_NPROC_ONLN=yes],
4618 [glibcxx_cv_SC_NPROC_ONLN=no])
4620 if test $glibcxx_cv_SC_NPROC_ONLN = yes; then
4621 AC_DEFINE(_GLIBCXX_USE_SC_NPROC_ONLN, 1, [Define if _SC_NPROC_ONLN is available in <unistd.h>.])
4624 CXXFLAGS="$ac_save_CXXFLAGS"
4629 dnl Check whether pthread_num_processors_np is available in <pthread.h>, and define _GLIBCXX_USE_PTHREADS_NUM_PROCESSORS_NP.
4631 AC_DEFUN([GLIBCXX_CHECK_PTHREADS_NUM_PROCESSORS_NP], [
4635 ac_save_CXXFLAGS="$CXXFLAGS"
4636 CXXFLAGS="$CXXFLAGS -fno-exceptions"
4638 AC_CACHE_CHECK([for pthreads_num_processors_np],
4639 glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP, [
4640 GCC_TRY_COMPILE_OR_LINK(
4641 [#include <pthread.h>],
4642 [int n = pthread_num_processors_np();],
4643 [glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP=yes],
4644 [glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP=no])
4646 if test $glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP = yes; then
4647 AC_DEFINE(_GLIBCXX_USE_PTHREADS_NUM_PROCESSORS_NP, 1, [Define if pthreads_num_processors_np is available in <pthread.h>.])
4650 CXXFLAGS="$ac_save_CXXFLAGS"
4655 dnl Check whether pthread_cond_clockwait is available in <pthread.h> for std::condition_variable to use,
4656 dnl and define _GLIBCXX_USE_PTHREAD_COND_CLOCKWAIT.
4658 AC_DEFUN([GLIBCXX_CHECK_PTHREAD_COND_CLOCKWAIT], [
4662 ac_save_CXXFLAGS="$CXXFLAGS"
4663 CXXFLAGS="$CXXFLAGS -fno-exceptions"
4664 ac_save_LIBS="$LIBS"
4665 LIBS="$LIBS -lpthread"
4667 AC_CACHE_CHECK([for pthread_cond_clockwait],
4668 glibcxx_cv_PTHREAD_COND_CLOCKWAIT, [
4669 GCC_TRY_COMPILE_OR_LINK(
4670 [#include <pthread.h>],
4671 [pthread_mutex_t mutex; pthread_cond_t cond; struct timespec ts; int n = pthread_cond_clockwait(&cond, &mutex, 0, &ts);],
4672 [glibcxx_cv_PTHREAD_COND_CLOCKWAIT=yes],
4673 [glibcxx_cv_PTHREAD_COND_CLOCKWAIT=no])
4675 if test $glibcxx_cv_PTHREAD_COND_CLOCKWAIT = yes; then
4676 AC_DEFINE(_GLIBCXX_USE_PTHREAD_COND_CLOCKWAIT, 1, [Define if pthread_cond_clockwait is available in <pthread.h>.])
4679 CXXFLAGS="$ac_save_CXXFLAGS"
4680 LIBS="$ac_save_LIBS"
4685 dnl Check whether pthread_mutex_clocklock is available in <pthread.h> for std::timed_mutex to use,
4686 dnl and define _GLIBCXX_USE_PTHREAD_MUTEX_CLOCKLOCK.
4688 AC_DEFUN([GLIBCXX_CHECK_PTHREAD_MUTEX_CLOCKLOCK], [
4692 ac_save_CXXFLAGS="$CXXFLAGS"
4693 CXXFLAGS="$CXXFLAGS -fno-exceptions"
4694 ac_save_LIBS="$LIBS"
4695 LIBS="$LIBS -lpthread"
4697 AC_CACHE_CHECK([for pthread_mutex_clocklock],
4698 glibcxx_cv_PTHREAD_MUTEX_CLOCKLOCK, [
4699 GCC_TRY_COMPILE_OR_LINK(
4700 [#include <pthread.h>],
4701 [pthread_mutex_t mutex; struct timespec ts; int n = pthread_mutex_clocklock(&mutex, CLOCK_REALTIME, &ts);],
4702 [glibcxx_cv_PTHREAD_MUTEX_CLOCKLOCK=yes],
4703 [glibcxx_cv_PTHREAD_MUTEX_CLOCKLOCK=no])
4705 if test $glibcxx_cv_PTHREAD_MUTEX_CLOCKLOCK = yes; then
4706 AC_DEFINE(_GLIBCXX_USE_PTHREAD_MUTEX_CLOCKLOCK, (_GLIBCXX_TSAN==0), [Define if pthread_mutex_clocklock is available in <pthread.h>.])
4709 CXXFLAGS="$ac_save_CXXFLAGS"
4710 LIBS="$ac_save_LIBS"
4715 dnl Check whether pthread_mutex_clocklock is available in <pthread.h> for std::timed_mutex to use,
4716 dnl and define _GLIBCXX_USE_PTHREAD_MUTEX_CLOCKLOCK.
4718 AC_DEFUN([GLIBCXX_CHECK_PTHREAD_RWLOCK_CLOCKLOCK], [
4722 ac_save_CXXFLAGS="$CXXFLAGS"
4723 CXXFLAGS="$CXXFLAGS -fno-exceptions"
4724 ac_save_LIBS="$LIBS"
4725 LIBS="$LIBS -lpthread"
4727 AC_CACHE_CHECK([for pthread_rwlock_clockrdlock, pthread_wlock_clockwrlock],
4728 glibcxx_cv_PTHREAD_RWLOCK_CLOCKLOCK, [
4729 GCC_TRY_COMPILE_OR_LINK(
4730 [#include <pthread.h>],
4731 [pthread_rwlock_t rwl; struct timespec ts;]
4732 [int n = pthread_rwlock_clockrdlock(&rwl, CLOCK_REALTIME, &ts);]
4733 [int m = pthread_rwlock_clockwrlock(&rwl, CLOCK_REALTIME, &ts);],
4734 [glibcxx_cv_PTHREAD_RWLOCK_CLOCKLOCK=yes],
4735 [glibcxx_cv_PTHREAD_RWLOCK_CLOCKLOCK=no])
4737 if test $glibcxx_cv_PTHREAD_RWLOCK_CLOCKLOCK = yes; then
4738 AC_DEFINE(_GLIBCXX_USE_PTHREAD_RWLOCK_CLOCKLOCK, 1, [Define if pthread_rwlock_clockrdlock and pthread_rwlock_clockwrlock are available in <pthread.h>.])
4741 CXXFLAGS="$ac_save_CXXFLAGS"
4742 LIBS="$ac_save_LIBS"
4747 dnl Check whether sysctl is available in <pthread.h>, and define _GLIBCXX_USE_SYSCTL_HW_NCPU.
4749 AC_DEFUN([GLIBCXX_CHECK_SYSCTL_HW_NCPU], [
4753 ac_save_CXXFLAGS="$CXXFLAGS"
4754 CXXFLAGS="$CXXFLAGS -fno-exceptions"
4756 AC_CACHE_CHECK([for hw.ncpu sysctl],
4757 glibcxx_cv_SYSCTL_HW_NCPU, [
4758 GCC_TRY_COMPILE_OR_LINK(
4761 #include <sys/sysctl.h>
4765 size_t size = sizeof(count);
4766 int mib[] = { CTL_HW, HW_NCPU };
4767 sysctl(mib, 2, &count, &size, NULL, 0);
4769 [glibcxx_cv_SYSCTL_HW_NCPU=yes],
4770 [glibcxx_cv_SYSCTL_HW_NCPU=no])
4772 if test $glibcxx_cv_SYSCTL_HW_NCPU = yes; then
4773 AC_DEFINE(_GLIBCXX_USE_SYSCTL_HW_NCPU, 1, [Define if sysctl(), CTL_HW and HW_NCPU are available in <sys/sysctl.h>.])
4776 CXXFLAGS="$ac_save_CXXFLAGS"
4781 dnl Check to see if python pretty printing can be activated.
4783 dnl --with-python-dir=dir
4784 dnl installs directory into $prefix/dir
4785 AC_DEFUN([GLIBCXX_ENABLE_PYTHON], [
4787 AC_MSG_CHECKING([for custom python install directory])
4788 AC_ARG_WITH([python-dir],
4789 AS_HELP_STRING([--with-python-dir],
4790 [the location to install Python modules. This path is relative starting from the prefix.]),
4791 [with_python_dir=$withval], [with_python_dir="no"])
4792 AC_MSG_RESULT(${with_python_dir})
4794 # Needed for installing Python modules during make install.
4795 python_mod_dir="${with_python_dir}"
4796 AC_SUBST(python_mod_dir)
4797 GLIBCXX_CONDITIONAL(ENABLE_PYTHONDIR, test $python_mod_dir != no)
4801 dnl Check to see if -Werror is disabled.
4803 dnl --enable-werror/--disable-werror
4804 AC_DEFUN([GLIBCXX_ENABLE_WERROR], [
4805 AC_MSG_CHECKING([for -Werror])
4806 GLIBCXX_ENABLE(werror,$1,,[turns on -Werror])
4807 AC_MSG_RESULT($enable_werror)
4808 GLIBCXX_CONDITIONAL(ENABLE_WERROR, test $enable_werror = yes)
4812 dnl Check whether obsolescent tmpnam is available in <stdio.h>,
4813 dnl and define _GLIBCXX_USE_TMPNAM.
4815 AC_DEFUN([GLIBCXX_CHECK_TMPNAM], [dnl
4819 ac_save_CXXFLAGS="$CXXFLAGS"
4820 CXXFLAGS="$CXXFLAGS -fno-exceptions"
4822 AC_CACHE_CHECK([for tmpnam], glibcxx_cv_TMPNAM, [dnl
4823 GCC_TRY_COMPILE_OR_LINK(
4824 [#include <stdio.h>],
4825 [char *tmp = tmpnam(NULL);],
4826 [glibcxx_cv_TMPNAM=yes],
4827 [glibcxx_cv_TMPNAM=no])
4829 if test $glibcxx_cv_TMPNAM = yes; then
4830 AC_DEFINE(_GLIBCXX_USE_TMPNAM, 1, [Define if obsolescent tmpnam is available in <stdio.h>.])
4833 CXXFLAGS="$ac_save_CXXFLAGS"
4838 dnl Check to see if sys/sdt.h exists and that it is suitable for use.
4839 dnl Some versions of sdt.h were not compatible with C++11.
4841 AC_DEFUN([GLIBCXX_CHECK_SDT_H], [
4842 # Note that this test has to be run with the C language.
4843 # Otherwise, sdt.h will try to include some headers from
4847 AC_CACHE_CHECK([for suitable sys/sdt.h],
4848 glibcxx_cv_sys_sdt_h, [
4849 # Because we have to run the test in C, we use grep rather
4850 # than the compiler to check for the bug. The bug is that
4851 # were strings without trailing whitespace, causing g++
4852 # to look for operator"". The pattern searches for the fixed
4854 AC_EGREP_CPP([ \",\" ], [
4855 #include <sys/sdt.h>
4856 int f() { STAP_PROBE(hi, bob); }
4857 ], [glibcxx_cv_sys_sdt_h=yes], [glibcxx_cv_sys_sdt_h=no])
4860 if test $glibcxx_cv_sys_sdt_h = yes; then
4861 AC_DEFINE(HAVE_SYS_SDT_H, 1,
4862 [Define to 1 if you have a suitable <sys/sdt.h> header file])
4867 dnl Control whether the library should define symbols for old and new ABIs.
4868 dnl This affects definitions of strings, stringstreams and locale facets.
4870 dnl --disable-libstdcxx-dual-abi will use old ABI for all types.
4873 dnl _GLIBCXX_USE_DUAL_ABI (always defined, either to 1 or 0)
4875 AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_DUAL_ABI], [
4876 GLIBCXX_ENABLE(libstdcxx-dual-abi,$1,,[support two versions of std::string])
4877 if test x$enable_symvers = xgnu-versioned-namespace; then
4878 # gnu-versioned-namespace is incompatible with the dual ABI.
4879 enable_libstdcxx_dual_abi="no"
4881 if test x"$enable_libstdcxx_dual_abi" != xyes; then
4882 AC_MSG_NOTICE([dual ABI is disabled])
4883 default_libstdcxx_abi="gcc4-compatible"
4885 GLIBCXX_CONDITIONAL(ENABLE_DUAL_ABI, test $enable_libstdcxx_dual_abi = yes)
4889 dnl Check to see which ABI should be enabled by default.
4891 dnl --with-default-libstdcxx-abi={gcc4-compatible,new}
4894 dnl _GLIBCXX_USE_CXX11_ABI (always defined, either to 1 or 0)
4896 AC_DEFUN([GLIBCXX_DEFAULT_ABI], [
4897 if test x$enable_libstdcxx_dual_abi = xyes; then
4898 AC_MSG_CHECKING([for default std::string ABI to use])
4899 AC_ARG_WITH([default-libstdcxx-abi],
4900 AS_HELP_STRING([--with-default-libstdcxx-abi],
4901 [set the std::string ABI to use by default]),
4903 gcc4-compatible) default_libstdcxx_abi="gcc4-compatible" ;;
4904 new|cxx11) default_libstdcxx_abi="new" ;;
4905 c++*|gnu++*) AC_MSG_ERROR([Supported arguments for --with-default-libstdcxx-abi have changed, use "new" or "gcc4-compatible"]) ;;
4906 *) AC_MSG_ERROR([Invalid argument for --with-default-libstdcxx-abi]) ;;
4909 [default_libstdcxx_abi="new"])
4910 AC_MSG_RESULT(${default_libstdcxx_abi})
4912 if test $default_libstdcxx_abi = "new"; then
4919 AC_SUBST(glibcxx_cxx98_abi)
4920 GLIBCXX_CONDITIONAL(ENABLE_CXX11_ABI, test $glibcxx_cxx11_abi = 1)
4924 dnl Check to see whether to build libstdc++fs.a
4926 dnl --enable-libstdcxx-filesystem-ts
4928 AC_DEFUN([GLIBCXX_ENABLE_FILESYSTEM_TS], [
4929 GLIBCXX_ENABLE(libstdcxx-filesystem-ts,auto,,
4930 [turns on ISO/IEC TS 18822 support],
4931 [permit yes|no|auto])
4933 AC_MSG_CHECKING([whether to build Filesystem TS support])
4934 if test x"$ac_cv_header_dirent_h" != x"yes"; then
4935 enable_libstdcxx_filesystem_ts=no
4937 if test x"$enable_libstdcxx_filesystem_ts" = x"auto"; then
4938 case "${target_os}" in
4939 freebsd*|netbsd*|openbsd*|dragonfly*|darwin*)
4940 enable_libstdcxx_filesystem_ts=yes
4942 gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
4943 enable_libstdcxx_filesystem_ts=yes
4946 enable_libstdcxx_filesystem_ts=yes
4949 enable_libstdcxx_filesystem_ts=yes
4952 enable_libstdcxx_filesystem_ts=yes
4955 enable_libstdcxx_filesystem_ts=no
4959 AC_MSG_RESULT($enable_libstdcxx_filesystem_ts)
4960 GLIBCXX_CONDITIONAL(ENABLE_FILESYSTEM_TS, test $enable_libstdcxx_filesystem_ts = yes)
4964 dnl Check whether the library calls required by the C++17 Filesystem library
4965 dnl and the Filesystem TS are present.
4967 dnl HAVE_STRUCT_DIRENT_D_TYPE
4968 dnl _GLIBCXX_USE_REALPATH
4969 dnl _GLIBCXX_USE_UTIMENSAT
4970 dnl _GLIBCXX_USE_ST_MTIM
4971 dnl _GLIBCXX_USE_FCHMOD
4972 dnl _GLIBCXX_USE_FCHMODAT
4973 dnl _GLIBCXX_USE_COPY_FILE_RANGE
4974 dnl _GLIBCXX_USE_SENDFILE
4980 AC_DEFUN([GLIBCXX_CHECK_FILESYSTEM_DEPS], [dnl
4984 ac_save_CXXFLAGS="$CXXFLAGS"
4985 CXXFLAGS="$CXXFLAGS -fno-exceptions"
4987 AC_CACHE_CHECK([for struct dirent.d_type], glibcxx_cv_dirent_d_type, [dnl
4988 GCC_TRY_COMPILE_OR_LINK(
4989 [#include <dirent.h>],
4992 if (sizeof d.d_type) return 0;
4994 [glibcxx_cv_dirent_d_type=yes],
4995 [glibcxx_cv_dirent_d_type=no])
4997 if test $glibcxx_cv_dirent_d_type = yes; then
4998 AC_DEFINE(HAVE_STRUCT_DIRENT_D_TYPE, 1, [Define to 1 if `d_type' is a member of `struct dirent'.])
5001 AC_CACHE_CHECK([for realpath], glibcxx_cv_realpath, [dnl
5002 GCC_TRY_COMPILE_OR_LINK(
5009 #if _XOPEN_VERSION < 500
5011 #elif _XOPEN_VERSION >= 700 || defined(PATH_MAX)
5012 char *tmp = realpath((const char*)NULL, (char*)NULL);
5017 [glibcxx_cv_realpath=yes],
5018 [glibcxx_cv_realpath=no])
5020 if test $glibcxx_cv_realpath = yes; then
5021 AC_DEFINE(_GLIBCXX_USE_REALPATH, 1, [Define if usable realpath is available in <stdlib.h>.])
5024 AC_CACHE_CHECK([for utimensat], glibcxx_cv_utimensat, [dnl
5025 GCC_TRY_COMPILE_OR_LINK(
5028 #include <sys/stat.h>
5031 struct timespec ts[2] = { { 0, UTIME_OMIT }, { 1, 1 } };
5032 int i = utimensat(AT_FDCWD, "path", ts, 0);
5034 [glibcxx_cv_utimensat=yes],
5035 [glibcxx_cv_utimensat=no])
5037 if test $glibcxx_cv_utimensat = yes; then
5038 AC_DEFINE(_GLIBCXX_USE_UTIMENSAT, 1, [Define if utimensat and UTIME_OMIT are available in <sys/stat.h> and AT_FDCWD in <fcntl.h>.])
5041 AC_CACHE_CHECK([for utime], glibcxx_cv_utime, [dnl
5042 GCC_TRY_COMPILE_OR_LINK(
5047 struct utimbuf t = { 1, 1 };
5048 int i = utime("path", &t);
5050 [glibcxx_cv_utime=yes],
5051 [glibcxx_cv_utime=no])
5053 if test $glibcxx_cv_utime = yes; then
5054 AC_DEFINE(_GLIBCXX_USE_UTIME, 1, [Define if utime is available in <utime.h>.])
5057 AC_CACHE_CHECK([for lstat], glibcxx_cv_lstat, [dnl
5058 GCC_TRY_COMPILE_OR_LINK(
5059 [ #include <sys/stat.h> ],
5062 int i = lstat("path", &st);
5064 [glibcxx_cv_lstat=yes],
5065 [glibcxx_cv_lstat=no])
5067 if test $glibcxx_cv_lstat = yes; then
5068 AC_DEFINE(_GLIBCXX_USE_LSTAT, 1, [Define if lstat is available in <sys/stat.h>.])
5071 AC_CACHE_CHECK([for struct stat.st_mtim.tv_nsec],
5072 glibcxx_cv_st_mtim, [dnl
5073 GCC_TRY_COMPILE_OR_LINK(
5074 [ #include <sys/stat.h> ],
5077 return st.st_mtim.tv_nsec;
5079 [glibcxx_cv_st_mtim=yes],
5080 [glibcxx_cv_st_mtim=no])
5082 if test $glibcxx_cv_st_mtim = yes; then
5083 AC_DEFINE(_GLIBCXX_USE_ST_MTIM, 1, [Define if struct stat has timespec members.])
5086 AC_CACHE_CHECK([for fchmod],
5087 glibcxx_cv_fchmod, [dnl
5088 GCC_TRY_COMPILE_OR_LINK(
5089 [#include <sys/stat.h>],
5090 [fchmod(1, S_IWUSR);],
5091 [glibcxx_cv_fchmod=yes],
5092 [glibcxx_cv_fchmod=no])
5094 if test $glibcxx_cv_fchmod = yes; then
5095 AC_DEFINE(_GLIBCXX_USE_FCHMOD, 1, [Define if fchmod is available in <sys/stat.h>.])
5098 AC_CACHE_CHECK([for fchmodat],
5099 glibcxx_cv_fchmodat, [dnl
5100 GCC_TRY_COMPILE_OR_LINK(
5103 #include <sys/stat.h>
5105 [fchmodat(AT_FDCWD, "", 0, AT_SYMLINK_NOFOLLOW);],
5106 [glibcxx_cv_fchmodat=yes],
5107 [glibcxx_cv_fchmodat=no])
5109 if test $glibcxx_cv_fchmodat = yes; then
5110 AC_DEFINE(_GLIBCXX_USE_FCHMODAT, 1, [Define if fchmodat is available in <sys/stat.h>.])
5113 AC_CACHE_CHECK([for link],
5114 glibcxx_cv_link, [dnl
5115 GCC_TRY_COMPILE_OR_LINK(
5116 [#include <unistd.h>],
5118 [glibcxx_cv_link=yes],
5119 [glibcxx_cv_link=no])
5121 if test $glibcxx_cv_link = yes; then
5122 AC_DEFINE(HAVE_LINK, 1, [Define if link is available in <unistd.h>.])
5125 AC_CACHE_CHECK([for lseek],
5126 glibcxx_cv_lseek, [dnl
5127 GCC_TRY_COMPILE_OR_LINK(
5128 [#include <unistd.h>],
5129 [lseek(1, 0, SEEK_SET);],
5130 [glibcxx_cv_lseek=yes],
5131 [glibcxx_cv_lseek=no])
5133 if test $glibcxx_cv_lseek = yes; then
5134 AC_DEFINE(HAVE_LSEEK, 1, [Define if lseek is available in <unistd.h>.])
5137 AC_CACHE_CHECK([for readlink],
5138 glibcxx_cv_readlink, [dnl
5139 GCC_TRY_COMPILE_OR_LINK(
5140 [#include <unistd.h>],
5141 [char buf[32]; readlink("", buf, sizeof(buf));],
5142 [glibcxx_cv_readlink=yes],
5143 [glibcxx_cv_readlink=no])
5145 if test $glibcxx_cv_readlink = yes; then
5146 AC_DEFINE(HAVE_READLINK, 1, [Define if readlink is available in <unistd.h>.])
5149 AC_CACHE_CHECK([for symlink],
5150 glibcxx_cv_symlink, [dnl
5151 GCC_TRY_COMPILE_OR_LINK(
5152 [#include <unistd.h>],
5154 [glibcxx_cv_symlink=yes],
5155 [glibcxx_cv_symlink=no])
5157 if test $glibcxx_cv_symlink = yes; then
5158 AC_DEFINE(HAVE_SYMLINK, 1, [Define if symlink is available in <unistd.h>.])
5161 AC_CACHE_CHECK([for truncate],
5162 glibcxx_cv_truncate, [dnl
5163 GCC_TRY_COMPILE_OR_LINK(
5164 [#include <unistd.h>],
5165 [truncate("", 99);],
5166 [glibcxx_cv_truncate=yes],
5167 [glibcxx_cv_truncate=no])
5169 if test $glibcxx_cv_truncate = yes; then
5170 AC_DEFINE(HAVE_TRUNCATE, 1, [Define if truncate is available in <unistd.h>.])
5173 AC_CACHE_CHECK([for copy_file_range that can copy files],
5174 glibcxx_cv_copy_file_range, [dnl
5175 case "${target_os}" in
5177 GCC_TRY_COMPILE_OR_LINK(
5178 [#include <unistd.h>],
5179 [copy_file_range(1, (loff_t*)nullptr, 2, (loff_t*)nullptr, 1, 0);],
5180 [glibcxx_cv_copy_file_range=yes],
5181 [glibcxx_cv_copy_file_range=no])
5184 glibcxx_cv_copy_file_range=no
5188 if test $glibcxx_cv_copy_file_range = yes; then
5189 AC_DEFINE(_GLIBCXX_USE_COPY_FILE_RANGE, 1, [Define if copy_file_range is available in <unistd.h>.])
5192 AC_CACHE_CHECK([for sendfile that can copy files],
5193 glibcxx_cv_sendfile, [dnl
5194 case "${target_os}" in
5195 gnu* | linux* | solaris* | uclinux*)
5196 GCC_TRY_COMPILE_OR_LINK(
5197 [#include <sys/sendfile.h>],
5198 [sendfile(1, 2, (off_t*)0, sizeof 1);],
5199 [glibcxx_cv_sendfile=yes],
5200 [glibcxx_cv_sendfile=no])
5203 glibcxx_cv_sendfile=no
5207 if test $glibcxx_cv_sendfile = yes && test $glibcxx_cv_lseek = yes; then
5208 AC_DEFINE(_GLIBCXX_USE_SENDFILE, 1, [Define if sendfile is available in <sys/sendfile.h>.])
5211 AC_CACHE_CHECK([for fdopendir],
5212 glibcxx_cv_fdopendir, [dnl
5213 GCC_TRY_COMPILE_OR_LINK(
5214 [#include <dirent.h>],
5215 [::DIR* dir = ::fdopendir(1);],
5216 [glibcxx_cv_fdopendir=yes],
5217 [glibcxx_cv_fdopendir=no])
5219 if test $glibcxx_cv_fdopendir = yes; then
5220 AC_DEFINE(HAVE_FDOPENDIR, 1, [Define if fdopendir is available in <dirent.h>.])
5223 AC_CACHE_CHECK([for dirfd],
5224 glibcxx_cv_dirfd, [dnl
5225 GCC_TRY_COMPILE_OR_LINK(
5226 [#include <dirent.h>],
5227 [int fd = ::dirfd((::DIR*)0);],
5228 [glibcxx_cv_dirfd=yes],
5229 [glibcxx_cv_dirfd=no])
5231 if test $glibcxx_cv_dirfd = yes; then
5232 AC_DEFINE(HAVE_DIRFD, 1, [Define if dirfd is available in <dirent.h>.])
5235 AC_CACHE_CHECK([for openat],
5236 glibcxx_cv_openat, [dnl
5237 GCC_TRY_COMPILE_OR_LINK(
5238 [#include <fcntl.h>],
5239 [int fd = ::openat(AT_FDCWD, "", 0);],
5240 [glibcxx_cv_openat=yes],
5241 [glibcxx_cv_openat=no])
5243 if test $glibcxx_cv_openat = yes; then
5244 AC_DEFINE(HAVE_OPENAT, 1, [Define if openat is available in <fcntl.h>.])
5247 AC_CACHE_CHECK([for unlinkat],
5248 glibcxx_cv_unlinkat, [dnl
5249 GCC_TRY_COMPILE_OR_LINK(
5251 #include <unistd.h>],
5252 [::unlinkat(AT_FDCWD, "", AT_REMOVEDIR);],
5253 [glibcxx_cv_unlinkat=yes],
5254 [glibcxx_cv_unlinkat=no])
5256 if test $glibcxx_cv_unlinkat = yes; then
5257 AC_DEFINE(HAVE_UNLINKAT, 1, [Define if unlinkat is available in <fcntl.h>.])
5260 CXXFLAGS="$ac_save_CXXFLAGS"
5265 dnl Check how size_t is mangled. Copied from libitm.
5267 AC_DEFUN([GLIBCXX_CHECK_SIZE_T_MANGLING], [
5268 AC_CACHE_CHECK([how size_t is mangled],
5269 glibcxx_cv_size_t_mangling, [
5270 AC_TRY_COMPILE([], [extern __SIZE_TYPE__ x; extern unsigned long x;],
5271 [glibcxx_cv_size_t_mangling=m], [
5272 AC_TRY_COMPILE([], [extern __SIZE_TYPE__ x; extern unsigned int x;],
5273 [glibcxx_cv_size_t_mangling=j], [
5275 [extern __SIZE_TYPE__ x; extern unsigned long long x;],
5276 [glibcxx_cv_size_t_mangling=y], [
5278 [extern __SIZE_TYPE__ x; extern unsigned short x;],
5279 [glibcxx_cv_size_t_mangling=t], [
5281 [extern __SIZE_TYPE__ x; extern __int20 unsigned x;],
5282 [glibcxx_cv_size_t_mangling=u6uint20],
5283 [glibcxx_cv_size_t_mangling=x])
5289 if test $glibcxx_cv_size_t_mangling = x; then
5290 AC_MSG_ERROR([Unknown underlying type for size_t])
5292 AC_DEFINE_UNQUOTED(_GLIBCXX_MANGLE_SIZE_T, [$glibcxx_cv_size_t_mangling],
5293 [Define to the letter to which size_t is mangled.])
5297 dnl Determine whether std::exception_ptr symbols should be exported with
5298 dnl the symbol versions from GCC 4.6.0 or GCC 7.1.0, depending on which
5299 dnl release first added support for std::exception_ptr. Originally it was
5300 dnl only supported for targets with always-lock-free atomics for int, but
5301 dnl since GCC 7.1 it is supported for all targets.
5303 AC_DEFUN([GLIBCXX_CHECK_EXCEPTION_PTR_SYMVER], [
5304 if test $enable_symvers != no; then
5305 AC_MSG_CHECKING([for first version to support std::exception_ptr])
5307 aarch64-*-* | alpha-*-* | hppa*-*-* | i?86-*-* | x86_64-*-* | \
5308 m68k-*-* | powerpc*-*-* | s390*-*-* | *-*-solaris* )
5309 ac_exception_ptr_since_gcc46=yes
5312 # If the value of this macro changes then we will need to hardcode
5313 # yes/no here for additional targets based on the original value.
5314 AC_TRY_COMPILE([], [
5315 #if __GCC_ATOMIC_INT_LOCK_FREE <= 1
5316 # error atomic int not always lock free
5319 [ac_exception_ptr_since_gcc46=yes],
5320 [ac_exception_ptr_since_gcc46=no])
5323 if test x"$ac_exception_ptr_since_gcc46" = x"yes" ; then
5324 AC_DEFINE(HAVE_EXCEPTION_PTR_SINCE_GCC46, 1,
5325 [Define to 1 if GCC 4.6 supported std::exception_ptr for the target])
5326 AC_MSG_RESULT([4.6.0])
5328 AC_MSG_RESULT([7.1.0])
5334 dnl Check whether getentropy is present in <unistd.h>.
5336 AC_DEFUN([GLIBCXX_CHECK_GETENTROPY], [
5340 AC_CACHE_CHECK([for getentropy], glibcxx_cv_getentropy, [
5341 GCC_TRY_COMPILE_OR_LINK(
5342 [#include <unistd.h>],
5344 ::getentropy(&i, sizeof(i));],
5345 [glibcxx_cv_getentropy=yes], [glibcxx_cv_getentropy=no])
5348 if test $glibcxx_cv_getentropy = yes; then
5349 AC_DEFINE(HAVE_GETENTROPY, 1, [Define if getentropy is available in <unistd.h>.])
5355 dnl Check whether arc4random is present in <stdlib.h>.
5357 AC_DEFUN([GLIBCXX_CHECK_ARC4RANDOM], [
5361 AC_CACHE_CHECK([for arc4random], glibcxx_cv_arc4random, [
5362 GCC_TRY_COMPILE_OR_LINK(
5363 [#include <stdlib.h>],
5364 [unsigned i = ::arc4random();],
5365 [glibcxx_cv_arc4random=yes], [glibcxx_cv_arc4random=no])
5368 if test $glibcxx_cv_arc4random = yes; then
5369 AC_DEFINE(HAVE_ARC4RANDOM, 1, [Define if arc4random is available in <stdlib.h>.])
5375 dnl Check to see whether to build libstdc++_libbacktrace.a
5377 dnl --enable-libstdcxx-backtrace
5379 AC_DEFUN([GLIBCXX_ENABLE_BACKTRACE], [
5380 GLIBCXX_ENABLE(libstdcxx-backtrace,auto,,
5381 [turns on libbacktrace support],
5382 [permit yes|no|auto])
5384 # Most of this is adapted from libsanitizer/configure.ac
5388 # libbacktrace only needs atomics for int, which we've already tested
5389 if test "$glibcxx_cv_atomic_int" = "yes"; then
5390 BACKTRACE_CPPFLAGS="$BACKTRACE_CPPFLAGS -DHAVE_ATOMIC_FUNCTIONS=1"
5393 # Test for __sync support.
5394 AC_CACHE_CHECK([__sync extensions],
5395 [glibcxx_cv_sys_sync],
5396 [GCC_TRY_COMPILE_OR_LINK(
5398 [__sync_bool_compare_and_swap (&i, i, i);
5399 __sync_lock_test_and_set (&i, 1);
5400 __sync_lock_release (&i);],
5401 [glibcxx_cv_sys_sync=yes],
5402 [glibcxx_cv_sys_sync=no])
5404 if test "$glibcxx_cv_sys_sync" = "yes"; then
5405 BACKTRACE_CPPFLAGS="$BACKTRACE_CPPFLAGS -DHAVE_SYNC_FUNCTIONS=1"
5408 # Check for dl_iterate_phdr.
5409 AC_CHECK_HEADERS(link.h)
5410 if test "$ac_cv_header_link_h" = "no"; then
5411 have_dl_iterate_phdr=no
5413 # When built as a GCC target library, we can't do a link test.
5414 AC_EGREP_HEADER([dl_iterate_phdr], [link.h], [have_dl_iterate_phdr=yes],
5415 [have_dl_iterate_phdr=no])
5417 if test "$have_dl_iterate_phdr" = "yes"; then
5418 BACKTRACE_CPPFLAGS="$BACKTRACE_CPPFLAGS -DHAVE_DL_ITERATE_PHDR=1"
5420 AC_CHECK_HEADERS(windows.h)
5422 # Check for the fcntl function.
5423 if test -n "${with_target_subdir}"; then
5425 *-*-mingw*) have_fcntl=no ;;
5426 *) have_fcntl=yes ;;
5429 AC_CHECK_FUNC(fcntl, [have_fcntl=yes], [have_fcntl=no])
5431 if test "$have_fcntl" = "yes"; then
5432 BACKTRACE_CPPFLAGS="$BACKTRACE_CPPFLAGS -DHAVE_FCNTL=1"
5435 AC_CHECK_DECLS(strnlen)
5437 # Check for getexecname function.
5438 if test -n "${with_target_subdir}"; then
5440 *-*-solaris2*) have_getexecname=yes ;;
5441 *) have_getexecname=no ;;
5444 AC_CHECK_FUNC(getexecname, [have_getexecname=yes], [have_getexecname=no])
5446 if test "$have_getexecname" = "yes"; then
5447 BACKTRACE_CPPFLAGS="$BACKTRACE_CPPFLAGS -DHAVE_GETEXECNAME=1"
5450 # The library needs to be able to read the executable itself. Compile
5451 # a file to determine the executable format. The awk script
5452 # filetype.awk prints out the file type.
5453 AC_CACHE_CHECK([output filetype],
5454 [glibcxx_cv_sys_filetype],
5457 [AC_LANG_PROGRAM([int i;], [int j;])],
5458 [filetype=`${AWK} -f $srcdir/../libbacktrace/filetype.awk conftest.$ac_objext`],
5459 [AC_MSG_FAILURE([compiler failed])])
5460 glibcxx_cv_sys_filetype=$filetype])
5462 # Match the file type to decide what files to compile.
5464 case "$glibcxx_cv_sys_filetype" in
5465 elf*) FORMAT_FILE="elf.lo" ;;
5466 pecoff*) FORMAT_FILE="pecoff.lo" ;;
5467 *) AC_MSG_WARN([could not determine output file type])
5468 FORMAT_FILE="unknown.lo"
5469 enable_libstdcxx_backtrace=no
5472 AC_SUBST(FORMAT_FILE)
5476 case "$glibcxx_cv_sys_filetype" in
5477 elf32) elfsize=32 ;;
5478 elf64) elfsize=64 ;;
5480 BACKTRACE_CPPFLAGS="$BACKTRACE_CPPFLAGS -DBACKTRACE_ELF_SIZE=$elfsize"
5482 AC_MSG_CHECKING([whether to build libbacktrace support])
5483 if test "$enable_libstdcxx_backtrace" = "auto"; then
5484 enable_libstdcxx_backtrace=no
5486 AC_MSG_RESULT($enable_libstdcxx_backtrace)
5487 if test "$enable_libstdcxx_backtrace" = "yes"; then
5488 BACKTRACE_SUPPORTED=1
5490 AC_CHECK_HEADERS(sys/mman.h)
5492 *-*-msdosdjgpp) # DJGPP has sys/man.h, but no mmap
5495 have_mmap="$ac_cv_header_sys_mman_h" ;;
5498 if test "$have_mmap" = "no"; then
5503 AC_PREPROC_IFELSE([AC_LANG_SOURCE([
5504 #include <sys/mman.h>
5505 #if !defined(MAP_ANONYMOUS) && !defined(MAP_ANON)
5506 #error no MAP_ANONYMOUS
5508 ])], [ALLOC_FILE=mmap.lo], [ALLOC_FILE=alloc.lo])
5511 AC_SUBST(ALLOC_FILE)
5513 BACKTRACE_USES_MALLOC=0
5514 if test "$ALLOC_FILE" = "alloc.lo"; then
5515 BACKTRACE_USES_MALLOC=1
5518 if test "$ac_has_gthreads" = "yes"; then
5519 BACKTRACE_SUPPORTS_THREADS=1
5521 BACKTRACE_SUPPORTS_THREADS=0
5523 AC_SUBST(BACKTRACE_CPPFLAGS)
5524 AC_SUBST(BACKTRACE_SUPPORTED)
5525 AC_SUBST(BACKTRACE_USES_MALLOC)
5526 AC_SUBST(BACKTRACE_SUPPORTS_THREADS)
5527 AC_DEFINE(HAVE_STACKTRACE, 1, [Define if the <stacktrace> header is supported.])
5529 BACKTRACE_SUPPORTED=0
5530 BACKTRACE_USES_MALLOC=0
5531 BACKTRACE_SUPPORTS_THREADS=0
5533 GLIBCXX_CONDITIONAL(ENABLE_BACKTRACE, [test "$enable_libstdcxx_backtrace" = yes])
5537 dnl Allow the emergency EH pool to be configured.
5539 dnl --enable-libstdcxx-static-eh-pool will cause a fixed-size static buffer
5540 dnl to be used for allocating exceptions after malloc fails. The default is
5541 dnl to allocate a buffer using malloc
5543 dnl --with-libstdcxx-eh-pool-obj-count=N will set the default size for the
5544 dnl buffer. For a static buffer that size is fixed permanently. For a dynamic
5545 dnl buffer it's the default, but it can be overridden from the environment.
5547 dnl To set the default to approximately the same values as GCC 12,
5548 dnl use --with-libstdcxx-eh-pool-obj-count=94 for 32-bit targets,
5549 dnl and --with-libstdcxx-eh-pool-obj-count=252 for 64-bit targets.
5552 dnl _GLIBCXX_EH_POOL_STATIC if a fixed-size static buffer should be used
5553 dnl instead of allocating a buffer on startup.
5554 dnl _GLIBCXX_EH_POOL_NOBJS to override the default EMERGENCY_OBJ_COUNT value.
5556 AC_DEFUN([GLIBCXX_EMERGENCY_EH_ALLOC], [
5559 AC_ARG_ENABLE([libstdcxx-static-eh-pool],
5560 AC_HELP_STRING([--enable-libstdcxx-static-eh-pool],
5561 [use a fixed-size static buffer for allocating exceptions if malloc fails]),
5562 [if test "${enableval}" = yes; then
5563 eh_pool_static="-D_GLIBCXX_EH_POOL_STATIC"
5564 AC_MSG_NOTICE([EH pool using static buffer])
5567 AC_ARG_WITH([libstdcxx-eh-pool-obj-count],
5568 AC_HELP_STRING([--with-libstdcxx-eh-pool-obj-count],
5569 [the number of exceptions that can be allocated from the pool if malloc fails]),
5570 [if test "${withval}" -ge 0 2>/dev/null; then
5571 eh_pool_obj_count="-D_GLIBCXX_EH_POOL_NOBJS=${withval}"
5572 AC_MSG_NOTICE([EH pool object count: ${withval}])
5574 AC_MSG_ERROR([EH pool obj count must be a non-negative integer: $withval])
5577 EH_POOL_FLAGS="$eh_pool_static $eh_pool_obj_count"
5578 AC_SUBST(EH_POOL_FLAGS)
5582 dnl Allow the location of tzdata files to be configured.
5584 dnl --with-libstdcxx-zoneinfo=ARG where ARG can be:
5585 dnl DIR - use DIR/tzdata.zi and DIR/leapseconds files.
5586 dnl static - use static copy of tzdata.zi embedded in the library.
5587 dnl DIR,static - use DIR, but use embedded static copy as fallback.
5588 dnl yes - equivalent to DIR,static with a system-specific value for DIR.
5589 dnl no - disable most tzdb functionality.
5592 dnl _GLIBCXX_ZONEINFO_DIR if std::chrono::tzdb should use the specified
5593 dnl directory for the tzdata.zi and leapseconds files.
5594 dnl _GLIBCXX_STATIC_TZDATA if std::chrono::tzdb should use an embedded
5595 dnl static copy of the tzdata.zi file.
5597 AC_DEFUN([GLIBCXX_ZONEINFO_DIR], [
5598 AC_ARG_WITH([libstdcxx-zoneinfo],
5599 AC_HELP_STRING([--with-libstdcxx-zoneinfo],
5600 [the location to use for tzdata]),
5601 [],[with_libstdcxx_zoneinfo=yes])
5603 if test "x${with_libstdcxx_zoneinfo}" = xyes; then
5604 # Pick a default when no specific path is set.
5605 case "$target_os" in
5606 gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
5607 # Not all distros ship tzdata.zi in this dir.
5608 zoneinfo_dir="/usr/share/zoneinfo"
5611 # Binary tzfile files are in /usr/share/lib/zoneinfo
5612 # but tzdata.zi is not present there.
5616 # Binary tzfile files are in /usr/share/lib/zoneinfo.default
5617 # but tzdata.zi is not present there.
5621 # Binary tzfile files are commonly found in /usr/share/zoneinfo
5622 # but tzdata.zi is not present there.
5627 AC_COMPUTE_INT(glibcxx_cv_at_least_32bit, [__INTPTR_WIDTH__ >= 32])
5628 if test "$glibcxx_cv_at_least_32bit" -ne 0; then
5629 # Also embed a copy of the tzdata.zi file as a static string.
5632 # The embedded data is too large for 16-bit targets.
5635 elif test "x${with_libstdcxx_zoneinfo}" = xno; then
5636 # Disable tzdb support completely.
5640 case "${with_libstdcxx_zoneinfo}" in
5642 # Do not attempt to read from disk, always use embedded data.
5646 static,* | *,static)
5647 # Try to read from disk, use embedded data as fallback.
5648 zoneinfo_dir="${with_libstdcxx_zoneinfo#static,}"
5649 zoneinfo_dir="${with_libstdcxx_zoneinfo%,static}"
5653 zoneinfo_dir="${with_libstdcxx_zoneinfo}"
5658 AC_MSG_NOTICE([zoneinfo data directory: ${zoneinfo_dir}])
5659 if test "x${zoneinfo_dir}" != xnone; then
5660 AC_DEFINE_UNQUOTED(_GLIBCXX_ZONEINFO_DIR, "${zoneinfo_dir}",
5661 [Define if a directory should be searched for tzdata files.])
5662 if $GLIBCXX_IS_NATIVE && ! test -f "$zoneinfo_dir/tzdata.zi"; then
5663 AC_MSG_WARN("$zoneinfo_dir does not contain tzdata.zi file")
5666 GLIBCXX_CONDITIONAL(USE_STATIC_TZDATA, test "${embed_zoneinfo}" = yes)
5667 if test "x${embed_zoneinfo}" = xyes; then
5668 AC_MSG_NOTICE([static tzdata.zi file will be compiled into the library])
5669 AC_DEFINE_UNQUOTED(_GLIBCXX_STATIC_TZDATA, 1,
5670 [Define if static tzdata should be compiled into the library.])
5675 dnl Check whether lock tables can be aligned to avoid false sharing.
5678 dnl _GLIBCXX_CAN_ALIGNAS_DESTRUCTIVE_SIZE if objects with static storage
5679 dnl duration can be aligned to std::hardware_destructive_interference_size.
5681 AC_DEFUN([GLIBCXX_CHECK_ALIGNAS_CACHELINE], [
5685 AC_MSG_CHECKING([whether static objects can be aligned to the cacheline size])
5686 AC_TRY_COMPILE(, [struct alignas(__GCC_DESTRUCTIVE_SIZE) Aligned { };
5687 alignas(Aligned) static char buf[sizeof(Aligned) * 16];
5688 ], [ac_alignas_cacheline=yes], [ac_alignas_cacheline=no])
5689 if test "$ac_alignas_cacheline" = yes; then
5690 AC_DEFINE_UNQUOTED(_GLIBCXX_CAN_ALIGNAS_DESTRUCTIVE_SIZE, 1,
5691 [Define if global objects can be aligned to
5692 std::hardware_destructive_interference_size.])
5694 AC_MSG_RESULT($ac_alignas_cacheline)
5700 dnl Check whether iostream initialization should be done in the library,
5701 dnl using the init_priority attribute.
5704 dnl _GLIBCXX_USE_INIT_PRIORITY_ATTRIBUTE if GCC supports the init_priority
5705 dnl attribute for the target.
5707 AC_DEFUN([GLIBCXX_CHECK_INIT_PRIORITY], [
5711 AC_MSG_CHECKING([whether init_priority attribute is supported])
5713 #if ! __has_attribute(init_priority)
5714 #error init_priority not supported
5716 ], [ac_init_priority=yes], [ac_init_priority=no])
5717 if test "$ac_init_priority" = yes; then
5718 AC_DEFINE_UNQUOTED(_GLIBCXX_USE_INIT_PRIORITY_ATTRIBUTE, 1,
5719 [Define if init_priority should be used for iostream initialization.])
5721 AC_MSG_RESULT($ac_init_priority)
5726 # Macros from the top-level gcc directory.
5727 m4_include([../config/gc++filt.m4])
5728 m4_include([../config/tls.m4])
5729 m4_include([../config/gthr.m4])
5730 m4_include([../config/cet.m4])