pythonPackages.cairocffi: support 1.0 and 0.9

This patch ensures that Python2 can be used if cairocffi is used.
Version 1.0 dropped Python 2 support.
This commit is contained in:
Alexander V. Nikolaev 2019-03-02 19:56:39 +02:00 committed by Robert Schütz
parent 8dac864470
commit e878fd6f5f
4 changed files with 115 additions and 48 deletions

@ -1,12 +1,14 @@
# FIXME: make gdk_pixbuf dependency optional
{ stdenv
, buildPythonPackage
, pythonOlder
, fetchPypi
, lib
, substituteAll
, makeFontsConf
, freefont_ttf
, pytest
, pytestrunner
, glibcLocales
, cairo
, cffi
@ -15,46 +17,62 @@
, glib
, gdk_pixbuf }:
buildPythonPackage rec {
pname = "cairocffi";
version = "1.0.2";
let
generic = { version, sha256, dlopen_patch, disabled ? false }:
buildPythonPackage rec {
pname = "cairocffi";
inherit version disabled;
src = fetchPypi {
inherit pname version;
sha256 = "01ac51ae12c4324ca5809ce270f9dd1b67f5166fe63bd3e497e9ea3ca91946ff";
};
src = fetchPypi {
inherit pname version sha256;
};
LC_ALL = "en_US.UTF-8";
LC_ALL = "en_US.UTF-8";
# checkPhase require at least one 'normal' font and one 'monospace',
# otherwise glyph tests fails
FONTCONFIG_FILE = makeFontsConf {
fontDirectories = [ freefont_ttf ];
};
# checkPhase require at least one 'normal' font and one 'monospace',
# otherwise glyph tests fails
FONTCONFIG_FILE = makeFontsConf {
fontDirectories = [ freefont_ttf ];
};
checkInputs = [ pytest glibcLocales ];
propagatedBuildInputs = [ cairo cffi ] ++ lib.optional withXcffib xcffib;
checkInputs = [ pytest pytestrunner glibcLocales ];
propagatedBuildInputs = [ cairo cffi ] ++ lib.optional withXcffib xcffib;
checkPhase = ''
py.test $out/${python.sitePackages}
'';
checkPhase = ''
py.test $out/${python.sitePackages}
'';
patches = [
# OSError: dlopen() failed to load a library: gdk_pixbuf-2.0 / gdk_pixbuf-2.0-0
(substituteAll {
src = ./dlopen-paths.patch;
ext = stdenv.hostPlatform.extensions.sharedLibrary;
cairo = cairo.out;
glib = glib.out;
gdk_pixbuf = gdk_pixbuf.out;
})
./fix_test_scaled_font.patch
];
patches = [
# OSError: dlopen() failed to load a library: gdk_pixbuf-2.0 / gdk_pixbuf-2.0-0
(substituteAll {
src = dlopen_patch;
ext = stdenv.hostPlatform.extensions.sharedLibrary;
cairo = cairo.out;
glib = glib.out;
gdk_pixbuf = gdk_pixbuf.out;
})
./fix_test_scaled_font.patch
];
meta = with lib; {
homepage = https://github.com/SimonSapin/cairocffi;
license = licenses.bsd3;
maintainers = with maintainers; [];
description = "cffi-based cairo bindings for Python";
};
}
meta = with lib; {
homepage = https://github.com/SimonSapin/cairocffi;
license = licenses.bsd3;
maintainers = with maintainers; [];
description = "cffi-based cairo bindings for Python";
};
};
in
{
cairocffi_1_0 = generic {
version = "1.0.2";
sha256 = "01ac51ae12c4324ca5809ce270f9dd1b67f5166fe63bd3e497e9ea3ca91946ff";
dlopen_patch = ./dlopen-paths.patch;
disabled = pythonOlder "3.5";
};
cairocffi_0_9 = generic {
version = "0.9.0";
sha256 = "15386c3a9e08823d6826c4491eaccc7b7254b1dc587a3b9ce60c350c3f990337";
dlopen_patch = ./dlopen-paths-0.9.patch;
};
}

@ -0,0 +1,47 @@
commit 705dc9a55bd160625d9996e63fc7dc532d0ad0ab
Author: Alexander V. Nikolaev <avn@avnik.info>
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@ext@',
+ 'glib-2.0': '@glib@/lib/libglib-2.0@ext@',
+ 'gobject-2.0': '@glib@/lib/libgobject-2.0@ext@',
+ 'gdk_pixbuf-2.0': '@gdk_pixbuf@/lib/libgdk_pixbuf-2.0@ext@',
+}
-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')

@ -1,4 +1,4 @@
commit 705dc9a55bd160625d9996e63fc7dc532d0ad0ab
commit 0435bc2577d4b18f54b78b2f5185abb2b2005982
Author: Alexander V. Nikolaev <avn@avnik.info>
Date: Sat Feb 6 08:09:06 2016 +0200
@ -7,12 +7,12 @@ Date: Sat Feb 6 08:09:06 2016 +0200
This patch is NixOS specific
diff --git a/cairocffi/__init__.py b/cairocffi/__init__.py
index 718aa7f..1a1dcff 100644
index 6061973..3538a58 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)
@@ -21,19 +21,22 @@ VERSION = __version__ = (Path(__file__).parent / 'VERSION').read_text().strip()
version = '1.16.0'
version_info = (1, 16, 0)
+# Use hardcoded soname, because ctypes.util use gcc/objdump which shouldn't be required for runtime
+_LIBS = {
@ -26,13 +26,12 @@ index 718aa7f..1a1dcff 100644
+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]:
- 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
- lib = ffi.dlopen(path or lib_name)
- if lib:
- return lib
- except OSError:
- pass
- raise OSError("dlopen() failed to load a library: %s" % ' / '.join(names))
@ -44,4 +43,4 @@ index 718aa7f..1a1dcff 100644
+ raise OSError("dlopen() failed to load a library: %s as %s" % (name, path))
cairo = dlopen(ffi, 'cairo', 'cairo-2')
cairo = dlopen(ffi, 'cairo', 'cairo-2', 'cairo-gobject-2', 'cairo.so.2')

@ -1311,7 +1311,10 @@ in {
canmatrix = callPackage ../development/python-modules/canmatrix {};
cairocffi = callPackage ../development/python-modules/cairocffi {};
cairocffi = let
inherit (callPackage ../development/python-modules/cairocffi {}) cairocffi_1_0 cairocffi_0_9;
in if isPy3k then cairocffi_1_0 else cairocffi_0_9;
cairosvg1 = callPackage ../development/python-modules/cairosvg/1_x.nix {};