生成自动生成的文件之间的依赖关系

时间:2017-08-31 21:02:01

标签: c++ cmake code-generation

描述

我有一个代码生成器,它接受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

1 个答案:

答案 0 :(得分:0)

如果您希望在构建文件A时(重新)创建文件B,则应指定此依赖关系明确

扫描发现的依赖关系(在add_library / add_executable命令中自动执行,或通过add_custom_command IMPLICIT_DEPENDS 选项)只有已检查才能进行修改。 CMake不会尝试(重新)创建通过扫描发现的依赖关系。