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