python / c ++ - 使用cmake编译共享库并使用distutils进行安装

时间:2013-08-21 14:30:54

标签: c++ python cmake boost-python distutils

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

我的项目目录结构:

  • 项目
    • build(python distutils目录)
    • doc(模块文档)
    • 模块(主模块目录)
      • core(升级项目/库的目录)
        • 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模块,所以它应该正常工作吗?)

2 个答案:

答案 0 :(得分:10)

最后,我遵循了答案here并覆盖了build_ext命令。因为我希望构建是跨平台的,并且由于共享库位于模块源代码树内,我导入模块共享库添加使用文件属性从安装程序获取共享库的路径的.py。

答案 1 :(得分:1)

scikit-buildsetup的自定义实现,用于替换distutils.core.Extension并使用cmake编译源代码。可以找到各种示例项目here。在您使用Pybind11的情况下,还有一个简单的使用示例here