mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-26 21:33:59 +08:00
785 lines
25 KiB
Plaintext
785 lines
25 KiB
Plaintext
|
dnl acinclude.m4
|
||
|
dnl
|
||
|
dnl This file was derived from libstdc++-v3/acinclude.m4 and heavily pruned.
|
||
|
dnl Its purpose is to check for glibc time, gettimeofday and
|
||
|
dnl float128 availability.
|
||
|
dnl
|
||
|
dnl GLIBCXX_CONDITIONAL (NAME, SHELL-TEST)
|
||
|
dnl
|
||
|
dnl Exactly like AM_CONDITIONAL, but delays evaluation of the test until the
|
||
|
dnl end of configure. This lets tested variables be reassigned, and the
|
||
|
dnl conditional will depend on the final state of the variable. For a simple
|
||
|
dnl example of why this is needed, see GLIBCXX_ENABLE_HOSTED.
|
||
|
dnl
|
||
|
m4_define([_m4_divert(glibcxx_diversion)], 8000)dnl
|
||
|
AC_DEFUN([GLIBCXX_CONDITIONAL], [dnl
|
||
|
m4_divert_text([glibcxx_diversion],dnl
|
||
|
AM_CONDITIONAL([$1],[$2])
|
||
|
)dnl
|
||
|
])dnl
|
||
|
AC_DEFUN([GLIBCXX_EVALUATE_CONDITIONALS], [m4_undivert([glibcxx_diversion])])dnl
|
||
|
|
||
|
|
||
|
dnl
|
||
|
dnl Check to see what architecture and operating system we are compiling
|
||
|
dnl for. Also, if architecture- or OS-specific flags are required for
|
||
|
dnl compilation, pick them up here.
|
||
|
dnl
|
||
|
AC_DEFUN([GLIBCXX_CHECK_HOST], [
|
||
|
. $glibcxx_srcdir/configure.host
|
||
|
AC_MSG_NOTICE([CPU config directory is $cpu_include_dir])
|
||
|
AC_MSG_NOTICE([OS config directory is $os_include_dir])
|
||
|
])
|
||
|
|
||
|
|
||
|
dnl
|
||
|
dnl Initialize the rest of the library configury. At this point we have
|
||
|
dnl variables like $host.
|
||
|
dnl
|
||
|
dnl Sets:
|
||
|
dnl SUBDIRS
|
||
|
dnl Substs:
|
||
|
dnl glibcxx_builddir (absolute path)
|
||
|
dnl glibcxx_srcdir (absolute path)
|
||
|
dnl toplevel_builddir (absolute path)
|
||
|
dnl toplevel_srcdir (absolute path)
|
||
|
dnl with_cross_host
|
||
|
dnl with_newlib
|
||
|
dnl with_target_subdir
|
||
|
dnl plus
|
||
|
dnl - the variables in GLIBCXX_CHECK_HOST / configure.host
|
||
|
dnl - default settings for all AM_CONFITIONAL test variables
|
||
|
dnl - lots of tools, like CC and CXX
|
||
|
dnl
|
||
|
AC_DEFUN([GLIBCXX_CONFIGURE], [
|
||
|
# Keep these sync'd with the list in Makefile.am. The first provides an
|
||
|
# expandable list at autoconf time; the second provides an expandable list
|
||
|
# (i.e., shell variable) at configure time.
|
||
|
m4_define([glibcxx_SUBDIRS],[])
|
||
|
SUBDIRS='glibcxx_SUBDIRS'
|
||
|
|
||
|
# These need to be absolute paths, yet at the same time need to
|
||
|
# canonicalize only relative paths, because then amd will not unmount
|
||
|
# drives. Thus the use of PWDCMD: set it to 'pawd' or 'amq -w' if using amd.
|
||
|
glibcxx_builddir=`${PWDCMD-pwd}`
|
||
|
case $srcdir in
|
||
|
[\\/$]* | ?:[\\/]*) glibcxx_srcdir=${srcdir} ;;
|
||
|
*) glibcxx_srcdir=`cd "$srcdir" && ${PWDCMD-pwd} || echo "$srcdir"` ;;
|
||
|
esac
|
||
|
toplevel_builddir=${glibcxx_builddir}/..
|
||
|
toplevel_srcdir=${glibcxx_srcdir}/..
|
||
|
AC_SUBST(glibcxx_builddir)
|
||
|
AC_SUBST(glibcxx_srcdir)
|
||
|
AC_SUBST(toplevel_builddir)
|
||
|
AC_SUBST(toplevel_srcdir)
|
||
|
|
||
|
# We use these options to decide which functions to include. They are
|
||
|
# set from the top level.
|
||
|
AC_ARG_WITH([target-subdir],
|
||
|
AC_HELP_STRING([--with-target-subdir=SUBDIR],
|
||
|
[configuring in a subdirectory]))
|
||
|
|
||
|
AC_ARG_WITH([cross-host],
|
||
|
AC_HELP_STRING([--with-cross-host=HOST],
|
||
|
[configuring with a cross compiler]))
|
||
|
|
||
|
AC_ARG_WITH([newlib],
|
||
|
AC_HELP_STRING([--with-newlib],
|
||
|
[assume newlib as a system C library]))
|
||
|
|
||
|
# Will set LN_S to either 'ln -s', 'ln', or 'cp -p' (if linking isn't
|
||
|
# available). Uncomment the next line to force a particular method.
|
||
|
AC_PROG_LN_S
|
||
|
#LN_S='cp -p'
|
||
|
|
||
|
AC_CHECK_TOOL(AS, as)
|
||
|
AC_CHECK_TOOL(AR, ar)
|
||
|
AC_CHECK_TOOL(RANLIB, ranlib, ranlib-not-found-in-path-error)
|
||
|
|
||
|
AM_MAINTAINER_MODE
|
||
|
|
||
|
# Set up safe default values for all subsequent AM_CONDITIONAL tests
|
||
|
# which are themselves conditionally expanded.
|
||
|
## (Right now, this only matters for enable_wchar_t, but nothing prevents
|
||
|
## other macros from doing the same. This should be automated.) -pme
|
||
|
|
||
|
# Check for C library flavor since GNU/Linux platforms use different
|
||
|
# configuration directories depending on the C library in use.
|
||
|
AC_EGREP_CPP([_using_uclibc], [
|
||
|
#include <stdio.h>
|
||
|
#if __UCLIBC__
|
||
|
_using_uclibc
|
||
|
#endif
|
||
|
], uclibc=yes, uclibc=no)
|
||
|
|
||
|
AC_EGREP_CPP([_using_bionic], [
|
||
|
#include <stdio.h>
|
||
|
#if __BIONIC__
|
||
|
_using_bionic
|
||
|
#endif
|
||
|
], bionic=yes, bionic=no)
|
||
|
|
||
|
# Find platform-specific directories containing configuration info.
|
||
|
# Also possibly modify flags used elsewhere, as needed by the platform.
|
||
|
GLIBCXX_CHECK_HOST
|
||
|
])
|
||
|
|
||
|
|
||
|
dnl
|
||
|
dnl GLIBCXX_ENABLE
|
||
|
dnl (FEATURE, DEFAULT, HELP-ARG, HELP-STRING)
|
||
|
dnl (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, permit a|b|c)
|
||
|
dnl (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, SHELL-CODE-HANDLER)
|
||
|
dnl
|
||
|
dnl See manual/appendix_porting.html#appendix.porting.build_hacking for
|
||
|
dnl documentation.
|
||
|
dnl
|
||
|
m4_define([GLIBCXX_ENABLE],[dnl
|
||
|
m4_define([_g_switch],[--enable-$1])dnl
|
||
|
m4_define([_g_help],[AC_HELP_STRING([_g_switch$3],[$4 @<:@default=$2@:>@])])dnl
|
||
|
AC_ARG_ENABLE([$1],m4_dquote(_g_help),
|
||
|
m4_bmatch([$5],
|
||
|
[^permit ],
|
||
|
[[
|
||
|
case "$enableval" in
|
||
|
m4_bpatsubst([$5],[permit ])) ;;
|
||
|
*) AC_MSG_ERROR(Unknown argument to enable/disable $1) ;;
|
||
|
dnl Idea for future: generate a URL pointing to
|
||
|
dnl "onlinedocs/configopts.html#whatever"
|
||
|
esac
|
||
|
]],
|
||
|
[^$],
|
||
|
[[
|
||
|
case "$enableval" in
|
||
|
yes|no) ;;
|
||
|
*) AC_MSG_ERROR(Argument to enable/disable $1 must be yes or no) ;;
|
||
|
esac
|
||
|
]],
|
||
|
[[$5]]),
|
||
|
[enable_]m4_bpatsubst([$1],-,_)[=][$2])
|
||
|
m4_undefine([_g_switch])dnl
|
||
|
m4_undefine([_g_help])dnl
|
||
|
])
|
||
|
|
||
|
|
||
|
dnl
|
||
|
dnl Check for clock_gettime, nanosleep and sched_yield, used in the
|
||
|
dnl implementation of 20.11.7 [time.clock], and 30.3.2 [thread.thread.this]
|
||
|
dnl in the C++11 standard.
|
||
|
dnl
|
||
|
dnl --enable-libstdcxx-time
|
||
|
dnl --enable-libstdcxx-time=yes
|
||
|
dnl checks for the availability of monotonic and realtime clocks,
|
||
|
dnl nanosleep and sched_yield in libc.
|
||
|
dnl --enable-libstdcxx-time=rt
|
||
|
dnl also searches (and, if needed, links) librt. Note that this is
|
||
|
dnl not always desirable because, in glibc 2.16 and earlier, for
|
||
|
dnl example, in turn it triggers the linking of libpthread too,
|
||
|
dnl which activates locking,
|
||
|
dnl a large overhead for single-thread programs.
|
||
|
dnl --enable-libstdcxx-time=no
|
||
|
dnl --disable-libstdcxx-time
|
||
|
dnl disables the checks completely
|
||
|
dnl
|
||
|
dnl N.B. Darwin provides nanosleep but doesn't support the whole POSIX
|
||
|
dnl Timers option, so doesn't define _POSIX_TIMERS. Because the test
|
||
|
dnl below fails Darwin unconditionally defines _GLIBCXX_USE_NANOSLEEP in
|
||
|
dnl os_defines.h and also defines _GLIBCXX_USE_SCHED_YIELD.
|
||
|
dnl
|
||
|
dnl needed
|
||
|
AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_TIME], [
|
||
|
|
||
|
GLIBCXX_ENABLE(libstdcxx-time,auto,[[[=KIND]]],
|
||
|
[use KIND for check type],
|
||
|
[permit yes|no|rt])
|
||
|
|
||
|
AC_LANG_SAVE
|
||
|
AC_LANG_CPLUSPLUS
|
||
|
ac_save_CXXFLAGS="$CXXFLAGS"
|
||
|
CXXFLAGS="$CXXFLAGS -fno-exceptions"
|
||
|
ac_save_LIBS="$LIBS"
|
||
|
|
||
|
ac_has_clock_monotonic=no
|
||
|
ac_has_clock_realtime=no
|
||
|
ac_has_nanosleep=no
|
||
|
ac_has_sched_yield=no
|
||
|
|
||
|
if test x"$enable_libstdcxx_time" = x"auto"; then
|
||
|
|
||
|
case "${target_os}" in
|
||
|
cygwin*)
|
||
|
ac_has_nanosleep=yes
|
||
|
;;
|
||
|
mingw*)
|
||
|
ac_has_win32_sleep=yes
|
||
|
ac_has_sched_yield=yes
|
||
|
;;
|
||
|
darwin*)
|
||
|
ac_has_nanosleep=yes
|
||
|
ac_has_sched_yield=yes
|
||
|
;;
|
||
|
# VxWorks has nanosleep as soon as the kernel is configured with
|
||
|
# INCLUDE_POSIX_TIMERS, which is normally/most-often the case.
|
||
|
vxworks*)
|
||
|
ac_has_nanosleep=yes
|
||
|
;;
|
||
|
gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
|
||
|
# Don't use link test for freestanding library, in case gcc_no_link=yes
|
||
|
if test x"$is_hosted" = xyes; then
|
||
|
# Versions of glibc before 2.17 needed -lrt for clock_gettime.
|
||
|
AC_SEARCH_LIBS(clock_gettime, [rt])
|
||
|
if test x"$ac_cv_search_clock_gettime" = x"none required"; then
|
||
|
ac_has_clock_monotonic=yes
|
||
|
ac_has_clock_realtime=yes
|
||
|
fi
|
||
|
fi
|
||
|
ac_has_nanosleep=yes
|
||
|
ac_has_sched_yield=yes
|
||
|
;;
|
||
|
freebsd*|netbsd*|dragonfly*|rtems*)
|
||
|
ac_has_clock_monotonic=yes
|
||
|
ac_has_clock_realtime=yes
|
||
|
ac_has_nanosleep=yes
|
||
|
ac_has_sched_yield=yes
|
||
|
;;
|
||
|
openbsd*)
|
||
|
ac_has_clock_monotonic=yes
|
||
|
ac_has_clock_realtime=yes
|
||
|
ac_has_nanosleep=yes
|
||
|
;;
|
||
|
solaris*)
|
||
|
ac_has_clock_monotonic=yes
|
||
|
ac_has_clock_realtime=yes
|
||
|
ac_has_nanosleep=yes
|
||
|
ac_has_sched_yield=yes
|
||
|
;;
|
||
|
uclinux*)
|
||
|
ac_has_nanosleep=yes
|
||
|
ac_has_sched_yield=yes
|
||
|
esac
|
||
|
|
||
|
elif test x"$enable_libstdcxx_time" != x"no"; then
|
||
|
|
||
|
if test x"$enable_libstdcxx_time" = x"rt"; then
|
||
|
AC_SEARCH_LIBS(clock_gettime, [rt])
|
||
|
AC_SEARCH_LIBS(nanosleep, [rt])
|
||
|
else
|
||
|
AC_CHECK_FUNC(clock_gettime)
|
||
|
AC_CHECK_FUNC(nanosleep)
|
||
|
fi
|
||
|
|
||
|
case "$ac_cv_search_clock_gettime" in
|
||
|
-l*) GLIBCXX_LIBS=$ac_cv_search_clock_gettime
|
||
|
;;
|
||
|
esac
|
||
|
case "$ac_cv_search_nanosleep" in
|
||
|
-l*) GLIBCXX_LIBS="$GLIBCXX_LIBS $ac_cv_search_nanosleep"
|
||
|
;;
|
||
|
esac
|
||
|
|
||
|
AC_SEARCH_LIBS(sched_yield, [rt])
|
||
|
|
||
|
case "$ac_cv_search_sched_yield" in
|
||
|
-lrt*)
|
||
|
if test x"$enable_libstdcxx_time" = x"rt"; then
|
||
|
GLIBCXX_LIBS="$GLIBCXX_LIBS $ac_cv_search_sched_yield"
|
||
|
ac_has_sched_yield=yes
|
||
|
fi
|
||
|
;;
|
||
|
*)
|
||
|
ac_has_sched_yield=yes
|
||
|
;;
|
||
|
esac
|
||
|
|
||
|
AC_CHECK_HEADERS(unistd.h, ac_has_unistd_h=yes, ac_has_unistd_h=no)
|
||
|
|
||
|
if test x"$ac_has_unistd_h" = x"yes"; then
|
||
|
AC_MSG_CHECKING([for monotonic clock])
|
||
|
AC_TRY_LINK(
|
||
|
[#include <unistd.h>
|
||
|
#include <time.h>
|
||
|
],
|
||
|
[#if _POSIX_TIMERS > 0 && defined(_POSIX_MONOTONIC_CLOCK)
|
||
|
timespec tp;
|
||
|
#endif
|
||
|
clock_gettime(CLOCK_MONOTONIC, &tp);
|
||
|
], [ac_has_clock_monotonic=yes], [ac_has_clock_monotonic=no])
|
||
|
|
||
|
AC_MSG_RESULT($ac_has_clock_monotonic)
|
||
|
|
||
|
AC_MSG_CHECKING([for realtime clock])
|
||
|
AC_TRY_LINK(
|
||
|
[#include <unistd.h>
|
||
|
#include <time.h>
|
||
|
],
|
||
|
[#if _POSIX_TIMERS > 0
|
||
|
timespec tp;
|
||
|
#endif
|
||
|
clock_gettime(CLOCK_REALTIME, &tp);
|
||
|
], [ac_has_clock_realtime=yes], [ac_has_clock_realtime=no])
|
||
|
|
||
|
AC_MSG_RESULT($ac_has_clock_realtime)
|
||
|
|
||
|
AC_MSG_CHECKING([for nanosleep])
|
||
|
AC_TRY_LINK(
|
||
|
[#include <unistd.h>
|
||
|
#include <time.h>
|
||
|
],
|
||
|
[#if _POSIX_TIMERS > 0
|
||
|
timespec tp;
|
||
|
#endif
|
||
|
nanosleep(&tp, 0);
|
||
|
], [ac_has_nanosleep=yes], [ac_has_nanosleep=no])
|
||
|
|
||
|
AC_MSG_RESULT($ac_has_nanosleep)
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
if test x"$ac_has_clock_monotonic" != x"yes"; then
|
||
|
case ${target_os} in
|
||
|
linux* | uclinux*)
|
||
|
AC_MSG_CHECKING([for clock_gettime syscall])
|
||
|
AC_TRY_COMPILE(
|
||
|
[#include <unistd.h>
|
||
|
#include <time.h>
|
||
|
#include <sys/syscall.h>
|
||
|
],
|
||
|
[#if _POSIX_TIMERS > 0 && defined(_POSIX_MONOTONIC_CLOCK)
|
||
|
timespec tp;
|
||
|
#endif
|
||
|
syscall(SYS_clock_gettime, CLOCK_MONOTONIC, &tp);
|
||
|
syscall(SYS_clock_gettime, CLOCK_REALTIME, &tp);
|
||
|
], [ac_has_clock_gettime_syscall=yes], [ac_has_clock_gettime_syscall=no])
|
||
|
AC_MSG_RESULT($ac_has_clock_gettime_syscall)
|
||
|
if test x"$ac_has_clock_gettime_syscall" = x"yes"; then
|
||
|
AC_DEFINE(_GLIBCXX_USE_CLOCK_GETTIME_SYSCALL, 1,
|
||
|
[Defined if clock_gettime syscall has monotonic and realtime clock support. ])
|
||
|
ac_has_clock_monotonic=yes
|
||
|
ac_has_clock_realtime=yes
|
||
|
AC_MSG_CHECKING([for struct timespec that matches syscall])
|
||
|
AC_TRY_COMPILE(
|
||
|
[#include <time.h>
|
||
|
#include <sys/syscall.h>
|
||
|
],
|
||
|
[#ifdef SYS_clock_gettime64
|
||
|
#if SYS_clock_gettime64 != SYS_clock_gettime
|
||
|
// We need to use SYS_clock_gettime and libc appears to
|
||
|
// also know about the SYS_clock_gettime64 syscall.
|
||
|
// Check that userspace doesn't use time64 version of timespec.
|
||
|
static_assert(sizeof(timespec::tv_sec) == sizeof(long),
|
||
|
"struct timespec must be compatible with SYS_clock_gettime");
|
||
|
#endif
|
||
|
#endif
|
||
|
],
|
||
|
[ac_timespec_matches_syscall=yes],
|
||
|
[ac_timespec_matches_syscall=no])
|
||
|
AC_MSG_RESULT($ac_timespec_matches_syscall)
|
||
|
if test x"$ac_timespec_matches_syscall" = no; then
|
||
|
AC_MSG_ERROR([struct timespec is not compatible with SYS_clock_gettime, please report a bug to http://gcc.gnu.org/bugzilla])
|
||
|
fi
|
||
|
fi;;
|
||
|
esac
|
||
|
fi
|
||
|
|
||
|
if test x"$ac_has_clock_monotonic" = x"yes"; then
|
||
|
AC_DEFINE(_GLIBCXX_USE_CLOCK_MONOTONIC, 1,
|
||
|
[ Defined if clock_gettime has monotonic clock support. ])
|
||
|
fi
|
||
|
|
||
|
if test x"$ac_has_clock_realtime" = x"yes"; then
|
||
|
AC_DEFINE(_GLIBCXX_USE_CLOCK_REALTIME, 1,
|
||
|
[ Defined if clock_gettime has realtime clock support. ])
|
||
|
fi
|
||
|
|
||
|
if test x"$ac_has_sched_yield" = x"yes"; then
|
||
|
AC_DEFINE(_GLIBCXX_USE_SCHED_YIELD, 1,
|
||
|
[ Defined if sched_yield is available. ])
|
||
|
fi
|
||
|
|
||
|
if test x"$ac_has_nanosleep" = x"yes"; then
|
||
|
AC_DEFINE(_GLIBCXX_USE_NANOSLEEP, 1,
|
||
|
[ Defined if nanosleep is available. ])
|
||
|
elif test x"$ac_has_win32_sleep" = x"yes"; then
|
||
|
AC_DEFINE(_GLIBCXX_USE_WIN32_SLEEP, 1,
|
||
|
[Defined if Sleep exists.])
|
||
|
else
|
||
|
AC_MSG_CHECKING([for sleep])
|
||
|
AC_TRY_COMPILE([#include <unistd.h>],
|
||
|
[sleep(1)],
|
||
|
[ac_has_sleep=yes],[ac_has_sleep=no])
|
||
|
if test x"$ac_has_sleep" = x"yes"; then
|
||
|
AC_DEFINE(HAVE_SLEEP,1, [Defined if sleep exists.])
|
||
|
fi
|
||
|
AC_MSG_RESULT($ac_has_sleep)
|
||
|
AC_MSG_CHECKING([for usleep])
|
||
|
AC_TRY_COMPILE([#include <unistd.h>],
|
||
|
[sleep(1);
|
||
|
usleep(100);],
|
||
|
[ac_has_usleep=yes],[ac_has_usleep=no])
|
||
|
if test x"$ac_has_usleep" = x"yes"; then
|
||
|
AC_DEFINE(HAVE_USLEEP,1, [Defined if usleep exists.])
|
||
|
fi
|
||
|
AC_MSG_RESULT($ac_has_usleep)
|
||
|
fi
|
||
|
|
||
|
if test x"$ac_has_nanosleep$ac_has_win32_sleep$ac_has_sleep" = x"nonono"; then
|
||
|
AC_DEFINE(_GLIBCXX_NO_SLEEP,1, [Defined if no way to sleep is available.])
|
||
|
fi
|
||
|
|
||
|
AC_SUBST(GLIBCXX_LIBS)
|
||
|
|
||
|
CXXFLAGS="$ac_save_CXXFLAGS"
|
||
|
LIBS="$ac_save_LIBS"
|
||
|
AC_LANG_RESTORE
|
||
|
])
|
||
|
|
||
|
dnl
|
||
|
dnl Check for gettimeofday, used in the implementation of 20.11.7
|
||
|
dnl [time.clock] in the C++11 standard.
|
||
|
dnl
|
||
|
dnl needed
|
||
|
AC_DEFUN([GLIBCXX_CHECK_GETTIMEOFDAY], [
|
||
|
|
||
|
AC_MSG_CHECKING([for gettimeofday])
|
||
|
|
||
|
AC_LANG_SAVE
|
||
|
AC_LANG_CPLUSPLUS
|
||
|
ac_save_CXXFLAGS="$CXXFLAGS"
|
||
|
CXXFLAGS="$CXXFLAGS -fno-exceptions"
|
||
|
|
||
|
ac_has_gettimeofday=no;
|
||
|
AC_CHECK_HEADERS(sys/time.h, ac_has_sys_time_h=yes, ac_has_sys_time_h=no)
|
||
|
if test x"$ac_has_sys_time_h" = x"yes"; then
|
||
|
AC_MSG_CHECKING([for gettimeofday])
|
||
|
GCC_TRY_COMPILE_OR_LINK([#include <sys/time.h>],
|
||
|
[timeval tv; gettimeofday(&tv, 0);],
|
||
|
[ac_has_gettimeofday=yes], [ac_has_gettimeofday=no])
|
||
|
|
||
|
AC_MSG_RESULT($ac_has_gettimeofday)
|
||
|
fi
|
||
|
|
||
|
if test x"$ac_has_gettimeofday" = x"yes"; then
|
||
|
AC_DEFINE(_GLIBCXX_USE_GETTIMEOFDAY, 1,
|
||
|
[ Defined if gettimeofday is available. ])
|
||
|
fi
|
||
|
|
||
|
CXXFLAGS="$ac_save_CXXFLAGS"
|
||
|
AC_LANG_RESTORE
|
||
|
])
|
||
|
|
||
|
dnl
|
||
|
dnl Check for which locale library to use. The choice is mapped to
|
||
|
dnl a subdirectory of config/locale.
|
||
|
dnl
|
||
|
dnl Default is generic.
|
||
|
dnl
|
||
|
AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [
|
||
|
GLIBCXX_ENABLE(clocale,auto,[[[=MODEL]]],
|
||
|
[use MODEL for target locale package],
|
||
|
[permit generic|gnu|ieee_1003.1-2001|newlib|yes|no|auto])
|
||
|
|
||
|
# Deal with gettext issues. Default to not using it (=no) until we detect
|
||
|
# support for it later. Let the user turn it off via --e/d, but let that
|
||
|
# default to on for easier handling.
|
||
|
USE_NLS=no
|
||
|
AC_ARG_ENABLE(nls,
|
||
|
AC_HELP_STRING([--enable-nls],[use Native Language Support (default)]),
|
||
|
[],
|
||
|
[enable_nls=yes])
|
||
|
|
||
|
# Either a known package, or "auto"
|
||
|
if test $enable_clocale = no || test $enable_clocale = yes; then
|
||
|
enable_clocale=auto
|
||
|
fi
|
||
|
enable_clocale_flag=$enable_clocale
|
||
|
|
||
|
# Probe for locale model to use if none specified.
|
||
|
# Default to "generic".
|
||
|
if test $enable_clocale_flag = auto; then
|
||
|
case ${target_os} in
|
||
|
linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
|
||
|
enable_clocale_flag=gnu
|
||
|
;;
|
||
|
darwin*)
|
||
|
enable_clocale_flag=darwin
|
||
|
;;
|
||
|
vxworks*)
|
||
|
enable_clocale_flag=vxworks
|
||
|
;;
|
||
|
dragonfly* | freebsd*)
|
||
|
enable_clocale_flag=dragonfly
|
||
|
;;
|
||
|
openbsd*)
|
||
|
enable_clocale_flag=newlib
|
||
|
;;
|
||
|
*)
|
||
|
if test x"$with_newlib" = x"yes"; then
|
||
|
enable_clocale_flag=newlib
|
||
|
else
|
||
|
enable_clocale_flag=generic
|
||
|
fi
|
||
|
;;
|
||
|
esac
|
||
|
fi
|
||
|
|
||
|
# Sanity check model, and test for special functionality.
|
||
|
if test $enable_clocale_flag = gnu; then
|
||
|
AC_EGREP_CPP([_GLIBCXX_ok], [
|
||
|
#include <features.h>
|
||
|
#if (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)) && !defined(__UCLIBC__)
|
||
|
_GLIBCXX_ok
|
||
|
#endif
|
||
|
], enable_clocale_flag=gnu, enable_clocale_flag=generic)
|
||
|
|
||
|
# Set it to scream when it hurts.
|
||
|
ac_save_CFLAGS="$CFLAGS"
|
||
|
CFLAGS="-Wimplicit-function-declaration -Werror"
|
||
|
|
||
|
# Use strxfrm_l if available.
|
||
|
AC_TRY_COMPILE([#define _GNU_SOURCE 1
|
||
|
#include <string.h>
|
||
|
#include <locale.h>],
|
||
|
[char s[128]; __locale_t loc; strxfrm_l(s, "C", 5, loc);],
|
||
|
AC_DEFINE(HAVE_STRXFRM_L, 1,
|
||
|
[Define if strxfrm_l is available in <string.h>.]),)
|
||
|
|
||
|
# Use strerror_l if available.
|
||
|
AC_TRY_COMPILE([#define _GNU_SOURCE 1
|
||
|
#include <string.h>
|
||
|
#include <locale.h>],
|
||
|
[__locale_t loc; strerror_l(5, loc);],
|
||
|
AC_DEFINE(HAVE_STRERROR_L, 1,
|
||
|
[Define if strerror_l is available in <string.h>.]),)
|
||
|
|
||
|
CFLAGS="$ac_save_CFLAGS"
|
||
|
fi
|
||
|
|
||
|
# Perhaps use strerror_r if available, and strerror_l isn't.
|
||
|
ac_save_CFLAGS="$CFLAGS"
|
||
|
CFLAGS="-Wimplicit-function-declaration -Werror"
|
||
|
AC_TRY_COMPILE([#define _GNU_SOURCE 1
|
||
|
#include <string.h>
|
||
|
#include <locale.h>],
|
||
|
[char s[128]; strerror_r(5, s, 128);],
|
||
|
AC_DEFINE(HAVE_STRERROR_R, 1,
|
||
|
[Define if strerror_r is available in <string.h>.]),)
|
||
|
CFLAGS="$ac_save_CFLAGS"
|
||
|
|
||
|
# Set configure bits for specified locale package
|
||
|
AC_MSG_CHECKING([for C locale to use])
|
||
|
case ${enable_clocale_flag} in
|
||
|
generic)
|
||
|
AC_MSG_RESULT(generic)
|
||
|
|
||
|
CLOCALE_H=config/locale/generic/c_locale.h
|
||
|
CLOCALE_CC=config/locale/generic/c_locale.cc
|
||
|
CCODECVT_CC=config/locale/generic/codecvt_members.cc
|
||
|
CCOLLATE_CC=config/locale/generic/collate_members.cc
|
||
|
CCTYPE_CC=config/locale/generic/ctype_members.cc
|
||
|
CMESSAGES_H=config/locale/generic/messages_members.h
|
||
|
CMESSAGES_CC=config/locale/generic/messages_members.cc
|
||
|
CMONEY_CC=config/locale/generic/monetary_members.cc
|
||
|
CNUMERIC_CC=config/locale/generic/numeric_members.cc
|
||
|
CTIME_H=config/locale/generic/time_members.h
|
||
|
CTIME_CC=config/locale/generic/time_members.cc
|
||
|
CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
|
||
|
;;
|
||
|
darwin)
|
||
|
AC_MSG_RESULT(darwin)
|
||
|
|
||
|
CLOCALE_H=config/locale/generic/c_locale.h
|
||
|
CLOCALE_CC=config/locale/generic/c_locale.cc
|
||
|
CCODECVT_CC=config/locale/generic/codecvt_members.cc
|
||
|
CCOLLATE_CC=config/locale/generic/collate_members.cc
|
||
|
CCTYPE_CC=config/locale/darwin/ctype_members.cc
|
||
|
CMESSAGES_H=config/locale/generic/messages_members.h
|
||
|
CMESSAGES_CC=config/locale/generic/messages_members.cc
|
||
|
CMONEY_CC=config/locale/generic/monetary_members.cc
|
||
|
CNUMERIC_CC=config/locale/generic/numeric_members.cc
|
||
|
CTIME_H=config/locale/generic/time_members.h
|
||
|
CTIME_CC=config/locale/generic/time_members.cc
|
||
|
CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
|
||
|
;;
|
||
|
vxworks)
|
||
|
AC_MSG_RESULT(vxworks)
|
||
|
|
||
|
CLOCALE_H=config/locale/generic/c_locale.h
|
||
|
CLOCALE_CC=config/locale/generic/c_locale.cc
|
||
|
CCODECVT_CC=config/locale/generic/codecvt_members.cc
|
||
|
CCOLLATE_CC=config/locale/generic/collate_members.cc
|
||
|
CCTYPE_CC=config/locale/vxworks/ctype_members.cc
|
||
|
CMESSAGES_H=config/locale/generic/messages_members.h
|
||
|
CMESSAGES_CC=config/locale/generic/messages_members.cc
|
||
|
CMONEY_CC=config/locale/generic/monetary_members.cc
|
||
|
CNUMERIC_CC=config/locale/generic/numeric_members.cc
|
||
|
CTIME_H=config/locale/generic/time_members.h
|
||
|
CTIME_CC=config/locale/generic/time_members.cc
|
||
|
CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
|
||
|
;;
|
||
|
dragonfly)
|
||
|
AC_MSG_RESULT(dragonfly or freebsd)
|
||
|
|
||
|
CLOCALE_H=config/locale/dragonfly/c_locale.h
|
||
|
CLOCALE_CC=config/locale/dragonfly/c_locale.cc
|
||
|
CCODECVT_CC=config/locale/dragonfly/codecvt_members.cc
|
||
|
CCOLLATE_CC=config/locale/dragonfly/collate_members.cc
|
||
|
CCTYPE_CC=config/locale/dragonfly/ctype_members.cc
|
||
|
CMESSAGES_H=config/locale/generic/messages_members.h
|
||
|
CMESSAGES_CC=config/locale/generic/messages_members.cc
|
||
|
CMONEY_CC=config/locale/dragonfly/monetary_members.cc
|
||
|
CNUMERIC_CC=config/locale/dragonfly/numeric_members.cc
|
||
|
CTIME_H=config/locale/dragonfly/time_members.h
|
||
|
CTIME_CC=config/locale/dragonfly/time_members.cc
|
||
|
CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
|
||
|
;;
|
||
|
|
||
|
gnu)
|
||
|
AC_MSG_RESULT(gnu)
|
||
|
|
||
|
# Declare intention to use gettext, and add support for specific
|
||
|
# languages.
|
||
|
# For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT
|
||
|
ALL_LINGUAS="de fr"
|
||
|
|
||
|
# Don't call AM-GNU-GETTEXT here. Instead, assume glibc.
|
||
|
AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no)
|
||
|
if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
|
||
|
USE_NLS=yes
|
||
|
fi
|
||
|
# Export the build objects.
|
||
|
for ling in $ALL_LINGUAS; do \
|
||
|
glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \
|
||
|
glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \
|
||
|
done
|
||
|
AC_SUBST(glibcxx_MOFILES)
|
||
|
AC_SUBST(glibcxx_POFILES)
|
||
|
|
||
|
CLOCALE_H=config/locale/gnu/c_locale.h
|
||
|
CLOCALE_CC=config/locale/gnu/c_locale.cc
|
||
|
CCODECVT_CC=config/locale/gnu/codecvt_members.cc
|
||
|
CCOLLATE_CC=config/locale/gnu/collate_members.cc
|
||
|
CCTYPE_CC=config/locale/gnu/ctype_members.cc
|
||
|
CMESSAGES_H=config/locale/gnu/messages_members.h
|
||
|
CMESSAGES_CC=config/locale/gnu/messages_members.cc
|
||
|
CMONEY_CC=config/locale/gnu/monetary_members.cc
|
||
|
CNUMERIC_CC=config/locale/gnu/numeric_members.cc
|
||
|
CTIME_H=config/locale/gnu/time_members.h
|
||
|
CTIME_CC=config/locale/gnu/time_members.cc
|
||
|
CLOCALE_INTERNAL_H=config/locale/gnu/c++locale_internal.h
|
||
|
;;
|
||
|
ieee_1003.1-2001)
|
||
|
AC_MSG_RESULT(IEEE 1003.1)
|
||
|
|
||
|
CLOCALE_H=config/locale/ieee_1003.1-2001/c_locale.h
|
||
|
CLOCALE_CC=config/locale/ieee_1003.1-2001/c_locale.cc
|
||
|
CCODECVT_CC=config/locale/generic/codecvt_members.cc
|
||
|
CCOLLATE_CC=config/locale/generic/collate_members.cc
|
||
|
CCTYPE_CC=config/locale/generic/ctype_members.cc
|
||
|
CMESSAGES_H=config/locale/ieee_1003.1-2001/messages_members.h
|
||
|
CMESSAGES_CC=config/locale/ieee_1003.1-2001/messages_members.cc
|
||
|
CMONEY_CC=config/locale/generic/monetary_members.cc
|
||
|
CNUMERIC_CC=config/locale/generic/numeric_members.cc
|
||
|
CTIME_H=config/locale/generic/time_members.h
|
||
|
CTIME_CC=config/locale/generic/time_members.cc
|
||
|
CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
|
||
|
;;
|
||
|
newlib)
|
||
|
AC_MSG_RESULT(newlib)
|
||
|
|
||
|
CLOCALE_H=config/locale/generic/c_locale.h
|
||
|
CLOCALE_CC=config/locale/generic/c_locale.cc
|
||
|
CCODECVT_CC=config/locale/generic/codecvt_members.cc
|
||
|
CCOLLATE_CC=config/locale/generic/collate_members.cc
|
||
|
CCTYPE_CC=config/locale/newlib/ctype_members.cc
|
||
|
CMESSAGES_H=config/locale/generic/messages_members.h
|
||
|
CMESSAGES_CC=config/locale/generic/messages_members.cc
|
||
|
CMONEY_CC=config/locale/generic/monetary_members.cc
|
||
|
CNUMERIC_CC=config/locale/generic/numeric_members.cc
|
||
|
CTIME_H=config/locale/generic/time_members.h
|
||
|
CTIME_CC=config/locale/generic/time_members.cc
|
||
|
CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
|
||
|
;;
|
||
|
esac
|
||
|
|
||
|
# This is where the testsuite looks for locale catalogs, using the
|
||
|
# -DLOCALEDIR define during testsuite compilation.
|
||
|
glibcxx_localedir=${glibcxx_builddir}/po/share/locale
|
||
|
AC_SUBST(glibcxx_localedir)
|
||
|
|
||
|
# A standalone libintl (e.g., GNU libintl) may be in use.
|
||
|
if test $USE_NLS = yes; then
|
||
|
AC_CHECK_HEADERS([libintl.h], [], USE_NLS=no)
|
||
|
AC_SEARCH_LIBS(gettext, intl, [], USE_NLS=no)
|
||
|
fi
|
||
|
if test $USE_NLS = yes; then
|
||
|
AC_DEFINE(_GLIBCXX_USE_NLS, 1,
|
||
|
[Define if NLS translations are to be used.])
|
||
|
fi
|
||
|
|
||
|
AC_SUBST(USE_NLS)
|
||
|
AC_SUBST(CLOCALE_H)
|
||
|
AC_SUBST(CMESSAGES_H)
|
||
|
AC_SUBST(CCODECVT_CC)
|
||
|
AC_SUBST(CCOLLATE_CC)
|
||
|
AC_SUBST(CCTYPE_CC)
|
||
|
AC_SUBST(CMESSAGES_CC)
|
||
|
AC_SUBST(CMONEY_CC)
|
||
|
AC_SUBST(CNUMERIC_CC)
|
||
|
AC_SUBST(CTIME_H)
|
||
|
AC_SUBST(CTIME_CC)
|
||
|
AC_SUBST(CLOCALE_CC)
|
||
|
AC_SUBST(CLOCALE_INTERNAL_H)
|
||
|
])
|
||
|
|
||
|
|
||
|
dnl
|
||
|
dnl Check for GNU 128-bit floating point type.
|
||
|
dnl
|
||
|
dnl Note: also checks that the type isn't a standard types.
|
||
|
dnl
|
||
|
dnl Defines:
|
||
|
dnl ENABLE_FLOAT128
|
||
|
dnl
|
||
|
AC_DEFUN([GLIBCXX_ENABLE_FLOAT128], [
|
||
|
|
||
|
AC_LANG_SAVE
|
||
|
AC_LANG_CPLUSPLUS
|
||
|
|
||
|
# Fake what AC_TRY_COMPILE does, without linking as this is
|
||
|
# unnecessary for this test.
|
||
|
|
||
|
cat > conftest.$ac_ext << EOF
|
||
|
[#]line __oline__ "configure"
|
||
|
template<typename T1, typename T2>
|
||
|
struct same
|
||
|
{ typedef T2 type; };
|
||
|
|
||
|
template<typename T>
|
||
|
struct same<T, T>;
|
||
|
|
||
|
int main()
|
||
|
{
|
||
|
typename same<double, __float128>::type f1;
|
||
|
typename same<long double, __float128>::type f2;
|
||
|
}
|
||
|
EOF
|
||
|
|
||
|
AC_MSG_CHECKING([for __float128])
|
||
|
if AC_TRY_EVAL(ac_compile); then
|
||
|
enable_float128=yes
|
||
|
else
|
||
|
enable_float128=no
|
||
|
fi
|
||
|
AC_MSG_RESULT($enable_float128)
|
||
|
GLIBCXX_CONDITIONAL(ENABLE_FLOAT128, test $enable_float128 = yes)
|
||
|
rm -f conftest*
|
||
|
|
||
|
AC_LANG_RESTORE
|
||
|
])
|
||
|
|
||
|
# Macros from the top-level gcc directory.
|
||
|
m4_include([../config/gc++filt.m4])
|
||
|
m4_include([../config/tls.m4])
|
||
|
m4_include([../config/gthr.m4])
|
||
|
m4_include([../config/cet.m4])
|