diff options
author | Alexander V. Nikolaev <avn@avnik.info> | 2019-03-02 19:56:39 +0200 |
---|---|---|
committer | Robert Schütz <robert.schuetz@stud.uni-heidelberg.de> | 2019-03-13 11:37:51 +0100 |
commit | e878fd6f5f38a1daeee25fdfb205fe5d96fce15c (patch) | |
tree | cddf301961f70075840dd51b31ab6694940edc1d /pkgs/development/python-modules/cairocffi | |
parent | 8dac8644700a364a45cd4537211df90ad509f5e4 (diff) |
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.
Diffstat (limited to 'pkgs/development/python-modules/cairocffi')
3 files changed, 118 insertions, 54 deletions
diff --git a/pkgs/development/python-modules/cairocffi/default.nix b/pkgs/development/python-modules/cairocffi/default.nix index 80b23e4338056..863e181f991ab 100644 --- a/pkgs/development/python-modules/cairocffi/default.nix +++ b/pkgs/development/python-modules/cairocffi/default.nix @@ -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"; - - src = fetchPypi { - inherit pname version; - sha256 = "01ac51ae12c4324ca5809ce270f9dd1b67f5166fe63bd3e497e9ea3ca91946ff"; - }; - - 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 ]; - }; - - checkInputs = [ pytest glibcLocales ]; - propagatedBuildInputs = [ cairo cffi ] ++ lib.optional withXcffib xcffib; - - 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 - ]; - - meta = with lib; { - homepage = https://github.com/SimonSapin/cairocffi; - license = licenses.bsd3; - maintainers = with maintainers; []; - description = "cffi-based cairo bindings for Python"; - }; -} +let + generic = { version, sha256, dlopen_patch, disabled ? false }: + buildPythonPackage rec { + pname = "cairocffi"; + inherit version disabled; + + src = fetchPypi { + inherit pname version sha256; + }; + + 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 ]; + }; + + checkInputs = [ pytest pytestrunner glibcLocales ]; + propagatedBuildInputs = [ cairo cffi ] ++ lib.optional withXcffib xcffib; + + 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_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"; + }; + }; +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; + }; + } diff --git a/pkgs/development/python-modules/cairocffi/dlopen-paths-0.9.patch b/pkgs/development/python-modules/cairocffi/dlopen-paths-0.9.patch new file mode 100644 index 0000000000000..862f7bd4bf7ce --- /dev/null +++ b/pkgs/development/python-modules/cairocffi/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') diff --git a/pkgs/development/python-modules/cairocffi/dlopen-paths.patch b/pkgs/development/python-modules/cairocffi/dlopen-paths.patch index 862f7bd4bf7ce..d42b8bcce48eb 100644 --- a/pkgs/development/python-modules/cairocffi/dlopen-paths.patch +++ b/pkgs/development/python-modules/cairocffi/dlopen-paths.patch @@ -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') |