[pypy-commit] cffi default: Add the keyword "relative_to=..." to verify(), as per

arigo noreply at buildbot.pypy.org
Wed Dec 24 16:51:56 CET 2014


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r1600:b97105235b12
Date: 2014-12-24 16:52 +0100
http://bitbucket.org/cffi/cffi/changeset/b97105235b12/

Log:	Add the keyword "relative_to=..." to verify(), as per
	https://bitbucket.org/cffi/cffi/pull-request/53

diff --git a/cffi/ffiplatform.py b/cffi/ffiplatform.py
--- a/cffi/ffiplatform.py
+++ b/cffi/ffiplatform.py
@@ -11,6 +11,9 @@
     """
 
 
+LIST_OF_FILE_NAMES = ['include_dirs', 'library_dirs',
+                      'extra_objects', 'depends']
+
 def get_extension(srcfilename, modname, sources=(), **kwds):
     from distutils.core import Extension
     allsources = [srcfilename]
diff --git a/cffi/verifier.py b/cffi/verifier.py
--- a/cffi/verifier.py
+++ b/cffi/verifier.py
@@ -17,7 +17,7 @@
 
     def __init__(self, ffi, preamble, tmpdir=None, modulename=None,
                  ext_package=None, tag='', force_generic_engine=False,
-                 source_extension='.c', flags=None, **kwds):
+                 source_extension='.c', flags=None, relative_to=None, **kwds):
         self.ffi = ffi
         self.preamble = preamble
         if not modulename:
@@ -26,7 +26,7 @@
         self._vengine = vengine_class(self)
         self._vengine.patch_extension_kwds(kwds)
         self.flags = flags
-        self.kwds = kwds
+        self.kwds = self.make_relative_to(kwds, relative_to)
         #
         if modulename:
             if tag:
@@ -109,6 +109,20 @@
     def generates_python_module(self):
         return self._vengine._gen_python_module
 
+    def make_relative_to(self, kwds, relative_to):
+        if relative_to and os.path.dirname(relative_to):
+            dirname = os.path.dirname(relative_to)
+            kwds = kwds.copy()
+            for key in ffiplatform.LIST_OF_FILE_NAMES:
+                if key in kwds:
+                    lst = kwds[key]
+                    if not isinstance(lst, (list, tuple)):
+                        raise TypeError("keyword '%s' should be a list or tuple"
+                                        % (key,))
+                    lst = [os.path.join(dirname, fn) for fn in lst]
+                    kwds[key] = lst
+        return kwds
+
     # ----------
 
     def _locate_module(self):
diff --git a/testing/test_verify.py b/testing/test_verify.py
--- a/testing/test_verify.py
+++ b/testing/test_verify.py
@@ -1349,7 +1349,7 @@
     """)
 
 def test_tmpdir():
-    import tempfile, os, shutil
+    import tempfile, os
     from testing.udir import udir
     tmpdir = tempfile.mkdtemp(dir=str(udir))
     ffi = FFI()
@@ -1358,6 +1358,20 @@
     assert os.listdir(tmpdir)
     assert lib.foo(100) == 142
 
+def test_relative_to():
+    import tempfile, os
+    from testing.udir import udir
+    tmpdir = tempfile.mkdtemp(dir=str(udir))
+    ffi = FFI()
+    ffi.cdef("int foo(int);")
+    f = open(os.path.join(tmpdir, 'foo.h'), 'w')
+    print >> f, "int foo(int a) { return a + 42; }"
+    f.close()
+    lib = ffi.verify('#include "foo.h"',
+                     include_dirs=['.'],
+                     relative_to=os.path.join(tmpdir, 'x'))
+    assert lib.foo(100) == 142
+
 def test_bug1():
     ffi = FFI()
     ffi.cdef("""


More information about the pypy-commit mailing list