将CMake与setup.py一起使用

时间:2012-11-08 21:55:42

标签: cmake distutils setup.py

对于一个项目,我构建了一个C库,并使用CMake隐藏了Python绑定(通过GObject内省)。我还想使用distutils分发一些Python辅助模块。我可以使用此CMakeLists.txt

构建和安装模块
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}/module/__init__.py")
    set(OUTPUT      "${CMAKE_CURRENT_BINARY_DIR}/build")

    configure_file(${SETUP_PY_IN} ${SETUP_PY})

    add_custom_command(OUTPUT ${OUTPUT}
                       COMMAND ${PYTHON}
                       ARGS setup.py build
                       DEPENDS ${DEPS})

    add_custom_target(target ALL DEPENDS ${OUTPUT})

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

以及以下setup.py.in

from distutils.core import setup, Extension

if __name__ == '__main__':
    setup(name='foo',
          version='${PACKAGE_VERSION}',
          package_dir={ '': '${CMAKE_CURRENT_SOURCE_DIR}' },
          packages=['module'])

不幸的是,每次运行make时都会执行构建步骤。我猜,问题与自定义命令的输出有关,该命令是目录而不是文件。现在,有没有办法告诉CMake仅在python setup.py build或其中一个来源发生变化时运行setup.py.in

1 个答案:

答案 0 :(得分:7)

只有文件,而不是目录,才能可靠地用作OUTPUT和DEPENDS。您可以修改自定义命令以生成时间戳文件,如下所示:

add_custom_command(
  OUTPUT ${OUTPUT}/timestamp
  COMMAND ${PYTHON} setup.py build
  COMMAND ${CMAKE_COMMAND} -E touch ${OUTPUT}/timestamp
  DEPENDS ${DEPS}
)

add_custom_target(target ALL DEPENDS ${OUTPUT}/timestamp)