构建包含跨平台C库的Python包的良好工作流程是什么



我在一个跨平台的C组件上工作,该组件主要用于大型C项目中。它也被一些人通过Python(cffi或ctypes(使用,因为它比我们试图构建的算法的优化Numpy实现提供了显著的性能提升。我正在努力弄清楚:建立一个能够(在多个平台上(构建所需动态库的持续集成系统,将它们全部包含在模块的Python发行版中,然后在所有支持的平台上测试该模块,什么是明智的方法。我也在试图了解我目前的想法(如下(是明智的还是愚蠢的。

我的感觉是CI会是这样的:

  1. 构建库并收集动态库人工制品
  2. 将人工制品放入本地python包
  3. 在单个平台或其他平台上使用python3 -m build --sdist来创建包
  4. 在多个平台上安装和测试创建的分发工件

在我看来,这与Numpy和Scipy的情况(它们也构建源代码(略有不同,因为它们主要是Python包,其中这主要是一个C源代码包,碰巧包括一些人想要使用的绑定库。C库也包含它自己的测试,这些测试需要运行;python包";这将是一份额外的工作。

存储库看起来像这样:

/my_library/CMakeLists.txt
/my_library/include/public_api_c.h (and other stuff)
/my_library/source/implementation.c (and other stuff)
/my_library/frontend/dll_linkage/dll_api_implementation.c
/my_library/python/test/ (all pytests go in here for the python package)
/my_library/python/src/my_library/ (all python for the module goes in here)
/my_library/python/src/my_library/bin (where the binary artefacts go)
/my_library/python/pyproject.toml (and a few other things go here)
/my_library/matlab/... (matlab implementations etc)
/c_dependency_1/CMakeLists.txt (and other stuff)
/c_dependency_2/CMakeLists.txt (and other stuff)
/CMakeLists.txt (top-level CMakeLists that imports dependencies and defines what things to build)

这意味着,如果有人获得了存储库,他们也可以访问python和matlab实现——他们只是没有二进制文件来使用更快的python绑定。

如果有人能向我介绍一些其他这样做的项目(特别是如果这些项目使用CMake作为C项目的构建系统(,或者能就我需要小心的事情提供一些反馈或信息,那将是非常棒的。此外,包位于主存储库的子目录中——这会是一个问题吗?

您的方法是可行的。选择python包应该"选择"哪个平台DSO;"包裹";运行时会增加复杂性。您可以考虑一种不同的方法,即为每个平台/架构构建一个python轮子。所有这些轮子都被推到python包索引,并且python安装工具(pip(在实际的";客户端";平台将选择要安装的匹配项。基本上,你会在";外部";而不是在python包的";内部";。为了制造这些轮子,你可以利用cibuildwheel。看看这个github操作工作流,了解在不同平台上构建轮子并测试和上传它们的完整示例。该示例在内部使用cmake来构建clang格式。

相关内容

最新更新