34 lines
924 B
Python
34 lines
924 B
Python
import os
|
|
import platform
|
|
from cffi import FFI
|
|
|
|
TEMPLATE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'templates'))
|
|
|
|
|
|
def write_code(folder, name, code, header):
|
|
if not os.path.exists(folder):
|
|
os.mkdir(folder)
|
|
|
|
open(os.path.join(folder, f"{name}.cpp"), 'w', encoding='utf-8').write(code)
|
|
open(os.path.join(folder, f"{name}.h"), 'w', encoding='utf-8').write(header)
|
|
|
|
|
|
def load_code(folder, name):
|
|
shared_ext = "dylib" if platform.system() == "Darwin" else "so"
|
|
shared_fn = os.path.join(folder, f"lib{name}.{shared_ext}")
|
|
header_fn = os.path.join(folder, f"{name}.h")
|
|
|
|
with open(header_fn, encoding='utf-8') as f:
|
|
header = f.read()
|
|
|
|
# is the only thing that can be parsed by cffi
|
|
header = "\n".join([line for line in header.split("\n") if line.startswith("void ")])
|
|
|
|
ffi = FFI()
|
|
ffi.cdef(header)
|
|
return (ffi, ffi.dlopen(shared_fn))
|
|
|
|
|
|
class KalmanError(Exception):
|
|
pass
|