python - 使用 pip 构建 CMake 扩展
问题描述
我正在开发具有以下结构的 C++/Python 项目:
foo
├── CMakeLists.txt
├── include
├── source
└── python
├── foo
│ ├── _foo_py.py
│ └── __init__.py
├── setup.py
└── source
├── CMakeLists.txt
└── _foo_cpp.cpp
foo/source
并foo/include
包含 C++ 源文件并foo/python/source/_foo_cpp.cpp
包含此 C++ 代码的 pybind11 包装器代码。Runningsetup.py
应该构建 C++ 代码(通过运行 CMake),_foo_cpp
以共享对象的形式创建一个 Python 模块,并将其与_foo_py.py
. 即我希望能够简单地调用python setup.py install
从foo/python
将foo
模块安装到我的系统。我目前正在使用 CMake 扩展类setup.py
来完成这项工作:
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:
subprocess.check_output(['cmake', '--version'])
except OSError:
raise RuntimeError("cmake command must be available")
for ext in self.extensions:
self.build_extension(ext)
def build_extension(self, ext):
if not os.path.exists(self.build_temp):
os.makedirs(self.build_temp)
self._setup(ext)
self._build(ext)
def _setup(self, ext):
cmake_cmd = [
'cmake',
ext.sourcedir,
]
subprocess.check_call(cmake_cmd, cwd=self.build_temp)
def _build(self, ext):
cmake_build_cmd = [
'cmake',
'--build', '.',
]
subprocess.check_call(cmake_build_cmd, cwd=self.build_temp)
当我尝试直接调用时出现问题pip
,foo/python
例如:
pip wheel -w wheelhouse --no-deps .
似乎在运行代码之前setup.py
,pip
将工作目录的内容复制到一个临时目录中。这显然不包括 C++ 代码和顶级CMakeLists.txt
. 这反过来又会导致CMakeBuild._setup
失败,因为在将根目录复制到另一个位置之后,似乎无法foo
从内部获取到根目录的路径。setup.py
pip
我可以做些什么来使此设置同时python
与 和一起使用pip
吗?我已经看到一些方法首先运行cmake
以setup.py
从setup.py.in
注入包版本、根目录路径等生成一个,但我想避免这种情况并setup.py
调用cmake
而不是相反。
解决方案
推荐阅读
- django - 将 Django BooleanField 转换为 NullBooleanField 并更改默认值
- angular - 如何将sidenav(mat-drawer)状态保存到Angular Material中的localstorage?
- vue.js - 如何使用 vue.js、vuex 和 django rest 框架将 Simple JWT Token 保存在本地存储中?
- python-3.x - Django base64 TypeError __str__ 返回非字符串(类型字节)
- flutter - 如何在 Flutter 的 AppBar 中添加 TabBar?
- azure-log-analytics - Azure 监视器/分析中的警报
- docker - 如何运行一个在其中运行 docker 的 docker 容器?
- jenkins - jnlp kubernetes从代理问题
- python - matplotlib 中不同 x 刻度标签的不同字体大小
- android - Kotlin - 在回收站视图中放置项目