Python/C++ - 使用CMake编译共享库并使用Distutils进行安装

22

我有一个使用boost.python的项目,我使用cmake和make进行编译。它是Python模块的一部分,我想能够使用distutils安装该模块。我已经按照这里的说明创建了CMakeLists.txt文件,首先编译共享库,然后设置setup.py文件,以便使用make install来安装Python模块。但是,尽管所有Python文件都被distutils识别并移动到构建目录中,但共享库却没有,而我真的不知道为什么。

我的项目目录结构:

  • project
    • build(Python distutils目录)
    • doc(模块文档)
    • module(主模块目录)
      • core(用于boost项目/库的目录
        • CMakeLists.txt - 构建共享库
      • other_py_files(几个纯Python文件的目录)
    • CMakeLists.txt
    • setup.py.in
    • setup.py(由cmake生成)

我的setup.py.in文件:

from distutils.core import setup
setup(
    name='module',
    version='${PACKAGE_VERSION}',
    packages=['module', 'module.core', 'module.other_py_files'],
    package_dir={'': '${CMAKE_CURRENT_SOURCE_DIR}'},
)

我的 CMakeLists.txt:

cmake_minimum_required (VERSION 2.6)
project (module)

add_subdirectory(module/core)

find_program(PYTHON "python")

if (PYTHON)
  set(SETUP_PY_IN "${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in")
  set(SETUP_PY "${CMAKE_CURRENT_BINARY_DIR}/setup.py")
  set(DEPS "${CMAKE_CURRENT_SOURCE_DIR}/pyQCD/__init__.py")
  set(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/build/timestamp")

  configure_file(${SETUP_PY_IN} ${SETUP_PY})

  add_custom_command(OUTPUT ${OUTPUT}
    COMMAND ${PYTHON} ${SETUP_PY} build
    COMMAND ${CMAKE_COMMAND} -E touch ${OUTPUT}
    DEPENDS ${DEPS})

  add_custom_target(target ALL DEPENDS ${OUTPUT})

  install(CODE "execute_process(COMMAND ${PYTHON} ${SETUP_PY} install)")

endif()

我以为distutils应该会自动将共享库扩展名添加到构建目录中,或者我在某个地方弄错了吗?(这个共享库是一个基于C API(boost.python)构建的可导入的Python模块,所以它应该能正常工作吧?)


这是一个使用CMake的C/Python模块链接 - https://gitlab.com/ideasman42/blender-mathutils - distutils仅用于提取Python前缀。 (虽然也有distutils setup.py,但它未用于CMake构建) - ideasman42
请注意,在调用 COMMAND ${PYTHON} ${SETUP_PY} build 时,应指定 WORKING_DIRECTORY。它应该指向您的 setup.py 文件所在的位置。如果未指定,可能会得到一个空包。 - ma3oun
2个回答

9
最终我遵循了这里的答案并重写了build_ext命令。由于我希望构建跨平台,且共享库位于模块源树内,因此我导入模块共享库并使用file属性从setup.py获取共享库路径。

1

scikit-build 是一个自定义实现的 setup 工具,取代了 distutils.core.Extension,使用 cmake 来编译源代码。可以在 这里 找到各种示例项目。如果你正在使用 Pybind11,这里还有另一个简单的使用示例 here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接