
This is the largest missing piece of C++20 support. Only the cxx11 ABI is supported, due to the use of std::string in the API for time zones. For the old gcc4 ABI, utc_clock and leap seconds are supported, but only using a hardcoded list of leap seconds, no up-to-date tzdb::leap_seconds information is available, and no time zones or zoned_time conversions. The implementation currently depends on a tzdata.zi file being provided by the OS or the user. The expected location is /usr/share/zoneinfo but that can be changed using --with-libstdcxx-zoneinfo-dir=PATH. On targets that support it there is also a weak symbol that users can override in their own program (which also helps with testing): extern "C++" const char* __gnu_cxx::zoneinfo_dir_override(); If no file is found, a fallback tzdb object will be created which only contains the "Etc/UTC" and "Etc/GMT" time zones. A leapseconds file is also expected in the same directory, but if that isn't present then a hardcoded list of leapseconds is used, which is correct at least as far as 2023-06-28 (and it currently looks like no leap second will be inserted for a few years). The tzdata.zi and leapseconds files from https://www.iana.org/time-zones are in the public domain, so shipping copies of them with GCC would be an option. However, the tzdata.zi file will rapidly become outdated, so users should really provide it themselves (or convince their OS vendor to do so). It would also be possible to implement an alternative parser for the compiled tzdata files (one per time zone) under /usr/share/zoneinfo. Those files are present on more operating systems, but do not contain all the information present in tzdata.zi. Specifically, the "links" are not present, so that e.g. "UTC" and "Universal" are distinct time zones, rather than both being links to the canonical "Etc/UTC" zone. For some platforms those files are hard links to the same file, but there's no indication which zone is the canonical name and which is a link. Other platforms just store them in different inodes anyway. I do not plan to add such an alternative parser for the compiled files. That would need to be contributed by maintainers or users of targets that require it, if making tzdata.zi available is not an option. The library ABI would not need to change for a new tzdb implementation, because everything in tzdb_list, tzdb and time_zone is implemented as a pimpl (except for the shared_ptr links between nodes, described below). That means the new exported symbols added by this commit should be stable even if the implementation is completely rewritten. The information from tzdata.zi is parsed and stored in data structures that closely model the info in the file. This is a space-efficient representation that uses less memory that storing every transition for every time zone. It also avoids spending time expanding that information into time zone transitions that might never be needed by the program. When a conversion to/from a local time to UTC is requested the information will be processed to determine the time zone transitions close to the time being converted. There is a bug in some time zone transitions. When generating a sys_info object immediately after one that was previously generated, we need to find the previous rule that was in effect and note its offset and letters. This is so that the start time and abbreviation of the new sys_info will be correct. This only affects time zones that use a format like "C%sT" where the LETTERS replacing %s are non-empty for standard time, e.g. "Asia/Shanghai" which uses "CST" for standard time and "CDT" for daylight time. The tzdb_list structure maintains a linked list of tzdb nodes using shared_ptr links. This allows the iterators into the list to share ownership with the list itself. This offers a non-portable solution to a lifetime issue in the API. Because tzdb objects can be erased from the list using tzdb_list::erase_after, separate modules/libraries in a large program cannot guarantee that any const tzdb& or const time_zone* remains valid indefinitely. Holding onto a tzdb_list::const_iterator will extend the tzdb object's lifetime, even if it's erased from the list. An alternative design would be for the list iterator to hold a weak_ptr. This would allow users to test whether the tzdb still exists when the iterator is dereferenced, which is better than just having a dangling raw pointer. That doesn't actually extend the tzdb's lifetime though, and every use of it would need to be preceded by checking the weak_ptr. Using shared_ptr adds a little bit of overhead but allows users to solve the lifetime issue if they rely on the libstdc++-specific iterator property. libstdc++-v3/ChangeLog: * acinclude.m4 (GLIBCXX_ZONEINFO_DIR): New macro. * config.h.in: Regenerate. * config/abi/pre/gnu.ver: Export new symbols. * configure: Regenerate. * configure.ac (GLIBCXX_ZONEINFO_DIR): Use new macro. * include/std/chrono (utc_clock::from_sys): Correct handling of leap seconds. (nonexistent_local_time::_M_make_what_str): Define. (ambiguous_local_time::_M_make_what_str): Define. (__throw_bad_local_time): Define new function. (time_zone, tzdb_list, tzdb): Implement all members. (remote_version, zoned_time, get_leap_second_info): Define. * include/std/version: Add comment for __cpp_lib_chrono. * src/c++20/Makefile.am: Add new file. * src/c++20/Makefile.in: Regenerate. * src/c++20/tzdb.cc: New file. * testsuite/lib/libstdc++.exp: Define effective target tzdb. * testsuite/std/time/clock/file/members.cc: Check file_time alias and file_clock::now() member. * testsuite/std/time/clock/gps/1.cc: Likewise for gps_clock. * testsuite/std/time/clock/tai/1.cc: Likewise for tai_clock. * testsuite/std/time/syn_c++20.cc: Uncomment everything except parse. * testsuite/std/time/clock/utc/leap_second_info.cc: New test. * testsuite/std/time/exceptions.cc: New test. * testsuite/std/time/time_zone/get_info_local.cc: New test. * testsuite/std/time/time_zone/get_info_sys.cc: New test. * testsuite/std/time/time_zone/requirements.cc: New test. * testsuite/std/time/tzdb/1.cc: New test. * testsuite/std/time/tzdb/leap_seconds.cc: New test. * testsuite/std/time/tzdb_list/1.cc: New test. * testsuite/std/time/tzdb_list/requirements.cc: New test. * testsuite/std/time/zoned_time/1.cc: New test. * testsuite/std/time/zoned_time/custom.cc: New test. * testsuite/std/time/zoned_time/deduction.cc: New test. * testsuite/std/time/zoned_time/req_neg.cc: New test. * testsuite/std/time/zoned_time/requirements.cc: New test. * testsuite/std/time/zoned_traits.cc: New test.
694 lines
22 KiB
Text
694 lines
22 KiB
Text
# Process this file with autoreconf to produce a configure script.
|
|
|
|
AC_INIT(package-unused, version-unused,, libstdc++)
|
|
AC_CONFIG_SRCDIR(src/shared/hashtable-aux.cc)
|
|
AC_CONFIG_HEADER(config.h)
|
|
|
|
# This works around the fact that libtool configuration may change LD
|
|
# for this particular configuration, but some shells, instead of
|
|
# keeping the changes in LD private, export them just because LD is
|
|
# exported. Only used at the end of this file.
|
|
### am handles this now? ORIGINAL_LD_FOR_MULTILIBS=$LD
|
|
|
|
# Find the rest of the source tree framework.
|
|
AM_ENABLE_MULTILIB(, ..)
|
|
|
|
# Gets build, host, target, *_vendor, *_cpu, *_os, etc.
|
|
#
|
|
# You will slowly go insane if you do not grok the following fact: when
|
|
# building v3 as part of the compiler, the top-level /target/ becomes the
|
|
# library's /host/. configure then causes --target to default to --host,
|
|
# exactly like any other package using autoconf. Therefore, 'target' and
|
|
# 'host' will always be the same. This makes sense both for native and
|
|
# cross compilers, just think about it for a little while. :-)
|
|
#
|
|
# Also, if v3 is being configured as part of a cross compiler, the top-level
|
|
# configure script will pass the "real" host as $with_cross_host.
|
|
#
|
|
# Do not delete or change the following two lines. For why, see
|
|
# http://gcc.gnu.org/ml/libstdc++/2003-07/msg00451.html
|
|
AC_CANONICAL_SYSTEM
|
|
target_alias=${target_alias-$host_alias}
|
|
|
|
# Handy for debugging:
|
|
#AC_MSG_NOTICE($build / $host / $target / $host_alias / $target_alias); sleep 5
|
|
|
|
if test "$build" != "$host"; then
|
|
# We are being configured with some form of cross compiler.
|
|
GLIBCXX_IS_NATIVE=false
|
|
case "$host","$target" in
|
|
# Darwin crosses can use the host system's libraries and headers,
|
|
# because of the fat library support. Of course, it must be the
|
|
# same version of Darwin on both sides. Allow the user to
|
|
# just say --target=foo-darwin without a version number to mean
|
|
# "the version on this system".
|
|
*-*-darwin*,*-*-darwin*)
|
|
hostos=`echo $host | sed 's/.*-darwin/darwin/'`
|
|
targetos=`echo $target | sed 's/.*-darwin/darwin/'`
|
|
if test $hostos = $targetos -o $targetos = darwin ; then
|
|
GLIBCXX_IS_NATIVE=true
|
|
fi
|
|
;;
|
|
|
|
*)
|
|
GCC_NO_EXECUTABLES
|
|
;;
|
|
esac
|
|
else
|
|
GLIBCXX_IS_NATIVE=true
|
|
fi
|
|
|
|
# In the case that we're building without headers, we won't have <stdio.h>
|
|
# available. In these cases, we have to instruct autotools to never include
|
|
# <stdio.h> as a part of default headers.
|
|
m4_version_prereq([2.70], [], [
|
|
if test "x$with_headers" = "xno"; then
|
|
ac_includes_default=`echo "$ac_includes_default" | sed '/^#include <stdio.h>$/d'`
|
|
fi
|
|
])
|
|
|
|
# Sets up automake. Must come after AC_CANONICAL_SYSTEM. Each of the
|
|
# following is magically included in AUTOMAKE_OPTIONS in each Makefile.am.
|
|
# 1.x: minimum required version
|
|
# no-define: PACKAGE and VERSION will not be #define'd in config.h (a bunch
|
|
# of other PACKAGE_* variables will, however, and there's nothing
|
|
# we can do about that; they come from AC_INIT).
|
|
# foreign: we don't follow the normal rules for GNU packages (no COPYING
|
|
# file in the top srcdir, etc, etc), so stop complaining.
|
|
# no-dependencies: turns off auto dependency generation (just for now)
|
|
# no-dist: we don't want 'dist' and related rules.
|
|
# -Wall: turns on all automake warnings...
|
|
# -Wno-portability: ...except this one, since GNU make is now required.
|
|
AM_INIT_AUTOMAKE([1.9.3 no-define foreign no-dependencies no-dist -Wall -Wno-portability -Wno-override])
|
|
AH_TEMPLATE(PACKAGE, [Name of package])
|
|
AH_TEMPLATE(VERSION, [Version number of package])
|
|
|
|
# -fno-builtin must be present here so that a non-conflicting form of
|
|
# std::exit can be guessed by AC_PROG_CXX, and used in later tests.
|
|
|
|
save_CXXFLAGS="$CXXFLAGS"
|
|
CXXFLAGS="$CXXFLAGS -fno-builtin"
|
|
AC_PROG_CC
|
|
AC_PROG_CXX
|
|
CXXFLAGS="$save_CXXFLAGS"
|
|
|
|
AC_SYS_LARGEFILE
|
|
|
|
# Runs configure.host, and assorted other critical bits. Sets
|
|
# up critical shell variables.
|
|
GLIBCXX_CONFIGURE
|
|
|
|
# Libtool setup.
|
|
if test "x${with_newlib}" != "xyes" &&
|
|
test "x${with_avrlibc}" != "xyes" &&
|
|
test "x$with_headers" != "xno"; then
|
|
AC_LIBTOOL_DLOPEN
|
|
fi
|
|
AM_PROG_LIBTOOL
|
|
ACX_LT_HOST_FLAGS
|
|
AC_SUBST(enable_shared)
|
|
AC_SUBST(enable_static)
|
|
|
|
if test "$enable_vtable_verify" = yes; then
|
|
predep_objects_CXX="${predep_objects_CXX} ${glibcxx_builddir}/../libgcc/vtv_start.o"
|
|
postdep_objects_CXX="${postdep_objects_CXX} ${glibcxx_builddir}/../libgcc/vtv_end.o"
|
|
fi
|
|
|
|
|
|
# libtool variables for C++ shared and position-independent compiles.
|
|
#
|
|
# Use glibcxx_lt_pic_flag to designate the automake variable
|
|
# used to encapsulate the default libtool approach to creating objects
|
|
# with position-independent code. Default: -prefer-pic.
|
|
#
|
|
# Use glibcxx_compiler_shared_flag to designate a compile-time flags for
|
|
# creating shared objects. Default: -D_GLIBCXX_SHARED.
|
|
#
|
|
# Use glibcxx_compiler_pic_flag to designate a compile-time flags for
|
|
# creating position-independent objects. This varies with the target
|
|
# hardware and operating system, but is often: -DPIC -fPIC.
|
|
if test "$enable_shared" = yes; then
|
|
glibcxx_lt_pic_flag="-prefer-pic"
|
|
glibcxx_compiler_pic_flag="$lt_prog_compiler_pic_CXX"
|
|
glibcxx_compiler_shared_flag="-D_GLIBCXX_SHARED"
|
|
|
|
else
|
|
glibcxx_lt_pic_flag=
|
|
glibcxx_compiler_pic_flag=
|
|
glibcxx_compiler_shared_flag=
|
|
fi
|
|
AC_SUBST(glibcxx_lt_pic_flag)
|
|
AC_SUBST(glibcxx_compiler_pic_flag)
|
|
AC_SUBST(glibcxx_compiler_shared_flag)
|
|
|
|
# Override the libtool's pic_flag and pic_mode.
|
|
# Do this step after AM_PROG_LIBTOOL, but before AC_OUTPUT.
|
|
# NB: this impacts --with-pic and --without-pic.
|
|
lt_prog_compiler_pic_CXX="$glibcxx_compiler_pic_flag $glibcxx_compiler_shared_flag"
|
|
pic_mode='default'
|
|
|
|
# Eliminate -lstdc++ addition to postdeps for cross compiles.
|
|
postdeps_CXX=`echo " $postdeps_CXX " | sed 's, -lstdc++ ,,g'`
|
|
|
|
# Possibly disable most of the library.
|
|
## TODO: Consider skipping unncessary tests altogether in this case, rather
|
|
## than just ignoring the results. Faster /and/ more correct, win win.
|
|
GLIBCXX_ENABLE_HOSTED
|
|
|
|
# Enable descriptive messages to standard output on termination.
|
|
GLIBCXX_ENABLE_VERBOSE
|
|
|
|
# Enable compiler support that doesn't require linking.
|
|
GLIBCXX_ENABLE_PCH($is_hosted)
|
|
GLIBCXX_ENABLE_THREADS
|
|
GLIBCXX_ENABLE_ATOMIC_BUILTINS
|
|
GLIBCXX_ENABLE_LOCK_POLICY
|
|
GLIBCXX_ENABLE_DECIMAL_FLOAT
|
|
GLIBCXX_ENABLE_FLOAT128
|
|
if test "$enable_float128" = yes; then
|
|
port_specific_symbol_files="$port_specific_symbol_files \$(top_srcdir)/config/abi/pre/float128.ver"
|
|
fi
|
|
|
|
# Checks for compiler support that doesn't require linking.
|
|
GLIBCXX_CHECK_COMPILER_FEATURES
|
|
|
|
# Enable all the variable C++ runtime options that don't require linking.
|
|
GLIBCXX_ENABLE_CSTDIO
|
|
GLIBCXX_ENABLE_CLOCALE
|
|
GLIBCXX_ENABLE_ALLOCATOR
|
|
GLIBCXX_ENABLE_CHEADERS($c_model) dnl c_model from configure.host
|
|
GLIBCXX_ENABLE_LONG_LONG([yes])
|
|
GLIBCXX_ENABLE_WCHAR_T([yes])
|
|
GLIBCXX_ENABLE_C99([yes])
|
|
GLIBCXX_ENABLE_CONCEPT_CHECKS([no])
|
|
GLIBCXX_ENABLE_DEBUG_FLAGS(["-g3 -O0 -D_GLIBCXX_ASSERTIONS"])
|
|
GLIBCXX_ENABLE_DEBUG([no])
|
|
GLIBCXX_ENABLE_PARALLEL([yes])
|
|
GLIBCXX_ENABLE_CXX_FLAGS
|
|
GLIBCXX_ENABLE_FULLY_DYNAMIC_STRING([no])
|
|
GLIBCXX_ENABLE_EXTERN_TEMPLATE([yes])
|
|
GLIBCXX_ENABLE_PYTHON
|
|
GLIBCXX_ENABLE_WERROR([no])
|
|
GLIBCXX_ENABLE_VTABLE_VERIFY([no])
|
|
|
|
# Checks for operating systems support that doesn't require linking.
|
|
GLIBCXX_CHECK_STDIO_PROTO
|
|
GLIBCXX_CHECK_MATH11_PROTO
|
|
GLIBCXX_CHECK_UCHAR_H
|
|
|
|
# For LFS support.
|
|
GLIBCXX_CHECK_LFS
|
|
|
|
# For showmanyc_helper().
|
|
AC_CHECK_HEADERS(sys/ioctl.h sys/filio.h)
|
|
GLIBCXX_CHECK_POLL
|
|
GLIBCXX_CHECK_S_ISREG_OR_S_IFREG
|
|
|
|
# For xsputn_2().
|
|
AC_CHECK_HEADERS(sys/uio.h)
|
|
GLIBCXX_CHECK_WRITEV
|
|
|
|
# Check for fenv.h and complex.h before GLIBCXX_CHECK_C99_TR1
|
|
# so that the check is done with the C compiler (not C++).
|
|
# Checking with C++ can break a canadian cross build if either
|
|
# file does not exist in C but does in C++.
|
|
AC_CHECK_HEADERS(fenv.h complex.h)
|
|
|
|
# For C99 support to TR1.
|
|
GLIBCXX_CHECK_C99_TR1
|
|
|
|
# For the EOF, SEEK_CUR, and SEEK_END integer constants.
|
|
GLIBCXX_COMPUTE_STDIO_INTEGER_CONSTANTS
|
|
|
|
# For gettimeofday support.
|
|
GLIBCXX_CHECK_GETTIMEOFDAY
|
|
|
|
# For clock_gettime, nanosleep and sched_yield support.
|
|
GLIBCXX_ENABLE_LIBSTDCXX_TIME
|
|
|
|
# Check for tmpnam which is obsolescent in POSIX.1-2008
|
|
GLIBCXX_CHECK_TMPNAM
|
|
|
|
# For pthread_cond_clockwait
|
|
GLIBCXX_CHECK_PTHREAD_COND_CLOCKWAIT
|
|
|
|
# For pthread_mutex_clocklock
|
|
GLIBCXX_CHECK_PTHREAD_MUTEX_CLOCKLOCK
|
|
|
|
# For pthread_rwlock_clockrdlock and pthread_rwlock_clockwrlock
|
|
GLIBCXX_CHECK_PTHREAD_RWLOCK_CLOCKLOCK
|
|
|
|
AC_LC_MESSAGES
|
|
|
|
# For hardware_concurrency
|
|
AC_CHECK_HEADERS(sys/sysinfo.h)
|
|
GLIBCXX_CHECK_GET_NPROCS
|
|
AC_CHECK_HEADERS(unistd.h)
|
|
GLIBCXX_CHECK_SC_NPROCESSORS_ONLN
|
|
GLIBCXX_CHECK_SC_NPROC_ONLN
|
|
GLIBCXX_CHECK_PTHREADS_NUM_PROCESSORS_NP
|
|
GLIBCXX_CHECK_SYSCTL_HW_NCPU
|
|
GLIBCXX_CHECK_SDT_H
|
|
|
|
# Check for available headers.
|
|
AC_CHECK_HEADERS([endian.h execinfo.h float.h fp.h ieeefp.h inttypes.h \
|
|
locale.h machine/endian.h machine/param.h nan.h stdint.h stdlib.h string.h \
|
|
strings.h sys/ipc.h sys/isa_defs.h sys/machine.h sys/param.h \
|
|
sys/resource.h sys/sem.h sys/stat.h sys/time.h sys/types.h unistd.h \
|
|
wchar.h wctype.h linux/types.h])
|
|
|
|
AC_CHECK_HEADERS([linux/random.h], [], [],
|
|
[[#ifdef HAVE_LINUX_TYPES_H
|
|
# include <linux/types.h>
|
|
#endif
|
|
]])
|
|
|
|
AC_CHECK_HEADERS([xlocale.h])
|
|
|
|
# Only do link tests if native. Else, hardcode.
|
|
if $GLIBCXX_IS_NATIVE; then
|
|
|
|
# We can do more elaborate tests that assume a working linker.
|
|
CANADIAN=no
|
|
|
|
GLIBCXX_CHECK_LINKER_FEATURES
|
|
GLIBCXX_CHECK_MATH_SUPPORT
|
|
GLIBCXX_CHECK_STDLIB_SUPPORT
|
|
|
|
# For /dev/random and /dev/urandom for std::random_device.
|
|
GLIBCXX_CHECK_DEV_RANDOM
|
|
|
|
# For TLS support.
|
|
GCC_CHECK_TLS
|
|
|
|
AC_CHECK_FUNCS(__cxa_thread_atexit_impl __cxa_thread_atexit)
|
|
AC_CHECK_FUNCS(aligned_alloc posix_memalign memalign _aligned_malloc)
|
|
AC_CHECK_FUNCS(_wfopen)
|
|
AC_CHECK_FUNCS(secure_getenv)
|
|
|
|
# C11 functions for C++17 library
|
|
AC_CHECK_FUNCS(timespec_get)
|
|
|
|
# For Networking TS.
|
|
AC_CHECK_FUNCS(sockatmark)
|
|
|
|
# Non-standard functions used by C++17 std::from_chars
|
|
AC_CHECK_FUNCS(uselocale)
|
|
|
|
# For iconv support.
|
|
AM_ICONV
|
|
|
|
else
|
|
|
|
# This lets us hard-code the functionality we know we'll have in the cross
|
|
# target environment. "Let" is a sugar-coated word placed on an especially
|
|
# dull and tedious hack, actually.
|
|
#
|
|
# Here's why GLIBCXX_CHECK_MATH_SUPPORT, and other autoconf macros
|
|
# that involve linking, can't be used:
|
|
# "cannot open sim-crt0.o"
|
|
# "cannot open crt0.o"
|
|
# etc. All this is because there currently exists no unified, consistent
|
|
# way for top level CC information to be passed down to target directories:
|
|
# newlib includes, newlib linking info, libgloss versus newlib crt0.o, etc.
|
|
# When all of that is done, all of this hokey, excessive AC_DEFINE junk for
|
|
# crosses can be removed.
|
|
|
|
# If Canadian cross, then don't pick up tools from the build directory.
|
|
# Used only in GLIBCXX_EXPORT_INCLUDES.
|
|
if test -n "$with_cross_host" &&
|
|
test x"$build_alias" != x"$with_cross_host" &&
|
|
test x"$build" != x"$target";
|
|
then
|
|
CANADIAN=yes
|
|
else
|
|
CANADIAN=no
|
|
fi
|
|
|
|
# Construct crosses by hand, eliminating bits that need ld...
|
|
# GLIBCXX_CHECK_MATH_SUPPORT
|
|
|
|
# First, test for "known" system libraries. We may be using newlib even
|
|
# on a hosted environment.
|
|
if test "x${with_newlib}" = "xyes"; then
|
|
os_include_dir="os/newlib"
|
|
AC_DEFINE(HAVE_HYPOT)
|
|
|
|
# GLIBCXX_CHECK_STDLIB_SUPPORT
|
|
AC_DEFINE(HAVE_STRTOF)
|
|
|
|
AC_DEFINE(HAVE_ACOSF)
|
|
AC_DEFINE(HAVE_ASINF)
|
|
AC_DEFINE(HAVE_ATAN2F)
|
|
AC_DEFINE(HAVE_ATANF)
|
|
AC_DEFINE(HAVE_CEILF)
|
|
AC_DEFINE(HAVE_COSF)
|
|
AC_DEFINE(HAVE_COSHF)
|
|
AC_DEFINE(HAVE_EXPF)
|
|
AC_DEFINE(HAVE_FABSF)
|
|
AC_DEFINE(HAVE_FLOORF)
|
|
AC_DEFINE(HAVE_FMODF)
|
|
AC_DEFINE(HAVE_FREXPF)
|
|
AC_DEFINE(HAVE_LDEXPF)
|
|
AC_DEFINE(HAVE_LOG10F)
|
|
AC_DEFINE(HAVE_LOGF)
|
|
AC_DEFINE(HAVE_MODFF)
|
|
AC_DEFINE(HAVE_POWF)
|
|
AC_DEFINE(HAVE_SINF)
|
|
AC_DEFINE(HAVE_SINHF)
|
|
AC_DEFINE(HAVE_SQRTF)
|
|
AC_DEFINE(HAVE_TANF)
|
|
AC_DEFINE(HAVE_TANHF)
|
|
|
|
AC_DEFINE(HAVE_ICONV)
|
|
AC_DEFINE(HAVE_MEMALIGN)
|
|
|
|
case "${target}" in
|
|
*-rtems*)
|
|
case "${target}" in
|
|
bfin* | lm32* | mips* | moxie* | or1k* | v850*)
|
|
;;
|
|
*)
|
|
AC_DEFINE(HAVE_TLS)
|
|
;;
|
|
esac
|
|
AC_DEFINE(HAVE_ALIGNED_ALLOC)
|
|
AC_DEFINE(HAVE_AT_QUICK_EXIT)
|
|
AC_DEFINE(HAVE_LINK)
|
|
AC_DEFINE(HAVE_QUICK_EXIT)
|
|
AC_DEFINE(HAVE_READLINK)
|
|
AC_DEFINE(HAVE_SETENV)
|
|
AC_DEFINE(HAVE_SLEEP)
|
|
AC_DEFINE(HAVE_SOCKATMARK)
|
|
AC_DEFINE(HAVE_STRERROR_L)
|
|
AC_DEFINE(HAVE_SYMLINK)
|
|
AC_DEFINE(HAVE_TRUNCATE)
|
|
AC_DEFINE(HAVE_USLEEP)
|
|
;;
|
|
esac
|
|
elif test "x$with_headers" != "xno"; then
|
|
GLIBCXX_CROSSCONFIG
|
|
fi
|
|
|
|
# At some point, we should differentiate between architectures
|
|
# like x86, which have long double versions, and alpha/powerpc/etc.,
|
|
# which don't. For the time being, punt.
|
|
if test x"long_double_math_on_this_cpu" = x"yes"; then
|
|
AC_DEFINE(HAVE_ACOSL)
|
|
AC_DEFINE(HAVE_ASINL)
|
|
AC_DEFINE(HAVE_ATAN2L)
|
|
AC_DEFINE(HAVE_ATANL)
|
|
AC_DEFINE(HAVE_CEILL)
|
|
AC_DEFINE(HAVE_COSL)
|
|
AC_DEFINE(HAVE_COSHL)
|
|
AC_DEFINE(HAVE_EXPL)
|
|
AC_DEFINE(HAVE_FABSL)
|
|
AC_DEFINE(HAVE_FLOORL)
|
|
AC_DEFINE(HAVE_FMODL)
|
|
AC_DEFINE(HAVE_FREXPL)
|
|
AC_DEFINE(HAVE_LDEXPL)
|
|
AC_DEFINE(HAVE_LOG10L)
|
|
AC_DEFINE(HAVE_LOGL)
|
|
AC_DEFINE(HAVE_MODFL)
|
|
AC_DEFINE(HAVE_POWL)
|
|
AC_DEFINE(HAVE_SINCOSL)
|
|
AC_DEFINE(HAVE_SINL)
|
|
AC_DEFINE(HAVE_SINHL)
|
|
AC_DEFINE(HAVE_SQRTL)
|
|
AC_DEFINE(HAVE_TANL)
|
|
AC_DEFINE(HAVE_TANHL)
|
|
fi
|
|
fi
|
|
|
|
# Check for _Unwind_GetIPInfo.
|
|
GCC_CHECK_UNWIND_GETIPINFO
|
|
|
|
GCC_LINUX_FUTEX([AC_DEFINE(HAVE_LINUX_FUTEX, 1, [Define if futex syscall is available.])])
|
|
|
|
GLIBCXX_ENABLE_SYMVERS([yes])
|
|
AC_SUBST(libtool_VERSION)
|
|
|
|
GLIBCXX_ENABLE_LIBSTDCXX_VISIBILITY([yes])
|
|
|
|
GLIBCXX_ENABLE_LIBSTDCXX_DUAL_ABI([yes])
|
|
GLIBCXX_DEFAULT_ABI
|
|
|
|
ac_ldbl_compat=no
|
|
ac_ldbl_alt128_compat=no
|
|
ac_ldbl_ieee128_default=no
|
|
LONG_DOUBLE_COMPAT_FLAGS="-mlong-double-64"
|
|
LONG_DOUBLE_128_FLAGS=
|
|
LONG_DOUBLE_ALT128_COMPAT_FLAGS=
|
|
case "$target" in
|
|
powerpc*-*-linux* | \
|
|
sparc*-*-linux* | \
|
|
s390*-*-linux* | \
|
|
alpha*-*-linux*)
|
|
AC_TRY_COMPILE(, [
|
|
#if !defined __LONG_DOUBLE_128__ || (defined(__sparc__) && defined(__arch64__))
|
|
#error no need for long double compatibility
|
|
#endif
|
|
], [ac_ldbl_compat=yes], [ac_ldbl_compat=no])
|
|
if test "$ac_ldbl_compat" = yes; then
|
|
AC_DEFINE([_GLIBCXX_LONG_DOUBLE_COMPAT],1,
|
|
[Define if compatibility should be provided for -mlong-double-64.])
|
|
port_specific_symbol_files="\$(top_srcdir)/config/os/gnu-linux/ldbl-extra.ver"
|
|
case "$target" in
|
|
powerpc*-*-linux*)
|
|
LONG_DOUBLE_COMPAT_FLAGS="$LONG_DOUBLE_COMPAT_FLAGS -mno-gnu-attribute"
|
|
# Check for IEEE128 support in libm:
|
|
AC_CHECK_LIB(m, __frexpieee128,
|
|
[ac_ldbl_ieee128_in_libc=yes],
|
|
[ac_ldbl_ieee128_in_libc=no])
|
|
if test $ac_ldbl_ieee128_in_libc = yes; then
|
|
# Determine which long double format is the compiler's default:
|
|
AC_TRY_COMPILE(, [
|
|
#ifndef __LONG_DOUBLE_IEEE128__
|
|
#error compiler defaults to ibm128
|
|
#endif
|
|
], [ac_ldbl_ieee128_default=yes], [ac_ldbl_ieee128_default=no])
|
|
# Library objects should use default long double format.
|
|
if test "$ac_ldbl_ieee128_default" = yes; then
|
|
LONG_DOUBLE_128_FLAGS="-mno-gnu-attribute"
|
|
# Except for the ones that explicitly use these flags:
|
|
LONG_DOUBLE_ALT128_COMPAT_FLAGS="-mabi=ibmlongdouble -mno-gnu-attribute -Wno-psabi"
|
|
else
|
|
LONG_DOUBLE_128_FLAGS="-mno-gnu-attribute"
|
|
LONG_DOUBLE_ALT128_COMPAT_FLAGS="-mabi=ieeelongdouble -mno-gnu-attribute -Wno-psabi"
|
|
fi
|
|
AC_DEFINE([_GLIBCXX_LONG_DOUBLE_ALT128_COMPAT],1,
|
|
[Define if compatibility should be provided for alternative 128-bit long double formats.])
|
|
port_specific_symbol_files="$port_specific_symbol_files \$(top_srcdir)/config/os/gnu-linux/ldbl-ieee128-extra.ver"
|
|
ac_ldbl_alt128_compat=yes
|
|
else
|
|
ac_ldbl_alt128_compat=no
|
|
fi
|
|
;;
|
|
esac
|
|
fi
|
|
esac
|
|
AC_SUBST(LONG_DOUBLE_COMPAT_FLAGS)
|
|
AC_SUBST(LONG_DOUBLE_128_FLAGS)
|
|
AC_SUBST(LONG_DOUBLE_ALT128_COMPAT_FLAGS)
|
|
GLIBCXX_CONDITIONAL(GLIBCXX_LDBL_COMPAT, test $ac_ldbl_compat = yes)
|
|
GLIBCXX_CONDITIONAL(GLIBCXX_LDBL_ALT128_COMPAT, test $ac_ldbl_alt128_compat = yes)
|
|
|
|
# Check if assembler supports disabling hardware capability support.
|
|
GCC_CHECK_ASSEMBLER_HWCAP
|
|
|
|
# Check if assembler supports rdrand opcode.
|
|
GLIBCXX_CHECK_X86_RDRAND
|
|
# Check if assembler supports rdseed opcode.
|
|
GLIBCXX_CHECK_X86_RDSEED
|
|
|
|
# Check for other random number APIs
|
|
GLIBCXX_CHECK_GETENTROPY
|
|
GLIBCXX_CHECK_ARC4RANDOM
|
|
|
|
# This depends on GLIBCXX_ENABLE_SYMVERS and GLIBCXX_IS_NATIVE.
|
|
GLIBCXX_CONFIGURE_TESTSUITE
|
|
|
|
# For gthread support. Depends on GLIBCXX_ENABLE_SYMVERS.
|
|
GLIBCXX_CHECK_GTHREADS
|
|
|
|
# For Filesystem TS.
|
|
AC_CHECK_HEADERS([fcntl.h dirent.h sys/statvfs.h utime.h])
|
|
GLIBCXX_ENABLE_FILESYSTEM_TS
|
|
GLIBCXX_CHECK_FILESYSTEM_DEPS
|
|
|
|
GLIBCXX_ENABLE_BACKTRACE
|
|
|
|
# For Networking TS.
|
|
AC_CHECK_HEADERS([fcntl.h sys/ioctl.h sys/socket.h sys/uio.h poll.h netdb.h arpa/inet.h netinet/in.h netinet/tcp.h])
|
|
AC_CHECK_DECL(F_GETFL,,,[#include <fcntl.h>])
|
|
AC_CHECK_DECL(F_SETFL,,,[#include <fcntl.h>])
|
|
if test "$ac_cv_have_decl_F_GETFL$ac_cv_have_decl_F_SETFL" = yesyes ; then
|
|
AC_CHECK_DECL(O_NONBLOCK,,,[#include <fcntl.h>])
|
|
fi
|
|
|
|
# For Transactional Memory TS
|
|
GLIBCXX_CHECK_SIZE_T_MANGLING
|
|
|
|
# Check which release added std::exception_ptr for the target
|
|
GLIBCXX_CHECK_EXCEPTION_PTR_SYMVER
|
|
|
|
# For libsupc++/eh_alloc.cc defaults.
|
|
GLIBCXX_EMERGENCY_EH_ALLOC
|
|
|
|
# For src/c++20/tzdb.cc defaults.
|
|
GLIBCXX_ZONEINFO_DIR
|
|
|
|
# Define documentation rules conditionally.
|
|
|
|
# See if makeinfo has been installed and is modern enough
|
|
# that we can use it.
|
|
ACX_CHECK_PROG_VER([MAKEINFO], [makeinfo], [--version],
|
|
[GNU texinfo.* \([0-9][0-9.]*\)],
|
|
[4.[4-9]*|4.[1-9][0-9]*|[5-9]*|[1-9][0-9]*])
|
|
AM_CONDITIONAL(BUILD_INFO, test $gcc_cv_prog_makeinfo_modern = "yes")
|
|
|
|
# Check for doxygen
|
|
AC_CHECK_PROG([DOXYGEN], doxygen, yes, no)
|
|
AC_CHECK_PROG([DOT], dot, yes, no)
|
|
|
|
# Check for docbook
|
|
AC_CHECK_PROG([XMLCATALOG], xmlcatalog, yes, no)
|
|
AC_CHECK_PROG([XSLTPROC], xsltproc, yes, no)
|
|
AC_CHECK_PROG([XMLLINT], xmllint, yes, no)
|
|
GLIBCXX_CONFIGURE_DOCBOOK
|
|
|
|
# Check for xml/html dependencies.
|
|
AM_CONDITIONAL(BUILD_XML,
|
|
test $ac_cv_prog_DOXYGEN = "yes" &&
|
|
test $ac_cv_prog_DOT = "yes" &&
|
|
test $ac_cv_prog_XSLTPROC = "yes" &&
|
|
test $ac_cv_prog_XMLLINT = "yes" &&
|
|
test $glibcxx_stylesheets = "yes")
|
|
|
|
AM_CONDITIONAL(BUILD_HTML,
|
|
test $ac_cv_prog_DOXYGEN = "yes" &&
|
|
test $ac_cv_prog_DOT = "yes" &&
|
|
test $ac_cv_prog_XSLTPROC = "yes" &&
|
|
test $ac_cv_prog_XMLLINT = "yes" &&
|
|
test $glibcxx_stylesheets = "yes")
|
|
|
|
# Check for man dependencies.
|
|
AM_CONDITIONAL(BUILD_MAN,
|
|
test $ac_cv_prog_DOXYGEN = "yes" &&
|
|
test $ac_cv_prog_DOT = "yes")
|
|
|
|
# Check for pdf dependencies.
|
|
AC_CHECK_PROG([DBLATEX], dblatex, yes, no)
|
|
AC_CHECK_PROG([PDFLATEX], pdflatex, yes, no)
|
|
AM_CONDITIONAL(BUILD_PDF,
|
|
test $ac_cv_prog_DOXYGEN = "yes" &&
|
|
test $ac_cv_prog_DOT = "yes" &&
|
|
test $ac_cv_prog_XSLTPROC = "yes" &&
|
|
test $ac_cv_prog_XMLLINT = "yes" &&
|
|
test $ac_cv_prog_DBLATEX = "yes" &&
|
|
test $ac_cv_prog_PDFLATEX = "yes")
|
|
|
|
case "$build" in
|
|
*-*-darwin* ) glibcxx_include_dir_notparallel=yes ;;
|
|
* ) glibcxx_include_dir_notparallel=no ;;
|
|
esac
|
|
AM_CONDITIONAL(INCLUDE_DIR_NOTPARALLEL,
|
|
test $glibcxx_include_dir_notparallel = "yes")
|
|
|
|
# Propagate the target-specific source directories through the build chain.
|
|
ATOMICITY_SRCDIR=config/${atomicity_dir}
|
|
ATOMIC_WORD_SRCDIR=config/${atomic_word_dir}
|
|
ATOMIC_FLAGS=${atomic_flags}
|
|
CPU_DEFINES_SRCDIR=config/${cpu_defines_dir}
|
|
OS_INC_SRCDIR=config/${os_include_dir}
|
|
ERROR_CONSTANTS_SRCDIR=config/${error_constants_dir}
|
|
ABI_TWEAKS_SRCDIR=config/${abi_tweaks_dir}
|
|
CPU_OPT_EXT_RANDOM=config/${cpu_opt_ext_random}
|
|
CPU_OPT_BITS_RANDOM=config/${cpu_opt_bits_random}
|
|
AC_SUBST(ATOMICITY_SRCDIR)
|
|
AC_SUBST(ATOMIC_WORD_SRCDIR)
|
|
AC_SUBST(ATOMIC_FLAGS)
|
|
AC_SUBST(CPU_DEFINES_SRCDIR)
|
|
AC_SUBST(ABI_TWEAKS_SRCDIR)
|
|
AC_SUBST(OS_INC_SRCDIR)
|
|
AC_SUBST(ERROR_CONSTANTS_SRCDIR)
|
|
AC_SUBST(CPU_OPT_EXT_RANDOM)
|
|
AC_SUBST(CPU_OPT_BITS_RANDOM)
|
|
|
|
# Conditionalize the makefile for this target machine.
|
|
tmake_file_=
|
|
for f in ${tmake_file}
|
|
do
|
|
if test -f ${srcdir}/config/$f
|
|
then
|
|
tmake_file_="${tmake_file_} \$(srcdir)/config/$f"
|
|
fi
|
|
done
|
|
tmake_file="${tmake_file_}"
|
|
AC_SUBST(tmake_file)
|
|
|
|
# Add CET specific flags if Intel CET is enabled.
|
|
GCC_CET_FLAGS(CET_FLAGS)
|
|
EXTRA_CXX_FLAGS="$EXTRA_CXX_FLAGS $CET_FLAGS"
|
|
EXTRA_CFLAGS="$EXTRA_CFLAGS $CET_FLAGS"
|
|
AC_SUBST(EXTRA_CFLAGS)
|
|
AC_SUBST(EXTRA_CXX_FLAGS)
|
|
|
|
# Determine cross-compile flags and AM_CONDITIONALs.
|
|
#AC_SUBST(GLIBCXX_IS_NATIVE)
|
|
#AM_CONDITIONAL(CANADIAN, test $CANADIAN = yes)
|
|
GLIBCXX_EVALUATE_CONDITIONALS
|
|
|
|
AC_CACHE_SAVE
|
|
|
|
if test ${multilib} = yes; then
|
|
multilib_arg="--enable-multilib"
|
|
else
|
|
multilib_arg=
|
|
fi
|
|
|
|
# Export all the install information.
|
|
GLIBCXX_EXPORT_INSTALL_INFO
|
|
|
|
# Export all the include and flag information to Makefiles.
|
|
GLIBCXX_EXPORT_INCLUDES
|
|
GLIBCXX_EXPORT_FLAGS
|
|
|
|
# Determine what GCC version number to use in filesystem paths.
|
|
GCC_BASE_VER
|
|
|
|
dnl In autoconf 2.5x, AC_OUTPUT is replaced by four AC_CONFIG_* macros,
|
|
dnl which can all be called multiple times as needed, plus one (different)
|
|
dnl AC_OUTPUT macro. This one lists the files to be created:
|
|
AC_CONFIG_FILES(Makefile)
|
|
AC_CONFIG_FILES([scripts/testsuite_flags],[chmod +x scripts/testsuite_flags])
|
|
AC_CONFIG_FILES([scripts/extract_symvers],[chmod +x scripts/extract_symvers])
|
|
AC_CONFIG_FILES([doc/xsl/customization.xsl])
|
|
AC_CONFIG_FILES([src/libbacktrace/backtrace-supported.h])
|
|
|
|
# Multilibs need MULTISUBDIR defined correctly in certain makefiles so
|
|
# that multilib installs will end up installed in the correct place.
|
|
# The testsuite needs it for multilib-aware ABI baseline files.
|
|
# To work around this not being passed down from config-ml.in ->
|
|
# srcdir/Makefile.am -> srcdir/{src,libsupc++,...}/Makefile.am, manually
|
|
# append it here. Only modify Makefiles that have just been created.
|
|
#
|
|
# Also, get rid of this simulated-VPATH thing that automake does.
|
|
AC_CONFIG_FILES(AC_FOREACH([DIR], glibcxx_SUBDIRS, [DIR/Makefile ]),
|
|
[cat > vpsed$$ << \_EOF
|
|
s!`test -f '$<' || echo '$(srcdir)/'`!!
|
|
_EOF
|
|
sed -f vpsed$$ $ac_file > tmp$$
|
|
mv tmp$$ $ac_file
|
|
rm vpsed$$
|
|
echo 'MULTISUBDIR =' >> $ac_file
|
|
ml_norecursion=yes
|
|
. ${multi_basedir}/config-ml.in
|
|
AS_UNSET([ml_norecursion])
|
|
])
|
|
|
|
AC_CONFIG_COMMANDS([generate-headers],
|
|
[(cd include && ${MAKE-make} pch_build= )])
|
|
|
|
dnl And this actually makes things happen:
|
|
AC_OUTPUT
|