On 5/22/2020 7:18 PM, Ken Brown via Cygwin-apps wrote:
I've been planning to adopt gimp and some related build dependencies.  My reason is that I use gimp and would like to see it kept up to date.

I thought I had all the prerequisites I needed.  But when I built gimp, I discovered that it used two functions, g_set_weak_pointer and g_date_time_new_from_iso8601, that were introduced in glib-2.56.

[gimp's configure.ac says that it only requires glib 2.54.2, but this seems to be wrong.  Cygwin's glib is at 2.54.3.  Fedora's is at 2.64.3, which is the latest upstream release.]

I'd appreciate some advice about how to proceed.  I'm not interested in adopting all of GNOME, and it probably doesn't make sense for different components of GNOME to be adopted by different people.

A short-term solution (from my personal POV) would be for me to do a non-maintainer update of glib to 2.56, assuming that's doable without messing up other GNOME components.

A better solution (again from my personal POV) would be for someone to adopt GNOME and update it to its latest release.

To focus the discussion a little better, I've built and installed glib2.0-2.56.4. My cygport file and patches are attached. I can now build gimp-2.10.18, and it seems to run fine in limited testing.

Ken
Fix for -Werror=nested-externs

--- origsrc/glib-2.34.3/m4macros/glib-gettext.m4        2012-11-20 
08:27:12.000000000 -0600
+++ src/glib-2.34.3/m4macros/glib-gettext.m4    2013-04-15 02:04:25.707401500 
-0500
@@ -222,8 +222,8 @@ msgstr ""
          AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
          GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
            [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
-         AC_TRY_LINK(, [extern int _nl_msg_cat_cntr;
-                        return _nl_msg_cat_cntr],
+         AC_TRY_LINK([extern int _nl_msg_cat_cntr;],
+                     [return _nl_msg_cat_cntr],
            [CATOBJEXT=.gmo 
              DATADIRNAME=share],
            [case $host in
--- origsrc/glib-2.36.3/configure.ac    2013-08-04 20:21:20.808722600 -0500
+++ src/glib-2.36.3/configure.ac        2013-08-04 18:30:21.852852200 -0500
@@ -1880,7 +1880,7 @@ dnl ************************************
 
 AC_MSG_CHECKING(for platform-dependent source)
 case "$host" in
-  *-*-cygwin*|*-*-mingw*)
+  *-*-mingw*)
     PLATFORMDEP=gwin32.lo
     ;;
   *)
@@ -2594,9 +2594,6 @@ dnl *** Win32 API libs ***
 dnl **********************
 
 case $host in
-  *-*-cygwin*)
-       G_LIBS_EXTRA="-luser32 -lkernel32"
-    ;;
   *-*-mingw*)
        G_LIBS_EXTRA="-lws2_32 -lole32 -lwinmm -lshlwapi"
     ;;
--- origsrc/glib-2.36.3/docs/reference/gio/Makefile.am  2013-08-04 
20:21:20.849725000 -0500
+++ src/glib-2.36.3/docs/reference/gio/Makefile.am      2013-08-04 
18:11:14.000000000 -0500
@@ -77,6 +77,8 @@ IGNORE_HFILES = \
        gunixvolume.h                   \
        gunixvolumemonitor.h            \
        gwin32appinfo.h                 \
+       gwin32inputstream.h             \
+       gwin32outputstream.h            \
        gwin32mount.h                   \
        gwin32resolver.h                \
        gwin32volumemonitor.h
--- origsrc/glib-2.36.3/gio/giomodule-priv.h    2013-08-04 20:21:20.877726600 
-0500
+++ src/glib-2.36.3/gio/giomodule-priv.h        2013-08-04 18:11:14.000000000 
-0500
@@ -39,7 +39,7 @@ GType    _g_io_module_get_default_type (
                                         const gchar *envvar,
                                         guint        is_supported_offset);
 
-#ifdef G_PLATFORM_WIN32
+#ifdef G_OS_WIN32
 void *_g_io_win32_get_module (void);
 #endif
 
--- origsrc/glib-2.36.3/gio/giomodule.c 2013-08-04 20:21:20.886727100 -0500
+++ src/glib-2.36.3/gio/giomodule.c     2013-08-04 18:11:14.000000000 -0500
@@ -894,7 +894,7 @@ extern GType g_network_monitor_base_get_
 extern GType _g_network_monitor_netlink_get_type (void);
 #endif
 
-#ifdef G_PLATFORM_WIN32
+#ifdef G_OS_WIN32
 
 #include <windows.h>
 
--- origsrc/glib-2.36.3/gio/tests/live-g-file.c 2013-08-04 20:21:20.898727800 
-0500
+++ src/glib-2.36.3/gio/tests/live-g-file.c     2013-08-04 18:11:14.000000000 
-0500
@@ -1282,7 +1282,7 @@ main (int argc, char *argv[])
          write_test = TRUE;
          only_create_struct = FALSE;
          target_path = DEFAULT_TEST_DIR;
-#ifdef G_PLATFORM_WIN32
+#ifdef G_OS_WIN32
          posix_compat = FALSE;
 #else
          posix_compat = TRUE;
--- origsrc/glib-2.36.3/glib/gatomic.c  2013-08-04 20:21:20.907728300 -0500
+++ src/glib-2.36.3/glib/gatomic.c      2013-08-04 18:11:14.000000000 -0500
@@ -464,7 +464,7 @@ gsize
   return g_atomic_pointer_xor ((volatile gpointer *) atomic, val);
 }
 
-#elif defined (G_PLATFORM_WIN32)
+#elif defined (G_OS_WIN32)
 
 #include <windows.h>
 #if !defined(_M_AMD64) && !defined (_M_IA64) && !defined(_M_X64) && !(defined 
_MSC_VER && _MSC_VER <= 1200)
--- origsrc/glib-2.36.3/glib/gcharset.c 2013-08-04 20:21:20.925729300 -0500
+++ src/glib-2.36.3/glib/gcharset.c     2013-08-04 18:11:14.000000000 -0500
@@ -496,7 +496,7 @@ guess_category_value (const gchar *categ
   if ((retval != NULL) && (retval[0] != '\0'))
     return retval;
 
-#ifdef G_PLATFORM_WIN32
+#ifdef G_OS_WIN32
   /* g_win32_getlocale() first checks for LC_ALL, LC_MESSAGES and
    * LANG, which we already did above. Oh well. The main point of
    * calling g_win32_getlocale() is to get the thread's locale as used
--- origsrc/glib-2.36.3/glib/gconvert.c 2013-08-04 20:21:20.933729800 -0500
+++ src/glib-2.36.3/glib/gconvert.c     2013-08-04 18:11:14.000000000 -0500
@@ -33,9 +33,6 @@
 
 #ifdef G_OS_WIN32
 #include "win_iconv.c"
-#endif
-
-#ifdef G_PLATFORM_WIN32
 #define STRICT
 #include <windows.h>
 #undef STRICT
@@ -1258,7 +1255,7 @@ g_locale_from_utf8 (const gchar *utf8str
                      charset, "UTF-8", bytes_read, bytes_written, error);
 }
 
-#ifndef G_PLATFORM_WIN32
+#ifndef G_OS_WIN32
 
 typedef struct _GFilenameCharsetCache GFilenameCharsetCache;
 
@@ -1374,7 +1371,7 @@ g_get_filename_charsets (const gchar ***
   return cache->is_utf8;
 }
 
-#else /* G_PLATFORM_WIN32 */
+#else /* G_OS_WIN32 */
 
 gboolean
 g_get_filename_charsets (const gchar ***filename_charsets) 
@@ -1403,7 +1400,7 @@ g_get_filename_charsets (const gchar ***
 #endif
 }
 
-#endif /* G_PLATFORM_WIN32 */
+#endif /* G_OS_WIN32 */
 
 static gboolean
 get_filename_charset (const gchar **filename_charset)
--- origsrc/glib-2.36.3/glib/gfileutils.c       2013-08-04 20:21:20.942730300 
-0500
+++ src/glib-2.36.3/glib/gfileutils.c   2013-08-04 18:11:14.000000000 -0500
@@ -2153,7 +2153,7 @@ g_path_skip_root (const gchar *file_name
 {
   g_return_val_if_fail (file_name != NULL, NULL);
 
-#ifdef G_PLATFORM_WIN32
+#ifdef G_OS_WIN32
   /* Skip \\server\share or //server/share */
   if (G_IS_DIR_SEPARATOR (file_name[0]) &&
       G_IS_DIR_SEPARATOR (file_name[1]) &&
@@ -2163,7 +2163,6 @@ g_path_skip_root (const gchar *file_name
       gchar *p;
       p = strchr (file_name + 2, G_DIR_SEPARATOR);
 
-#ifdef G_OS_WIN32
       {
         gchar *q;
 
@@ -2171,7 +2170,6 @@ g_path_skip_root (const gchar *file_name
         if (p == NULL || (q != NULL && q < p))
         p = q;
       }
-#endif
 
       if (p && p > file_name + 2 && p[1])
         {
--- origsrc/glib-2.36.3/glib/glib.h     2013-08-04 20:21:20.949730700 -0500
+++ src/glib-2.36.3/glib/glib.h 2013-08-04 18:11:14.000000000 -0500
@@ -96,7 +96,7 @@
 #include <glib/gvariant.h>
 #include <glib/gversion.h>
 #include <glib/gversionmacros.h>
-#ifdef G_PLATFORM_WIN32
+#ifdef G_OS_WIN32
 #include <glib/gwin32.h>
 #endif
 
--- origsrc/glib-2.36.3/glib/gutf8.c    2013-08-04 20:21:20.984732700 -0500
+++ src/glib-2.36.3/glib/gutf8.c        2013-08-04 18:11:14.000000000 -0500
@@ -27,7 +27,7 @@
 #endif
 #include <string.h>
 
-#ifdef G_PLATFORM_WIN32
+#ifdef G_OS_WIN32
 #include <stdio.h>
 #define STRICT
 #include <windows.h>
--- origsrc/glib-2.36.3/glib/gutils.c   2013-08-04 20:21:21.015734500 -0500
+++ src/glib-2.36.3/glib/gutils.c       2013-08-04 18:11:14.000000000 -0500
@@ -72,7 +72,7 @@
 #include "garray.h"
 #include "glibintl.h"
 
-#ifdef G_PLATFORM_WIN32
+#ifdef G_OS_WIN32
 #include "gconvert.h"
 #include "gwin32.h"
 #endif
@@ -86,16 +86,13 @@
  * These are portable utility functions.
  */
 
-#ifdef G_PLATFORM_WIN32
+#ifdef G_OS_WIN32
 #  include <windows.h>
 #  ifndef GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
 #    define GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT 2
 #    define GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS 4
 #  endif
 #  include <lmcons.h>          /* For UNLEN */
-#endif /* G_PLATFORM_WIN32 */
-
-#ifdef G_OS_WIN32
 #  include <direct.h>
 #  include <shlobj.h>
    /* older SDK (e.g. msvc 5.0) does not have these*/
@@ -131,7 +128,7 @@
 #include <langinfo.h>
 #endif
 
-#ifdef G_PLATFORM_WIN32
+#ifdef G_OS_WIN32
 
 gchar *
 _glib_get_dll_directory (void)
--- origsrc/glib-2.36.3/glib/gutils.h   2013-08-04 20:21:21.067737500 -0500
+++ src/glib-2.36.3/glib/gutils.h       2013-08-04 18:11:14.000000000 -0500
@@ -350,7 +350,7 @@ g_bit_storage (gulong number)
  * On non-Windows platforms, expands to nothing.
  */
 
-#ifndef G_PLATFORM_WIN32
+#ifndef G_OS_WIN32
 # define G_WIN32_DLLMAIN_FOR_DLL_NAME(static, dll_name)
 #else
 # define G_WIN32_DLLMAIN_FOR_DLL_NAME(static, dll_name)                        
\
@@ -378,7 +378,7 @@ DllMain (HINSTANCE hinstDLL,                                
                \
 
 #endif /* !G_DISABLE_DEPRECATED */
 
-#endif /* G_PLATFORM_WIN32 */
+#endif /* G_OS_WIN32 */
 
 G_END_DECLS
 
--- origsrc/glib-2.36.3/glib/gwin32.h   2013-08-04 20:21:21.081738300 -0500
+++ src/glib-2.36.3/glib/gwin32.h       2013-08-04 18:11:14.000000000 -0500
@@ -33,7 +33,7 @@
 
 #include <glib/gtypes.h>
 
-#ifdef G_PLATFORM_WIN32
+#ifdef G_OS_WIN32
 
 G_BEGIN_DECLS
 
@@ -41,8 +41,6 @@ G_BEGIN_DECLS
 #define MAXPATHLEN 1024
 #endif
 
-#ifdef G_OS_WIN32
-
 /*
  * To get prototypes for the following POSIXish functions, you have to
  * include the indicated non-POSIX headers. The functions are defined
@@ -68,7 +66,6 @@ G_BEGIN_DECLS
 GLIB_AVAILABLE_IN_ALL
 gint           g_win32_ftruncate       (gint            f,
                                         guint           size);
-#endif /* G_OS_WIN32 */
 
 /* The MS setlocale uses locale names of the form "English_United
  * States.1252" etc. We want the Unixish standard form "en", "zh_TW"
@@ -112,7 +109,7 @@ gchar*          g_win32_locale_filename_
 
 G_END_DECLS
 
-#endif  /* G_PLATFORM_WIN32 */
+#endif  /* G_OS_WIN32 */
 
 #ifdef G_OS_WIN32
 #ifdef _WIN64
--- origsrc/glib-2.36.3/glib/libcharset/localcharset.c  2013-08-04 
20:21:21.095739100 -0500
+++ src/glib-2.36.3/glib/libcharset/localcharset.c      2013-08-04 
18:11:14.000000000 -0500
@@ -46,10 +46,6 @@
 #   include <locale.h>
 #  endif
 # endif
-# ifdef __CYGWIN__
-#  define WIN32_LEAN_AND_MEAN
-#  include <windows.h>
-# endif
 #elif defined WIN32_NATIVE
 # define WIN32_LEAN_AND_MEAN
 # include <windows.h>
@@ -111,7 +107,7 @@ _g_locale_get_charset_aliases (void)
   cp = charset_aliases;
   if (cp == NULL)
     {
-#if !(defined VMS || defined WIN32_NATIVE || defined __CYGWIN__)
+#if !(defined VMS || defined WIN32_NATIVE)
       FILE *fp;
       const char *dir;
       const char *base = "charset.alias";
@@ -237,7 +233,7 @@ _g_locale_get_charset_aliases (void)
           "DECKOREAN" "\0" "EUC-KR" "\0";
 # endif
 
-# if defined WIN32_NATIVE || defined __CYGWIN__
+# if defined WIN32_NATIVE
       /* To avoid the troubles of installing a separate file in the same
         directory as the DLL and of retrieving the DLL's directory at
         runtime, simply inline the aliases here.  */
@@ -292,53 +288,6 @@ _g_locale_charset_raw (void)
   /* Most systems support nl_langinfo (CODESET) nowadays.  */
   codeset = nl_langinfo (CODESET);
 
-#  ifdef __CYGWIN__
-  /* Cygwin 2006 does not have locales.  nl_langinfo (CODESET) always
-     returns "US-ASCII".  As long as this is not fixed, return the suffix
-     of the locale name from the environment variables (if present) or
-     the codepage as a number.  */
-  if (codeset != NULL && strcmp (codeset, "US-ASCII") == 0)
-    {
-      const char *locale;
-      static char buf[2 + 10 + 1];
-
-      locale = getenv ("LC_ALL");
-      if (locale == NULL || locale[0] == '\0')
-       {
-         locale = getenv ("LC_CTYPE");
-         if (locale == NULL || locale[0] == '\0')
-           locale = getenv ("LANG");
-       }
-      if (locale != NULL && locale[0] != '\0')
-       {
-         /* If the locale name contains an encoding after the dot, return
-            it.  */
-         const char *dot = strchr (locale, '.');
-
-         if (dot != NULL)
-           {
-             const char *modifier;
-
-             dot++;
-             /* Look for the possible @... trailer and remove it, if any.  */
-             modifier = strchr (dot, '@');
-             if (modifier == NULL)
-               return dot;
-             if (modifier - dot < sizeof (buf))
-               {
-                 memcpy (buf, dot, modifier - dot);
-                 buf [modifier - dot] = '\0';
-                 return buf;
-               }
-           }
-       }
-
-      /* Woe32 has a function returning the locale's codepage as a number.  */
-      sprintf (buf, "CP%u", GetACP ());
-      codeset = buf;
-    }
-#  endif
-
 # else
 
   /* On old systems which lack it, use setlocale or getenv.  */
--- origsrc/glib-2.36.3/glib/tests/uri.c        2013-08-04 20:21:21.104739600 
-0500
+++ src/glib-2.36.3/glib/tests/uri.c    2013-08-04 18:11:14.000000000 -0500
@@ -56,7 +56,7 @@ to_uri_tests[] = {
   { "c:\\windows", "otherhost", NULL, G_CONVERT_ERROR_NOT_ABSOLUTE_PATH},
 #endif
   { "etc", "localhost", NULL, G_CONVERT_ERROR_NOT_ABSOLUTE_PATH},
-#ifndef G_PLATFORM_WIN32
+#ifndef G_OS_WIN32
   { "/etc/\xE5\xE4\xF6", NULL, "file:///etc/%E5%E4%F6" },
   { "/etc/\xC3\xB6\xC3\xA4\xC3\xA5", NULL, "file:///etc/%C3%B6%C3%A4%C3%A5"},
 #endif
--- origsrc/glib-2.36.3/tests/Makefile.am       2013-08-04 20:21:21.109739900 
-0500
+++ src/glib-2.36.3/tests/Makefile.am   2013-08-04 18:11:14.000000000 -0500
@@ -20,7 +20,9 @@ libadd_libgmodule = $(libgmodule)
 libadd_libglib = $(libglib)
 if PLATFORM_WIN32
 no_undefined = -no-undefined
+endif
 
+if OS_WIN32
 module_test_exp = module-test.exp
 
 module-test.exp: module-test.o
--- origsrc/glib-2.36.3/tests/testglib.c        2013-08-04 20:21:21.118740400 
-0500
+++ src/glib-2.36.3/tests/testglib.c    2013-08-04 18:11:14.000000000 -0500
@@ -776,7 +776,7 @@ test_info (void)
 
   if (g_test_verbose())
     {
-#ifdef G_PLATFORM_WIN32
+#ifdef G_OS_WIN32
       g_printerr ("current locale: %s\n", g_win32_getlocale ());
 
       g_printerr ("found more.com as %s\n", g_find_program_in_path 
("more.com"));
--- origsrc/glib-2.36.3/configure.ac    2013-08-04 18:11:14.140206800 -0500
+++ src/glib-2.36.3/configure.ac        2013-08-04 18:30:21.852852200 -0500
@@ -3584,7 +3584,7 @@ dnl visibility attributes for symbol exp
 dnl
 GLIB_HIDDEN_VISIBILITY_CFLAGS=""
 case "$host" in
-  *-*-mingw*)
+  *-*-cygwin*|*-*-mingw*)
     dnl on mingw32 we do -fvisibility=hidden and __declspec(dllexport)
     AC_DEFINE([_GLIB_EXTERN], [__attribute__((visibility("default"))) 
__declspec(dllexport) extern],
               [defines how to decorate public symbols while building])
--- origsrc/glib-2.36.4/glib/gspawn.c   2013-08-07 09:36:32.000000000 -0500
+++ src/glib-2.36.4/glib/gspawn.c       2013-10-21 13:25:34.502441400 -0500
@@ -1040,7 +1040,7 @@ fdwalk (int (*cb)(void *data, int fd), v
   struct rlimit rl;
 #endif
 
-#ifdef __linux__  
+#if defined(__linux__) || defined(__CYGWIN__)
   DIR *d;
 
   if ((d = opendir("/proc/self/fd"))) {
Cygwin defines this since 1.7.8, but our wchar_t is only 16-bit while
this code seems to assume 32-bit wchar_t.  So, either some incorrect
assumptions need to be fixed in the __STDC_ISO_10646__ code paths, or
the conditionals need to also be guarded && (__SIZEOF_WCHAR_T__ == 4).

Reported by SLao:
http://article.gmane.org/gmane.os.cygwin.ports.general/1330

--- origsrc/glib-2.36.4/glib/gunicollate.c      2013-05-07 13:26:07.000000000 
-0500
+++ src/glib-2.36.4/glib/gunicollate.c  2013-11-30 21:36:27.710188300 -0600
@@ -37,9 +37,12 @@
 #include "gstrfuncs.h"
 #include "gtestutils.h"
 #include "gcharset.h"
-#ifndef __STDC_ISO_10646__
+#if !defined(__STDC_ISO_10646__) || defined(G_WITH_CYGWIN)
 #include "gconvert.h"
 #endif
+#ifdef G_WITH_CYGWIN
+#undef __STDC_ISO_10646__
+#endif
 
 
 #ifdef _MSC_VER
--- origsrc/glib-2.38.2/glib/gconvert.c 2014-04-02 01:48:25.505447200 -0500
+++ src/glib-2.38.2/glib/gconvert.c     2014-04-02 02:22:47.959345500 -0500
@@ -1583,7 +1583,9 @@ g_filename_from_uri (const gchar *uri,
       return NULL;
     }
        
-  if (has_case_prefix (path_part, "///")) 
+  if (has_case_prefix (path_part, "////"))
+    path_part += 1;
+  else if (has_case_prefix (path_part, "///"))
     path_part += 2;
   else if (has_case_prefix (path_part, "//"))
     {
--- origsrc/glib-2.42.1/glib/goption.c  2014-11-09 15:54:26.000000000 -0600
+++ src/glib-2.42.1/glib/goption.c      2015-01-01 19:39:40.385456500 -0600
@@ -1740,7 +1740,7 @@ free_pending_nulls (GOptionContext *cont
 static char *
 platform_get_argv0 (void)
 {
-#if defined __linux
+#if defined __linux || defined __CYGWIN__
   char *cmdline;
   char *base_arg0;
   gsize len;
--- origsrc/glib-2.42.1/glib/tests/option-argv0.c       2014-06-28 
12:02:43.000000000 -0500
+++ src/glib-2.42.1/glib/tests/option-argv0.c   2015-01-01 19:39:34.848253300 
-0600
@@ -27,7 +27,7 @@
 #include <stdio.h>
 #include <string.h>
 
-#if defined __linux || defined __OpenBSD__
+#if defined __linux || defined __OpenBSD__ || defined __CYGWIN__
 static void
 test_platform_argv0 (void)
 {
@@ -56,7 +56,7 @@ main (int   argc,
 {
   g_test_init (&argc, &argv, "no_g_set_prgname", NULL);
 
-#if defined __linux || defined __OpenBSD__
+#if defined __linux || defined __OpenBSD__ || defined __CYGWIN__
   g_test_add_func ("/option/argv0", test_platform_argv0);
 #endif
 
--- origsrc/glib-2.56.4/gio/gdbusauth.c 2018-12-18 10:03:26.000000000 -0500
+++ src/glib-2.56.4/gio/gdbusauth.c     2020-05-23 08:58:55.003593200 -0400
@@ -1299,9 +1299,9 @@ _g_dbus_auth_run_server (GDBusAuth
                                                     &line_length,
                                                     cancellable,
                                                     error);
-          debug_print ("SERVER: WaitingForBegin, read '%s'", line);
           if (line == NULL)
             goto out;
+          debug_print ("SERVER: WaitingForBegin, read '%s'", line);
           if (g_strcmp0 (line, "BEGIN") == 0)
             {
               /* YAY, done! */
--- origsrc/glib-2.56.4/gio/gdbusmessage.c      2018-12-18 10:03:26.000000000 
-0500
+++ src/glib-2.56.4/gio/gdbusmessage.c  2020-05-23 09:18:23.976547300 -0400
@@ -2727,7 +2727,6 @@ g_dbus_message_to_blob (GDBusMessage
   if (message->body != NULL)
     {
       gchar *tupled_signature_str;
-      tupled_signature_str = g_strdup_printf ("(%s)", signature_str);
       if (signature == NULL)
         {
           g_set_error (error,
@@ -2735,10 +2734,10 @@ g_dbus_message_to_blob (GDBusMessage
                        G_IO_ERROR_INVALID_ARGUMENT,
                        _("Message body has signature “%s” but there is no 
signature header"),
                        signature_str);
-          g_free (tupled_signature_str);
           goto out;
         }
-      else if (g_strcmp0 (tupled_signature_str, g_variant_get_type_string 
(message->body)) != 0)
+      tupled_signature_str = g_strdup_printf ("(%s)", signature_str);
+      if (g_strcmp0 (tupled_signature_str, g_variant_get_type_string 
(message->body)) != 0)
         {
           g_set_error (error,
                        G_IO_ERROR,
--- origsrc/glib-2.56.4/gmodule/gmodule-win32.c 2018-08-15 12:22:08.000000000 
-0400
+++ src/glib-2.56.4/gmodule/gmodule-win32.c     2020-05-23 08:29:18.332616700 
-0400
@@ -37,7 +37,20 @@
 
 #ifdef G_WITH_CYGWIN
 #include <sys/cygwin.h>
-#endif
+#include <dlfcn.h>
+
+static gchar*
+fetch_dlerror (gboolean replace_null)
+{
+  gchar *msg = dlerror ();
+
+  if (!msg && replace_null)
+    return "unknown dl-error";
+
+  return msg;
+}
+
+#else
 
 static void
 set_error (const gchar *format,
@@ -62,22 +75,26 @@ set_error (const gchar *format,
   g_free (error);
 }
 
+#endif /* G_WITH_CYGWIN */
+
 /* --- functions --- */
 static gpointer
 _g_module_open (const gchar *file_name,
                gboolean     bind_lazy,
                gboolean     bind_local)
 {
-  HINSTANCE handle;
-  wchar_t *wfilename;
   DWORD old_mode;
   BOOL success;
 #ifdef G_WITH_CYGWIN
-  gchar tmp[MAX_PATH];
+  gpointer handle;
 
-  cygwin_conv_to_win32_path(file_name, tmp);
-  file_name = tmp;
-#endif
+  handle = dlopen (file_name,
+          (bind_local ? RTLD_LOCAL : RTLD_GLOBAL) | (bind_lazy ? RTLD_LAZY : 
RTLD_NOW));
+  if (!handle)
+    g_module_set_error (fetch_dlerror (TRUE));
+#else
+  HINSTANCE handle;
+  wchar_t *wfilename;
   wfilename = g_utf8_to_utf16 (file_name, -1, NULL, NULL, NULL);
 
   /* suppress error dialog */
@@ -91,26 +108,44 @@ _g_module_open (const gchar *file_name,
       
   if (!handle)
     set_error ("'%s': ", file_name);
+#endif
 
   return handle;
 }
 
+#ifndef G_WITH_CYGWIN
 static gint dummy;
 static gpointer null_module_handle = &dummy;
+#endif
   
 static gpointer
 _g_module_self (void)
 {
+#ifdef G_WITH_CYGWIN
+  gpointer handle;
+
+  handle = dlopen (NULL, RTLD_GLOBAL | RTLD_LAZY);
+  if (!handle)
+    g_module_set_error (fetch_dlerror (TRUE));
+
+  return handle;
+#else
   return null_module_handle;
+#endif
 }
 
 static void
 _g_module_close (gpointer handle,
                 gboolean is_unref)
 {
+#ifdef G_WITH_CYGWIN
+  if (dlclose (handle) != 0)
+    g_module_set_error (fetch_dlerror (TRUE));
+#else
   if (handle != null_module_handle)
     if (!FreeLibrary (handle))
       set_error ("");
+#endif
 }
 
 static gpointer
@@ -129,8 +164,19 @@ find_in_any_module_using_toolhelp (const
   if (Module32First (snapshot, &me32))
     {
       do {
-       if ((p = GetProcAddress (me32.hModule, symbol_name)) != NULL)
-         break;
+       if ((p = GetProcAddress (me32.hModule, symbol_name)) != NULL) {
+#ifdef G_WITH_CYGWIN
+         /* if symbol is found in another module, we probably do not want it */
+         ssize_t size = cygwin_conv_path (CCP_WIN_A_TO_POSIX, me32.szExePath, 
NULL, 0);
+         char *posix = (char *) alloca (size);
+         cygwin_conv_path (CCP_WIN_A_TO_POSIX, me32.szExePath, posix, size);
+         if (g_strstr_len (posix, size, "/usr/lib")
+             || g_strstr_len (posix, size, "/usr/local/lib"))
+           p = NULL;
+         else
+#endif
+           break;
+         }
       } while (Module32Next (snapshot, &me32));
     }
 
@@ -156,6 +202,13 @@ _g_module_symbol (gpointer     handle,
 {
   gpointer p;
   
+#ifdef G_WITH_CYGWIN
+  p = dlsym (handle, symbol_name);
+  if (!p)
+    p = find_in_any_module (symbol_name);
+  if (!p)
+    g_module_set_error (fetch_dlerror (FALSE));
+#else
   if (handle == null_module_handle)
     {
       if ((p = GetProcAddress (GetModuleHandle (NULL), symbol_name)) == NULL)
@@ -166,6 +219,7 @@ _g_module_symbol (gpointer     handle,
 
   if (!p)
     set_error ("");
+#endif
 
   return p;
 }
ORIG_PN="glib"
inherit gnome2 python

NAME="glib2.0"
VERSION=2.56.4
RELEASE=1
CATEGORY="Libs"
SUMMARY="GNOME core C function library"
DESCRIPTION="GLib is the low-level core library that forms the basis for
projects such as GTK+ and GNOME. It provides data structure handling for C,
portability wrappers, and interfaces for such runtime functionality as
an event loop, threads, dynamic loading, and an object system."
HOMEPAGE="http://www.gtk.org/";

PATCH_URI="
        2.56-gmodule-cygwin.patch
        2.36.3-not-win32.patch
        2.36.4-gspawn-cygwin.patch
        2.42.1-goption-cygwin.patch
        2.34.3-m4macros.patch
        2.36.3-visibility.patch
        2.36.4-gutf8-cygwin.patch
        2.38.2-gconvert-cygwin.patch
        2.56.4-dont-print-null-strings.patch
"
#       2.36.4-gsocket-cygwin.patch  # requires abstract sockets

BUILD_REQUIRES="gnome-common \
        gettext \
        gettext-devel \
        libfam-devel \
        libiconv \
        libpcre-devel \
        zlib-devel"

DISTCLEANFILES="gmodule/gmodule-cygwin.c gio/gdbus-2.0/codegen/config.py"

# libelf: for gresource(1), only useful on ELF platforms
CYGCONF_ARGS="
        --disable-visibility
        --disable-libelf
        --with-libiconv=gnu
        --with-pcre=system
        --with-threads=posix
        ac_cv_header_winsock2_h=no
        ac_cv_header_mswsock_h=no
"

PKG_NAMES="lib${NAME}_0 lib${NAME}-devel lib${NAME}-doc"
libglib2_0_0_SUMMARY="${SUMMARY} (runtime)"
libglib2_0_0_REQUIRES="desktop-file-utils gsettings-desktop-schemas 
shared-mime-info tzdata"
libglib2_0_0_CONTENTS="
        etc/
        usr/bin/cyg*-2.0-0.dll
        usr/bin/gapplication.exe
        usr/bin/gdbus.exe
        usr/bin/gio.exe
        usr/bin/gio-querymodules.exe
        usr/bin/glib-compile-schemas.exe
        usr/bin/gobject-query.exe
        usr/bin/gsettings.exe
        usr/lib/gio/
        usr/share/doc/
        usr/share/glib-2.0/schemas/
        usr/share/locale/
        usr/share/man/man1/gapplication.*
        usr/share/man/man1/gdbus.*
        usr/share/man/man1/gio*
        usr/share/man/man1/glib-compile-schemas*
        usr/share/man/man1/gobject*
        usr/share/man/man1/gsettings.*
"
libglib2_0_devel_SUMMARY="${SUMMARY} (development)"
libglib2_0_devel_CONTENTS="
        --exclude=glib-compile-schemas.[^html]*
        usr/bin/gdbus-codegen
        usr/bin/glib-*
        usr/bin/gresource*
        usr/bin/gtester*
        usr/include/gio-unix-2.0/
        usr/include/glib-2.0/
        usr/lib/glib-2.0/include/
        usr/lib/lib*-2.0.dll.a
        usr/lib/pkgconfig/*
        usr/share/aclocal/
        usr/share/gettext/
        usr/share/glib-2.0/codegen/
        usr/share/glib-2.0/gettext/
        usr/share/man/man1/gdbus-codegen*
        usr/share/man/man1/glib-*
        usr/share/man/man1/gresource*
        usr/share/man/man1/gtester*
"
libglib2_0_doc_CATEGORY="Doc"
libglib2_0_doc_CONTENTS="usr/share/gtk-doc/"
glib2_0_debuginfo_CONTENTS+=" usr/share/glib-2.0/gdb/"
PKG_IGNORE="
        usr/share/glib-2.0/valgrind/
"

src_install() {
        local giomodule_cache=/usr/lib/gio/modules/giomodule.cache
        local gschemas_compiled=/usr/share/glib-2.0/schemas/gschemas.compiled

        cd ${B}
        cyginstall completiondir=/etc/bash_completion.d

        rm -f ${D}/usr/lib/charset.alias

        pushd ${D}/usr/share/gdb/auto-load
        mkdir -p usr/bin
        mv libglib* usr/bin/cygglib-2.0-0.dll-gdb.py
        mv libgobject* usr/bin/cyggobject-2.0-0.dll-gdb.py
        popd

        python_optimize /usr/share/glib-2.0/gdb


        dodir /etc/postinstall /etc/preremove
        cat > ${D}/etc/postinstall/zp_${NAME}.sh <<EOF
if [ ! -f $giomodule_cache ]
then
    /usr/bin/gio-querymodules ${giomodule_cache%/*}
fi
find ${giomodule_cache%/*} -name '*.dll' -cnewer $giomodule_cache -exec 
/usr/bin/gio-querymodules ${giomodule_cache%/*} \;

if [ ! -f $gschemas_compiled ]
then
    /usr/bin/glib-compile-schemas ${gschemas_compiled%/*}
fi
find ${gschemas_compiled%/*} -name '*.xml' -cnewer $gschemas_compiled -exec 
/usr/bin/glib-compile-schemas ${gschemas_compiled%/*} \;
EOF
        cat > ${D}/etc/preremove/${NAME}.sh <<EOF
rm -f $giomodule_cache $gschemas_compiled
EOF
        chmod +x ${D}/etc/{postinstall,preremove}/*.sh
}

Reply via email to