| From 9de73fefbe83c74840a93c039258845c49271b9b Mon Sep 17 00:00:00 2001 |
| From: Jeffery To <jeffery.to@gmail.com> |
| Date: Sun, 8 Nov 2020 21:51:09 +0800 |
| Subject: [PATCH] Use CFFI in out-of-line API mode (#49) |
| |
| Currently, ffi.py is called during setup to generate augeas.py; this |
| file would normally be used for out-of-line ABI mode. ffi.py is also |
| imported at run-time, instead of the generated augeas.py, and used in |
| in-line ABI mode. |
| |
| This changes usage of CFFI to out-of-line API mode (CFFI's "main mode of |
| usage"): ffi.py is called during setup to generate _augeas.abi3.so (a C |
| extension module); this generated module is imported at run-time. |
| |
| With this change, the headers/development files for augeas (i.e. |
| libaugeas-dev on Debian, augeas-devel on Fedora, etc.) and the C |
| compiler are required for build/setup. (These were not necessary |
| previously.) |
| |
| Closes https://github.com/hercules-team/python-augeas/issues/48. |
| |
| Upstream: commit 712c2028568df7760bc98d95577e35709078bfea |
| Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> |
| --- |
| augeas/__init__.py | 2 +- |
| augeas/ffi.py | 27 ++++++++++++++++++++++----- |
| setup.py | 1 + |
| 3 files changed, 24 insertions(+), 6 deletions(-) |
| |
| diff --git a/augeas/__init__.py b/augeas/__init__.py |
| index 9bd97bf..1c0f580 100644 |
| --- a/augeas/__init__.py |
| +++ b/augeas/__init__.py |
| @@ -32,7 +32,7 @@ format and the transformation into a tree. |
| |
| from sys import version_info as _pyver |
| |
| -from augeas.ffi import ffi, lib |
| +from _augeas import ffi, lib |
| |
| __author__ = "Nathaniel McCallum <nathaniel@natemccallum.com>" |
| __credits__ = """Jeff Schroeder <jeffschroeder@computer.org> |
| diff --git a/augeas/ffi.py b/augeas/ffi.py |
| index a24daf5..1931764 100644 |
| --- a/augeas/ffi.py |
| +++ b/augeas/ffi.py |
| @@ -1,9 +1,28 @@ |
| +import os |
| +import subprocess |
| + |
| from cffi import FFI |
| |
| +def get_include_dirs(): |
| + XML2_CONFIG = os.environ.get('XML2_CONFIG', 'xml2-config') |
| + PKG_CONFIG = os.environ.get('PKG_CONFIG', 'pkg-config') |
| + try: |
| + stdout = subprocess.check_output([XML2_CONFIG, '--cflags']) |
| + except (OSError, subprocess.CalledProcessError): |
| + try: |
| + stdout = subprocess.check_output([PKG_CONFIG, '--cflags', 'libxml-2.0']) |
| + except (OSError, subprocess.CalledProcessError): |
| + stdout = b'' |
| + cflags = stdout.decode('utf-8').split() |
| + return [cflag[2:] for cflag in cflags if cflag.startswith('-I')] |
| + |
| ffi = FFI() |
| -ffi.set_source("augeas", |
| - None, |
| - libraries=['augeas']) |
| +ffi.set_source("_augeas", |
| + """ |
| + #include <augeas.h> |
| + """, |
| + libraries=['augeas'], |
| + include_dirs=get_include_dirs()) |
| |
| ffi.cdef(""" |
| typedef struct augeas augeas; |
| @@ -44,7 +63,5 @@ const char *aug_error_details(augeas *aug); |
| void free(void *); |
| """) |
| |
| -lib = ffi.dlopen("augeas") |
| - |
| if __name__ == "__main__": |
| ffi.compile(verbose=True) |
| diff --git a/setup.py b/setup.py |
| index 7d55877..17f9516 100755 |
| --- a/setup.py |
| +++ b/setup.py |
| @@ -22,6 +22,7 @@ setup(name=name, |
| setup_requires=["cffi>=1.0.0"], |
| cffi_modules=["augeas/ffi.py:ffi"], |
| install_requires=["cffi>=1.0.0"], |
| + zip_safe=False, |
| url="http://augeas.net/", |
| classifiers=[ |
| "Programming Language :: Python :: 2.7", |
| -- |
| 2.31.1 |
| |