2012-11-08 18 views
14

Dla projektu buduję bibliotekę C i implikuję powiązania Python (poprzez introspekcję GObject) z CMake. Chcę również rozpowszechniać niektóre moduły pomocnicze Python przy użyciu distutils. Jestem w stanie zbudować i zainstalować moduł z tym CMakeLists.txtUżywanie CMake z 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() 

i następnego 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']) 

Niestety, etap budowy jest wykonywana za każdym razem, biegnę make. Przypuszczam, że problem jest związany z wyjściem niestandardowego polecenia, które jest katalogiem, a nie plikiem. Czy istnieje sposób na powiedzenie CMake'owi, aby uruchamiał python setup.py build tylko wtedy, gdy zmieniono setup.py.in lub jedno ze źródeł?

Odpowiedz

7

Tylko pliki, nie katalogi, mogą być niezawodnie używane jako WYJŚCIA i ZALEśY. Można zmodyfikować niestandardowe polecenie, aby utworzyć plik sygnatury czasowej, coś takiego:

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

Dokładnie tego, czego szukałem. Dzięki. – matthias