1*4882a593SmuzhiyunFrom 9de73fefbe83c74840a93c039258845c49271b9b Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Jeffery To <jeffery.to@gmail.com> 3*4882a593SmuzhiyunDate: Sun, 8 Nov 2020 21:51:09 +0800 4*4882a593SmuzhiyunSubject: [PATCH] Use CFFI in out-of-line API mode (#49) 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunCurrently, ffi.py is called during setup to generate augeas.py; this 7*4882a593Smuzhiyunfile would normally be used for out-of-line ABI mode. ffi.py is also 8*4882a593Smuzhiyunimported at run-time, instead of the generated augeas.py, and used in 9*4882a593Smuzhiyunin-line ABI mode. 10*4882a593Smuzhiyun 11*4882a593SmuzhiyunThis changes usage of CFFI to out-of-line API mode (CFFI's "main mode of 12*4882a593Smuzhiyunusage"): ffi.py is called during setup to generate _augeas.abi3.so (a C 13*4882a593Smuzhiyunextension module); this generated module is imported at run-time. 14*4882a593Smuzhiyun 15*4882a593SmuzhiyunWith this change, the headers/development files for augeas (i.e. 16*4882a593Smuzhiyunlibaugeas-dev on Debian, augeas-devel on Fedora, etc.) and the C 17*4882a593Smuzhiyuncompiler are required for build/setup. (These were not necessary 18*4882a593Smuzhiyunpreviously.) 19*4882a593Smuzhiyun 20*4882a593SmuzhiyunCloses https://github.com/hercules-team/python-augeas/issues/48. 21*4882a593Smuzhiyun 22*4882a593SmuzhiyunUpstream: commit 712c2028568df7760bc98d95577e35709078bfea 23*4882a593SmuzhiyunSigned-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> 24*4882a593Smuzhiyun--- 25*4882a593Smuzhiyun augeas/__init__.py | 2 +- 26*4882a593Smuzhiyun augeas/ffi.py | 27 ++++++++++++++++++++++----- 27*4882a593Smuzhiyun setup.py | 1 + 28*4882a593Smuzhiyun 3 files changed, 24 insertions(+), 6 deletions(-) 29*4882a593Smuzhiyun 30*4882a593Smuzhiyundiff --git a/augeas/__init__.py b/augeas/__init__.py 31*4882a593Smuzhiyunindex 9bd97bf..1c0f580 100644 32*4882a593Smuzhiyun--- a/augeas/__init__.py 33*4882a593Smuzhiyun+++ b/augeas/__init__.py 34*4882a593Smuzhiyun@@ -32,7 +32,7 @@ format and the transformation into a tree. 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun from sys import version_info as _pyver 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun-from augeas.ffi import ffi, lib 39*4882a593Smuzhiyun+from _augeas import ffi, lib 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun __author__ = "Nathaniel McCallum <nathaniel@natemccallum.com>" 42*4882a593Smuzhiyun __credits__ = """Jeff Schroeder <jeffschroeder@computer.org> 43*4882a593Smuzhiyundiff --git a/augeas/ffi.py b/augeas/ffi.py 44*4882a593Smuzhiyunindex a24daf5..1931764 100644 45*4882a593Smuzhiyun--- a/augeas/ffi.py 46*4882a593Smuzhiyun+++ b/augeas/ffi.py 47*4882a593Smuzhiyun@@ -1,9 +1,28 @@ 48*4882a593Smuzhiyun+import os 49*4882a593Smuzhiyun+import subprocess 50*4882a593Smuzhiyun+ 51*4882a593Smuzhiyun from cffi import FFI 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun+def get_include_dirs(): 54*4882a593Smuzhiyun+ XML2_CONFIG = os.environ.get('XML2_CONFIG', 'xml2-config') 55*4882a593Smuzhiyun+ PKG_CONFIG = os.environ.get('PKG_CONFIG', 'pkg-config') 56*4882a593Smuzhiyun+ try: 57*4882a593Smuzhiyun+ stdout = subprocess.check_output([XML2_CONFIG, '--cflags']) 58*4882a593Smuzhiyun+ except (OSError, subprocess.CalledProcessError): 59*4882a593Smuzhiyun+ try: 60*4882a593Smuzhiyun+ stdout = subprocess.check_output([PKG_CONFIG, '--cflags', 'libxml-2.0']) 61*4882a593Smuzhiyun+ except (OSError, subprocess.CalledProcessError): 62*4882a593Smuzhiyun+ stdout = b'' 63*4882a593Smuzhiyun+ cflags = stdout.decode('utf-8').split() 64*4882a593Smuzhiyun+ return [cflag[2:] for cflag in cflags if cflag.startswith('-I')] 65*4882a593Smuzhiyun+ 66*4882a593Smuzhiyun ffi = FFI() 67*4882a593Smuzhiyun-ffi.set_source("augeas", 68*4882a593Smuzhiyun- None, 69*4882a593Smuzhiyun- libraries=['augeas']) 70*4882a593Smuzhiyun+ffi.set_source("_augeas", 71*4882a593Smuzhiyun+ """ 72*4882a593Smuzhiyun+ #include <augeas.h> 73*4882a593Smuzhiyun+ """, 74*4882a593Smuzhiyun+ libraries=['augeas'], 75*4882a593Smuzhiyun+ include_dirs=get_include_dirs()) 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun ffi.cdef(""" 78*4882a593Smuzhiyun typedef struct augeas augeas; 79*4882a593Smuzhiyun@@ -44,7 +63,5 @@ const char *aug_error_details(augeas *aug); 80*4882a593Smuzhiyun void free(void *); 81*4882a593Smuzhiyun """) 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun-lib = ffi.dlopen("augeas") 84*4882a593Smuzhiyun- 85*4882a593Smuzhiyun if __name__ == "__main__": 86*4882a593Smuzhiyun ffi.compile(verbose=True) 87*4882a593Smuzhiyundiff --git a/setup.py b/setup.py 88*4882a593Smuzhiyunindex 7d55877..17f9516 100755 89*4882a593Smuzhiyun--- a/setup.py 90*4882a593Smuzhiyun+++ b/setup.py 91*4882a593Smuzhiyun@@ -22,6 +22,7 @@ setup(name=name, 92*4882a593Smuzhiyun setup_requires=["cffi>=1.0.0"], 93*4882a593Smuzhiyun cffi_modules=["augeas/ffi.py:ffi"], 94*4882a593Smuzhiyun install_requires=["cffi>=1.0.0"], 95*4882a593Smuzhiyun+ zip_safe=False, 96*4882a593Smuzhiyun url="http://augeas.net/", 97*4882a593Smuzhiyun classifiers=[ 98*4882a593Smuzhiyun "Programming Language :: Python :: 2.7", 99*4882a593Smuzhiyun-- 100*4882a593Smuzhiyun2.31.1 101*4882a593Smuzhiyun 102