]> git.draconx.ca Git - dxcommon.git/commitdiff
Try an additional workaround for GLib inline issue.
authorNick Bowler <nbowler@draconx.ca>
Sat, 8 Feb 2020 21:36:53 +0000 (16:36 -0500)
committerNick Bowler <nbowler@draconx.ca>
Sat, 8 Feb 2020 21:42:31 +0000 (16:42 -0500)
It seems there are a range of GLib versions which #define G_INLINE_FUNC
unconditionally and thus we cannot work around the headers reliance on
obsolete GNU inline semantics by predefining this macro.

On these versions, we can define G_IMPLEMENT_INLINES to disable inline
function usage altogether.  This is less ideal but it will at least
allow compilation to proceed.

m4/glib.m4
tests/libs.at

index 21676a41cd145ccd2a3650878e66d7314be93698..7afab9d10f529c056e1f2d6041ca21d842c7b5b3 100644 (file)
@@ -133,10 +133,11 @@ AC_DEFUN([DX_LIB_GLIB_BUSTED_GNU_INLINE],
 [save_CFLAGS=$CFLAGS save_LIBS=$LIBS CFLAGS="$LIBGLIB_CFLAGS $CFLAGS"
 LIBS="conftest_bar.$OBJEXT $LIBGLIB_LIBS $save_LIBS"
 dx_cv_glib_busted_gnu_inline=unknown
-for dx_attempt in no yes; do
-AS_CASE([$dx_attempt],
-[yes], [DEFTEST='#define G_INLINE_FUNC static inline'
-], [DEFTEST=
+for dx_cv_glib_inline_workaround in no G_INLINE_FUNC G_IMPLEMENT_INLINES; do
+AS_CASE([$dx_cv_glib_inline_workaround],
+[G_INLINE_FUNC], [DEFTEST='#define G_INLINE_FUNC static inline' ret=yes
+], [G_IMPLEMENT_INLINES], [DEFTEST='#define G_IMPLEMENT_INLINES 1' ret=yes
+], [DEFTEST= ret=no
 ])
 AC_COMPILE_IFELSE([AC_LANG_SOURCE([$DEFTEST
 #include <glib.h>
@@ -146,11 +147,14 @@ int bar(void) { return 0; }])],
 AC_LINK_IFELSE([AC_LANG_PROGRAM([$DEFTEST
 #include <glib.h>
 extern int bar(void);], [return bar();])],
-[dx_cv_glib_busted_gnu_inline=$dx_attempt; break])
+[dx_cv_glib_busted_gnu_inline=$ret; break])
 rm -f conftest_bar.$OBJEXT
 done
 CFLAGS=$save_CFLAGS LIBS=$save_LIBS])
-AS_CASE([$dx_cv_glib_busted_gnu_inline], [yes],
-[AC_DEFINE([G_INLINE_FUNC], [static inline],
+AS_CASE([$dx_cv_glib_inline_workaround],
+[G_INLINE_FUNC], [AC_DEFINE([G_INLINE_FUNC], [static inline],
   [Define to static inline to work around multiple definitions in old GLib.])
+], [G_IMPLEMENT_INLINES], [AC_DEFINE([G_IMPLEMENT_INLINES], [1],
+  [If G_INLINE_FUNC cannot work around multiple definition issues,
+   define to 1 to disable inlining altogether in GLib.])
 ])])
index cc09cead3a26e280d9d9ee97e09ac5cdbe08127d..8689c380d6fba819652c7eb576fae1da7f21463e 100644 (file)
@@ -125,11 +125,15 @@ TEST_AUTORECONF
 TEST_CONFIGURE([PKG_CONFIG=$PWD/pkg-config])
 AT_CHECK([./test.sh], [0], [ignore], [ignore])
 
-AT_CHECK([grep G_INLINE_FUNC config.h], [0],
+AT_CHECK([grep '#.*G_INLINE_FUNC' config.h], [0],
 [/* #undef G_INLINE_FUNC */
 ])
+AT_CHECK([grep '#.*G_IMPLEMENT_INLINES' config.h], [0],
+[/* #undef G_IMPLEMENT_INLINES */
+])
 
-cat >>glib.h <<'EOF'
+cp glib.h glib-orig.h
+cat glib-orig.h - >glib.h <<'EOF'
 #ifndef G_INLINE_FUNC
 #  define G_INLINE_FUNC extern inline
 #endif
@@ -137,8 +141,28 @@ G_INLINE_FUNC void break_things(void) { }
 EOF
 
 TEST_CONFIGURE([PKG_CONFIG=$PWD/pkg-config])
-AT_CHECK([grep G_INLINE_FUNC config.h], [0],
+AT_CHECK([grep '#.*G_INLINE_FUNC' config.h], [0],
 [#define G_INLINE_FUNC static inline
 ])
+AT_CHECK([grep '#.*G_IMPLEMENT_INLINES' config.h], [0],
+[/* #undef G_IMPLEMENT_INLINES */
+])
+
+cat glib-orig.h - >glib.h <<'EOF'
+#define G_INLINE_FUNC extern inline
+#ifdef G_IMPLEMENT_INLINES
+extern void break_things(void);
+#else
+G_INLINE_FUNC void break_things(void) { }
+#endif
+EOF
+
+TEST_CONFIGURE([PKG_CONFIG=$PWD/pkg-config])
+AT_CHECK([grep '#.*G_INLINE_FUNC' config.h], [0],
+[/* #undef G_INLINE_FUNC */
+])
+AT_CHECK([grep '#.*G_IMPLEMENT_INLINES' config.h], [0],
+[#define G_IMPLEMENT_INLINES 1
+])
 
 AT_CLEANUP