我使用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)
但是这次运行每次运行脚本。我做错了什么?
答案 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}
)