summaryrefslogtreecommitdiff
path: root/debian/patches/cffi-fix.patch
blob: 417d408858e2d13b141bb1ad8e01177b9843df1e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
Description: check package root for cffi binaries
 cffi checks __pycache__ for binaries which is cleaned by pypy installation so
 packages can't ship in there.
 Instead ship in package root and patch module finding to look in there.
 Also use fixed path in a place passed to cffi to get the same checksum
 in build and install. After it is installed no build is needed so it doesn't
 matter if its wrong.
 This patch assumes pypy 2.2 api, won't work with 2.1 as so_suffices is no
 list.
Bug: https://bitbucket.org/cffi/cffi/issue/109/enable-sane-packaging-for-cffi

Index: pyzmq/zmq/backend/cffi/__init__.py
===================================================================
--- pyzmq.orig/zmq/backend/cffi/__init__.py
+++ pyzmq/zmq/backend/cffi/__init__.py
@@ -3,6 +3,40 @@
 # Copyright (C) PyZMQ Developers
 # Distributed under the terms of the Modified BSD License.
 
+import imp
+import os.path
+import sys
+
+import cffi.vengine_cpy
+import cffi.vengine_gen
+_ma_triplet = None
+
+def vengine_gen_find_module(self, module_name, path, so_suffixes):
+    global _ma_triplet
+    if _ma_triplet is None:
+        try:
+            import subprocess as sp
+            p = sp.Popen(["gcc", "-print-multiarch"], stdout=sp.PIPE)
+            _ma_triplet = str(p.communicate()[0].decode().strip())
+        except:
+            import warnings
+            warnings.warn('failed to detect multiarch paths, please install gcc')
+
+    for so_suffix in so_suffixes + ['.%s-%s.so' % (imp.get_tag(), _ma_triplet)]:
+        basename = module_name + so_suffix
+        if path is None:
+            path = sys.path
+            # import from non root package would try __pycache__ which is
+            # cleaned by pypy installation
+            path.insert(0, "/usr/lib/pypy/dist-packages/zmq/backend/cffi")
+        for dirname in path:
+            filename = os.path.join(dirname, basename)
+            if os.path.isfile(filename):
+                return filename
+
+
+cffi.vengine_gen.VGenericEngine.find_module = vengine_gen_find_module
+
 from zmq.backend.cffi import (constants, error, message, context, socket,
                            _poll, devices, utils)
 
Index: pyzmq/zmq/backend/cffi/_cffi.py
===================================================================
--- pyzmq.orig/zmq/backend/cffi/_cffi.py
+++ pyzmq/zmq/backend/cffi/_cffi.py
@@ -18,10 +18,10 @@ base_zmq_version = (3,2,2)
 def load_compiler_config():
     """load pyzmq compiler arguments"""
     import zmq
-    zmq_dir = dirname(zmq.__file__)
+    zmq_dir = "zmq"
     zmq_parent = dirname(zmq_dir)
     
-    fname = join(zmq_dir, 'utils', 'compiler.json')
+    fname = join(dirname(zmq.__file__), 'utils', 'compiler.json')
     if os.path.exists(fname):
         with open(fname) as f:
             cfg = json.load(f)