4

Python スクリプト (gen_instantiations.py) を使用して、別の cpp ファイル (foo.cpp) に含まれる cpp ファイル (autogen_instantiations.cpp) を生成するため、foo.hpp または gen_instantiations.py が変更されるたびに CMake でこのファイルを再生成する必要があります。CMake FAQ の指示に従って、これが私がしたことです

add_custom_command(
  COMMAND "./gen_instantiations.py" 
  OUTPUT "autogen_instantiations.cpp"
  WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" 
  DEPENDS gen_instantiations.py foo.hpp
)
add_custom_target(instantiations ALL DEPENDS autogen_instantiations.cpp)

add_library(foo
   foo.cpp  
 )
 add_dependencies(foo instantiations)

ただし、これを実行すると、毎回スクリプトが実行されます。私は何を間違っていますか?

4

2 に答える 2

2

autogen_instantiations.cppで生成されていることを確認しCMAKE_CURRENT_BINARY_DIRます。出力名が相対パスの場合は、 を基準として解釈されCMAKE_CURRENT_BINARY_DIRます。

コマンドが現在のバイナリ ディレクトリに実際に作成しない場合autogen_instantiations.cpp、ルールは常に実行されます。

于 2013-02-17T20:25:32.937 に答える
2

より良いアプローチは、#include生成されないことですautogen_instantiations.cppが、それをfooライブラリに追加することですfoo

set(GENERATED_SOURCES autogen_instantiations.cpp)
add_custom_command(
    OUTPUT ${GENERATED_SOURCES}
    COMMAND "./gen_instantiations.py"
    WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/gen_instantiations.py ${CMAKE_CURRENT_SOURCE_DIR}/foo.hpp
  )

add_library(
    foo
    foo.cpp
    ${GENERATED_SOURCES}
  )
于 2013-02-17T20:23:13.150 に答える