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 <br...@clisp.org> 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 <e...@gnu.org>. 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' \