Per https://gcc.gnu.org/gcc-5/porting_to.html, gcc 5.1 intentionally changed the preprocessor to emit multiple lines, rather than one line, when expanding text that includes literal markers combined with a macro expansion obtained from a header. This in turn breaks the probe for whether mingw headers support GNU-style "lld" for PRIdMAX, as the probe text was no longer on one line.
While at it, I also noted that on 64-bit Linux, PRIdMAX is "ld". This patch changes from grepping preprocessor output (with its indeterminate layout due to differences in preprocessors) to instead grepping an object file with a witness string literal embedded. It feels a bit gross, and certainly costs more processor time to compute, but I can't come up with anything better. Based on a report by Suren Hajyan. * m4/stdio_h.m4 (gl_STDIO_H): Change to compile test coupled with grepping the object file, to work around new gcc preprocessor rules. Signed-off-by: Eric Blake <ebl...@redhat.com> --- Any better ideas for how I can probe the value of PRIdMAX? Suren, I can work with you offline, to test a build of libvirt that incorporates this gnulib patch to see if it helps resolve your mingw cross-compilation of libvirt. ChangeLog | 6 ++++++ m4/stdio_h.m4 | 19 +++++++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 293b863..1b67561 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2015-05-20 Eric Blake <ebl...@redhat.com> + + stdio: fix probe on mingw under gcc 5.1 + * m4/stdio_h.m4 (gl_STDIO_H): Change to compile test coupled with + grepping the object file, to work around new gcc preprocessor rules. + 2015-03-09 Eric Blake <ebl...@redhat.com> error: document all entry points provided diff --git a/m4/stdio_h.m4 b/m4/stdio_h.m4 index e0c4bde..8ba140b 100644 --- a/m4/stdio_h.m4 +++ b/m4/stdio_h.m4 @@ -1,4 +1,4 @@ -# stdio_h.m4 serial 44 +# stdio_h.m4 serial 45 dnl Copyright (C) 2007-2015 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -8,6 +8,7 @@ AC_DEFUN([gl_STDIO_H], [ dnl For __USE_MINGW_ANSI_STDIO AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) + AC_REQUIRE([AC_PROG_EGREP]) AC_REQUIRE([gl_STDIO_H_DEFAULTS]) gl_NEXT_HEADERS([stdio.h]) @@ -17,13 +18,19 @@ AC_DEFUN([gl_STDIO_H], dnl printf wrapper the right attribute to match. AC_CACHE_CHECK([whether inttypes macros match system or gnu printf], [gl_cv_func_printf_attribute_flavor], - [AC_EGREP_CPP([findme .(ll|j)d. findme], - [#define __STDC_FORMAT_MACROS 1 + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #define __STDC_FORMAT_MACROS 1 #include <stdio.h> #include <inttypes.h> - findme PRIdMAX findme - ], [gl_cv_func_printf_attribute_flavor=gnu], - [gl_cv_func_printf_attribute_flavor=system])]) + extern int offset; + static const char probe[] = "\nFiNdMe" PRIdMAX "fInDmE\n"; + ]], [[ + return !probe[offset];]])], + [if $EGREP "FiNdMe(l?l|j)dfInDmE" conftest.$OBJEXT >/dev/null 2>&1; then + gl_cv_func_printf_attribute_flavor=gnu + else + gl_cv_func_printf_attribute_flavor=system + fi], [gl_cv_func_printf_attribute_flavor=system])]) if test "$gl_cv_func_printf_attribute_flavor" = gnu; then AC_DEFINE([GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU], [1], [Define to 1 if printf and friends should be labeled with -- 2.1.0