You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

148 lines
5.0 KiB

import os
import platform
import re
import shutil # Added for shutil.rmtree
import subprocess
import sys
from distutils.version import LooseVersion
from setuptools import Command, Extension, find_packages, setup # Added Command
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)))
# required for auto-detection of auxiliary "native" libs
if not extdir.endswith(os.path.sep):
extdir += os.path.sep
# Get pybind11 include paths
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"] # Adjust core count as needed
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)
# New Clean Command
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):
# Remove build directory
if os.path.exists("build"):
print("Removing 'build/' directory")
shutil.rmtree("build")
# Remove .egg-info directory
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)
# Optionally, remove dist directory if you generate distributions
if os.path.exists("dist"):
print("Removing 'dist/' directory")
shutil.rmtree("dist")
# New Uninstall Command
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="", # Optionally, load from a README.md file
ext_modules=[CMakeExtension("xrobotoolkit_sdk")],
cmdclass=dict(
build_ext=CMakeBuild,
clean=CleanCommand, # Add clean command
uninstall=UninstallCommand, # Add uninstall command
),
zip_safe=False,
python_requires=">=3.10", # Specify your Python version requirement
packages=find_packages(), # If you have other Python packages in your project
)