From 4f3e19a6298267a8675de26e3e3e16afa97cf6a1 Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Sat, 8 Feb 2020 16:36:53 -0500 Subject: [PATCH] Try an additional workaround for GLib inline issue. 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 | 18 +++++++++++------- tests/libs.at | 30 +++++++++++++++++++++++++++--- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/m4/glib.m4 b/m4/glib.m4 index 21676a4..7afab9d 100644 --- a/m4/glib.m4 +++ b/m4/glib.m4 @@ -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 @@ -146,11 +147,14 @@ int bar(void) { return 0; }])], AC_LINK_IFELSE([AC_LANG_PROGRAM([$DEFTEST #include 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.]) ])]) diff --git a/tests/libs.at b/tests/libs.at index cc09cea..8689c38 100644 --- a/tests/libs.at +++ b/tests/libs.at @@ -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 -- 2.43.2