2012-11-08 29 views
14

プロジェクトでは、Cライブラリをビルドし、Pythonバインディング(GObjectイントロスペクション経由)をCMakeに暗示します。 distutilsを使っていくつかのPythonヘルパーモジュールを配布したいと思っています。私はこのCMakeLists.txtCMakeを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を実行するたびに実行されます。おそらく、問題はファイルではなくディレクトリであるカスタムコマンドの出力に関連していると思います。さて、setup.py.inまたはソースの1つが変更された場合にのみ、python setup.py buildを実行するようにCMakeに指示する方法はありますか?

答えて

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

関連する問題