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,
|
|||
|
|
)
|