bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] stdio: fix probe on mingw under gcc 5.1


From: Pádraig Brady
Subject: Re: [PATCH] stdio: fix probe on mingw under gcc 5.1
Date: Thu, 21 May 2015 00:54:40 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.6.0

On 21/05/15 00:26, Eric Blake wrote:
> 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 <address@hidden>
> ---
> 
> 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  <address@hidden>
> +
> +     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  <address@hidden>
> 
>       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

It's a bit gross, though I can't see any problems with it.
You could process the preprocessor output too with
something like that, though it's not great either.

cpp ... | sed /^#/d | tr -cd '[[:alnum:]]' | grep ...

thanks,
Pádraig



reply via email to

[Prev in Thread] Current Thread [Next in Thread]