2013-08-21 41 views
15

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

我的项目目录结构:

  • 项目
    • 版本(蟒蛇的distutils目录)
    • DOC(模块文档)
    • 模块(主模块目录)
      • 核心(DIR用于增强项目/库
        • 的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模块,所以它应该正常工作吗?)

+0

这是一个使用CMake的C/Python模块的链接 - https://gitlab.com/ideasman42/blender-mathutils - distutils仅用于提取Python前缀。 *(虽然也有一个distutils setup.py,但它不用于CMake构建)* – ideasman42

回答

9

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

0

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