summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndoni Morales Alastruey <ylatuya@gmail.com>2014-10-09 11:38:28 +0200
committerSebastian Dröge <sebastian@centricular.com>2014-12-18 13:03:33 +0100
commit3722abfa9edaa897c6cc03fed0fa9f56a0e4f1c6 (patch)
treecab9f1c39e7869af1aef48e30fb29dc6c9706ef8
parentf3733197a5090b52ce093338f8c034c1f70ad7b5 (diff)
gdk-pixbuf: support relocations in OS X and Linux
Relocations are disabled in Linux by default but it can be changed with -DGDK_PIXBUF_RELOCATIONS see: https://bugzilla.gnome.org/show_bug.cgi?id=737523
-rw-r--r--recipes/gdk-pixbuf.recipe5
-rw-r--r--recipes/gdk-pixbuf/0001-io-extened-support-for-relotations-to-OS-X-and-Linux.patch205
2 files changed, 209 insertions, 1 deletions
diff --git a/recipes/gdk-pixbuf.recipe b/recipes/gdk-pixbuf.recipe
index 73162235..68c1ffe9 100644
--- a/recipes/gdk-pixbuf.recipe
+++ b/recipes/gdk-pixbuf.recipe
@@ -8,7 +8,10 @@ class Recipe(recipe.Recipe):
licenses = [License.LGPLv2Plus]
stype = SourceType.TARBALL
url = 'http://ftp.gnome.org/pub/gnome/sources/gdk-pixbuf/2.30/gdk-pixbuf-2.30.7.tar.xz'
- patches = ['gdk-pixbuf/0002-nls-update-gettext-macros-for-0.18.patch']
+ patches = [
+ 'gdk-pixbuf/0001-io-extened-support-for-relotations-to-OS-X-and-Linux.patch',
+ 'gdk-pixbuf/0002-nls-update-gettext-macros-for-0.18.patch',
+ ]
configure_options = '--with-included-loaders --enable-static --enable-gio-sniffing=no '
deps = ['jpeg', 'glib', 'libpng', 'tiff', 'zlib' ]
autoreconf = True
diff --git a/recipes/gdk-pixbuf/0001-io-extened-support-for-relotations-to-OS-X-and-Linux.patch b/recipes/gdk-pixbuf/0001-io-extened-support-for-relotations-to-OS-X-and-Linux.patch
new file mode 100644
index 00000000..ced85d6b
--- /dev/null
+++ b/recipes/gdk-pixbuf/0001-io-extened-support-for-relotations-to-OS-X-and-Linux.patch
@@ -0,0 +1,205 @@
+From 618259694147a134377eae4a0aaead939190b983 Mon Sep 17 00:00:00 2001
+From: Andoni Morales Alastruey <ylatuya@gmail.com>
+Date: Thu, 9 Oct 2014 11:33:36 +0200
+Subject: [PATCH] io: extened support for relotations to OS X and Linux
+
+---
+ configure.ac | 25 ++++++++++++++++++++++
+ gdk-pixbuf/gdk-pixbuf-io.c | 49 +++++++++++++++++++++++++++++++++-----------
+ gdk-pixbuf/gdk-pixbuf-util.c | 10 ++++++---
+ 3 files changed, 69 insertions(+), 15 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index 626e9e9..8501a83 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -130,6 +130,9 @@ case $host in
+ *-*-linux*)
+ os_linux=yes
+ ;;
++ *-*-darwin*)
++ AC_DEFINE(OS_DARWIN, 1, [Define to 1 if it's a darwin platform])
++ ;;
+ esac
+
+ if test "$os_win32" = "yes"; then
+@@ -1000,6 +1003,28 @@ fi
+
+ AM_CONDITIONAL(ENABLE_MAN, test x$enable_man != xno)
+
++#######################################################
++# Enable replacing the build-time prefix in the loaders
++# cache with the installation prefix on this machine
++# for relocatable packages such as Windows and OS X
++# applicationsapplications and linux bundles
++#######################################################
++
++enable_relocations=no
++case $host in
++ *-*-mingw*)
++ enable_relocations=yes
++ ;;
++ *-*-darwin*)
++ enable_relocations=yes
++ ;;
++esac
++
++if test "x$enable_relocations" = "xyes"; then
++ AC_DEFINE(GDK_PIXBUF_RELOCATABLE, 1,
++ [Define to 1 to replace the build-time prefix in modules])
++fi
++
+
+ ##################################################
+ # Check for -Bsymbolic-functions linker flag used
+diff --git a/gdk-pixbuf/gdk-pixbuf-io.c b/gdk-pixbuf/gdk-pixbuf-io.c
+index 2d952e5..49e294d 100644
+--- a/gdk-pixbuf/gdk-pixbuf-io.c
++++ b/gdk-pixbuf/gdk-pixbuf-io.c
+@@ -44,6 +44,9 @@
+ #include <windows.h>
+ #undef STRICT
+ #endif
++#ifdef OS_DARWIN
++#include <mach-o/dyld.h>
++#endif
+
+ /**
+ * SECTION:file-loading
+@@ -189,6 +192,7 @@ get_file_formats (void)
+ return file_formats;
+ }
+
++
+ #ifdef G_OS_WIN32
+
+ /* DllMain function needed to tuck away the gdk-pixbuf DLL handle */
+@@ -208,19 +212,40 @@ DllMain (HINSTANCE hinstDLL,
+
+ return TRUE;
+ }
++#endif
++
+
+ char *
+-_gdk_pixbuf_win32_get_toplevel (void)
++_gdk_pixbuf_get_toplevel (void)
+ {
+ static char *toplevel = NULL;
+
+- if (toplevel == NULL)
+- toplevel = g_win32_get_package_installation_directory_of_module (gdk_pixbuf_dll);
+-
++ if (toplevel == NULL) {
++#if defined(G_OS_WIN32)
++ toplevel = g_win32_get_package_installation_directory_of_module (gdk_pixbuf_dll);
++#elif defined(OS_DARWIN)
++ char pathbuf[PATH_MAX + 1];
++ uint32_t bufsize = sizeof(pathbuf);
++ gchar *bin_dir;
++
++ _NSGetExecutablePath(pathbuf, &bufsize);
++ bin_dir = g_dirname(pathbuf);
++ toplevel = g_build_path (G_DIR_SEPARATOR_S, bin_dir, "..", NULL);
++ g_free (bin_dir);
++#elif defined (G_OS_UNIX)
++ gchar *exe_path, *bin_dir;
++
++ exe_path = g_file_read_link ("/proc/self/exe", NULL);
++ bin_dir = g_dirname(exe_path);
++ toplevel = g_build_path (G_DIR_SEPARATOR_S, bin_dir, "..", NULL);
++ g_free (exe_path);
++ g_free (bin_dir);
++#else
++#error "Relocations not supported for this platform"
++#endif
++ }
+ return toplevel;
+ }
+-#endif
+-
+
+ #ifdef USE_GMODULE
+
+@@ -302,8 +327,8 @@ skip_space (const char **pos)
+
+ return !(*p == '\0');
+ }
+-
+-#ifdef G_OS_WIN32
++
++#ifdef GDK_PIXBUF_RELOCATABLE
+
+ static char *
+ get_libdir (void)
+@@ -311,7 +336,7 @@ get_libdir (void)
+ static char *libdir = NULL;
+
+ if (libdir == NULL)
+- libdir = g_build_filename (_gdk_pixbuf_win32_get_toplevel (), "lib", NULL);
++ libdir = g_build_filename (_gdk_pixbuf_get_toplevel (), "lib", NULL);
+
+ return libdir;
+ }
+@@ -340,12 +365,12 @@ correct_prefix (gchar **path)
+ * installation prefix on this machine.
+ */
+ tem = *path;
+- *path = g_strconcat (_gdk_pixbuf_win32_get_toplevel (), tem + strlen (GDK_PIXBUF_PREFIX), NULL);
++ *path = g_strconcat (_gdk_pixbuf_get_toplevel (), tem + strlen (GDK_PIXBUF_PREFIX), NULL);
+ g_free (tem);
+ }
+ }
+
+-#endif /* G_OS_WIN32 */
++#endif /* GDK_PIXBUF_RELOCATABLE */
+
+ static gchar *
+ gdk_pixbuf_get_module_file (void)
+@@ -496,7 +521,7 @@ gdk_pixbuf_io_init (void)
+ /* Blank line marking the end of a module
+ */
+ if (module && *p != '#') {
+-#ifdef G_OS_WIN32
++#ifdef GDK_PIXBUF_RELOCATABLE
+ correct_prefix (&module->module_path);
+ #endif
+ file_formats = g_slist_prepend (file_formats, module);
+diff --git a/gdk-pixbuf/gdk-pixbuf-util.c b/gdk-pixbuf/gdk-pixbuf-util.c
+index 6fbaa8e..be381cb 100644
+--- a/gdk-pixbuf/gdk-pixbuf-util.c
++++ b/gdk-pixbuf/gdk-pixbuf-util.c
+@@ -342,7 +342,7 @@ gdk_pixbuf_apply_embedded_orientation (GdkPixbuf *src)
+ return dest;
+ }
+
+-#ifdef G_OS_WIN32
++#ifdef GDK_PIXBUF_RELOCATABLE
+
+ static const gchar *
+ get_localedir (void)
+@@ -351,15 +351,19 @@ get_localedir (void)
+ gchar *retval;
+
+ /* In gdk-pixbuf-io.c */
+- extern char *_gdk_pixbuf_win32_get_toplevel (void);
++ extern char *_gdk_pixbuf_get_toplevel (void);
+
+- temp = g_build_filename (_gdk_pixbuf_win32_get_toplevel (), "share/locale", NULL);
++ temp = g_build_filename (_gdk_pixbuf_get_toplevel (), "share/locale", NULL);
+
++#ifdef G_OS_WIN32
+ /* The localedir is passed to bindtextdomain() which isn't
+ * UTF-8-aware.
+ */
+ retval = g_win32_locale_filename_from_utf8 (temp);
+ g_free (temp);
++#else
++ retval = temp;
++#endif
+ return retval;
+ }
+
+--
+1.9.1
+