Makefile依赖既是文件又是规则时的执行逻辑问询
Makefile依赖规则的执行逻辑问题
通用规则形式:
output_file_name: dep_file_name1, dep_file_name_2, ..., dep_file_name_n recipe假设某Makefile中无伪目标,每个
dep_file_name_x均为文件名,且常同时是另一条规则的output_file_name。问题:触发此类规则时,make仅检查dep_file_name_x文件的修改时间(若存在),还是会先执行对应的规则(若该规则可更新文件)?更简洁的问法:当dep_file_name_x同时对应现有规则和文件时,是否会先执行该规则(含其依赖检查)再进行文件修改时间检查?
Make的处理逻辑是先递归执行依赖对应的规则(包括检查该依赖自身的依赖链),确保依赖文件处于最新状态后,再对比依赖与目标的修改时间。
具体来说:
- 处理目标时,make会遍历它的所有依赖;
- 对每个依赖,若存在对应的生成规则,会优先递归处理该规则:检查这个依赖的自身依赖是否需要更新,执行对应的recipe生成/更新该依赖文件;
- 等所有依赖都完成更新(确认是最新状态)后,才会对比依赖文件和当前目标文件的修改时间,判断是否需要执行当前目标的recipe。
举个实际例子:
# 目标foo依赖bar foo: bar echo "生成foo" > foo # 目标bar依赖baz bar: baz echo "生成bar" > bar # 目标baz无依赖 baz: echo "生成baz" > baz
执行make foo时,make会按baz → bar → foo的顺序递归处理:
- 先处理
baz:生成baz文件; - 再处理
bar:因为baz是新生成的,比bar(不存在或更旧)新,所以生成bar文件; - 最后处理
foo:因为bar是新生成的,比foo(不存在或更旧)新,所以生成foo文件。
如果后续修改baz文件,再次执行make foo,make会重新生成bar和foo——因为它会先检查baz的状态,发现baz更新后,递归更新bar,再更新foo。
内容的提问来源于stack exchange,提问作者meta_leap
相关产品推荐
相关产品推荐

