cmake自定义目标的依赖关系

时间:2013-02-17 20:07:35

标签: c++ cmake

我使用python脚本(gen_instantiations.py)生成一个cpp文件(autogen_instantiations.cpp),该文件包含在另一个cpp文件中(foo.cpp) 因此,每当foo.hpp或gen_instantiations.py发生变化时,我希望CMake重新生成此文件。 按照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)

但是这次运行每次运行脚本。我做错了什么?

2 个答案:

答案 0 :(得分:2)

确保在autogen_instantiations.cpp中生成CMAKE_CURRENT_BINARY_DIR。如果输出名称是相对路径,则将相对于CMAKE_CURRENT_BINARY_DIR进行解释。

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

答案 1 :(得分:1)

更好的方法是不#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}
  )