diff --git a/pkgs/development/python-modules/cairocffi/dlopen-paths.patch b/pkgs/development/python-modules/cairocffi/dlopen-paths.patch new file mode 100644 index 00000000000..bc5e939ceba --- /dev/null +++ b/pkgs/development/python-modules/cairocffi/dlopen-paths.patch @@ -0,0 +1,47 @@ +commit 705dc9a55bd160625d9996e63fc7dc532d0ad0ab +Author: Alexander V. Nikolaev +Date: Sat Feb 6 08:09:06 2016 +0200 + + Patch dlopen() to allow direct paths to all required libs + + This patch is NixOS specific + +diff --git a/cairocffi/__init__.py b/cairocffi/__init__.py +index 718aa7f..1a1dcff 100644 +--- a/cairocffi/__init__.py ++++ b/cairocffi/__init__.py +@@ -27,20 +27,22 @@ VERSION = '0.7.2' + version = '1.10.0' + version_info = (1, 10, 0) + ++# Use hardcoded soname, because ctypes.util use gcc/objdump which shouldn't be required for runtime ++_LIBS = { ++ 'cairo': '@cairo@/lib/libcairo.so.2', ++ 'glib-2.0': '@glib@/lib/libglib-2.0.so.0', ++ 'gobject-2.0': '@glib@/lib/libgobject-2.0.so.0', ++ 'gdk_pixbuf-2.0': '@gdk_pixbuf@/lib/libgdk_pixbuf-2.0.so.0', ++} + +-def dlopen(ffi, *names): ++def dlopen(ffi, name, *names): + """Try various names for the same library, for different platforms.""" +- for name in names: +- for lib_name in [name, 'lib' + name]: +- try: +- path = ctypes.util.find_library(lib_name) +- if path: +- lib = ffi.dlopen(path) +- if lib: +- return lib +- except OSError: +- pass +- raise OSError("dlopen() failed to load a library: %s" % ' / '.join(names)) ++ path = _LIBS.get(name, None) ++ if path: ++ lib = ffi.dlopen(path) ++ if lib: ++ return lib ++ raise OSError("dlopen() failed to load a library: %s as %s" % (name, path)) + + + cairo = dlopen(ffi, 'cairo', 'cairo-2') diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index 04312ca1f23..18671f3b4c7 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -2609,6 +2609,13 @@ in modules // { }; LC_ALL = "en_US.UTF-8"; + + # checkPhase require at least one 'normal' font and one 'monospace', + # otherwise glyph tests fails + FONTCONFIG_FILE = pkgs.makeFontsConf { + fontDirectories = [ pkgs.freefont_ttf ]; + }; + buildInputs = with self; [ pytest pkgs.glibcLocales ]; propagatedBuildInputs = with self; [ pkgs.cairo cffi ]; @@ -2616,17 +2623,29 @@ in modules // { py.test $out/${python.sitePackages} ''; - # Marked broken since according to test + # FIXME: make gdk_pixbuf dependency optional (as wel as xcfffi) # Happens with 0.7.1 and 0.7.2 # OSError: dlopen() failed to load a library: gdk_pixbuf-2.0 / gdk_pixbuf-2.0-0 - patchPhase = '' + patches = [ + # This patch from PR substituted upstream + (pkgs.fetchpatch { + url = "https://github.com/avnik/cairocffi/commit/2266882e263c5efc87350cf016d117b2ec6a1d59.patch"; + sha256 = "0gb570z3ivf1b0ixsk526n3h29m8c5rhjsiyam7rr3x80dp65cdl"; + }) + + ../development/python-modules/cairocffi/dlopen-paths.patch + ]; + + postPatch = '' # Hardcode cairo library path - sed -e 's,ffi\.dlopen(,&"${pkgs.cairo}/lib/" + ,' -i cairocffi/__init__.py + # FIXME: for closure-size branch all pkgs.foo should be replaced with pkgs.foo.lib + substituteInPlace cairocffi/__init__.py --subst-var-by cairo ${pkgs.cairo} + substituteInPlace cairocffi/__init__.py --subst-var-by glib ${pkgs.glib} + substituteInPlace cairocffi/__init__.py --subst-var-by gdk_pixbuf ${pkgs.gdk_pixbuf} ''; meta = { - broken = true; homepage = https://github.com/SimonSapin/cairocffi; license = "bsd"; description = "cffi-based cairo bindings for Python";