Home | History | Annotate | Line # | Download | only in m4
      1 # locale_h.m4 serial 28
      2 dnl Copyright (C) 2007, 2009-2022 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 
      7 AC_DEFUN_ONCE([gl_LOCALE_H],
      8 [
      9   dnl Ensure to expand the default settings once only, before all statements
     10   dnl that occur in other macros.
     11   AC_REQUIRE([gl_LOCALE_H_DEFAULTS])
     12 
     13   dnl Persuade glibc <locale.h> to define locale_t and the int_p_*, int_n_*
     14   dnl members of 'struct lconv'.
     15   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
     16 
     17   dnl If <stddef.h> is replaced, then <locale.h> must also be replaced.
     18   AC_REQUIRE([gl_STDDEF_H])
     19 
     20   AC_REQUIRE([gl_LOCALE_T])
     21 
     22   dnl Solaris 11.0 defines the int_p_*, int_n_* members of 'struct lconv'
     23   dnl only if _LCONV_C99 is defined.
     24   AC_REQUIRE([AC_CANONICAL_HOST])
     25   case "$host_os" in
     26     solaris*)
     27       AC_DEFINE([_LCONV_C99], [1], [Define to 1 on Solaris.])
     28       ;;
     29   esac
     30 
     31   AC_CACHE_CHECK([whether locale.h conforms to POSIX:2001],
     32     [gl_cv_header_locale_h_posix2001],
     33     [AC_COMPILE_IFELSE(
     34        [AC_LANG_PROGRAM(
     35           [[#include <locale.h>
     36             int x = LC_MESSAGES;
     37             int y = sizeof (((struct lconv *) 0)->decimal_point);]],
     38           [[]])],
     39        [gl_cv_header_locale_h_posix2001=yes],
     40        [gl_cv_header_locale_h_posix2001=no])])
     41 
     42   dnl Check whether 'struct lconv' is complete.
     43   dnl Bionic libc's 'struct lconv' is just a dummy.
     44   dnl On OpenBSD 4.9, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin 1.5.x,
     45   dnl mingw, MSVC 9, it lacks the int_p_* and int_n_* members.
     46   AC_CACHE_CHECK([whether struct lconv is properly defined],
     47     [gl_cv_sys_struct_lconv_ok],
     48     [AC_COMPILE_IFELSE(
     49        [AC_LANG_PROGRAM(
     50           [[#include <locale.h>
     51             struct lconv l;
     52             int x = sizeof (l.decimal_point);
     53             int y = sizeof (l.int_p_cs_precedes);]],
     54           [[]])],
     55        [gl_cv_sys_struct_lconv_ok=yes],
     56        [gl_cv_sys_struct_lconv_ok=no])
     57     ])
     58   if test $gl_cv_sys_struct_lconv_ok = no; then
     59     dnl On native Windows with MSVC, merely define these member names as macros.
     60     dnl This avoids trouble in C++ mode.
     61     case "$host_os" in
     62       mingw*)
     63         AC_EGREP_CPP([Special], [
     64 #ifdef _MSC_VER
     65  Special
     66 #endif
     67           ],
     68           [],
     69           [REPLACE_STRUCT_LCONV=1])
     70         ;;
     71       *) REPLACE_STRUCT_LCONV=1 ;;
     72     esac
     73   fi
     74 
     75   dnl <locale.h> is always overridden, because of GNULIB_POSIXCHECK.
     76   gl_NEXT_HEADERS([locale.h])
     77 
     78   dnl Check for declarations of anything we want to poison if the
     79   dnl corresponding gnulib module is not in use.
     80   gl_WARN_ON_USE_PREPARE([[#include <locale.h>
     81 /* Some systems provide declarations in a non-standard header.  */
     82 #if HAVE_XLOCALE_H
     83 # include <xlocale.h>
     84 #endif
     85     ]],
     86     [setlocale newlocale duplocale freelocale])
     87 ])
     88 
     89 dnl Checks to determine whether the system has the locale_t type,
     90 dnl and how to obtain it.
     91 AC_DEFUN([gl_LOCALE_T],
     92 [
     93   dnl Persuade glibc and Solaris <locale.h> to define locale_t.
     94   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
     95 
     96   dnl Check whether use of locale_t requires inclusion of <xlocale.h>,
     97   dnl e.g. on Mac OS X 10.5. If <locale.h> does not define locale_t by
     98   dnl itself, we assume that <xlocale.h> will do so.
     99   AC_CACHE_CHECK([whether locale.h defines locale_t],
    100     [gl_cv_header_locale_has_locale_t],
    101     [AC_COMPILE_IFELSE(
    102        [AC_LANG_PROGRAM(
    103           [[#include <locale.h>
    104             locale_t x;]],
    105           [[]])],
    106        [gl_cv_header_locale_has_locale_t=yes],
    107        [gl_cv_header_locale_has_locale_t=no])
    108     ])
    109 
    110   dnl Check for <xlocale.h>.
    111   AC_CHECK_HEADERS_ONCE([xlocale.h])
    112   if test $ac_cv_header_xlocale_h = yes; then
    113     HAVE_XLOCALE_H=1
    114     if test $gl_cv_header_locale_has_locale_t = yes; then
    115       gl_cv_header_locale_h_needs_xlocale_h=no
    116     else
    117       gl_cv_header_locale_h_needs_xlocale_h=yes
    118     fi
    119     HAVE_LOCALE_T=1
    120   else
    121     HAVE_XLOCALE_H=0
    122     gl_cv_header_locale_h_needs_xlocale_h=no
    123     if test $gl_cv_header_locale_has_locale_t = yes; then
    124       HAVE_LOCALE_T=1
    125     else
    126       HAVE_LOCALE_T=0
    127     fi
    128   fi
    129   AC_SUBST([HAVE_XLOCALE_H])
    130 ])
    131 
    132 # gl_LOCALE_MODULE_INDICATOR([modulename])
    133 # sets the shell variable that indicates the presence of the given module
    134 # to a C preprocessor expression that will evaluate to 1.
    135 # This macro invocation must not occur in macros that are AC_REQUIREd.
    136 AC_DEFUN([gl_LOCALE_MODULE_INDICATOR],
    137 [
    138   dnl Ensure to expand the default settings once only.
    139   gl_LOCALE_H_REQUIRE_DEFAULTS
    140   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
    141   dnl Define it also as a C macro, for the benefit of the unit tests.
    142   gl_MODULE_INDICATOR_FOR_TESTS([$1])
    143 ])
    144 
    145 # Initializes the default values for AC_SUBSTed shell variables.
    146 # This macro must not be AC_REQUIREd.  It must only be invoked, and only
    147 # outside of macros or in macros that are not AC_REQUIREd.
    148 AC_DEFUN([gl_LOCALE_H_REQUIRE_DEFAULTS],
    149 [
    150   m4_defun(GL_MODULE_INDICATOR_PREFIX[_LOCALE_H_MODULE_INDICATOR_DEFAULTS], [
    151     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOCALECONV])
    152     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SETLOCALE])
    153     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SETLOCALE_NULL])
    154     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_DUPLOCALE])
    155     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOCALENAME])
    156   ])
    157   m4_require(GL_MODULE_INDICATOR_PREFIX[_LOCALE_H_MODULE_INDICATOR_DEFAULTS])
    158   AC_REQUIRE([gl_LOCALE_H_DEFAULTS])
    159 ])
    160 
    161 AC_DEFUN([gl_LOCALE_H_DEFAULTS],
    162 [
    163   dnl Assume proper GNU behavior unless another module says otherwise.
    164   HAVE_NEWLOCALE=1;       AC_SUBST([HAVE_NEWLOCALE])
    165   HAVE_DUPLOCALE=1;       AC_SUBST([HAVE_DUPLOCALE])
    166   HAVE_FREELOCALE=1;      AC_SUBST([HAVE_FREELOCALE])
    167   REPLACE_LOCALECONV=0;   AC_SUBST([REPLACE_LOCALECONV])
    168   REPLACE_SETLOCALE=0;    AC_SUBST([REPLACE_SETLOCALE])
    169   REPLACE_NEWLOCALE=0;    AC_SUBST([REPLACE_NEWLOCALE])
    170   REPLACE_DUPLOCALE=0;    AC_SUBST([REPLACE_DUPLOCALE])
    171   REPLACE_FREELOCALE=0;   AC_SUBST([REPLACE_FREELOCALE])
    172   REPLACE_STRUCT_LCONV=0; AC_SUBST([REPLACE_STRUCT_LCONV])
    173   LOCALENAME_ENHANCE_LOCALE_FUNCS=0; AC_SUBST([LOCALENAME_ENHANCE_LOCALE_FUNCS])
    174 ])
    175