diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 000000000..19fbaba29 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,3 @@ +include SConstruct SConscript +graft msgq +global-exclude __pycache__ *.pyc *.o *.os *.d diff --git a/SConscript b/SConscript index cde36529e..328056e90 100644 --- a/SConscript +++ b/SConscript @@ -11,7 +11,7 @@ msgq_objects = env.SharedObject([ 'msgq/impl_fake.cc', 'msgq/msgq.cc', ]) -msgq = env.Library('msgq', msgq_objects) +msgq = env.Library('msgq/libmsgq', msgq_objects) msgq_python = envCython.Program('msgq/ipc_pyx.so', 'msgq/ipc_pyx.pyx', LIBS=envCython["LIBS"]+[msgq]+common) # Build Vision IPC @@ -23,7 +23,7 @@ else: vipc_sources = [f'{visionipc_dir.abspath}/{f}' for f in vipc_files] vipc_objects = env.SharedObject(vipc_sources) -visionipc = env.Library('visionipc', vipc_objects) +visionipc = env.Library('msgq/visionipc/libvisionipc', vipc_objects) vipc_libs = envCython["LIBS"] + [visionipc, msgq] + common diff --git a/msgq/__init__.py b/msgq/__init__.py index 1f71f3b6d..7e9f3c4e8 100644 --- a/msgq/__init__.py +++ b/msgq/__init__.py @@ -1,4 +1,11 @@ -# must be built with scons +import os + +# Native libraries and headers used by downstream C++ builds. +INCLUDE_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) +LIB_PATH = os.path.join(os.path.dirname(__file__), "libmsgq.a") +VISIONIPC_LIB_PATH = os.path.join(os.path.dirname(__file__), "visionipc", "libvisionipc.a") +PYTHON_LIB_PATH = os.path.join(os.path.dirname(__file__), "ipc_pyx.so") + from msgq.ipc_pyx import Context, Poller, SubSocket, PubSocket, SocketEventHandle, toggle_fake_events, \ set_fake_prefix, get_fake_prefix, delete_fake_prefix, wait_for_one_event from msgq.ipc_pyx import MultiplePublishersError, IpcError diff --git a/pyproject.toml b/pyproject.toml index 8bb946933..39becfd9b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,6 +13,10 @@ classifiers = [ ] dependencies = [] +[build-system] +requires = ["setuptools>=64", "Cython", "scons"] +build-backend = "setuptools.build_meta" + [project.optional-dependencies] dev = [ "setuptools", # for distutils @@ -27,7 +31,7 @@ dev = [ ] [tool.setuptools.package-data] -"*" = ["*.so"] +msgq = ["*.h", "*.a", "*.so", "*.dylib", "visionipc/*.h", "visionipc/*.a", "visionipc/*.so", "visionipc/*.dylib"] # https://beta.ruff.rs/docs/configuration/#using-pyprojecttoml [tool.ruff] diff --git a/setup.py b/setup.py new file mode 100644 index 000000000..055572c1b --- /dev/null +++ b/setup.py @@ -0,0 +1,20 @@ +import os +import subprocess + +from setuptools import Distribution, setup +from setuptools.command.build_py import build_py + + +class BinaryDistribution(Distribution): + def has_ext_modules(self): + return True + + +class BuildPyWithScons(build_py): + def run(self): + root = os.path.dirname(os.path.abspath(__file__)) + subprocess.check_call(["scons", f"-j{os.cpu_count() or 1}", "--minimal"], cwd=root) + super().run() + + +setup(cmdclass={"build_py": BuildPyWithScons}, distclass=BinaryDistribution)