Home | History | Annotate | Line # | Download | only in m4
      1 dnl A placeholder for ISO C99 <wchar.h>, for platforms that have issues.
      2 
      3 dnl Copyright (C) 2007-2022 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 55
     11 
     12 AC_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 
     63 dnl Check whether <wchar.h> is usable at all.
     64 AC_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).
    117 This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in
    118 C99 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.
    124 Configuration 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.
    132 AC_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.
    144 AC_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 
    197 AC_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