xref: /netbsd-src/external/gpl3/gdb/dist/gnulib/import/m4/wchar_h.m4 (revision 4b169a6ba595ae283ca507b26b15fdff40495b1c)
1dnl A placeholder for ISO C99 <wchar.h>, for platforms that have issues.
2
3dnl Copyright (C) 2007-2022 Free Software Foundation, Inc.
4dnl This file is free software; the Free Software Foundation
5dnl gives unlimited permission to copy and/or distribute it,
6dnl with or without modifications, as long as this notice is preserved.
7
8dnl Written by Eric Blake.
9
10# wchar_h.m4 serial 55
11
12AC_DEFUN_ONCE([gl_WCHAR_H],
13[
14  AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
15  AC_REQUIRE([gl_WCHAR_H_INLINE_OK])
16  dnl Prepare for creating substitute <wchar.h>.
17  dnl Check for <wchar.h> (missing in Linux uClibc when built without wide
18  dnl character support).
19  dnl <wchar.h> is always overridden, because of GNULIB_POSIXCHECK.
20  gl_CHECK_NEXT_HEADERS([wchar.h])
21  if test $ac_cv_header_wchar_h = yes; then
22    HAVE_WCHAR_H=1
23  else
24    HAVE_WCHAR_H=0
25  fi
26  AC_SUBST([HAVE_WCHAR_H])
27
28  AC_REQUIRE([gl_FEATURES_H])
29
30  AC_REQUIRE([gt_TYPE_WINT_T])
31  if test $gt_cv_c_wint_t = yes; then
32    HAVE_WINT_T=1
33  else
34    HAVE_WINT_T=0
35  fi
36  AC_SUBST([HAVE_WINT_T])
37
38  AC_REQUIRE([gl_TYPE_WINT_T_PREREQ])
39
40  dnl Check for declarations of anything we want to poison if the
41  dnl corresponding gnulib module is not in use.
42  gl_WARN_ON_USE_PREPARE([[
43      #include <wchar.h>
44    ]],
45    [btowc wctob mbsinit mbrtowc mbrlen mbsrtowcs mbsnrtowcs wcrtomb
46     wcsrtombs wcsnrtombs wcwidth
47     wmemchr wmemcmp wmemcpy wmemmove wmempcpy wmemset
48     wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat wcscmp
49     wcsncmp wcscasecmp wcsncasecmp wcscoll wcsxfrm wcsdup wcschr wcsrchr
50     wcscspn wcsspn wcspbrk wcsstr wcstok wcswidth wcsftime
51    ])
52
53  AC_REQUIRE([AC_C_RESTRICT])
54
55  AC_CHECK_DECLS([wcsdup], [], [], [[
56      #include <wchar.h>
57    ]])
58  if test $ac_cv_have_decl_wcsdup = no; then
59    HAVE_DECL_WCSDUP=0
60  fi
61])
62
63dnl Check whether <wchar.h> is usable at all.
64AC_DEFUN([gl_WCHAR_H_INLINE_OK],
65[
66  dnl Test whether <wchar.h> suffers due to the transition from '__inline' to
67  dnl 'gnu_inline'. See <https://sourceware.org/bugzilla/show_bug.cgi?id=4022>
68  dnl and <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42440>. In summary,
69  dnl glibc version 2.5 or older, together with gcc version 4.3 or newer and
70  dnl the option -std=c99 or -std=gnu99, leads to a broken <wchar.h>.
71  AC_REQUIRE([AC_CANONICAL_HOST])
72  AC_CACHE_CHECK([whether <wchar.h> uses 'inline' correctly],
73    [gl_cv_header_wchar_h_correct_inline],
74    [gl_cv_header_wchar_h_correct_inline=yes
75     case "$host_os" in
76       *-gnu* | gnu*)
77         AC_LANG_CONFTEST([
78           AC_LANG_SOURCE([[
79             #define wcstod renamed_wcstod
80             #include <wchar.h>
81             extern int zero (void);
82             int main () { return zero(); }
83           ]])])
84         dnl Do not rename the object file from conftest.$ac_objext to
85         dnl conftest1.$ac_objext, as this will cause the link to fail on
86         dnl z/OS when using the XPLINK object format (due to duplicate
87         dnl CSECT names). Instead, temporarily redefine $ac_compile so
88         dnl that the object file has the latter name from the start.
89         save_ac_compile="$ac_compile"
90         ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest1/`
91         if echo '#include "conftest.c"' >conftest1.c \
92            && AC_TRY_EVAL([ac_compile]); then
93           AC_LANG_CONFTEST([
94             AC_LANG_SOURCE([[
95               #define wcstod renamed_wcstod
96               #include <wchar.h>
97               int zero (void) { return 0; }
98             ]])])
99           dnl See note above about renaming object files.
100           ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest2/`
101           if echo '#include "conftest.c"' >conftest2.c \
102              && AC_TRY_EVAL([ac_compile]); then
103             if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&AS_MESSAGE_LOG_FD 2>&1; then
104               :
105             else
106               gl_cv_header_wchar_h_correct_inline=no
107             fi
108           fi
109         fi
110         ac_compile="$save_ac_compile"
111         rm -f conftest[12].c conftest[12].$ac_objext conftest$ac_exeext
112         ;;
113     esac
114    ])
115  if test $gl_cv_header_wchar_h_correct_inline = no; then
116    AC_MSG_ERROR([<wchar.h> cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS).
117This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in
118C99 mode. You have four options:
119  - Add the flag -fgnu89-inline to CC and reconfigure, or
120  - Fix your include files, using parts of
121    <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b037a293a48718af30d706c2e18c929d0e69a621>, or
122  - Use a gcc version older than 4.3, or
123  - Don't use the flags -std=c99 or -std=gnu99.
124Configuration aborted.])
125  fi
126])
127
128# gl_WCHAR_MODULE_INDICATOR([modulename])
129# sets the shell variable that indicates the presence of the given module
130# to a C preprocessor expression that will evaluate to 1.
131# This macro invocation must not occur in macros that are AC_REQUIREd.
132AC_DEFUN([gl_WCHAR_MODULE_INDICATOR],
133[
134  dnl Ensure to expand the default settings once only.
135  gl_WCHAR_H_REQUIRE_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# Initializes the default values for AC_SUBSTed shell variables.
142# This macro must not be AC_REQUIREd.  It must only be invoked, and only
143# outside of macros or in macros that are not AC_REQUIREd.
144AC_DEFUN([gl_WCHAR_H_REQUIRE_DEFAULTS],
145[
146  m4_defun(GL_MODULE_INDICATOR_PREFIX[_WCHAR_H_MODULE_INDICATOR_DEFAULTS], [
147    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_BTOWC])
148    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCTOB])
149    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSINIT])
150    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBRTOWC])
151    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBRLEN])
152    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSRTOWCS])
153    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSNRTOWCS])
154    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCRTOMB])
155    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSRTOMBS])
156    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNRTOMBS])
157    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCWIDTH])
158    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMCHR])
159    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMCMP])
160    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMCPY])
161    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMMOVE])
162    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMPCPY])
163    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMSET])
164    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSLEN])
165    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNLEN])
166    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCPY])
167    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCPCPY])
168    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNCPY])
169    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCPNCPY])
170    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCAT])
171    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNCAT])
172    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCMP])
173    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNCMP])
174    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCASECMP])
175    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNCASECMP])
176    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCOLL])
177    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSXFRM])
178    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSDUP])
179    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCHR])
180    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSRCHR])
181    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCSPN])
182    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSSPN])
183    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSPBRK])
184    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSSTR])
185    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSTOK])
186    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSWIDTH])
187    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSFTIME])
188    dnl Support Microsoft deprecated alias function names by default.
189    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_WCSDUP], [1])
190  ])
191  m4_require(GL_MODULE_INDICATOR_PREFIX[_WCHAR_H_MODULE_INDICATOR_DEFAULTS])
192  dnl Make sure the shell variable for GNULIB_FREE_POSIX is initialized.
193  gl_STDLIB_H_REQUIRE_DEFAULTS
194  AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
195])
196
197AC_DEFUN([gl_WCHAR_H_DEFAULTS],
198[
199  dnl Assume proper GNU behavior unless another module says otherwise.
200  HAVE_BTOWC=1;         AC_SUBST([HAVE_BTOWC])
201  HAVE_MBSINIT=1;       AC_SUBST([HAVE_MBSINIT])
202  HAVE_MBRTOWC=1;       AC_SUBST([HAVE_MBRTOWC])
203  HAVE_MBRLEN=1;        AC_SUBST([HAVE_MBRLEN])
204  HAVE_MBSRTOWCS=1;     AC_SUBST([HAVE_MBSRTOWCS])
205  HAVE_MBSNRTOWCS=1;    AC_SUBST([HAVE_MBSNRTOWCS])
206  HAVE_WCRTOMB=1;       AC_SUBST([HAVE_WCRTOMB])
207  HAVE_WCSRTOMBS=1;     AC_SUBST([HAVE_WCSRTOMBS])
208  HAVE_WCSNRTOMBS=1;    AC_SUBST([HAVE_WCSNRTOMBS])
209  HAVE_WMEMCHR=1;       AC_SUBST([HAVE_WMEMCHR])
210  HAVE_WMEMCMP=1;       AC_SUBST([HAVE_WMEMCMP])
211  HAVE_WMEMCPY=1;       AC_SUBST([HAVE_WMEMCPY])
212  HAVE_WMEMMOVE=1;      AC_SUBST([HAVE_WMEMMOVE])
213  HAVE_WMEMPCPY=1;      AC_SUBST([HAVE_WMEMPCPY])
214  HAVE_WMEMSET=1;       AC_SUBST([HAVE_WMEMSET])
215  HAVE_WCSLEN=1;        AC_SUBST([HAVE_WCSLEN])
216  HAVE_WCSNLEN=1;       AC_SUBST([HAVE_WCSNLEN])
217  HAVE_WCSCPY=1;        AC_SUBST([HAVE_WCSCPY])
218  HAVE_WCPCPY=1;        AC_SUBST([HAVE_WCPCPY])
219  HAVE_WCSNCPY=1;       AC_SUBST([HAVE_WCSNCPY])
220  HAVE_WCPNCPY=1;       AC_SUBST([HAVE_WCPNCPY])
221  HAVE_WCSCAT=1;        AC_SUBST([HAVE_WCSCAT])
222  HAVE_WCSNCAT=1;       AC_SUBST([HAVE_WCSNCAT])
223  HAVE_WCSCMP=1;        AC_SUBST([HAVE_WCSCMP])
224  HAVE_WCSNCMP=1;       AC_SUBST([HAVE_WCSNCMP])
225  HAVE_WCSCASECMP=1;    AC_SUBST([HAVE_WCSCASECMP])
226  HAVE_WCSNCASECMP=1;   AC_SUBST([HAVE_WCSNCASECMP])
227  HAVE_WCSCOLL=1;       AC_SUBST([HAVE_WCSCOLL])
228  HAVE_WCSXFRM=1;       AC_SUBST([HAVE_WCSXFRM])
229  HAVE_WCSDUP=1;        AC_SUBST([HAVE_WCSDUP])
230  HAVE_WCSCHR=1;        AC_SUBST([HAVE_WCSCHR])
231  HAVE_WCSRCHR=1;       AC_SUBST([HAVE_WCSRCHR])
232  HAVE_WCSCSPN=1;       AC_SUBST([HAVE_WCSCSPN])
233  HAVE_WCSSPN=1;        AC_SUBST([HAVE_WCSSPN])
234  HAVE_WCSPBRK=1;       AC_SUBST([HAVE_WCSPBRK])
235  HAVE_WCSSTR=1;        AC_SUBST([HAVE_WCSSTR])
236  HAVE_WCSTOK=1;        AC_SUBST([HAVE_WCSTOK])
237  HAVE_WCSWIDTH=1;      AC_SUBST([HAVE_WCSWIDTH])
238  HAVE_WCSFTIME=1;      AC_SUBST([HAVE_WCSFTIME])
239  HAVE_DECL_WCTOB=1;    AC_SUBST([HAVE_DECL_WCTOB])
240  HAVE_DECL_WCSDUP=1;   AC_SUBST([HAVE_DECL_WCSDUP])
241  HAVE_DECL_WCWIDTH=1;  AC_SUBST([HAVE_DECL_WCWIDTH])
242  REPLACE_MBSTATE_T=0;  AC_SUBST([REPLACE_MBSTATE_T])
243  REPLACE_BTOWC=0;      AC_SUBST([REPLACE_BTOWC])
244  REPLACE_WCTOB=0;      AC_SUBST([REPLACE_WCTOB])
245  REPLACE_MBSINIT=0;    AC_SUBST([REPLACE_MBSINIT])
246  REPLACE_MBRTOWC=0;    AC_SUBST([REPLACE_MBRTOWC])
247  REPLACE_MBRLEN=0;     AC_SUBST([REPLACE_MBRLEN])
248  REPLACE_MBSRTOWCS=0;  AC_SUBST([REPLACE_MBSRTOWCS])
249  REPLACE_MBSNRTOWCS=0; AC_SUBST([REPLACE_MBSNRTOWCS])
250  REPLACE_WCRTOMB=0;    AC_SUBST([REPLACE_WCRTOMB])
251  REPLACE_WCSRTOMBS=0;  AC_SUBST([REPLACE_WCSRTOMBS])
252  REPLACE_WCSNRTOMBS=0; AC_SUBST([REPLACE_WCSNRTOMBS])
253  REPLACE_WCWIDTH=0;    AC_SUBST([REPLACE_WCWIDTH])
254  REPLACE_WCSWIDTH=0;   AC_SUBST([REPLACE_WCSWIDTH])
255  REPLACE_WCSFTIME=0;   AC_SUBST([REPLACE_WCSFTIME])
256  REPLACE_WCSTOK=0;     AC_SUBST([REPLACE_WCSTOK])
257])
258