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