首页 > 解决方案 > 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 之后没有被修改。

这个解决方案可以满足我的所有需求,但我害怕不得不向其他人解释。我希望存在已经记录在案的现有技术,所以我可以避免上述解释。

标签: recursionmakefile

解决方案


推荐阅读