build: improve our use of glib's version macros to catch more bugs
authorDan Winship <danw@gnome.org>
Sat, 8 Feb 2014 13:03:49 +0000 (14:03 +0100)
committerDan Winship <danw@gnome.org>
Thu, 13 Feb 2014 16:24:37 +0000 (11:24 -0500)
We were setting GLIB_VERSION_MAX_ALLOWED to 2.34, since we provide
reimplementations of a few 2.34 functions in nm-glib-compat.h. But
this was turning off warnings for the 2.34+ APIs we *didn't* have
compat versions of too.

Fix this by setting MAX_ALLOWED to 2.32 (same as MIN_REQUIRED), and
defining macros to wrap calls to compat-ified functions and disable
deprecation warnings around them.

This points out several places where we were accidentally using 2.34
APIs without noticing, which need to be fixed now.

Makefile.am
configure.ac
include/nm-glib-compat.h
tui/newt/Makefile.am
tui/newt/nmt-newt-types.h
tui/newt/nmt-newt-utils.c

index edeadf5..b41bfa9 100644 (file)
@@ -57,7 +57,7 @@ cscope:
        cscope -b -q -R -Iinclude -ssrc -slibnm-glib -slibnm-util -scli/src;
 
 libgsystem_srcpath := libgsystem
-libgsystem_cflags := $(GLIB_CFLAGS) -I$(srcdir)/libgsystem
+libgsystem_cflags := $(filter-out -DGLIB_VERSION%,$(GLIB_CFLAGS)) -I$(srcdir)/libgsystem
 libgsystem_libs = $(GLIB_LIBS)
 include libgsystem/Makefile-libgsystem.am
 noinst_LTLIBRARIES = libgsystem.la
index 9e29b71..174b6bf 100644 (file)
@@ -254,12 +254,10 @@ AM_CONDITIONAL(HAVE_DBUS_GLIB_100, test "${have_dbus_glib_100}" = "yes")
 PKG_CHECK_MODULES(GLIB, gio-unix-2.0 >= 2.32 gmodule-2.0)
 
 dnl GLIB_VERSION_MIN_REQUIRED should match the version above.
-dnl GLIB_VERSION_MAX_ALLOWED should be the largest version for which there
-dnl is a GLIB_CHECK_VERSION check. We currently have to use
-dnl G_ENCODE_VERSION(2,34) here rather than GLIB_VERSION_2_34, because
-dnl GLib 2.32 did not handle future version defines correctly.
-
-GLIB_CFLAGS="$GLIB_CFLAGS -DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_32 '-DGLIB_VERSION_MAX_ALLOWED=G_ENCODE_VERSION(2,34)'"
+dnl GLIB_VERSION_MAX_ALLOWED should be set to the same version;
+dnl nm-glib-compat.h will cause it to be overridden for the functions
+dnl we have compat versions of.
+GLIB_CFLAGS="$GLIB_CFLAGS -DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_32 -DGLIB_VERSION_MAX_ALLOWED=GLIB_VERSION_2_32"
 
 AC_SUBST(GLIB_CFLAGS)
 AC_SUBST(GLIB_LIBS)
index 58e92cf..9004e24 100644 (file)
@@ -55,6 +55,40 @@ g_type_ensure (GType type)
                        _destroy (_p); \
        } G_STMT_END
 
+/* These are used to clean up the output of test programs; we can just let
+ * them no-op in older glib.
+ */
+#define g_test_expect_message(log_domain, log_level, pattern)
+#define g_test_assert_expected_messages()
+
+#else
+
+/* We build with -DGLIB_MAX_ALLOWED_VERSION set to 2.32 to make sure we don't
+ * accidentally use new API that we shouldn't. But we don't want warnings for
+ * the APIs that we emulate above.
+ */
+
+#define g_type_ensure(t) \
+       G_STMT_START { \
+               G_GNUC_BEGIN_IGNORE_DEPRECATIONS \
+               g_type_ensure (t); \
+               G_GNUC_END_IGNORE_DEPRECATIONS \
+       } G_STMT_END
+
+#define g_test_expect_message(domain, level, format...) \
+       G_STMT_START { \
+               G_GNUC_BEGIN_IGNORE_DEPRECATIONS \
+               g_test_expect_message (domain, level, format); \
+               G_GNUC_END_IGNORE_DEPRECATIONS \
+       } G_STMT_END
+
+#define g_test_assert_expected_messages_internal(domain, file, line, func) \
+       G_STMT_START { \
+               G_GNUC_BEGIN_IGNORE_DEPRECATIONS \
+               g_test_assert_expected_messages_internal (domain, file, line, func); \
+               G_GNUC_END_IGNORE_DEPRECATIONS \
+       } G_STMT_END
+
 #endif
 
 #endif  /* NM_GLIB_COMPAT_H */
index c5b295c..7dc35bb 100644 (file)
@@ -1,4 +1,5 @@
 AM_CPPFLAGS= \
+       -I$(top_srcdir)/include \
        $(GLIB_CFLAGS) \
        $(NEWT_CFLAGS) \
        $(NULL)
index c26ff90..608f7ff 100644 (file)
@@ -21,6 +21,7 @@
 
 #include <glib-object.h>
 #include <newt.h>
+#include "nm-glib-compat.h"
 
 G_BEGIN_DECLS
 
index 028c243..10e8484 100644 (file)
@@ -26,6 +26,7 @@
 #include <errno.h>
 #include <stdarg.h>
 #include <unistd.h>
+#include <sys/wait.h>
 
 #include <glib/gi18n-lib.h>
 
@@ -350,11 +351,21 @@ nmt_newt_edit_string (const char *data)
                goto done;
        }
 
+#if GLIB_CHECK_VERSION (2, 34, 0)
+       G_GNUC_BEGIN_IGNORE_DEPRECATIONS
        if (!g_spawn_check_exit_status (status, &error)) {
                nmt_newt_message_dialog (_("Editor failed: %s"), error->message);
                g_error_free (error);
                goto done;
        }
+       G_GNUC_END_IGNORE_DEPRECATIONS
+#else
+       if (WIFEXITED (status)) {
+               if (WEXITSTATUS (status) != 0)
+                       nmt_newt_message_dialog (_("Editor failed with status %d"), WEXITSTATUS (status));
+       } else if (WIFSIGNALED (status))
+               nmt_newt_message_dialog (_("Editor failed with signal %d"), WTERMSIG (status));
+#endif
 
        if (!g_file_get_contents (filename, &new_data, NULL, &error)) {
                nmt_newt_message_dialog (_("Could not re-read file: %s"), error->message);