# Copyright 2023 LiveKit, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import os import pathlib import re import subprocess import sys from pathlib import Path import setuptools from setuptools import Extension from setuptools.command.build_ext import build_ext here = pathlib.Path(__file__).parent.resolve() about = {} with open(os.path.join(here, "livekit", "durable", "version.py")) as f: exec(f.read(), about) class CMakeExtension(Extension): def __init__(self, name: str, sourcedir: str = "") -> None: super().__init__(name, sources=[]) self.sourcedir = os.fspath(Path(sourcedir).resolve()) class CMakeBuild(build_ext): def build_extension(self, ext: CMakeExtension) -> None: # Must be in this form due to bug in .resolve() only fixed in Python 3.10+ ext_fullpath = Path.cwd() / self.get_ext_fullpath(ext.name) extdir = ext_fullpath.parent.resolve() cmake_args = [ f"-DCMAKE_LIBRARY_OUTPUT_DIRECTORY={extdir}", f"-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG={extdir}", f"-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE={extdir}", "-DCMAKE_BUILD_TYPE=Release", f"-DPython_EXECUTABLE={sys.executable}", ] print(f"cmake_args: {cmake_args}") if sys.platform.startswith("darwin"): # Cross-compile support for macOS - respect ARCHFLAGS if set archs = re.findall(r"-arch (\S+)", os.environ.get("ARCHFLAGS", "")) if archs: cmake_args += ["-DCMAKE_OSX_ARCHITECTURES={}".format(";".join(archs))] self.build_temp = Path(self.build_temp) / ext.name if not self.build_temp.exists(): self.build_temp.mkdir(parents=True) subprocess.run(["cmake", ext.sourcedir, *cmake_args], cwd=self.build_temp, check=True) target = ext.name.split(".")[-1] subprocess.run( ["cmake", "--build", ".", "--target", target, "--config", "Release"], cwd=self.build_temp, check=True, ) setuptools.setup( name="livekit-durable", version=about["__version__"], description="Durable generator/coroutine tools for livekit-agents", long_description=(here / "README.md").read_text(encoding="utf-8"), long_description_content_type="text/markdown", url="https://github.com/livekit/agents", classifiers=[ "Intended Audience :: Developers", "Topic :: Multimedia :: Sound/Audio", "Topic :: Multimedia :: Video", "Topic :: Scientific/Engineering :: Artificial Intelligence", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", "Programming Language :: Python :: 3 :: Only", ], keywords=["webrtc", "realtime", "audio", "video", "livekit"], license="Apache-2.0", zip_safe=False, ext_modules=[CMakeExtension("lk_durable")], package_data={"livekit.durable": ["py.typed"]}, cmdclass={"build_ext": CMakeBuild}, packages=setuptools.find_namespace_packages(include=["livekit.*"]), python_requires=">=3.10.0,<3.15", project_urls={ "Documentation": "https://docs.livekit.io", "Website": "https://livekit.io/", "Source": "https://github.com/livekit/agents", }, )