diff options
author | Daniel Holth <dholth@fastmail.fm> | 2016-08-21 18:53:51 -0400 |
---|---|---|
committer | Daniel Holth <dholth@fastmail.fm> | 2016-08-21 18:53:51 -0400 |
commit | 024968a60f625413482ee698eb6e1e01ee2d7ccf (patch) | |
tree | 5dc6676c876fd16d4d9bc1523f9088baf8080564 | |
parent | ca64aac20e93177835ed91a7ed2640dabaaf06a8 (diff) | |
download | cffi-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.py | 19 | ||||
-rw-r--r-- | testing/cffi0/test_zintegration.py | 25 |
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 |