From ca67cf226d1d8fc46f559ca2734fbc1412a27c0c Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Sat, 5 Jan 2019 14:33:50 -0700 Subject: [PATCH] Add glib --- recipes/glib/recipe.sh | 44 ++++ recipes/glib/redox.patch | 541 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 585 insertions(+) create mode 100644 recipes/glib/recipe.sh create mode 100644 recipes/glib/redox.patch diff --git a/recipes/glib/recipe.sh b/recipes/glib/recipe.sh new file mode 100644 index 000000000..cd40d7bdb --- /dev/null +++ b/recipes/glib/recipe.sh @@ -0,0 +1,44 @@ +VERSION=2.59.0 +TAR=https://download.gnome.org/sources/glib/${VERSION%.*}/glib-$VERSION.tar.xz +BUILD_DEPENDS=(gettext libffi libiconv pcre zlib) + +function recipe_version { + echo "$VERSION" + skip=1 +} + +function recipe_update { + echo "skipping update" + skip=1 +} + +function recipe_build { + sysroot="$(realpath ../sysroot)" + export CFLAGS="-I$sysroot/include" + export LDFLAGS="-L$sysroot/lib" + glib_cv_stack_grows=no ./autogen.sh \ + --host=${HOST} \ + --prefix=/ \ + --disable-shared \ + --enable-static + sed -i 's/#define HAVE_SYS_RESOURCE_H 1/#undef HAVE_SYS_RESOURCE_H/' config.h + make -j"$(nproc)" + skip=1 +} + +function recipe_test { + echo "skipping test" + skip=1 +} + +function recipe_clean { + make clean + skip=1 +} + +function recipe_stage { + dest="$(realpath $1)" + make DESTDIR="$dest" install + rm -f "$dest/lib/"*.la + skip=1 +} diff --git a/recipes/glib/redox.patch b/recipes/glib/redox.patch new file mode 100644 index 000000000..61b76956f --- /dev/null +++ b/recipes/glib/redox.patch @@ -0,0 +1,541 @@ +diff -ruwN source/configure.ac source-new/configure.ac +--- source/configure.ac 2018-12-23 06:10:41.000000000 -0700 ++++ source-new/configure.ac 2019-01-05 10:59:22.924421938 -0700 +@@ -981,7 +981,7 @@ + [int qclass = C_IN;])], + [AC_MSG_RESULT([yes]) + NAMESER_COMPAT_INCLUDE="#include "], +- [AC_MSG_ERROR([could not compile test program either way])])])]) ++ [AC_MSG_WARN([could not compile test program either way])])])]) + AC_SUBST(NAMESER_COMPAT_INCLUDE) + + # We can't just use AC_CHECK_FUNC/AC_CHECK_LIB here. Bug 586150 +@@ -1009,7 +1009,7 @@ + [res_query("test", 0, 0, (void *)0, 0);], + [AC_MSG_RESULT([in -lbind]) + NETWORK_LIBS="-lbind $NETWORK_LIBS"], +- [AC_MSG_ERROR(not found)])]) ++ [AC_MSG_WARN(not found)])]) + LIBS="$save_libs"]) + AC_CHECK_FUNC(socket, :, AC_CHECK_LIB(socket, socket, + [NETWORK_LIBS="-lsocket $NETWORK_LIBS"], +diff -ruwN source/gio/ginetsocketaddress.c source-new/gio/ginetsocketaddress.c +--- source/gio/ginetsocketaddress.c 2018-12-23 06:10:41.000000000 -0700 ++++ source-new/gio/ginetsocketaddress.c 2019-01-05 12:05:33.754323562 -0700 +@@ -407,14 +407,21 @@ + g_inet_socket_address_new_from_string (const char *address, + guint port) + { ++#if !defined(__redox__) + static struct addrinfo *hints, hints_struct; ++#endif + GSocketAddress *saddr; + GInetAddress *iaddr; ++#if !defined(__redox__) + struct addrinfo *res; ++#endif + gint status; + + if (strchr (address, ':')) + { ++#if defined(__redox__) ++ saddr = NULL; ++#else + /* IPv6 address (or it's invalid). We use getaddrinfo() because + * it will handle parsing a scope_id as well. + */ +@@ -442,6 +449,7 @@ + saddr = NULL; + + freeaddrinfo (res); ++#endif + } + else + { +diff -ruwN source/gio/glocalfileinfo.c source-new/gio/glocalfileinfo.c +--- source/gio/glocalfileinfo.c 2018-12-23 06:10:41.000000000 -0700 ++++ source-new/gio/glocalfileinfo.c 2019-01-05 14:18:02.435425946 -0700 +@@ -1217,11 +1217,13 @@ + lookup_gid_name (gid_t gid) + { + char *name; ++#if !defined(__redox__) + #if defined (HAVE_GETGRGID_R) + char buffer[4096]; + struct group gbuf; + #endif + struct group *gbufp; ++#endif + + if (gid_cache == NULL) + gid_cache = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_free); +@@ -1231,6 +1233,7 @@ + if (name) + return name; + ++#if !defined(__redox__) + #if defined (HAVE_GETGRGID_R) + getgrgid_r (gid, &gbuf, buffer, sizeof(buffer), &gbufp); + #else +@@ -1242,6 +1245,7 @@ + gbufp->gr_name[0] != 0) + name = convert_pwd_string_to_utf8 (gbufp->gr_name); + else ++#endif + name = g_strdup_printf("%d", (int)gid); + + g_hash_table_replace (gid_cache, GINT_TO_POINTER (gid), name); +diff -ruwN source/gio/gnetworking.h.in source-new/gio/gnetworking.h.in +--- source/gio/gnetworking.h.in 2018-12-23 06:10:41.000000000 -0700 ++++ source-new/gio/gnetworking.h.in 2019-01-05 11:43:10.527612479 -0700 +@@ -40,14 +40,20 @@ + + #include + #include ++#if !defined(__redox__) + #include + #include ++#endif + #include + #include ++#if !defined(__redox__) + #include ++#endif + + #include ++#if !defined(__redox__) + #include ++#endif + @NAMESER_COMPAT_INCLUDE@ + + #ifndef T_SRV +diff -ruwN source/gio/gresolver.c source-new/gio/gresolver.c +--- source/gio/gresolver.c 2018-12-23 06:10:41.000000000 -0700 ++++ source-new/gio/gresolver.c 2019-01-05 12:51:56.587550105 -0700 +@@ -342,7 +342,7 @@ + { + g_set_error (error, G_RESOLVER_ERROR, G_RESOLVER_ERROR_NOT_FOUND, + _("Error resolving ā€œ%sā€: %s"), +- hostname, gai_strerror (EAI_NONAME)); ++ hostname, "EAI_NONAME"); + return TRUE; + } + +diff -ruwN source/gio/gsocket.c source-new/gio/gsocket.c +--- source/gio/gsocket.c 2018-12-23 06:10:41.000000000 -0700 ++++ source-new/gio/gsocket.c 2019-01-05 13:34:30.178211038 -0700 +@@ -1539,6 +1539,7 @@ + + g_return_val_if_fail (G_IS_SOCKET (socket), 0); + ++#if !defined(__redox__) + if (socket->priv->family == G_SOCKET_FAMILY_IPV4) + { + g_socket_get_option (socket, IPPROTO_IP, IP_TTL, +@@ -1550,6 +1551,7 @@ + &value, &error); + } + else ++#endif + g_return_val_if_reached (0); + + if (error) +@@ -1580,6 +1582,7 @@ + + g_return_if_fail (G_IS_SOCKET (socket)); + ++#if !defined(__redox__) + if (socket->priv->family == G_SOCKET_FAMILY_IPV4) + { + g_socket_set_option (socket, IPPROTO_IP, IP_TTL, +@@ -1593,6 +1596,7 @@ + ttl, &error); + } + else ++#endif + g_return_if_reached (); + + if (error) +@@ -1688,6 +1692,7 @@ + + g_return_val_if_fail (G_IS_SOCKET (socket), FALSE); + ++#if !defined(__redox__) + if (socket->priv->family == G_SOCKET_FAMILY_IPV4) + { + g_socket_get_option (socket, IPPROTO_IP, IP_MULTICAST_LOOP, +@@ -1699,6 +1704,7 @@ + &value, &error); + } + else ++#endif + g_return_val_if_reached (FALSE); + + if (error) +@@ -1733,6 +1739,7 @@ + + loopback = !!loopback; + ++#if !defined(__redox__) + if (socket->priv->family == G_SOCKET_FAMILY_IPV4) + { + g_socket_set_option (socket, IPPROTO_IP, IP_MULTICAST_LOOP, +@@ -1746,6 +1753,7 @@ + loopback, &error); + } + else ++#endif + g_return_if_reached (); + + if (error) +@@ -1777,6 +1785,7 @@ + + g_return_val_if_fail (G_IS_SOCKET (socket), 0); + ++#if !defined(__redox__) + if (socket->priv->family == G_SOCKET_FAMILY_IPV4) + { + g_socket_get_option (socket, IPPROTO_IP, IP_MULTICAST_TTL, +@@ -1788,6 +1797,7 @@ + &value, &error); + } + else ++#endif + g_return_val_if_reached (FALSE); + + if (error) +@@ -1819,6 +1829,7 @@ + + g_return_if_fail (G_IS_SOCKET (socket)); + ++#if !defined(__redox__) + if (socket->priv->family == G_SOCKET_FAMILY_IPV4) + { + g_socket_set_option (socket, IPPROTO_IP, IP_MULTICAST_TTL, +@@ -1832,6 +1843,7 @@ + ttl, &error); + } + else ++#endif + g_return_if_reached (); + + if (error) +@@ -2191,6 +2203,7 @@ + return FALSE; + + native_addr = g_inet_address_to_bytes (group); ++#if !defined(__redox__) + if (g_inet_address_get_family (group) == G_SOCKET_FAMILY_IPV4) + { + #ifdef HAVE_IP_MREQN +@@ -2252,6 +2265,7 @@ + &mc_req_ipv6, sizeof (mc_req_ipv6)); + } + else ++#endif + g_return_val_if_reached (FALSE); + + if (result < 0) +@@ -2912,6 +2926,7 @@ + if (!check_timeout (socket, error)) + return FALSE; + ++#if !defined(__redox__) + if (!g_socket_get_option (socket, SOL_SOCKET, SO_ERROR, &value, error)) + { + g_prefix_error (error, _("Unable to get pending error: ")); +@@ -2929,6 +2944,7 @@ + } + return FALSE; + } ++#endif + + socket->priv->connected_read = TRUE; + socket->priv->connected_write = TRUE; +@@ -3001,7 +3017,7 @@ + { + #ifdef G_OS_WIN32 + if (ioctlsocket (socket->priv->fd, FIONREAD, &avail) < 0) +-#else ++#elif !defined(__redox__) + if (ioctl (socket->priv->fd, FIONREAD, &avail) < 0) + #endif + avail = -1; +@@ -4316,7 +4332,7 @@ + #endif + } + +-#ifndef G_OS_WIN32 ++#if !defined(G_OS_WIN32) && !defined(__redox__) + + /* Unfortunately these have to be macros rather than inline functions due to + * using alloca(). */ +@@ -4673,7 +4689,9 @@ + vectors = &one_vector; + } + +-#ifndef G_OS_WIN32 ++#if defined(__redox__) ++ return -1; ++#elif !defined(G_OS_WIN32) + { + GOutputMessage output_message; + struct msghdr msg; +@@ -5138,7 +5156,9 @@ + vectors = &one_vector; + } + +-#ifndef G_OS_WIN32 ++#if defined(__redox__) ++ return -1; ++#elif !defined(G_OS_WIN32) + { + GInputMessage input_message; + struct msghdr msg; +@@ -5910,4 +5930,3 @@ + #endif + return FALSE; + } +- +diff -ruwN source/gio/gthreadedresolver.c source-new/gio/gthreadedresolver.c +--- source/gio/gthreadedresolver.c 2018-12-23 06:10:41.000000000 -0700 ++++ source-new/gio/gthreadedresolver.c 2019-01-05 13:46:36.830327532 -0700 +@@ -49,6 +49,7 @@ + { + switch (err) + { ++#if !defined(__redox__) + case EAI_FAIL: + #if defined(EAI_NODATA) && (EAI_NODATA != EAI_NONAME) + case EAI_NODATA: +@@ -58,7 +59,7 @@ + + case EAI_AGAIN: + return G_RESOLVER_ERROR_TEMPORARY_FAILURE; +- ++#endif + default: + return G_RESOLVER_ERROR_INTERNAL; + } +@@ -92,6 +93,12 @@ + gpointer task_data, + GCancellable *cancellable) + { ++#if defined(__redox__) ++ g_task_return_new_error (task, ++ G_RESOLVER_ERROR, ++ G_RESOLVER_ERROR_INTERNAL, ++ _("do_lookup_by_name not implemented on Redox")); ++#else + LookupData *lookup_data = task_data; + const char *hostname = lookup_data->hostname; + struct addrinfo *res = NULL; +@@ -163,6 +170,7 @@ + + if (res) + freeaddrinfo (res); ++#endif + } + + static GList * +@@ -289,6 +297,12 @@ + gpointer task_data, + GCancellable *cancellable) + { ++#if defined(__redox__) ++ g_task_return_new_error (task, ++ G_RESOLVER_ERROR, ++ G_RESOLVER_ERROR_INTERNAL, ++ _("do_lookup_by_address not implemented on Redox")); ++#else + GInetAddress *address = task_data; + struct sockaddr_storage sockaddr; + gsize sockaddr_size; +@@ -319,6 +333,7 @@ + gai_strerror (retval)); + g_free (phys); + } ++#endif + } + + static gchar * +@@ -369,7 +384,7 @@ + } + + +-#if defined(G_OS_UNIX) ++#if defined(G_OS_UNIX) && !defined(__redox__) + + #if defined __BIONIC__ && !defined BIND_4_COMPAT + /* Copy from bionic/libc/private/arpa_nameser_compat.h +@@ -920,6 +935,12 @@ + gpointer task_data, + GCancellable *cancellable) + { ++#if defined(__redox__) ++ g_task_return_new_error (task, ++ G_RESOLVER_ERROR, ++ G_RESOLVER_ERROR_INTERNAL, ++ _("do_lookup_records not implemented on Redox")); ++#else + LookupRecordsData *lrd = task_data; + GList *records; + GError *error = NULL; +@@ -1005,6 +1026,7 @@ + g_task_return_pointer (task, records, (GDestroyNotify) free_records); + else + g_task_return_error (task, error); ++#endif + } + + static GList * +diff -ruwN source/gio/gunixfdmessage.c source-new/gio/gunixfdmessage.c +--- source/gio/gunixfdmessage.c 2018-12-23 06:10:41.000000000 -0700 ++++ source-new/gio/gunixfdmessage.c 2019-01-05 14:22:53.097587821 -0700 +@@ -53,6 +53,10 @@ + #include "gnetworking.h" + #include "gioerror.h" + ++#if defined(__redox__) ++#define SCM_RIGHTS 1 ++#endif ++ + struct _GUnixFDMessagePrivate + { + GUnixFDList *list; +diff -ruwN source/gio/gunixmounts.c source-new/gio/gunixmounts.c +--- source/gio/gunixmounts.c 2018-12-23 06:10:41.000000000 -0700 ++++ source-new/gio/gunixmounts.c 2019-01-05 14:25:31.846709810 -0700 +@@ -949,6 +949,21 @@ + return return_list; + } + ++/* Redox {{{2 */ ++#elif defined(__redox__) ++ ++static const char * ++get_mtab_monitor_file (void) ++{ ++ return NULL; ++} ++ ++static GList * ++_g_get_unix_mounts (void) ++{ ++ return NULL; ++} ++ + /* Common code {{{2 */ + #else + #error No _g_get_unix_mounts() implementation for system +@@ -1465,7 +1480,7 @@ + return g_list_reverse (return_list); + } + /* Interix {{{2 */ +-#elif defined(__INTERIX) ++#elif defined(__INTERIX) || defined(__redox__) + static GList * + _g_get_unix_mount_points (void) + { +diff -ruwN source/glib/glib-init.c source-new/glib/glib-init.c +--- source/glib/glib-init.c 2018-12-23 06:10:41.000000000 -0700 ++++ source-new/glib/glib-init.c 2019-01-05 11:09:03.083866992 -0700 +@@ -31,6 +31,10 @@ + #include + #include + ++#if defined(__redox__) ++int strcasecmp(const char *s1, const char *s2); ++#endif ++ + /* This seems as good a place as any to make static assertions about platform + * assumptions we make throughout GLib. */ + +diff -ruwN source/glib/gmain.c source-new/glib/gmain.c +--- source/glib/gmain.c 2018-12-23 06:10:41.000000000 -0700 ++++ source-new/glib/gmain.c 2019-01-05 11:10:02.228193887 -0700 +@@ -5891,13 +5891,21 @@ + sigset_t all; + + sigfillset (&all); ++ #if defined(__redox__) ++ sigprocmask (SIG_SETMASK, &all, &prev_mask); ++ #else + pthread_sigmask (SIG_SETMASK, &all, &prev_mask); + #endif ++#endif + glib_worker_context = g_main_context_new (); + g_thread_new ("gmain", glib_worker_main, NULL); + #ifdef G_OS_UNIX ++ #if defined(__redox__) ++ sigprocmask (SIG_SETMASK, &prev_mask, NULL); ++ #else + pthread_sigmask (SIG_SETMASK, &prev_mask, NULL); + #endif ++#endif + g_once_init_leave (&initialised, TRUE); + } + +diff -ruwN source/glib/gslice.c source-new/glib/gslice.c +--- source/glib/gslice.c 2018-12-23 06:10:41.000000000 -0700 ++++ source-new/glib/gslice.c 2019-01-05 11:11:23.896640840 -0700 +@@ -405,6 +405,8 @@ + GetSystemInfo (&system_info); + sys_page_size = system_info.dwPageSize; + } ++#elif defined(__redox__) ++ sys_page_size = getpagesize(); + #else + sys_page_size = sysconf (_SC_PAGESIZE); /* = sysconf (_SC_PAGE_SIZE); = getpagesize(); */ + #endif +diff -ruwN source/glib/gspawn.c source-new/glib/gspawn.c +--- source/glib/gspawn.c 2018-12-23 06:10:41.000000000 -0700 ++++ source-new/glib/gspawn.c 2019-01-05 11:20:25.669130455 -0700 +@@ -1217,7 +1217,11 @@ + open_max = rl.rlim_max; + else + #endif ++#if defined(__redox__) ++ open_max = INT_MAX; ++#else + open_max = sysconf (_SC_OPEN_MAX); ++#endif + + for (fd = 0; fd < open_max; fd++) + if ((res = cb (data, fd)) != 0) +diff -ruwN source/glib/gstrfuncs.c source-new/glib/gstrfuncs.c +--- source/glib/gstrfuncs.c 2018-12-23 06:10:41.000000000 -0700 ++++ source-new/glib/gstrfuncs.c 2019-01-05 11:11:59.452834000 -0700 +@@ -55,6 +55,12 @@ + #include "glibintl.h" + + ++#if defined(__redox__) ++int strcasecmp(const char *s1, const char *s2); ++int strncasecmp(const char *s1, const char *s2, size_t n); ++#endif ++ ++ + /** + * SECTION:string_utils + * @title: String Utility Functions +diff -ruwN source/glib/gthread-posix.c source-new/glib/gthread-posix.c +--- source/glib/gthread-posix.c 2018-12-23 06:10:41.000000000 -0700 ++++ source-new/glib/gthread-posix.c 2019-01-05 11:40:57.454759289 -0700 +@@ -660,6 +660,7 @@ + #elif defined (HAVE_PTHREAD_CONDATTR_SETCLOCK) && defined (CLOCK_MONOTONIC) + if G_UNLIKELY ((status = pthread_condattr_setclock (&attr, CLOCK_MONOTONIC)) != 0) + g_thread_abort (status, "pthread_condattr_setclock"); ++#elif defined(__redox__) + #else + #error Cannot support GCond on your platform. + #endif +@@ -896,7 +897,7 @@ + if ((status = pthread_cond_timedwait_relative_np (g_cond_get_impl (cond), g_mutex_get_impl (mutex), &ts)) == 0) + return TRUE; + } +-#elif defined (HAVE_PTHREAD_CONDATTR_SETCLOCK) && defined (CLOCK_MONOTONIC) ++#elif (defined (HAVE_PTHREAD_CONDATTR_SETCLOCK) && defined (CLOCK_MONOTONIC)) || defined(__redox__) + /* This is the exact check we used during init to set the clock to + * monotonic, so if we're in this branch, timedwait() will already be + * expecting a monotonic clock.