4

我使用python脚本(gen_instantiations.py)生成一个cpp文件(autogen_instantiations.cpp),该文件包含在另一个cpp文件(foo.cpp)中所以我希望CMake在foo.hpp或gen_instantiations.py发生变化时重新生成这个文件。按照 CMake 常见问题解答中的说明,这就是我所做的

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

更好的方法是不#include生成autogen_instantiations.cpp,而是将其作为另一个源文件添加到foo库中,因此 cmake 可以看到它foo依赖于它并在 smth 发生更改时调用您的生成器

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 回答
2

确保autogen_instantiations.cppCMAKE_CURRENT_BINARY_DIR. 如果输出名称是相对路径,它将被解释为相对于CMAKE_CURRENT_BINARY_DIR.

如果该命令实际上并未autogen_instantiations.cpp在当前二进制目录中创建,则该规则将始终运行。

于 2013-02-17T20:25:32.937 回答