All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Daniel P. Berrangé" <berrange@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Peter Maydell" <peter.maydell@linaro.org>,
	"Markus Armbruster" <armbru@redhat.com>,
	"Paolo Bonzini" <pbonzini@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>,
	"Daniel P. Berrangé" <berrange@redhat.com>
Subject: [Qemu-devel] [PATCH 3/3] glib: enforce the minimum required version and warn about old APIs
Date: Fri,  4 May 2018 17:00:26 +0100	[thread overview]
Message-ID: <20180504160026.14017-4-berrange@redhat.com> (raw)
In-Reply-To: <20180504160026.14017-1-berrange@redhat.com>

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.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
 include/glib-compat.h | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 49 insertions(+)

diff --git a/include/glib-compat.h b/include/glib-compat.h
index 3b340ab33c..d066f6d257 100644
--- a/include/glib-compat.h
+++ b/include/glib-compat.h
@@ -16,8 +16,57 @@
 #ifndef QEMU_GLIB_COMPAT_H
 #define QEMU_GLIB_COMPAT_H
 
+/* Ask for warnings for anything that was marked deprecated in
+ * the defined version, or before. It is a candidate for rewrite.
+ */
+#define GLIB_VERSION_MIN_REQUIRED GLIB_VERSION_2_42
+
+/* Ask for warnings if code tries to use function that did not
+ * exist in the defined version. These risk breaking builds
+ */
+#define GLIB_VERSION_MAX_ALLOWED GLIB_VERSION_2_42
+
 #include <glib.h>
 
+/*
+ * Note that because of the GLIB_VERSION_MAX_ALLOWED constant
+ * above, allowing use of functions from newer GLib via this
+ * compat header needs a little trickery to prevent warnings
+ * being emitted.
+ *
+ * Consider a function from newer glib-X.Y that we want to use
+ *
+ *    int g_foo(const char *wibble)
+ *
+ * We must define a static inline function with the same
+ * 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)
+ *        g_foo(wibble)
+ *     #else
+ *        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
+ *
+ *   #define g_foo(a) g_foo_qemu(a)
+ *
+ * So now the code elsewhere in QEMU, which *does* have the
+ * -Wdeprecated-declarations warning active, can call
+ * g_foo(...) as normal, without generating warnings.
+ */
+
+
 #if defined(_WIN32) && !GLIB_CHECK_VERSION(2, 50, 0)
 /*
  * g_poll has a problem on Windows when using
-- 
2.14.3

  parent reply	other threads:[~2018-05-04 16:00 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 ` Daniel P. Berrangé [this message]
2018-05-08 15:17   ` [Qemu-devel] [PATCH 3/3] glib: enforce the minimum required version and warn about old APIs Paolo Bonzini
2018-05-08 15:19     ` Daniel P. Berrangé
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=20180504160026.14017-4-berrange@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.