【问题标题】:Generate dependencies between auto-generated files在自动生成的文件之间生成依赖关系
【发布时间】: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_commandIMPLICIT_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


【解决方案1】:

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

扫描(在add_library/add_executable 命令中自动或通过add_custom_commandIMPLICIT_DEPENDS 选项)发现的依赖项仅检查 进行修改。 CMake 不会尝试(重新)创建通过扫描发现的依赖项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 2011-07-10
    • 2023-04-11
    • 1970-01-01
    • 2014-01-07
    相关资源
    最近更新 更多