diff --git a/pkgs/development/python-modules/cairocffi/default.nix b/pkgs/development/python-modules/cairocffi/default.nix index 80b23e43380..863e181f991 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"; +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; + }; + } 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 00000000000..862f7bd4bf7 --- /dev/null +++ b/pkgs/development/python-modules/cairocffi/dlopen-paths-0.9.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@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 862f7bd4bf7..d42b8bcce48 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 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') diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index 5acc12fe4ba..ccef0e38c92 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -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 {};