Kozea / cairocffi

CFFI-based cairo bindings for Python.
https://doc.courtbouillon.org/cairocffi
BSD 3-Clause "New" or "Revised" License
208 stars 54 forks source link

Api mode cffi compile #230

Open georgeharker opened 1 week ago

georgeharker commented 1 week ago

Cffi code is much faster when compiled with a c compiler (API mode) rather than using libfffi (ABI mode) - however this requires a compiler to be installed .

This change allows an install to be made using

CAIROCFFI_API_MODE=1 XCFFIB_API_MODE=1 pip3 install cairocffi

Various other projects (pangocffi and pangocairocffi) can then benefit from similar changes.

This change requires xcffib changes to be accepted - see here

During installation CAIROCFFI_API_MODE=0 or CAIROCFFI_API_MODE not set defaults to the previous ABI mode install which incurs lever overhead on load, runs the ffi_build as before and will dynamically translate arguments to C using the general libffi.

During installation CAIROCFFI_API_MODE=1 compiles a shared library / C extension which dynamically depends on xcd.

At runtime if the shared library / C extension is present it will be used (unless CAIROCFFI_API_MODE =0). The user does not have to arrange for CAIROCFFI_API_MODE =1 to be set. If the extension is not present, the old behavior is used.

To make this work I added the relevant FFI calls / setup.py calls to have the C extension be built.

I don't suggest this be default, but API mode is a potential substantial performance improvement. It also allows full speed threading as the C side unlocks the GIL.