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