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