179 lines
4.8 KiB
Python
179 lines
4.8 KiB
Python
import os
|
||
import sys
|
||
|
||
# Try to import pybind11, but don't fail if it's not available during build setup
|
||
try:
|
||
import pybind11
|
||
from pybind11.setup_helpers import Pybind11Extension, build_ext
|
||
PYBIND11_AVAILABLE = True
|
||
except ImportError:
|
||
PYBIND11_AVAILABLE = False
|
||
# Define dummy classes for when pybind11 is not available
|
||
class Pybind11Extension:
|
||
def __init__(self, *args, **kwargs):
|
||
pass
|
||
class build_ext:
|
||
pass
|
||
|
||
from setuptools import setup, Extension
|
||
|
||
# 获取当前目录
|
||
__dir__ = os.path.dirname(os.path.abspath(__file__))
|
||
|
||
# 获取所有源文件
|
||
def get_source_files():
|
||
"""获取所有STT源文件"""
|
||
src_files = []
|
||
|
||
# 添加主源文件
|
||
src_dir = os.path.join(__dir__, 'src')
|
||
for file in os.listdir(src_dir):
|
||
if file.endswith('.cc'):
|
||
src_files.append(os.path.join('src', file))
|
||
|
||
# 添加绑定文件
|
||
src_files.append('pybind/stt_binding.cpp')
|
||
|
||
return src_files
|
||
|
||
# 获取包含目录
|
||
def get_include_dirs():
|
||
"""获取包含目录"""
|
||
includes = [
|
||
# 当前目录
|
||
__dir__,
|
||
# src目录
|
||
os.path.join(__dir__, 'src'),
|
||
# pybind目录
|
||
os.path.join(__dir__, 'pybind'),
|
||
]
|
||
|
||
# 只有在pybind11可用时才添加其包含目录
|
||
if PYBIND11_AVAILABLE:
|
||
includes.extend([
|
||
# pybind11包含目录
|
||
pybind11.get_include(),
|
||
# Python包含目录
|
||
pybind11.get_include(True)
|
||
])
|
||
|
||
return includes
|
||
|
||
# 定义扩展模块
|
||
if PYBIND11_AVAILABLE:
|
||
ext_modules = [
|
||
Pybind11Extension(
|
||
"pystt",
|
||
# 源文件列表
|
||
get_source_files(),
|
||
# 包含目录
|
||
include_dirs=get_include_dirs(),
|
||
# 编译选项
|
||
extra_compile_args=[
|
||
'-O3', # 优化级别
|
||
'-std=c++11', # C++11标准
|
||
'-fPIC', # 位置无关代码
|
||
'-DVERSION_INFO="1.4.1"', # 版本信息
|
||
'-DPYTHON_BINDING' # Python绑定模式
|
||
],
|
||
# 链接选项
|
||
extra_link_args=[],
|
||
# 定义宏
|
||
define_macros=[
|
||
('VERSION_INFO', '"1.4.1"'),
|
||
('PYTHON_BINDING', '1'),
|
||
],
|
||
# 语言标准
|
||
cxx_std=11,
|
||
),
|
||
]
|
||
else:
|
||
# 当pybind11不可用时,使用空列表
|
||
ext_modules = []
|
||
|
||
# 读取README文件
|
||
def read_readme():
|
||
"""读取README文件"""
|
||
readme_path = os.path.join(__dir__, 'README.md')
|
||
if os.path.exists(readme_path):
|
||
with open(readme_path, 'r', encoding='utf-8') as f:
|
||
return f.read()
|
||
return "STT Python Binding - Spherical Triangular Tessellation Generator"
|
||
|
||
# 设置包信息
|
||
setup(
|
||
name='pystt',
|
||
version='1.4.1',
|
||
author='STT Development Team',
|
||
author_email='yizhang-geo@zju.edu.cn',
|
||
description='Python binding for Spherical Triangular Tessellation (STT) generator',
|
||
long_description=read_readme(),
|
||
long_description_content_type='text/markdown',
|
||
url='https://github.com/your-repo/stt',
|
||
|
||
# 扩展模块
|
||
ext_modules=ext_modules,
|
||
|
||
# 构建命令
|
||
cmdclass={"build_ext": build_ext} if PYBIND11_AVAILABLE else {},
|
||
|
||
# 依赖
|
||
install_requires=[
|
||
'pybind11>=2.6.0',
|
||
'numpy>=1.19.0',
|
||
],
|
||
|
||
# 可选依赖
|
||
extras_require={
|
||
'dev': [
|
||
'pytest>=6.0',
|
||
'pytest-cov',
|
||
'black',
|
||
'flake8',
|
||
],
|
||
'progress': [
|
||
'tqdm>=4.50.0',
|
||
],
|
||
},
|
||
|
||
# Python版本要求
|
||
python_requires='>=3.6',
|
||
|
||
# 分类
|
||
classifiers=[
|
||
'Development Status :: 4 - Beta',
|
||
'Intended Audience :: Science/Research',
|
||
'License :: OSI Approved :: MIT License',
|
||
'Programming Language :: Python :: 3',
|
||
'Programming Language :: Python :: 3.6',
|
||
'Programming Language :: Python :: 3.7',
|
||
'Programming Language :: Python :: 3.8',
|
||
'Programming Language :: Python :: 3.9',
|
||
'Programming Language :: Python :: 3.10',
|
||
'Programming Language :: Python :: 3.11',
|
||
'Programming Language :: C++',
|
||
'Topic :: Scientific/Engineering :: GIS',
|
||
'Topic :: Scientific/Engineering :: Mathematics',
|
||
],
|
||
|
||
# 关键词
|
||
keywords='spherical triangular tessellation mesh generation geography',
|
||
|
||
# 项目URL
|
||
project_urls={
|
||
'Bug Reports': 'https://github.com/your-repo/stt/issues',
|
||
'Source': 'https://github.com/your-repo/stt',
|
||
'Documentation': 'https://stt.readthedocs.io/',
|
||
},
|
||
|
||
# 包含包数据
|
||
include_package_data=True,
|
||
|
||
# 排除文件
|
||
exclude_package_data={
|
||
'': ['*.cpp', '*.cc', '*.h', '*.hpp', 'CMakeLists.txt', 'Makefile'],
|
||
},
|
||
|
||
# ZIP安全
|
||
zip_safe=False,
|
||
) |