recursion - Makefile:如何递归跟踪程序的导入层次结构?
问题描述
问题
考虑以下配方:
a: b
<create a>
也许它是正确的。但是,如果b
导入另一个程序c
,则不是。它应该这样说:
a: b c
<create a>
如果c
取决于d
,它应该这样说:
a: b c d
<create a>
并且任何时候c
更改它导入的内容,任何依赖于它的输出都b
需要在 makefile 中更新其配方。
这很乏味。这也很危险,因为很容易错过需要更新的食谱。
什么会更好
就是只需要说一次给定源文件依赖的其他源文件,而不是每次它出现在任何配方的先决条件中。也就是说,Makefile 应该进行递归,而不是我。
(如果我不得不说源文件所依赖的内容的零倍,而不是从代码中自动生成该信息,那就更好了。我想知道这样的解决方案是否存在?)
我有一个尴尬的解决方案。
这是一个(非常)最小的例子:
https://github.com/JeffreyBenjaminBrown/makefile-import-aware/
这是 Makefile(repo 中的所有其他内容都只是空文件或文档):
.no_younger_than/lib/a: \
code/lib/a
install -D /dev/null .no_younger_than/lib/a
.no_younger_than/b: \
code/b \
.no_younger_than/lib/a
install -D /dev/null .no_younger_than/b
c: .no_younger_than/b
echo "yes" > c
这些install
指令创建一个与代码平行的文件树,其中包含与每个源文件对应的空“证据”文件。makefile 每次运行时都会创建这样的证据。如果证据文件上的时间戳是 T,这意味着它对应的文件在 T 之后没有被修改。
这个解决方案可以满足我的所有需求,但我害怕不得不向其他人解释。我希望存在已经记录在案的现有技术,所以我可以避免上述解释。
解决方案
推荐阅读
- javascript - 制作 Discord 机器人时“无法读取未定义的属性‘前缀’”
- reactjs - React:Material UI主题更改后按钮不会更改其颜色
- python - 如何使用 Microsoft bot 框架对我的 python bot 进行单元测试?
- python - Python:改变列表列表的形状
- java - PDFBOX - 如果多个文件附加到 pdf,则附加的最后一个文件不会打开
- javascript - 我是否错误地使用了 PromptOptions?
- android - 在 Flutter 中刷新屏幕而不引起用户注意
- sql-server - 当我的 xml 使用 SQL Server 2017 具有多个文本节点时,如何从我的 xml 中检索特定文本节点(第一个、第二个或最后一个)?
- reactjs - 无法在带有汇总的反应组件中导入 SVG 图像
- typescript - 如何将字体与 rollupjs 捆绑在一起?