mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-11-06 04:23:42 +08:00
64 lines
2.4 KiB
Python
64 lines
2.4 KiB
Python
import sys
|
|
import sysconfig
|
|
from pathlib import Path
|
|
|
|
import nanobind
|
|
|
|
Import('env', 'arch', 'common')
|
|
|
|
envNanobind = env.Clone(LIBS=[])
|
|
nb_dir = Path(nanobind.source_dir()).parent
|
|
envNanobind.Append(CPPPATH=[sysconfig.get_paths()['include'], nanobind.include_dir(), str(nb_dir / "ext/robin_map/include")],
|
|
CCFLAGS=["-fvisibility=hidden", "-fno-strict-aliasing"])
|
|
if arch == "Darwin":
|
|
envNanobind.Append(LINKFLAGS=["-bundle", "-undefined", "dynamic_lookup"])
|
|
else:
|
|
# Python symbols resolve at import time.
|
|
envNanobind["LINKFLAGS"] = [f for f in env["LINKFLAGS"] if f != "-Wl,--no-undefined"] + ["-pthread", "-shared"]
|
|
|
|
# Third-party runtime sources do not follow our shadowing warning policy.
|
|
envNanobindRuntime = envNanobind.Clone()
|
|
envNanobindRuntime['CCFLAGS'] = [flag for flag in envNanobindRuntime['CCFLAGS'] if not flag.startswith('-Wshadow')]
|
|
nanobind_lib = envNanobindRuntime.SharedObject('msgq/nb_combined.os', str(nb_dir / "src/nb_combined.cpp"))
|
|
|
|
|
|
visionipc_dir = Dir('msgq/visionipc')
|
|
python_suffix = ".so"
|
|
|
|
# Build msgq
|
|
msgq_objects = env.SharedObject([
|
|
'msgq/ipc.cc',
|
|
'msgq/event.cc',
|
|
'msgq/msgq.cc',
|
|
])
|
|
msgq = env.Library('msgq', msgq_objects)
|
|
msgq_python = envNanobind.Program(f'msgq/_ipc{python_suffix}', ['msgq/ipc_py.cc', nanobind_lib], LIBS=envNanobind["LIBS"]+[msgq]+common)
|
|
|
|
# Build Vision IPC
|
|
vipc_files = ['visionipc.cc', 'visionipc_server.cc', 'visionipc_client.cc']
|
|
if File('/dev/ion').exists():
|
|
vipc_files += ['visionbuf_ion.cc']
|
|
else:
|
|
vipc_files += ['visionbuf.cc']
|
|
vipc_sources = [f'{visionipc_dir.abspath}/{f}' for f in vipc_files]
|
|
|
|
vipc_objects = env.SharedObject(vipc_sources)
|
|
visionipc = env.Library('visionipc', vipc_objects)
|
|
|
|
|
|
vipc_libs = envNanobind["LIBS"] + [visionipc, msgq] + common
|
|
visionipc_python = envNanobind.Program(f'{visionipc_dir.abspath}/_visionipc{python_suffix}', [f'{visionipc_dir.abspath}/visionipc_py.cc', nanobind_lib],
|
|
LIBS=vipc_libs)
|
|
|
|
# ASan modules require a preloaded runtime before Python can import them.
|
|
if "-fsanitize=address" not in env["LINKFLAGS"]:
|
|
root = Dir('.').abspath
|
|
for module in ('msgq._ipc', 'msgq.visionipc._visionipc'):
|
|
env.Command(module.replace('.', '/') + '.pyi', [msgq_python, visionipc_python],
|
|
f'"{sys.executable}" -m nanobind.stubgen -i "{root}" -m {module} -o "$TARGET"')
|
|
|
|
if GetOption('extras'):
|
|
env.Program('msgq/test_runner', ['msgq/msgq_tests.cc'], LIBS=[msgq]+common)
|
|
|
|
Export('visionipc', 'msgq', 'msgq_python')
|