2012-11-08 50 views
14

对于一个项目,我构建了一个C库,并将蕴含Python绑定(通过GObject内省)与CMake绑定。我也想分发一些使用distutils的Python helper模块。我能与此CMakeLists.txt使用CMake和setup.py

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只有在setup.py.in或其中一个来源发生变化时才运行python setup.py build

回答

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) 
+0

正是我在找的东西。谢谢。 – matthias