自定义目标的CMake依赖关系

4
我使用一个Python脚本(gen_instantiations.py)来生成一个cpp文件(autogen_instantiations.cpp),这个文件被另一个cpp文件(foo.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)

但这样会每次都运行脚本。我做错了什么?
2个回答

2
更好的做法是不要包含生成的autogen_instantiations.cpp文件,而是将其作为另一个源文件添加到foo库中,这样cmake就能看到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}
  )

2

请确保autogen_instantiations.cppCMAKE_CURRENT_BINARY_DIR中生成。如果输出名称是相对路径,则将其解释为相对于CMAKE_CURRENT_BINARY_DIR的路径。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接