2012-11-08 5 views
14

Für ein Projekt baue ich eine C-Bibliothek und impliziert Python-Bindungen (über GObject Introspection) mit CMake. Ich möchte auch einige Python-Helper-Module mit Hilfe von Distutils verteilen. Ich bin in der Lage das Modul mit diesem CMakeLists.txtVerwenden von CMake mit 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() 

und der folgenden setup.py.in zu bauen und zu installieren:

from distutils.core import setup, Extension 

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

Leider Schritt ausgeführt wird jedes Mal, wenn ich make laufen, die zu bauen. Ich denke, das Problem hängt mit der Ausgabe des benutzerdefinierten Befehls zusammen, bei dem es sich um ein Verzeichnis und nicht um eine Datei handelt. Gibt es nun eine Möglichkeit, CMake zu veranlassen, python setup.py build nur auszuführen, wenn setup.py.in oder eine der Quellen geändert wurde?

Antwort

7

Nur Dateien, keine Verzeichnisse, können zuverlässig als OUTPUT und DEPENDS verwendet werden. Sie könnten Ihren benutzerdefinierten Befehl ändern, um auch eine Timestamp-Datei zu erstellen, etwa wie folgt:

+0

Genau das, was ich gesucht habe. Vielen Dank. – matthias