summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Holth <dholth@fastmail.fm>2016-08-21 18:53:51 -0400
committerDaniel Holth <dholth@fastmail.fm>2016-08-21 18:53:51 -0400
commit024968a60f625413482ee698eb6e1e01ee2d7ccf (patch)
tree5dc6676c876fd16d4d9bc1523f9088baf8080564
parentca64aac20e93177835ed91a7ed2640dabaaf06a8 (diff)
downloadcffi-024968a60f625413482ee698eb6e1e01ee2d7ccf.tar.gz
use py_limited_api flag when available.
In setuptools>=26, Extension(..., py_limited_api=True) sets the .abi3.so filename, readable by Python 3.2+.
-rw-r--r--cffi/setuptools_ext.py19
-rw-r--r--testing/cffi0/test_zintegration.py25
2 files changed, 43 insertions, 1 deletions
diff --git a/cffi/setuptools_ext.py b/cffi/setuptools_ext.py
index 9c6436d..a579285 100644
--- a/cffi/setuptools_ext.py
+++ b/cffi/setuptools_ext.py
@@ -69,16 +69,33 @@ def add_cffi_module(dist, mod_spec):
else:
_add_c_module(dist, ffi, module_name, source, source_extension, kwds)
+def _set_py_limited_api(Extension, kwds):
+ """
+ Add py_limited_api to kwds if setuptools >= 26 is in use.
+ Do not alter the setting if it already exists.
+ Setuptools takes care of ignoring the flag on Python 2 and PyPy.
+ """
+ if Extension.__module__.startswith('setuptools.') and not 'py_limited_api' in kwds:
+ import setuptools
+ try:
+ setuptools_major_version = int(setuptools.__version__.partition('.')[0])
+ if setuptools_major_version >= 26:
+ kwds['py_limited_api'] = True
+ except ValueError: # certain development versions of setuptools
+ pass
+ return kwds
def _add_c_module(dist, ffi, module_name, source, source_extension, kwds):
from distutils.core import Extension
- from distutils.command.build_ext import build_ext
+ # We are a setuptools extension. Need this build_ext for py_limited_api.
+ from setuptools.command.build_ext import build_ext
from distutils.dir_util import mkpath
from distutils import log
from cffi import recompiler
allsources = ['$PLACEHOLDER']
allsources.extend(kwds.pop('sources', []))
+ kwds = _set_py_limited_api(Extension, kwds)
ext = Extension(name=module_name, sources=allsources, **kwds)
def make_mod(tmpdir, pre_run=None):
diff --git a/testing/cffi0/test_zintegration.py b/testing/cffi0/test_zintegration.py
index 2736eb1..dcc4873 100644
--- a/testing/cffi0/test_zintegration.py
+++ b/testing/cffi0/test_zintegration.py
@@ -148,3 +148,28 @@ class TestZIntegration(object):
p = snip_setuptools_verify2.C.getpwuid(0)
assert snip_setuptools_verify2.ffi.string(p.pw_name) == b"root"
''')
+
+ def test_set_py_limited_api(self):
+ from cffi.setuptools_ext import _set_py_limited_api
+ try:
+ import setuptools
+ orig_version = setuptools.__version__
+ setuptools.__version__ = '26.0.0'
+ from setuptools import Extension
+
+ kwds = _set_py_limited_api(Extension, {})
+ assert kwds['py_limited_api'] == True
+
+ kwds = _set_py_limited_api(Extension.__base__, {})
+ assert not kwds
+
+ setuptools.__version__ = '25.0'
+ kwds = _set_py_limited_api(Extension, {})
+ assert not kwds
+
+ setuptools.__version__ = 'development'
+ kwds = _set_py_limited_api(Extension, {})
+ assert not kwds
+
+ finally:
+ setuptools.__version__ = orig_version