我有一个代码生成器,它接受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_A}
上添加${GEN_HEADER_B}
之类的所有依赖项,而无需手动指定每个依赖项?
IMPLICIT_DEPENDS
的{{1}}功能似乎具有我想要的功能。但是,我尝试使用它并没有导致为add_custom_command
调用代码生成器。我的假设是因为我在添加库${GEN_HEADER_B}
${MODULE_NAME}
的规则
add_library(subdirectory/${MODULE_NAME} ${STATIC_SOURCES})
我确实在add_custom_command(
OUTPUT ${MODULE_NAME}
COMMAND ...
IMPLICIT_DEPENDS ${GEN_HEADER}
)
${GEN_HEADER_B}
中看到CXX.includecache
答案 0 :(得分:0)
如果您希望在构建文件A
时(重新)创建文件B
,则应指定此依赖关系明确。
扫描发现的依赖关系(在add_library
/ add_executable
命令中自动执行,或通过add_custom_command
的 IMPLICIT_DEPENDS 选项)只有已检查才能进行修改。 CMake不会尝试(重新)创建通过扫描发现的依赖关系。