123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- # intl-thread-locale.m4 serial 9
- dnl Copyright (C) 2015-2021 Free Software Foundation, Inc.
- dnl This file is free software; the Free Software Foundation
- dnl gives unlimited permission to copy and/or distribute it,
- dnl with or without modifications, as long as this notice is preserved.
- dnl
- dnl This file can be used in projects which are not available under
- dnl the GNU General Public License or the GNU Lesser General Public
- dnl License but which still want to provide support for the GNU gettext
- dnl functionality.
- dnl Please note that the actual code of the GNU gettext library is covered
- dnl by the GNU Lesser General Public License, and the rest of the GNU
- dnl gettext package is covered by the GNU General Public License.
- dnl They are *not* in the public domain.
- dnl Check how to retrieve the name of a per-thread locale (POSIX locale_t).
- dnl Sets gt_nameless_locales.
- AC_DEFUN([gt_INTL_THREAD_LOCALE_NAME],
- [
- AC_REQUIRE([AC_CANONICAL_HOST])
- dnl Persuade Solaris <locale.h> to define 'locale_t'.
- AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
- dnl Test whether uselocale() exists and works at all.
- gt_FUNC_USELOCALE
- dnl On OpenBSD >= 6.2, the locale_t type and the uselocale(), newlocale(),
- dnl duplocale(), freelocale() functions exist but are effectively useless,
- dnl because the locale_t value depends only on the LC_CTYPE category of the
- dnl locale and furthermore contains only one bit of information (it
- dnl distinguishes the "C" locale from the *.UTF-8 locales). See
- dnl <https://cvsweb.openbsd.org/src/lib/libc/locale/newlocale.c?rev=1.1&content-type=text/x-cvsweb-markup>.
- dnl In the setlocale() implementation they have thought about the programs
- dnl that use the API ("Even though only LC_CTYPE has any effect in the
- dnl OpenBSD base system, store complete information about the global locale,
- dnl such that third-party software can access it"), but for uselocale()
- dnl they did not think about the programs.
- dnl In this situation, even the HAVE_NAMELESS_LOCALES support does not work.
- dnl So, define HAVE_FAKE_LOCALES and disable all locale_t support.
- case "$gt_cv_func_uselocale_works" in
- *yes)
- AC_CHECK_HEADERS_ONCE([xlocale.h])
- AC_CACHE_CHECK([for fake locale system (OpenBSD)],
- [gt_cv_locale_fake],
- [AC_RUN_IFELSE(
- [AC_LANG_SOURCE([[
- #include <locale.h>
- #if HAVE_XLOCALE_H
- # include <xlocale.h>
- #endif
- int main ()
- {
- locale_t loc1, loc2;
- if (setlocale (LC_ALL, "de_DE.UTF-8") == NULL) return 1;
- if (setlocale (LC_ALL, "fr_FR.UTF-8") == NULL) return 1;
- loc1 = newlocale (LC_ALL_MASK, "de_DE.UTF-8", (locale_t)0);
- loc2 = newlocale (LC_ALL_MASK, "fr_FR.UTF-8", (locale_t)0);
- return !(loc1 == loc2);
- }]])],
- [gt_cv_locale_fake=yes],
- [gt_cv_locale_fake=no],
- [dnl Guess the locale system is fake only on OpenBSD.
- case "$host_os" in
- openbsd*) gt_cv_locale_fake="guessing yes" ;;
- *) gt_cv_locale_fake="guessing no" ;;
- esac
- ])
- ])
- ;;
- *) gt_cv_locale_fake=no ;;
- esac
- case "$gt_cv_locale_fake" in
- *yes)
- gt_fake_locales=yes
- AC_DEFINE([HAVE_FAKE_LOCALES], [1],
- [Define if the locale_t type contains insufficient information, as on OpenBSD.])
- ;;
- *)
- gt_fake_locales=no
- ;;
- esac
- case "$gt_cv_func_uselocale_works" in
- *yes)
- AC_CACHE_CHECK([for Solaris 11.4 locale system],
- [gt_cv_locale_solaris114],
- [case "$host_os" in
- solaris*)
- dnl Test whether <locale.h> defines locale_t as a typedef of
- dnl 'struct _LC_locale_t **' (whereas Illumos defines it as a
- dnl typedef of 'struct _locale *').
- dnl Another possible test would be to include <sys/localedef.h>
- dnl and test whether it defines the _LC_core_data_locale_t type.
- dnl This type was added in Solaris 11.4.
- AC_COMPILE_IFELSE(
- [AC_LANG_PROGRAM([[
- #include <locale.h>
- struct _LC_locale_t *x;
- locale_t y;
- ]],
- [[*y = x;]])],
- [gt_cv_locale_solaris114=yes],
- [gt_cv_locale_solaris114=no])
- ;;
- *) gt_cv_locale_solaris114=no ;;
- esac
- ])
- ;;
- *) gt_cv_locale_solaris114=no ;;
- esac
- if test $gt_cv_locale_solaris114 = yes; then
- AC_DEFINE([HAVE_SOLARIS114_LOCALES], [1],
- [Define if the locale_t type is as on Solaris 11.4.])
- fi
- dnl Solaris 12 will maybe provide getlocalename_l. If it does, it will
- dnl improve the implementation of gl_locale_name_thread(), by removing
- dnl the use of undocumented structures.
- case "$gt_cv_func_uselocale_works" in
- *yes)
- AC_CHECK_FUNCS([getlocalename_l])
- ;;
- esac
- dnl This code is for platforms where the locale_t type does not provide access
- dnl to the name of each locale category. This code has the drawback that it
- dnl requires the gnulib overrides of 'newlocale', 'duplocale', 'freelocale',
- dnl which is a problem for GNU libunistring. Therefore try hard to avoid
- dnl enabling this code!
- gt_nameless_locales=no
- case "$host_os" in
- dnl It's needed on AIX 7.2.
- aix*)
- gt_nameless_locales=yes
- AC_DEFINE([HAVE_NAMELESS_LOCALES], [1],
- [Define if the locale_t type does not contain the name of each locale category.])
- ;;
- esac
- dnl We cannot support uselocale() on platforms where the locale_t type is
- dnl fake. So, set
- dnl gt_good_uselocale = gt_working_uselocale && !gt_fake_locales.
- if test $gt_working_uselocale = yes && test $gt_fake_locales = no; then
- gt_good_uselocale=yes
- AC_DEFINE([HAVE_GOOD_USELOCALE], [1],
- [Define if the uselocale exists, may be safely called, and returns sufficient information.])
- else
- gt_good_uselocale=no
- fi
- dnl Set gt_localename_enhances_locale_funcs to indicate whether localename.c
- dnl overrides newlocale(), duplocale(), freelocale() to keep track of locale
- dnl names.
- if test $gt_good_uselocale = yes && test $gt_nameless_locales = yes; then
- gt_localename_enhances_locale_funcs=yes
- LOCALENAME_ENHANCE_LOCALE_FUNCS=1
- AC_DEFINE([LOCALENAME_ENHANCE_LOCALE_FUNCS], [1],
- [Define if localename.c overrides newlocale(), duplocale(), freelocale().])
- else
- gt_localename_enhances_locale_funcs=no
- fi
- ])
- dnl Tests whether uselocale() exists and is usable.
- dnl Sets gt_working_uselocale and defines HAVE_WORKING_USELOCALE.
- AC_DEFUN([gt_FUNC_USELOCALE],
- [
- AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
- dnl Persuade glibc and Solaris <locale.h> to define 'locale_t'.
- AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
- AC_CHECK_FUNCS_ONCE([uselocale])
- dnl On AIX 7.2, the uselocale() function is not documented and leads to
- dnl crashes in subsequent setlocale() invocations.
- dnl In 2019, some versions of z/OS lack the locale_t type and have a broken
- dnl uselocale function.
- if test $ac_cv_func_uselocale = yes; then
- AC_CHECK_HEADERS_ONCE([xlocale.h])
- AC_CACHE_CHECK([whether uselocale works],
- [gt_cv_func_uselocale_works],
- [AC_RUN_IFELSE(
- [AC_LANG_SOURCE([[
- #include <locale.h>
- #if HAVE_XLOCALE_H
- # include <xlocale.h>
- #endif
- locale_t loc1;
- int main ()
- {
- uselocale (NULL);
- setlocale (LC_ALL, "en_US.UTF-8");
- return 0;
- }]])],
- [gt_cv_func_uselocale_works=yes],
- [gt_cv_func_uselocale_works=no],
- [# Guess no on AIX and z/OS, yes otherwise.
- case "$host_os" in
- aix* | openedition*) gt_cv_func_uselocale_works="guessing no" ;;
- *) gt_cv_func_uselocale_works="guessing yes" ;;
- esac
- ])
- ])
- else
- gt_cv_func_uselocale_works=no
- fi
- case "$gt_cv_func_uselocale_works" in
- *yes)
- gt_working_uselocale=yes
- AC_DEFINE([HAVE_WORKING_USELOCALE], [1],
- [Define if the uselocale function exists and may safely be called.])
- ;;
- *)
- gt_working_uselocale=no
- ;;
- esac
- ])
|