From: "Daniel P. Berrangé" <berrange@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: qemu-devel@nongnu.org, Peter Maydell <peter.maydell@linaro.org>,
Markus Armbruster <armbru@redhat.com>,
Thomas Huth <thuth@redhat.com>, Olaf Hering <olaf@aepfle.de>,
Stefan Hajnoczi <stefanha@redhat.com>,
Michael Roth <mdroth@linux.vnet.ibm.com>,
Eric Blake <eblake@redhat.com>,
Stefan Berger <stefanb@linux.vnet.ibm.com>
Subject: Re: [Qemu-devel] [PATCH 3/3] glib: enforce the minimum required version and warn about old APIs
Date: Tue, 8 May 2018 16:19:40 +0100 [thread overview]
Message-ID: <20180508151940.GC5967@redhat.com> (raw)
In-Reply-To: <752b52d8-2990-13d7-753c-36aafc5f0041@redhat.com>
On Tue, May 08, 2018 at 05:17:40PM +0200, Paolo Bonzini wrote:
> On 04/05/2018 18:00, Daniel P. Berrangé wrote:
> > There are two useful macros that can be defined before including
> > glib.h that are related to the min required glib version
> >
> > - GLIB_VERSION_MIN_REQUIRED
> >
> > When this is defined, if code uses an API that was deprecated
> > in this version, or older, a compiler warning will be emitted.
> > This alerts maintainers to update their code to whatever new
> > replacement API is now recommended best practice.
> >
> > - GLIB_VERSION_MAX_ALLOWED
> >
> > When this is defined, if code uses an API that was introduced
> > in a version that is newer than the declared version, a compiler
> > warning will be emitted. This alerts maintainers if new code
> > accidentally uses functionality that won't be available on some
> > supported platforms.
> >
> > The GLIB_VERSION_MAX_ALLOWED constant makes it a bit harder to opt
> > in to using specific new APIs with a GLIB_CHECK_VERSION conditional.
> > To workaround this Pragmas can be used to temporarily turn off the
> > -Wdeprecated-declarations compiler warning, while a static inline
> > compat function is implemented. Nothing needs that at this time,
> > so just illustrate it in a comment for benefit of future changes.
>
> Unfortunately there is one need, and it's a bug in glib itself:
>
> In file included from /usr/lib64/glib-2.0/include/glibconfig.h:9:0,
> from /usr/include/glib-2.0/glib/gtypes.h:32,
> from /usr/include/glib-2.0/glib/galloca.h:32,
> from /usr/include/glib-2.0/glib.h:30,
> from /home/pbonzini/work/upstream/qemu/include/glib-compat.h:29,
> from /home/pbonzini/work/upstream/qemu/include/qemu/osdep.h:107,
> from /home/pbonzini/work/upstream/qemu/disas/arm-a64.cc:21:
> /usr/include/glib-2.0/glib/glib-autocleanups.h: In function ‘void glib_autoptr_cleanup_GOptionGroup(GOptionGroup**)’:
> /usr/include/glib-2.0/glib/glib-autocleanups.h:63:45: error: ‘void g_option_group_unref(GOptionGroup*)’ is deprecated (declared at /usr/include/glib-2.0/glib/goption.h:372): Not available before 2.44 [-Werror=deprecated-declarations]
> G_DEFINE_AUTOPTR_CLEANUP_FUNC(GOptionGroup, g_option_group_unref)
> ^
> /usr/include/glib-2.0/glib/gmacros.h:444:88: note: in definition of macro ‘G_DEFINE_AUTOPTR_CLEANUP_FUNC’
> static inline void _GLIB_AUTOPTR_FUNC_NAME(TypeName) (TypeName **_ptr) { if (*_ptr) (func) (*_ptr); } \
> ^
> /usr/include/glib-2.0/glib/gmacros.h:444:100: error: ‘void g_option_group_unref(GOptionGroup*)’ is deprecated (declared at /usr/include/glib-2.0/glib/goption.h:372): Not available before 2.44 [-Werror=deprecated-declarations]
> static inline void _GLIB_AUTOPTR_FUNC_NAME(TypeName) (TypeName **_ptr) { if (*_ptr) (func) (*_ptr); } \
> ^
> /usr/include/glib-2.0/glib/glib-autocleanups.h:63:1: note: in expansion of macro ‘G_DEFINE_AUTOPTR_CLEANUP_FUNC’
> G_DEFINE_AUTOPTR_CLEANUP_FUNC(GOptionGroup, g_option_group_unref)
>
> (This is RHEL7 glib2-2.50.3-3.el7.x86_64).
>
> Luckily you suggested the solution yourself---this seems to work:
>
> diff --git a/include/glib-compat.h b/include/glib-compat.h
> index d066f6d..ef07489 100644
> --- a/include/glib-compat.h
> +++ b/include/glib-compat.h
> @@ -26,6 +26,8 @@
> */
> #define GLIB_VERSION_MAX_ALLOWED GLIB_VERSION_2_42
>
> +_Pragma("GCC diagnostic push")
> +_Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
> #include <glib.h>
>
> /*
> @@ -42,8 +44,6 @@
> * signature that does what we need, but with a "_qemu"
> * suffix eg
> *
> - * _Pragma("GCC diagnostic push")
> - * _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
> * static inline void g_foo_qemu(const char *wibble)
> * {
> * #if GLIB_CHECK_VERSION(X, Y, 0)
> @@ -52,12 +52,10 @@
> * g_something_equivalent_in_older_glib(wibble);
> * #endif
> * }
> - * _Pragma("GCC diagnostic pop")
> *
> - * The Pragma calls turn off -Wdeprecated-declarations,
> - * ensuring this wrapper function impl doesn't trigger the
> - * compiler warning about using too new glib APIs. Finally
> - * we can do
> + * The _Pragma at the top of this file turns off -Wdeprecated-declarations,
> + * ensuring this wrapper function impl doesn't trigger the compiler warning
> + * about using too new glib APIs. Finally we can do
> *
> * #define g_foo(a) g_foo_qemu(a)
> *
> @@ -94,4 +92,6 @@ gint g_poll_fixed(GPollFD *fds, guint nfds, gint timeout);
> } while (0)
> #endif
>
> +_Pragma("GCC diagnostic pop")
> +
> #endif
>
> I'll give it a shot on clang too.
Ok, that change looks fine with me assuming it passes your build tests.
In fact that is what I had done in an earlier version.
Regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
next prev parent reply other threads:[~2018-05-08 15:19 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-05-04 16:00 [Qemu-devel] [PATCH 0/3] Document intent for supported build platforms and bump min glib to 2.42 Daniel P. Berrangé
2018-05-04 16:00 ` [Qemu-devel] [PATCH 1/3] qemu-doc: provide details of supported build platforms Daniel P. Berrangé
2018-05-04 16:00 ` [Qemu-devel] [PATCH 2/3] glib: bump min required glib library version to 2.42 Daniel P. Berrangé
2018-05-04 20:02 ` Eric Blake
2018-05-04 16:00 ` [Qemu-devel] [PATCH 3/3] glib: enforce the minimum required version and warn about old APIs Daniel P. Berrangé
2018-05-08 15:17 ` Paolo Bonzini
2018-05-08 15:19 ` Daniel P. Berrangé [this message]
2018-05-08 16:02 ` Paolo Bonzini
2018-05-08 16:14 ` Daniel P. Berrangé
2018-05-04 16:35 ` [Qemu-devel] [PATCH 0/3] Document intent for supported build platforms and bump min glib to 2.42 no-reply
2018-05-04 16:36 ` no-reply
2018-05-04 19:40 ` Olaf Hering
2018-05-04 20:57 ` Daniel P. Berrangé
2018-05-04 21:00 ` Daniel P. Berrangé
2018-05-04 21:00 ` [Qemu-devel] " Daniel P. Berrangé
2018-05-08 14:50 ` George Dunlap
2018-05-08 14:50 ` [Qemu-devel] [Xen-devel] " George Dunlap
2018-05-08 15:05 ` Paolo Bonzini
2018-05-08 15:05 ` [Qemu-devel] [Xen-devel] " Paolo Bonzini
2018-05-08 15:10 ` Daniel P. Berrangé
2018-05-08 15:10 ` [Qemu-devel] [Xen-devel] " Daniel P. Berrangé
2018-05-08 15:47 ` George Dunlap
2018-05-08 15:47 ` [Qemu-devel] [Xen-devel] " George Dunlap
2018-05-04 22:05 ` [Qemu-devel] " Paolo Bonzini
2018-05-08 10:42 ` Daniel P. Berrangé
2018-05-08 11:41 ` Paolo Bonzini
2018-05-11 22:48 ` [Qemu-devel] Requiring Python 2.7+ (was Re: [PATCH 0/3] Document intent for supported build platforms and bump min glib to 2.42) Eduardo Habkost
2018-05-14 9:33 ` Daniel P. Berrangé
2018-05-14 9:36 ` Peter Maydell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180508151940.GC5967@redhat.com \
--to=berrange@redhat.com \
--cc=armbru@redhat.com \
--cc=eblake@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=olaf@aepfle.de \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanb@linux.vnet.ibm.com \
--cc=stefanha@redhat.com \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.