[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' \