bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Gnulib's wctype.h fails to compile with MinGW


From: Bruno Haible
Subject: Re: Gnulib's wctype.h fails to compile with MinGW
Date: Thu, 27 Apr 2017 19:03:35 +0200
User-agent: KMail/5.1.3 (Linux/4.4.0-75-generic; KDE/5.18.0; x86_64; ; )

Hi Eli,

> Building the recent pretest of Texinfo 6.4 with mingw.org's MinGW
> fails:
> 
>      gcc -static-libgcc -DHAVE_CONFIG_H -I. -I../..    -Id:/usr/include  -O2 
> -gdwarf-4 -g3 -MT mbchar.o -MD -MP -MF $depbase.Tpo -c -o mbchar.o mbchar.c 
> &&\
>      mv -f $depbase.Tpo $depbase.Po
>      In file included from d:\usr\include\wchar.h:44:0,
>                     from ./wchar.h:87,
>                     from mbchar.h:156,
>                     from mbchar.c:23:
>      ./wctype.h:539:24: fatal error: crtdefs.h: No such file or directory
>      compilation terminated.
>      Makefile:1399: recipe for target `mbchar.o' failed
>      make[4]: *** [mbchar.o] Error 1
> 
> This happens because gnulib/lib/wctype.h does this:
> 
>      #else
>      /* mingw and MSVC define wint_t as 'unsigned short' in <crtdefs.h>.
>       This is too small: ISO C 99 section 7.24.1.(2) says that wint_t must be
>       "unchanged by default argument promotions".  Override it.  */
>      # if 1
>      #  if !GNULIB_defined_wint_t
>      #   include <crtdefs.h>
>      typedef unsigned int rpl_wint_t;
>      #   undef wint_t
>      #   define wint_t rpl_wint_t
>      #   define GNULIB_defined_wint_t 1
>      #  endif
>      # endif
> 
> But mingw.org's MinGW headers don't have crtdefs.h.  The wint_t type
> is defined in stddef.h there.
> 
> I propose the following to fix this:
> 
> diff --git a/lib/wctype.in.h b/lib/wctype.in.h
> index d307630..70bd4d2 100644
> --- a/lib/wctype.in.h
> +++ b/lib/wctype.in.h
> @@ -105,12 +105,21 @@ _GL_INLINE_HEADER_BEGIN
>  #  define WEOF -1
>  # endif
>  #else
> -/* mingw and MSVC define wint_t as 'unsigned short' in <crtdefs.h>.
> +/* mingw and MSVC define wint_t as 'unsigned short' in 
> <crtdefs.h>/<stddef.h>.
>     This is too small: ISO C 99 section 7.24.1.(2) says that wint_t must be
>     "unchanged by default argument promotions".  Override it.  */
>  # if @GNULIB_OVERRIDES_WINT_T@
>  #  if !GNULIB_defined_wint_t
> -#   include <crtdefs.h>
> +#   ifdef __MINGW32__
> +#    include <_mingw.h>
> +#    ifdef __MINGW64_VERSION_MAJOR
> +#     include <crtdefs.h>
> +#    else
> +#     include <stddef.h>
> +#    endif
> +#   else
> +#    include <crtdefs.h>
> +#   endif
>  typedef unsigned int rpl_wint_t;
>  #   undef wint_t
>  #   define wint_t rpl_wint_t

Thanks for the report and suggested fix.

The #ifdefology here seems a bit fragile to me (will likely break in other
forks of mingw), therefore I'm using an Autoconf test instead:


2017-04-27  Bruno Haible  <address@hidden>

        wctype-h: Fix compilation error with the original mingw.org mingw.
        * m4/wctype_h.m4 (gl_WCTYPE_H): Test for <crtdefs.h>. Set
        HAVE_CRTDEFS_H.
        * modules/wctype-h (Makefile.am): Substitute HAVE_CRTDEFS_H.
        * lib/wctype.in.h (rpl_wint_t): If <crtdefs.h> does not exist, include
        <stddef.h> instead.
        Reported and proposed by Eli Zaretskii <address@hidden>.

diff --git a/lib/wctype.in.h b/lib/wctype.in.h
index d307630..933bf78 100644
--- a/lib/wctype.in.h
+++ b/lib/wctype.in.h
@@ -105,12 +105,16 @@ _GL_INLINE_HEADER_BEGIN
 #  define WEOF -1
 # endif
 #else
-/* mingw and MSVC define wint_t as 'unsigned short' in <crtdefs.h>.
-   This is too small: ISO C 99 section 7.24.1.(2) says that wint_t must be
-   "unchanged by default argument promotions".  Override it.  */
+/* mingw and MSVC define wint_t as 'unsigned short' in <crtdefs.h> or
+   <stddef.h>.  This is too small: ISO C 99 section 7.24.1.(2) says that
+   wint_t must be "unchanged by default argument promotions".  Override it.  */
 # if @GNULIB_OVERRIDES_WINT_T@
 #  if !GNULIB_defined_wint_t
-#   include <crtdefs.h>
+#   if @HAVE_CRTDEFS_H@
+#    include <crtdefs.h>
+#   else
+#    include <stddef.h>
+#   endif
 typedef unsigned int rpl_wint_t;
 #   undef wint_t
 #   define wint_t rpl_wint_t
diff --git a/m4/wctype_h.m4 b/m4/wctype_h.m4
index 45ddaeb..c72a73f 100644
--- a/m4/wctype_h.m4
+++ b/m4/wctype_h.m4
@@ -1,4 +1,4 @@
-# wctype_h.m4 serial 18
+# wctype_h.m4 serial 19
 
 dnl A placeholder for ISO C99 <wctype.h>, for platforms that lack it.
 
@@ -66,6 +66,14 @@ AC_DEFUN([gl_WCTYPE_H],
   fi
   AC_SUBST([HAVE_WCTYPE_H])
 
+  AC_CHECK_HEADERS_ONCE([crtdefs.h])
+  if test $ac_cv_header_crtdefs_h = yes; then
+    HAVE_CRTDEFS_H=1
+  else
+    HAVE_CRTDEFS_H=0
+  fi
+  AC_SUBST([HAVE_CRTDEFS_H])
+
   case "$gl_cv_func_iswcntrl_works" in
     *yes) REPLACE_ISWCNTRL=0 ;;
     *)    REPLACE_ISWCNTRL=1 ;;
diff --git a/modules/wctype-h b/modules/wctype-h
index adfb218..37bccce 100644
--- a/modules/wctype-h
+++ b/modules/wctype-h
@@ -31,6 +31,7 @@ wctype.h: wctype.in.h $(top_builddir)/config.status 
$(CXXDEFS_H) $(WARN_ON_USE_H
              -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
              -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
              -e 's|@''NEXT_WCTYPE_H''@|$(NEXT_WCTYPE_H)|g' \
+             -e 's/@''HAVE_CRTDEFS_H''@/$(HAVE_CRTDEFS_H)/g' \
              -e 's/@''GNULIB_OVERRIDES_WINT_T''@/$(GNULIB_OVERRIDES_WINT_T)/g' 
\
              -e 's/@''GNULIB_ISWBLANK''@/$(GNULIB_ISWBLANK)/g' \
              -e 's/@''GNULIB_WCTYPE''@/$(GNULIB_WCTYPE)/g' \




reply via email to

[Prev in Thread] Current Thread [Next in Thread]