Commit | Line | Data |
---|---|---|
5df4cba6 SM |
1 | # locale_h.m4 serial 24 |
2 | dnl Copyright (C) 2007, 2009-2020 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([gl_LOCALE_H], | |
8 | [ | |
9 | dnl Use AC_REQUIRE here, so that the default behavior below is expanded | |
10 | dnl once only, before all statements 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 | AC_DEFUN([gl_LOCALE_MODULE_INDICATOR], | |
133 | [ | |
134 | dnl Use AC_REQUIRE here, so that the default settings are expanded once only. | |
135 | AC_REQUIRE([gl_LOCALE_H_DEFAULTS]) | |
136 | gl_MODULE_INDICATOR_SET_VARIABLE([$1]) | |
137 | dnl Define it also as a C macro, for the benefit of the unit tests. | |
138 | gl_MODULE_INDICATOR_FOR_TESTS([$1]) | |
139 | ]) | |
140 | ||
141 | AC_DEFUN([gl_LOCALE_H_DEFAULTS], | |
142 | [ | |
143 | GNULIB_LOCALECONV=0; AC_SUBST([GNULIB_LOCALECONV]) | |
144 | GNULIB_SETLOCALE=0; AC_SUBST([GNULIB_SETLOCALE]) | |
145 | GNULIB_SETLOCALE_NULL=0; AC_SUBST([GNULIB_SETLOCALE_NULL]) | |
146 | GNULIB_DUPLOCALE=0; AC_SUBST([GNULIB_DUPLOCALE]) | |
147 | GNULIB_LOCALENAME=0; AC_SUBST([GNULIB_LOCALENAME]) | |
148 | dnl Assume proper GNU behavior unless another module says otherwise. | |
149 | HAVE_NEWLOCALE=1; AC_SUBST([HAVE_NEWLOCALE]) | |
150 | HAVE_DUPLOCALE=1; AC_SUBST([HAVE_DUPLOCALE]) | |
151 | HAVE_FREELOCALE=1; AC_SUBST([HAVE_FREELOCALE]) | |
152 | REPLACE_LOCALECONV=0; AC_SUBST([REPLACE_LOCALECONV]) | |
153 | REPLACE_SETLOCALE=0; AC_SUBST([REPLACE_SETLOCALE]) | |
154 | REPLACE_NEWLOCALE=0; AC_SUBST([REPLACE_NEWLOCALE]) | |
155 | REPLACE_DUPLOCALE=0; AC_SUBST([REPLACE_DUPLOCALE]) | |
156 | REPLACE_FREELOCALE=0; AC_SUBST([REPLACE_FREELOCALE]) | |
157 | REPLACE_STRUCT_LCONV=0; AC_SUBST([REPLACE_STRUCT_LCONV]) | |
158 | ]) |