mirror of
https://github.com/chatmail/core.git
synced 2026-04-17 21:46:35 +03:00
feat: bring back and adapt python bindings with rust core
* import python, try to adapt for rust * add missing wrapper functions * - try to write up how to build python bindings - strike some unused functions from deltachat.h * adjustments to make tox work * try to run circle-ci with python build * don't do docs * running cargo test as well * don't run cargo test anymore, that's done in other ci jobs * also build docs * don't run doxygen anymore * subst C with Rust * a try to get better wheels Closes #41
This commit is contained in:
committed by
Friedel Ziegelmayer
parent
a2fc127923
commit
6ce8374513
73
python/src/deltachat/_build.py
Normal file
73
python/src/deltachat/_build.py
Normal file
@@ -0,0 +1,73 @@
|
||||
import distutils.ccompiler
|
||||
import distutils.sysconfig
|
||||
import tempfile
|
||||
import os
|
||||
import cffi
|
||||
|
||||
# XXX hack out the header and library dirs
|
||||
# relying on CFLAGS and LD_LIBRARY_PATH being set properly is not good
|
||||
# (but we also don't want to rely on global installs of headers and libs)
|
||||
HEADERDIR = os.environ["CFLAGS"].split("-I", 1)[1]
|
||||
LIBDIR = os.environ["LD_LIBRARY_PATH"]
|
||||
|
||||
|
||||
def ffibuilder():
|
||||
builder = cffi.FFI()
|
||||
builder.set_source(
|
||||
'deltachat.capi',
|
||||
"""
|
||||
#include <deltachat.h>
|
||||
const char * dupstring_helper(const char* string)
|
||||
{
|
||||
return strdup(string);
|
||||
}
|
||||
int dc_get_event_signature_types(int e)
|
||||
{
|
||||
int result = 0;
|
||||
if (DC_EVENT_DATA1_IS_STRING(e))
|
||||
result |= 1;
|
||||
if (DC_EVENT_DATA2_IS_STRING(e))
|
||||
result |= 2;
|
||||
if (DC_EVENT_RETURNS_STRING(e))
|
||||
result |= 4;
|
||||
if (DC_EVENT_RETURNS_INT(e))
|
||||
result |= 8;
|
||||
return result;
|
||||
}
|
||||
""",
|
||||
libraries=['deltachat'],
|
||||
include_dirs=[HEADERDIR],
|
||||
library_dirs=[LIBDIR],
|
||||
)
|
||||
builder.cdef("""
|
||||
typedef int... time_t;
|
||||
void free(void *ptr);
|
||||
extern const char * dupstring_helper(const char* string);
|
||||
extern int dc_get_event_signature_types(int);
|
||||
""")
|
||||
cc = distutils.ccompiler.new_compiler(force=True)
|
||||
distutils.sysconfig.customize_compiler(cc)
|
||||
with tempfile.NamedTemporaryFile(mode='w', suffix='.h') as src_fp:
|
||||
src_fp.write('#include <deltachat.h>')
|
||||
src_fp.flush()
|
||||
with tempfile.NamedTemporaryFile(mode='r') as dst_fp:
|
||||
cc.preprocess(source=src_fp.name,
|
||||
output_file=dst_fp.name,
|
||||
include_dirs=[HEADERDIR],
|
||||
macros=[('PY_CFFI', '1')])
|
||||
builder.cdef(dst_fp.read())
|
||||
builder.cdef("""
|
||||
extern "Python" uintptr_t py_dc_callback(
|
||||
dc_context_t* context,
|
||||
int event,
|
||||
uintptr_t data1,
|
||||
uintptr_t data2);
|
||||
""")
|
||||
return builder
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
import os.path
|
||||
pkgdir = os.path.join(os.path.dirname(__file__), '..')
|
||||
builder = ffibuilder()
|
||||
builder.compile(tmpdir=pkgdir, verbose=True)
|
||||
Reference in New Issue
Block a user