]> git.draconx.ca Git - dxcommon.git/blobdiff - m4/glib.m4
Improve GLib probe against old GLib versions.
[dxcommon.git] / m4 / glib.m4
index 32d27848da5d2656480a197960557bf916f4c8ba..21676a41cd145ccd2a3650878e66d7314be93698 100644 (file)
@@ -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 <glib.h>])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 <https://www.gtk.org/>.
 m4_newline([DX_LIB_USERFLAG_BLURB([libglib], [GLib])])
@@ -117,3 +118,39 @@ 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_attempt in no yes; do
+AS_CASE([$dx_attempt],
+[yes], [DEFTEST='#define G_INLINE_FUNC static inline'
+], [DEFTEST=
+])
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([$DEFTEST
+#include <glib.h>
+int bar(void) { return 0; }])],
+[mv -f conftest.$OBJEXT conftest_bar.$OBJEXT],
+[continue])
+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])
+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],
+  [Define to static inline to work around multiple definitions in old GLib.])
+])])