| import os |
| import platform |
| import re |
| import shutil |
| import subprocess |
| import sys |
| from distutils.version import LooseVersion |
|
|
| from setuptools import Command, Extension, find_packages, setup |
| from setuptools.command.build_ext import build_ext |
|
|
|
|
| class CMakeExtension(Extension): |
| def __init__(self, name, sourcedir=""): |
| Extension.__init__(self, name, sources=[]) |
| self.sourcedir = os.path.abspath(sourcedir) |
|
|
|
|
| class CMakeBuild(build_ext): |
| def run(self): |
| try: |
| out = subprocess.check_output(["cmake", "--version"]) |
| except OSError: |
| raise RuntimeError( |
| "CMake must be installed to build the following extensions: " |
| + ", ".join(e.name for e in self.extensions) |
| ) |
|
|
| if platform.system() == "Windows": |
| cmake_version = LooseVersion(re.search(r"version\s*([\d.]+)", out.decode()).group(1)) |
| if cmake_version < "3.1.0": |
| raise RuntimeError("CMake >= 3.1.0 is required on Windows") |
|
|
| for ext in self.extensions: |
| self.build_extension(ext) |
|
|
| def build_extension(self, ext): |
| extdir = os.path.abspath(os.path.dirname(self.get_ext_fullpath(ext.name))) |
| |
| if not extdir.endswith(os.path.sep): |
| extdir += os.path.sep |
|
|
| |
| cmake_args = [ |
| "-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=" + extdir, |
| "-DPYTHON_EXECUTABLE=" + sys.executable, |
| "-DCMAKE_BUILD_TYPE=Release", |
| ] |
|
|
| cfg = "Debug" if self.debug else "Release" |
| build_args = ["--config", cfg] |
|
|
| if platform.system() == "Windows": |
| cmake_args += ["-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_{}={}".format(cfg.upper(), extdir)] |
| if sys.maxsize > 2**32: |
| cmake_args += ["-A", "x64"] |
| build_args += ["--", "/m"] |
| else: |
| cmake_args += ["-DCMAKE_BUILD_TYPE=" + cfg] |
| build_args += ["--", "-j2"] |
|
|
| env = os.environ.copy() |
| env["CXXFLAGS"] = '{} -DVERSION_INFO=\\"{}\\"'.format( |
| env.get("CXXFLAGS", ""), self.distribution.get_version() |
| ) |
| if not os.path.exists(self.build_temp): |
| os.makedirs(self.build_temp) |
|
|
| subprocess.check_call(["cmake", ext.sourcedir] + cmake_args, cwd=self.build_temp, env=env) |
| subprocess.check_call(["cmake", "--build", "."] + build_args, cwd=self.build_temp) |
|
|
|
|
| |
| class CleanCommand(Command): |
| """Custom clean command to tidy up the project root.""" |
|
|
| user_options = [] |
|
|
| def initialize_options(self): |
| pass |
|
|
| def finalize_options(self): |
| pass |
|
|
| def run(self): |
| |
| if os.path.exists("build"): |
| print("Removing 'build/' directory") |
| shutil.rmtree("build") |
| |
| for item in os.listdir("."): |
| if item.endswith(".egg-info"): |
| print(f"Removing '{item}' directory") |
| shutil.rmtree(item) |
| for item in os.listdir("."): |
| if item.endswith(".eggs"): |
| print(f"Removing '{item}' directory") |
| shutil.rmtree(item) |
| |
| if os.path.exists("dist"): |
| print("Removing 'dist/' directory") |
| shutil.rmtree("dist") |
|
|
|
|
| |
| class UninstallCommand(Command): |
| """Custom command to uninstall the package.""" |
|
|
| user_options = [] |
|
|
| def initialize_options(self): |
| pass |
|
|
| def finalize_options(self): |
| pass |
|
|
| def run(self): |
| package_name = self.distribution.get_name() |
| print(f"Attempting to uninstall {package_name}...") |
| try: |
| subprocess.check_call([sys.executable, "-m", "pip", "uninstall", "-y", package_name]) |
| print(f"{package_name} uninstalled successfully.") |
| except subprocess.CalledProcessError as e: |
| print( |
| f"Failed to uninstall {package_name}. It may not be installed or pip uninstall failed." |
| ) |
| print(f"Error: {e}") |
| except FileNotFoundError: |
| print("pip command not found. Please ensure pip is installed and in your PATH.") |
|
|
|
|
| setup( |
| name="xrobotoolkit_sdk", |
| version="1.0.2", |
| author="Zhigen Zhao", |
| author_email="zhigen.zhao@bytedance.com", |
| description="A Python binding for XRobotoolkit PC Service SDK using pybind11 and CMake", |
| long_description="", |
| ext_modules=[CMakeExtension("xrobotoolkit_sdk")], |
| cmdclass=dict( |
| build_ext=CMakeBuild, |
| clean=CleanCommand, |
| uninstall=UninstallCommand, |
| ), |
| zip_safe=False, |
| python_requires=">=3.10", |
| packages=find_packages(), |
| ) |
|
|