Eli Zaretskii
2017-04-27 14:44:58 UTC
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
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