2012-11-08 101 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