描述
我有一个代码生成器,它接受一个 XML 输入文件并输出一个 c++ 头文件和源文件。然后将这些自动生成的文件与静态源文件一起编译以生成一个库。简化的 cmake 文件。
add_library(subdirectory/${MODULE_NAME} ${STATIC_SOURCES})
# Invoke auto-coder
add_custom_command(
OUTPUT ${GEN_HEADER} ${GEN_SOURCE}
COMMAND ${CMAKE_COMMAND} ${CMAKE_SOURCE_DIR}/my_autocoder ${SOURCE_XML}
DEPENDS ${SOURCE_XML}
)
# Add auto-generated source dependencies
target_sources(${MODULE_NAME}
PUBLIC ${GEN_HEADER}
PRIVATE ${GEN_SOURCE}
)
问题
生成的头文件 ${GEN_HEADER_A}
包含其他生成的头文件,例如${GEN_HEADER_B}
。当在顶层运行 make
时,一切都会正确构建。但是,当单独构建库时,它会出错,因为 ${GEN_HEADER_B}
不存在。
问题
如何在 ${GEN_HEADER_B}
上添加所有依赖项,如 ${GEN_HEADER_A}
而无需手动指定每个依赖项?
尝试
add_custom_command
的IMPLICIT_DEPENDS
功能似乎具有我想要的功能。但是,我尝试使用它并没有导致为 ${GEN_HEADER_B}
调用代码生成器。我的假设是这是因为当我添加库 add_library(subdirectory/${MODULE_NAME} ${STATIC_SOURCES})
add_custom_command(
OUTPUT ${MODULE_NAME}
COMMAND ...
IMPLICIT_DEPENDS ${GEN_HEADER}
)
我确实在 ${GEN_HEADER_A}
下的 CXX.includecache
中看到了 ${GEN_HEADER_B}
最佳答案
如果你想要文件A
在文件 B
时(重新)创建已构建,您应该明确地指定此依赖项。
通过扫描发现的依赖项(在 add_library
/add_executable
命令中自动发现,或通过 add_custom_command
的IMPLICIT_DEPENDS 选项)仅被检查 进行修改。 CMake 不会尝试(重新)创建通过扫描发现的依赖项。
关于c++ - 在自动生成的文件之间生成依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45990022/