查看上次状态更新
初始状态
- 生成一组以一个输入文件为参数的 c++ 源代码的代码生成器
- 输入文件可能包含其他输入文件
已经解决了获取输出文件列表、解析输入代码生成文件以获得完整的代码生成输入列表的任务。即 add_custom_command 首次提供了正确的依赖集:
add_custom_command(OUTPUT ${generatedSources} COMMAND ${codegenCommand} ARGS ${codegenArgs} DEPENDS ${codegenInputFiles})
问题场景
- 当前系统运行良好,直到有人修改 codegen 输入文件之一以包含新输入文件或删除现有输入文件的包含。这种情况下,需要更新提供给 add_custom_command 作为依赖项的 codegen 输入文件列表,但我不知道如何
什么不见了
- 通过项目重建更新 add_custom_command 依赖项的能力
有没有办法在不进行完整项目重建的情况下解决它?
更新 - 替代(更好?)问题描述
我在 cmake 邮件列表上发现了类似的未回答问题,为了更清楚起见,将其发布在这里:http: //article.gmane.org/gmane.comp.programming.tools.cmake.user/52279
我试图让代码生成工具在依赖项方面表现得与 C 源文件“相同”。我的意思是,假设你有一个 C 文件“ac”。因为它可以#include 文件,所以每次内容a.c
变化时,它的依赖关系也可能发生变化。使用 -MMD 重新扫描依赖项。我想要一些方法来模拟我的代码生成器。首先我尝试了 add_custom_command,它采用一个固定的 DEPENDS 列表,在定义自定义命令时确定。具体来说,我的意思是这样的:
function(add_generated_library)
figure_out_dependencies(deps ${ARGN})
add_custom_command(... DEPENDS ${deps})
endfunction()
但这仅在构建系统生成时捕获依赖关系。每次自定义命令运行时,可能需要更改 DEPENDS 列表,因为更改可能意味着新的依赖项。我应该如何执行此操作?
更新 2 - 可能的解决方案
以下我认为是事实 - 网络上有关于 cmake 支持动态依赖项的声音,这是平滑集成许多非平凡代码生成工具所必需的 - 没有现成可用的最佳解决方案,正如我们所说的那样实际上需要钩子来添加对自定义 DSL 的支持到 IMPLICIT_DEPENDS
从cmake手册:
IMPLICIT_DEPENDS 选项请求扫描输入文件的隐式依赖项。给定的语言指定了应该使用其对应的依赖扫描程序的编程语言。目前仅支持 C 和 CXX 语言扫描程序。必须为 IMPLICIT_DEPENDS 列表中的每个文件指定语言。从扫描中发现的依赖关系会在构建时添加到自定义命令的依赖关系中。
以下解决方案(希望)符合以下标准:
- 避免在重建时进行不必要的依赖扫描
- 避免在重建时运行不必要的代码生成器
- 允许向客户提供 cmake 函数来注册他们的模型并从该代码生成代码/创建库,而不强加任何项目结构要求(即没有负责代码生成的子项目,模型使用项目特定的策略分布在项目层次结构中)
解决方案思路
无法注册自定义语言扫描器,但可以重用现有的。这个想法是自定义模型文件的依赖关系/层次结构反映为“C”头文件的层次结构。每个层次结构节点在模型文件注册时添加,C 文件包含匹配模型文件包含。如果模型文件包含被更改,C 文件包含被更改。因此,每个 codegen 调用将仅依赖于一个生成的反映传递模型的 C 标头。每个反映的文件都将依赖于模型文件并涉及模型文件的更改。
总结:可能,我的措辞在这一点上不是很清楚,但关于其他人的需求和社区帮助我调查这个问题,我将发布通用解决方案(+链接到 github 或新的 cmake wiki 页面)没有我准备好后的项目细节(1-3 天内)。