[vlc-devel] [PATCH 3/4] win32: Fix *printf & require mingw32-runtime version > 3.13

davidf+nntp at woaf.net davidf+nntp at woaf.net
Fri Apr 10 14:53:00 CEST 2009


From: David Flynn <davidf at woaf.net>

*printf as per MSVCRT is not c99 compliant.  mingw32 provides a set of
replacement functions, but these are buggy in old versions.

Defining __USE_MINGW_ANSI_STDIO causes mingw's stdio to provide a
set of wrappers that use the mingw32 version that gets statically
linked.

Attention needs to be given to contrib too, it is possible for contrib
to expect a c99 *printf and later die.  This patch modifies the conrtib
bootstrap to define the above in CPPFLAGS, however, not all builds
honour CPPFLAGS.

This can be validated by looking for the import from msvcrt:

  $ find vlc-w32/vlc-1.0.0-pre1/ -name '*.dll' -print -exec sh -c \
     'i586-mingw32msvc-nm {} | grep __imp__.*printf' ';'

If all is good, this shouldn't find anything.

This patch *will* break WinCE support.  However, it is semibroken
anyway; better to force it to be fixed completely.

Signed-off-by: David Flynn <davidf at rd.bbc.co.uk>
---
 configure.ac             |   18 ++++++++++++++++++
 extras/contrib/bootstrap |    6 +++++-
 include/vlc_fixups.h     |   13 +++++++++++++
 3 files changed, 36 insertions(+), 1 deletions(-)

diff --git a/configure.ac b/configure.ac
index 75f60c2..37f35d2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -453,6 +453,24 @@ AM_ICONV
 VLC_ADD_CFLAGS([libvlc],[${INCICONV}])
 VLC_ADD_LIBS([libvlc],[${LTLIBICONV}])
 
+dnl Check for broken versions of mingw-runtime compatability library
+if test "${SYS}" = "mingw32"
+then
+    AC_MSG_CHECKING(for broken mingw-runtime)
+    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <_mingw.h>
+#if (__MINGW32_MAJOR_VERSION == 3) && (__MINGW32_MINOR_VERSION < 14)
+# error Attempting to use mingw-runtime with broken vsnprintf support
+#endif
+        ]])],
+        [AC_MSG_RESULT([Ok])],
+        [AC_MSG_ERROR([Broken mingw-runtime, need > 3.13])],
+])
+    dnl force use of mingw provided c99 *printf over msvcrt
+    CPPFLAGS="${CPPFLAGS} -D__USE_MINGW_ANSI_STDIO=1"
+    CPPFLAGS_save="${CPPFLAGS_save} -D__USE_MINGW_ANSI_STDIO=1"
+fi
+
 dnl Check for the need to include the mingwex lib for mingw32
 if test "${SYS}" = "mingw32"
 then
diff --git a/extras/contrib/bootstrap b/extras/contrib/bootstrap
index 6cc9fe5..30a46ab 100755
--- a/extras/contrib/bootstrap
+++ b/extras/contrib/bootstrap
@@ -224,7 +224,9 @@ case $HOST in
     *mingw32*)
         echo "HAVE_WIN32 = 1" >> config.mak
         echo "PKG_CONFIG_PATH = \$(PREFIX)/lib/pkgconfig" >> config.mak
-	    EXTRA_CFLAGS="-O3"
+        # force use of mingw provided c99 *printf over msvcrt:
+        EXTRA_CPPFLAGS=" -D__USE_MINGW_ANSI_STDIO=1"
+        EXTRA_CFLAGS="-O3"
         cat src/Distributions/win32.mak >> distro.mak
     ;;
     i686-pc-cygwin)
@@ -236,6 +238,8 @@ case $HOST in
         EXTRA_CFLAGS=" -mno-cygwin -isystem /usr/include/mingw"
         EXTRA_CPPFLAGS=" -mno-cygwin -isystem /usr/include/mingw"
         EXTRA_LDFLAGS=" -mno-cygwin"
+        # force use of mingw provided c99 *printf over msvcrt:
+        EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS -D__USE_MINGW_ANSI_STDIO=1"
         echo "PKG_CONFIG_PATH = \$(PREFIX)/lib/pkgconfig" >> config.mak
         cat src/Distributions/win32.mak >> distro.mak
     ;;
diff --git a/include/vlc_fixups.h b/include/vlc_fixups.h
index 15172b2..0294c3d 100644
--- a/include/vlc_fixups.h
+++ b/include/vlc_fixups.h
@@ -26,6 +26,19 @@
 #ifndef LIBVLC_FIXUPS_H
 # define LIBVLC_FIXUPS_H 1
 
+#ifdef __MINGW32_VERSION
+# if __MINGW32_MAJOR_VERSION == 3 && __MINGW32_MINOR_VERSION < 14
+#  error This mingw-runtime is too old, it has a broken vsnprintf
+# endif
+/* mingw-runtime provides the whole printf family in a c99 compliant way. */
+/* the way to enable this is to define __USE_MINGW_ANSI_STDIO, or something
+ * such as _ISOC99_SOURCE; the former is done by configure.ac */
+/* This isn't done here, since some modules don't include config.h and
+ * therefore this as the first include file */
+#elif defined UNDER_CE
+# error Window CE support for *printf needs fixing.
+#endif
+
 #ifndef HAVE_STRDUP
 # include <string.h>
 # include <stdlib.h>
-- 
1.5.6.5




More information about the vlc-devel mailing list