Home | History | Annotate | Line # | Download | only in m4
wchar_h.m4 revision 1.1
      1 dnl A placeholder for ISO C99 <wchar.h>, for platforms that have issues.
      2 
      3 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc.
      4 dnl This file is free software; the Free Software Foundation
      5 dnl gives unlimited permission to copy and/or distribute it,
      6 dnl with or without modifications, as long as this notice is preserved.
      7 
      8 dnl Written by Eric Blake.
      9 
     10 # wchar_h.m4 serial 46
     11 
     12 AC_DEFUN([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 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
     44    <wchar.h>.
     45    BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
     46    included before <wchar.h>.  */
     47 #if !(defined __GLIBC__ && !defined __UCLIBC__)
     48 # include <stddef.h>
     49 # include <stdio.h>
     50 # include <time.h>
     51 #endif
     52 #include <wchar.h>
     53     ]],
     54     [btowc wctob mbsinit mbrtowc mbrlen mbsrtowcs mbsnrtowcs wcrtomb
     55      wcsrtombs wcsnrtombs wcwidth
     56      wmemchr wmemcmp wmemcpy wmemmove wmempcpy wmemset
     57      wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat wcscmp
     58      wcsncmp wcscasecmp wcsncasecmp wcscoll wcsxfrm wcsdup wcschr wcsrchr
     59      wcscspn wcsspn wcspbrk wcsstr wcstok wcswidth wcsftime
     60     ])
     61 
     62   AC_REQUIRE([AC_C_RESTRICT])
     63 ])
     64 
     65 dnl Check whether <wchar.h> is usable at all.
     66 AC_DEFUN([gl_WCHAR_H_INLINE_OK],
     67 [
     68   dnl Test whether <wchar.h> suffers due to the transition from '__inline' to
     69   dnl 'gnu_inline'. See <https://sourceware.org/bugzilla/show_bug.cgi?id=4022>
     70   dnl and <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42440>. In summary,
     71   dnl glibc version 2.5 or older, together with gcc version 4.3 or newer and
     72   dnl the option -std=c99 or -std=gnu99, leads to a broken <wchar.h>.
     73   AC_CACHE_CHECK([whether <wchar.h> uses 'inline' correctly],
     74     [gl_cv_header_wchar_h_correct_inline],
     75     [gl_cv_header_wchar_h_correct_inline=yes
     76      AC_LANG_CONFTEST([
     77        AC_LANG_SOURCE([[#define wcstod renamed_wcstod
     78 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
     79    <wchar.h>.
     80    BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
     81    included before <wchar.h>.  */
     82 #include <stddef.h>
     83 #include <stdio.h>
     84 #include <time.h>
     85 #include <wchar.h>
     86 extern int zero (void);
     87 int main () { return zero(); }
     88 ]])])
     89      dnl Do not rename the object file from conftest.$ac_objext to
     90      dnl conftest1.$ac_objext, as this will cause the link to fail on
     91      dnl z/OS when using the XPLINK object format (due to duplicate
     92      dnl CSECT names). Instead, temporarily redefine $ac_compile so
     93      dnl that the object file has the latter name from the start.
     94      save_ac_compile="$ac_compile"
     95      ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest1/`
     96      if echo '#include "conftest.c"' >conftest1.c &&
     97         AC_TRY_EVAL([ac_compile]); then
     98        AC_LANG_CONFTEST([
     99          AC_LANG_SOURCE([[#define wcstod renamed_wcstod
    100 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
    101    <wchar.h>.
    102    BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
    103    included before <wchar.h>.  */
    104 #include <stddef.h>
    105 #include <stdio.h>
    106 #include <time.h>
    107 #include <wchar.h>
    108 int zero (void) { return 0; }
    109 ]])])
    110        dnl See note above about renaming object files.
    111        ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest2/`
    112        if echo '#include "conftest.c"' >conftest2.c &&
    113           AC_TRY_EVAL([ac_compile]); then
    114          if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&AS_MESSAGE_LOG_FD 2>&1; then
    115            :
    116          else
    117            gl_cv_header_wchar_h_correct_inline=no
    118          fi
    119        fi
    120      fi
    121      ac_compile="$save_ac_compile"
    122      rm -f conftest[12].c conftest[12].$ac_objext conftest$ac_exeext
    123     ])
    124   if test $gl_cv_header_wchar_h_correct_inline = no; then
    125     AC_MSG_ERROR([<wchar.h> cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS).
    126 This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in
    127 C99 mode. You have four options:
    128   - Add the flag -fgnu89-inline to CC and reconfigure, or
    129   - Fix your include files, using parts of
    130     <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b037a293a48718af30d706c2e18c929d0e69a621>, or
    131   - Use a gcc version older than 4.3, or
    132   - Don't use the flags -std=c99 or -std=gnu99.
    133 Configuration aborted.])
    134   fi
    135 ])
    136 
    137 AC_DEFUN([gl_WCHAR_MODULE_INDICATOR],
    138 [
    139   dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
    140   AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
    141   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
    142   dnl Define it also as a C macro, for the benefit of the unit tests.
    143   gl_MODULE_INDICATOR_FOR_TESTS([$1])
    144 ])
    145 
    146 AC_DEFUN([gl_WCHAR_H_DEFAULTS],
    147 [
    148   GNULIB_BTOWC=0;       AC_SUBST([GNULIB_BTOWC])
    149   GNULIB_WCTOB=0;       AC_SUBST([GNULIB_WCTOB])
    150   GNULIB_MBSINIT=0;     AC_SUBST([GNULIB_MBSINIT])
    151   GNULIB_MBRTOWC=0;     AC_SUBST([GNULIB_MBRTOWC])
    152   GNULIB_MBRLEN=0;      AC_SUBST([GNULIB_MBRLEN])
    153   GNULIB_MBSRTOWCS=0;   AC_SUBST([GNULIB_MBSRTOWCS])
    154   GNULIB_MBSNRTOWCS=0;  AC_SUBST([GNULIB_MBSNRTOWCS])
    155   GNULIB_WCRTOMB=0;     AC_SUBST([GNULIB_WCRTOMB])
    156   GNULIB_WCSRTOMBS=0;   AC_SUBST([GNULIB_WCSRTOMBS])
    157   GNULIB_WCSNRTOMBS=0;  AC_SUBST([GNULIB_WCSNRTOMBS])
    158   GNULIB_WCWIDTH=0;     AC_SUBST([GNULIB_WCWIDTH])
    159   GNULIB_WMEMCHR=0;     AC_SUBST([GNULIB_WMEMCHR])
    160   GNULIB_WMEMCMP=0;     AC_SUBST([GNULIB_WMEMCMP])
    161   GNULIB_WMEMCPY=0;     AC_SUBST([GNULIB_WMEMCPY])
    162   GNULIB_WMEMMOVE=0;    AC_SUBST([GNULIB_WMEMMOVE])
    163   GNULIB_WMEMPCPY=0;    AC_SUBST([GNULIB_WMEMPCPY])
    164   GNULIB_WMEMSET=0;     AC_SUBST([GNULIB_WMEMSET])
    165   GNULIB_WCSLEN=0;      AC_SUBST([GNULIB_WCSLEN])
    166   GNULIB_WCSNLEN=0;     AC_SUBST([GNULIB_WCSNLEN])
    167   GNULIB_WCSCPY=0;      AC_SUBST([GNULIB_WCSCPY])
    168   GNULIB_WCPCPY=0;      AC_SUBST([GNULIB_WCPCPY])
    169   GNULIB_WCSNCPY=0;     AC_SUBST([GNULIB_WCSNCPY])
    170   GNULIB_WCPNCPY=0;     AC_SUBST([GNULIB_WCPNCPY])
    171   GNULIB_WCSCAT=0;      AC_SUBST([GNULIB_WCSCAT])
    172   GNULIB_WCSNCAT=0;     AC_SUBST([GNULIB_WCSNCAT])
    173   GNULIB_WCSCMP=0;      AC_SUBST([GNULIB_WCSCMP])
    174   GNULIB_WCSNCMP=0;     AC_SUBST([GNULIB_WCSNCMP])
    175   GNULIB_WCSCASECMP=0;  AC_SUBST([GNULIB_WCSCASECMP])
    176   GNULIB_WCSNCASECMP=0; AC_SUBST([GNULIB_WCSNCASECMP])
    177   GNULIB_WCSCOLL=0;     AC_SUBST([GNULIB_WCSCOLL])
    178   GNULIB_WCSXFRM=0;     AC_SUBST([GNULIB_WCSXFRM])
    179   GNULIB_WCSDUP=0;      AC_SUBST([GNULIB_WCSDUP])
    180   GNULIB_WCSCHR=0;      AC_SUBST([GNULIB_WCSCHR])
    181   GNULIB_WCSRCHR=0;     AC_SUBST([GNULIB_WCSRCHR])
    182   GNULIB_WCSCSPN=0;     AC_SUBST([GNULIB_WCSCSPN])
    183   GNULIB_WCSSPN=0;      AC_SUBST([GNULIB_WCSSPN])
    184   GNULIB_WCSPBRK=0;     AC_SUBST([GNULIB_WCSPBRK])
    185   GNULIB_WCSSTR=0;      AC_SUBST([GNULIB_WCSSTR])
    186   GNULIB_WCSTOK=0;      AC_SUBST([GNULIB_WCSTOK])
    187   GNULIB_WCSWIDTH=0;    AC_SUBST([GNULIB_WCSWIDTH])
    188   GNULIB_WCSFTIME=0;    AC_SUBST([GNULIB_WCSFTIME])
    189   dnl Assume proper GNU behavior unless another module says otherwise.
    190   HAVE_BTOWC=1;         AC_SUBST([HAVE_BTOWC])
    191   HAVE_MBSINIT=1;       AC_SUBST([HAVE_MBSINIT])
    192   HAVE_MBRTOWC=1;       AC_SUBST([HAVE_MBRTOWC])
    193   HAVE_MBRLEN=1;        AC_SUBST([HAVE_MBRLEN])
    194   HAVE_MBSRTOWCS=1;     AC_SUBST([HAVE_MBSRTOWCS])
    195   HAVE_MBSNRTOWCS=1;    AC_SUBST([HAVE_MBSNRTOWCS])
    196   HAVE_WCRTOMB=1;       AC_SUBST([HAVE_WCRTOMB])
    197   HAVE_WCSRTOMBS=1;     AC_SUBST([HAVE_WCSRTOMBS])
    198   HAVE_WCSNRTOMBS=1;    AC_SUBST([HAVE_WCSNRTOMBS])
    199   HAVE_WMEMCHR=1;       AC_SUBST([HAVE_WMEMCHR])
    200   HAVE_WMEMCMP=1;       AC_SUBST([HAVE_WMEMCMP])
    201   HAVE_WMEMCPY=1;       AC_SUBST([HAVE_WMEMCPY])
    202   HAVE_WMEMMOVE=1;      AC_SUBST([HAVE_WMEMMOVE])
    203   HAVE_WMEMPCPY=1;      AC_SUBST([HAVE_WMEMPCPY])
    204   HAVE_WMEMSET=1;       AC_SUBST([HAVE_WMEMSET])
    205   HAVE_WCSLEN=1;        AC_SUBST([HAVE_WCSLEN])
    206   HAVE_WCSNLEN=1;       AC_SUBST([HAVE_WCSNLEN])
    207   HAVE_WCSCPY=1;        AC_SUBST([HAVE_WCSCPY])
    208   HAVE_WCPCPY=1;        AC_SUBST([HAVE_WCPCPY])
    209   HAVE_WCSNCPY=1;       AC_SUBST([HAVE_WCSNCPY])
    210   HAVE_WCPNCPY=1;       AC_SUBST([HAVE_WCPNCPY])
    211   HAVE_WCSCAT=1;        AC_SUBST([HAVE_WCSCAT])
    212   HAVE_WCSNCAT=1;       AC_SUBST([HAVE_WCSNCAT])
    213   HAVE_WCSCMP=1;        AC_SUBST([HAVE_WCSCMP])
    214   HAVE_WCSNCMP=1;       AC_SUBST([HAVE_WCSNCMP])
    215   HAVE_WCSCASECMP=1;    AC_SUBST([HAVE_WCSCASECMP])
    216   HAVE_WCSNCASECMP=1;   AC_SUBST([HAVE_WCSNCASECMP])
    217   HAVE_WCSCOLL=1;       AC_SUBST([HAVE_WCSCOLL])
    218   HAVE_WCSXFRM=1;       AC_SUBST([HAVE_WCSXFRM])
    219   HAVE_WCSDUP=1;        AC_SUBST([HAVE_WCSDUP])
    220   HAVE_WCSCHR=1;        AC_SUBST([HAVE_WCSCHR])
    221   HAVE_WCSRCHR=1;       AC_SUBST([HAVE_WCSRCHR])
    222   HAVE_WCSCSPN=1;       AC_SUBST([HAVE_WCSCSPN])
    223   HAVE_WCSSPN=1;        AC_SUBST([HAVE_WCSSPN])
    224   HAVE_WCSPBRK=1;       AC_SUBST([HAVE_WCSPBRK])
    225   HAVE_WCSSTR=1;        AC_SUBST([HAVE_WCSSTR])
    226   HAVE_WCSTOK=1;        AC_SUBST([HAVE_WCSTOK])
    227   HAVE_WCSWIDTH=1;      AC_SUBST([HAVE_WCSWIDTH])
    228   HAVE_WCSFTIME=1;      AC_SUBST([HAVE_WCSFTIME])
    229   HAVE_DECL_WCTOB=1;    AC_SUBST([HAVE_DECL_WCTOB])
    230   HAVE_DECL_WCWIDTH=1;  AC_SUBST([HAVE_DECL_WCWIDTH])
    231   REPLACE_MBSTATE_T=0;  AC_SUBST([REPLACE_MBSTATE_T])
    232   REPLACE_BTOWC=0;      AC_SUBST([REPLACE_BTOWC])
    233   REPLACE_WCTOB=0;      AC_SUBST([REPLACE_WCTOB])
    234   REPLACE_MBSINIT=0;    AC_SUBST([REPLACE_MBSINIT])
    235   REPLACE_MBRTOWC=0;    AC_SUBST([REPLACE_MBRTOWC])
    236   REPLACE_MBRLEN=0;     AC_SUBST([REPLACE_MBRLEN])
    237   REPLACE_MBSRTOWCS=0;  AC_SUBST([REPLACE_MBSRTOWCS])
    238   REPLACE_MBSNRTOWCS=0; AC_SUBST([REPLACE_MBSNRTOWCS])
    239   REPLACE_WCRTOMB=0;    AC_SUBST([REPLACE_WCRTOMB])
    240   REPLACE_WCSRTOMBS=0;  AC_SUBST([REPLACE_WCSRTOMBS])
    241   REPLACE_WCSNRTOMBS=0; AC_SUBST([REPLACE_WCSNRTOMBS])
    242   REPLACE_WCWIDTH=0;    AC_SUBST([REPLACE_WCWIDTH])
    243   REPLACE_WCSWIDTH=0;   AC_SUBST([REPLACE_WCSWIDTH])
    244   REPLACE_WCSFTIME=0;   AC_SUBST([REPLACE_WCSFTIME])
    245   REPLACE_WCSTOK=0;     AC_SUBST([REPLACE_WCSTOK])
    246 ])
    247