Annotation of embedaddon/libiconv/srcm4/intl-thread-locale.m4, revision 1.1.1.1

1.1       misho       1: # intl-thread-locale.m4 serial 4
                      2: dnl Copyright (C) 2015-2019 Free Software Foundation, Inc.
                      3: dnl This file is free software; the Free Software Foundation
                      4: dnl gives unlimited permission to copy and/or distribute it,
                      5: dnl with or without modifications, as long as this notice is preserved.
                      6: dnl
                      7: dnl This file can be used in projects which are not available under
                      8: dnl the GNU General Public License or the GNU Library General Public
                      9: dnl License but which still want to provide support for the GNU gettext
                     10: dnl functionality.
                     11: dnl Please note that the actual code of the GNU gettext library is covered
                     12: dnl by the GNU Library General Public License, and the rest of the GNU
                     13: dnl gettext package is covered by the GNU General Public License.
                     14: dnl They are *not* in the public domain.
                     15: 
                     16: dnl Check how to retrieve the name of a per-thread locale (POSIX locale_t).
                     17: dnl Sets gt_nameless_locales.
                     18: AC_DEFUN([gt_INTL_THREAD_LOCALE_NAME],
                     19: [
                     20:   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
                     21: 
                     22:   dnl Persuade Solaris <locale.h> to define 'locale_t'.
                     23:   AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
                     24: 
                     25:   dnl Test whether uselocale() exists and works at all.
                     26:   gt_FUNC_USELOCALE
                     27: 
                     28:   dnl On OpenBSD >= 6.2, the locale_t type and the uselocale(), newlocale(),
                     29:   dnl duplocale(), freelocale() functions exist but are effectively useless,
                     30:   dnl because the locale_t value depends only on the LC_CTYPE category of the
                     31:   dnl locale and furthermore contains only one bit of information (it
                     32:   dnl distinguishes the "C" locale from the *.UTF-8 locales). See
                     33:   dnl <https://cvsweb.openbsd.org/src/lib/libc/locale/newlocale.c?rev=1.1&content-type=text/x-cvsweb-markup>.
                     34:   dnl In the setlocale() implementation they have thought about the programs
                     35:   dnl that use the API ("Even though only LC_CTYPE has any effect in the
                     36:   dnl OpenBSD base system, store complete information about the global locale,
                     37:   dnl such that third-party software can access it"), but for uselocale()
                     38:   dnl they did not think about the programs.
                     39:   dnl In this situation, even the HAVE_NAMELESS_LOCALES support does not work.
                     40:   dnl So, define HAVE_FAKE_LOCALES and disable all locale_t support.
                     41:   case "$gt_cv_func_uselocale_works" in
                     42:     *yes)
                     43:       AC_CHECK_HEADERS_ONCE([xlocale.h])
                     44:       AC_CACHE_CHECK([for fake locale system (OpenBSD)],
                     45:         [gt_cv_locale_fake],
                     46:         [AC_RUN_IFELSE(
                     47:            [AC_LANG_SOURCE([[
                     48: #include <locale.h>
                     49: #if HAVE_XLOCALE_H
                     50: # include <xlocale.h>
                     51: #endif
                     52: int main ()
                     53: {
                     54:   locale_t loc1, loc2;
                     55:   if (setlocale (LC_ALL, "de_DE.UTF-8") == NULL) return 1;
                     56:   if (setlocale (LC_ALL, "fr_FR.UTF-8") == NULL) return 1;
                     57:   loc1 = newlocale (LC_ALL_MASK, "de_DE.UTF-8", (locale_t)0);
                     58:   loc2 = newlocale (LC_ALL_MASK, "fr_FR.UTF-8", (locale_t)0);
                     59:   return !(loc1 == loc2);
                     60: }]])],
                     61:            [gt_cv_locale_fake=yes],
                     62:            [gt_cv_locale_fake=no],
                     63:            [dnl Guess the locale system is fake only on OpenBSD.
                     64:             case "$host_os" in
                     65:               openbsd*) gt_cv_locale_fake="guessing yes" ;;
                     66:               *)        gt_cv_locale_fake="guessing no" ;;
                     67:             esac
                     68:            ])
                     69:         ])
                     70:       ;;
                     71:     *) gt_cv_locale_fake=no ;;
                     72:   esac
                     73:   case "$gt_cv_locale_fake" in
                     74:     *yes)
                     75:       AC_DEFINE([HAVE_FAKE_LOCALES], [1],
                     76:         [Define if the locale_t type contains insufficient information, as on OpenBSD.])
                     77:       ;;
                     78:   esac
                     79: 
                     80:   case "$gt_cv_func_uselocale_works" in
                     81:     *yes)
                     82:       AC_CACHE_CHECK([for Solaris 11.4 locale system],
                     83:         [gt_cv_locale_solaris114],
                     84:         [case "$host_os" in
                     85:            solaris*)
                     86:              dnl Test whether <locale.h> defines locale_t as a typedef of
                     87:              dnl 'struct _LC_locale_t **' (whereas Illumos defines it as a
                     88:              dnl typedef of 'struct _locale *').
                     89:              dnl Another possible test would be to include <sys/localedef.h>
                     90:              dnl and test whether it defines the _LC_core_data_locale_t type.
                     91:              dnl This type was added in Solaris 11.4.
                     92:              AC_COMPILE_IFELSE(
                     93:                [AC_LANG_PROGRAM([[
                     94:                   #include <locale.h>
                     95:                   struct _LC_locale_t *x;
                     96:                   locale_t y;
                     97:                 ]],
                     98:                 [[*y = x;]])],
                     99:                [gt_cv_locale_solaris114=yes],
                    100:                [gt_cv_locale_solaris114=no])
                    101:              ;;
                    102:            *) gt_cv_locale_solaris114=no ;;
                    103:          esac
                    104:         ])
                    105:       ;;
                    106:     *) gt_cv_locale_solaris114=no ;;
                    107:   esac
                    108:   if test $gt_cv_locale_solaris114 = yes; then
                    109:     AC_DEFINE([HAVE_SOLARIS114_LOCALES], [1],
                    110:       [Define if the locale_t type is as on Solaris 11.4.])
                    111:   fi
                    112: 
                    113:   dnl Solaris 12 will maybe provide getlocalename_l.  If it does, it will
                    114:   dnl improve the implementation of gl_locale_name_thread(), by removing
                    115:   dnl the use of undocumented structures.
                    116:   case "$gt_cv_func_uselocale_works" in
                    117:     *yes)
                    118:       AC_CHECK_FUNCS([getlocalename_l])
                    119:       ;;
                    120:   esac
                    121: 
                    122:   dnl This code is for future use, in case we some day have to port to a
                    123:   dnl platform where the locale_t type does not provide access to the name of
                    124:   dnl each locale category.  This code has the drawback that it requires the
                    125:   dnl gnulib overrides of 'newlocale', 'duplocale', 'freelocale', which is a
                    126:   dnl problem for GNU libunistring.  Therefore try hard to avoid enabling this
                    127:   dnl code!
                    128:   gt_nameless_locales=no
                    129:   if false; then
                    130:     gt_nameless_locales=yes
                    131:     AC_DEFINE([HAVE_NAMELESS_LOCALES], [1],
                    132:       [Define if the locale_t type does not contain the name of each locale category.])
                    133:   fi
                    134: ])
                    135: 
                    136: dnl Tests whether uselocale() exists and is usable.
                    137: dnl Sets gt_cv_func_uselocale_works. Defines HAVE_WORKING_USELOCALE.
                    138: AC_DEFUN([gt_FUNC_USELOCALE],
                    139: [
                    140:   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
                    141: 
                    142:   dnl Persuade Solaris <locale.h> to define 'locale_t'.
                    143:   AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
                    144: 
                    145:   AC_CHECK_FUNCS_ONCE([uselocale])
                    146: 
                    147:   dnl On AIX 7.2, the uselocale() function is not documented and leads to
                    148:   dnl crashes in subsequent setlocale() invocations.
                    149:   if test $ac_cv_func_uselocale = yes; then
                    150:     AC_CHECK_HEADERS_ONCE([xlocale.h])
                    151:     AC_CACHE_CHECK([whether uselocale works],
                    152:       [gt_cv_func_uselocale_works],
                    153:       [AC_RUN_IFELSE(
                    154:          [AC_LANG_SOURCE([[
                    155: #include <locale.h>
                    156: #if HAVE_XLOCALE_H
                    157: # include <xlocale.h>
                    158: #endif
                    159: int main ()
                    160: {
                    161:   uselocale (NULL);
                    162:   setlocale (LC_ALL, "en_US.UTF-8");
                    163:   return 0;
                    164: }]])],
                    165:          [gt_cv_func_uselocale_works=yes],
                    166:          [gt_cv_func_uselocale_works=no],
                    167:          [# Guess no on AIX, yes otherwise.
                    168:           case "$host_os" in
                    169:             aix*) gt_cv_func_uselocale_works="guessing no" ;;
                    170:             *)    gt_cv_func_uselocale_works="guessing yes" ;;
                    171:           esac
                    172:          ])
                    173:       ])
                    174:   else
                    175:     gt_cv_func_uselocale_works=no
                    176:   fi
                    177:   case "$gt_cv_func_uselocale_works" in
                    178:     *yes)
                    179:       AC_DEFINE([HAVE_WORKING_USELOCALE], [1],
                    180:         [Define if the uselocale function exists any may safely be called.])
                    181:       ;;
                    182:   esac
                    183: ])

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>