X-Git-Url: http://git.draconx.ca/gitweb/dxcommon.git/blobdiff_plain/9ade2c8c042ab15030d7bbb49fa97ae692a10e4f..15c81590df7ef0ff8ec387b259fee8dac8ceda0e:/m4/glib.m4 diff --git a/m4/glib.m4 b/m4/glib.m4 index 32d2784..7afab9d 100644 --- a/m4/glib.m4 +++ b/m4/glib.m4 @@ -1,4 +1,4 @@ -dnl Copyright © 2009, 2019 Nick Bowler +dnl Copyright © 2009, 2019-2020 Nick Bowler dnl dnl License WTFPL2: Do What The Fuck You Want To Public License, version 2. dnl This is free software: you are free to do what the fuck you want to. @@ -32,14 +32,15 @@ AC_DEFUN([DX_LIB_GLIB2], m4_define([_DX_LIB_GLIB2_TESTHEAD], [#include ])dnl _DX_LIB_GLIB2_VERSION_TEST(m4_split([$1], [\.]))dnl m4_define([_DX_LIB_GLIB2_TESTMAIN], - [const char *v = glib_check_version(2,0,0);])dnl + [const char *v = g_get_prgname();])dnl m4_define([_DX_GLIB_MODULES], [glib])dnl m4_append_uniq_w([_DX_GLIB_MODULES], [$2])dnl m4_map_args_w(m4_defn([_DX_GLIB_MODULES]), [_DX_LIB_GLIB2_MODULE(], [)]) AC_SUBST([GLIB_CFLAGS])dnl AC_SUBST([GLIB_LIBS])dnl -AS_IF([$_dx_lib_glib_search_ok], [$3], [m4_default([$4], [AC_MSG_FAILURE( +AS_IF([$_dx_lib_glib_search_ok], [DX_LIB_GLIB_BUSTED_GNU_INLINE +$3], [m4_default([$4], [AC_MSG_FAILURE( [GLib[]m4_ifnblank([$1], [ version $1 or newer]) is required. The latest version may be found at . m4_newline([DX_LIB_USERFLAG_BLURB([libglib], [GLib])]) @@ -117,3 +118,43 @@ AC_DEFUN([_DX_LIB_GLIB2_VERSION_TEST], [m4_append([_DX_LIB_GLIB2_TESTHEAD], [ [0])) DX_LIB_COMPILE_ERROR([glib version insufficient]) #endif])]) + +dnl Old glib headers expect gcc to provide GNU inline semantics by default. +dnl This is not the case with modern gcc if the language standard is set to +dnl C99 or later. This results is linker failures due to multiple definitions +dnl when two source files include the GLib headers. +dnl +dnl Pre-#defining G_INLINE_FUNC to 'static inline' works to avoid this problem, +dnl so we have configure first test to see if the problem occurs, then test +dnl if this definition fixes it, then AC_DEFINE that if necessary. +AC_DEFUN([DX_LIB_GLIB_BUSTED_GNU_INLINE], +[AC_CACHE_CHECK([whether GLib needs obsolete GNU inline semantics], +[dx_cv_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_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 +int bar(void) { return 0; }])], +[mv -f conftest.$OBJEXT conftest_bar.$OBJEXT], +[continue]) +AC_LINK_IFELSE([AC_LANG_PROGRAM([$DEFTEST +#include +extern int bar(void);], [return bar();])], +[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_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.]) +])])