【发布时间】:2018-02-09 21:58:40
【问题描述】:
说明
我有一个代码生成器,它接受一个 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}) 时,我已经有了构建 ${MODULE_NAME} 的规则
add_custom_command(
OUTPUT ${MODULE_NAME}
COMMAND ...
IMPLICIT_DEPENDS ${GEN_HEADER}
)
我在${GEN_HEADER_A} 下的CXX.includecache 中确实看到了${GEN_HEADER_B}
【问题讨论】:
-
add_custom_target而不是add_custom_command。自定义目标可以相互依赖。
标签: c++ cmake code-generation