2012-11-08 36 views
14

Per un progetto costruisco una libreria C e collegamenti Python impliciti (tramite introspezione GObject) con CMake. Voglio anche distribuire alcuni moduli helper Python usando le distutils. Sono in grado di costruire e installare il modulo con questo CMakeLists.txtUso di CMake con 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() 

e la seguente 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']) 

Purtroppo, il passaggio di generazione viene eseguito ogni volta che corro make. Immagino che il problema sia legato all'output del comando personalizzato che è una directory piuttosto che un file. Ora, c'è un modo per dire a CMake di eseguire python setup.py build solo quando setup.py.in o una delle fonti è cambiato?

risposta

7

Solo i file, non le directory, possono essere utilizzati in modo affidabile come OUTPUT e DEPENDS. È possibile modificare il comando personalizzato per produrre anche un file timestamp, qualcosa come questo:

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

Esattamente quello che stavo cercando. Grazie. – matthias