c++ - 在自动生成的文件之间生成依赖关系

标签 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_B} 上添加所有依赖项,如 ${GEN_HEADER_A} 而无需手动指定每个依赖项?

尝试

add_custom_commandIMPLICIT_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_commandIMPLICIT_DEPENDS 选项)仅被检查 进行修改。 CMake 不会尝试(重新)创建通过扫描发现的依赖项。

关于c++ - 在自动生成的文件之间生成依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45990022/

相关文章:

c++ - cmake 无法在自定义位置或库存位置找到 boost

perl - 如何使用 perl AUTOLOAD 和 Moose::Meta::Class 动态添加不存在的属性?

c++ - OpenGL 纹理三角形

c++ - 将虚函数覆盖为非虚函数可以吗?

cmake find_package 已安装模块的完整列表

java - 在 Java Web 应用程序中,在哪里存储运行时生成的类?

.Net SvcUtil : attributes must be optional

c++ - VS 2015 Community Edition 项目属性 UI 中的 C/C++ 预处理器设置在哪里?

c++ - 使用 GPU 进行实时信号处理

gcc - 构建 OpenCV 时 CMake 的问题