Makefile 与现有目标建立依赖关系,但缺少依赖关系

Makefile 与现有目标建立依赖关系,但缺少依赖关系,makefile,gnu-make,Makefile,Gnu Make,我有一个makefile,例如: A : B echo "made A" B : D echo "made B" 这里,B存在,但D不存在(有时存在,有时不存在) 现在如果我执行make,它会对我大叫: make: *** No rule to make target 'D', needed by 'B'. Stop. 是否有正确的行为方式,即: B和D不存在:失败 B存在,D存在并且比B更新,应用配方 B存在,D存在但更老:什么都不要做 如果B存在而D不存在:不要重建B

我有一个makefile,例如:

A : B
    echo "made A"
B : D
    echo "made B"
这里,B存在,但D不存在(有时存在,有时不存在)

现在如果我执行make,它会对我大叫:

make: *** No rule to make target 'D', needed by 'B'.  Stop.
是否有正确的行为方式,即:

  • B和D不存在:失败
  • B存在,D存在并且比B更新,应用配方
  • B存在,D存在但更老:什么都不要做
  • 如果B存在而D不存在:不要重建B(您不能),但您可以使用B来构建A
使用以D为目标的空行将始终执行配方来构建B,但如果没有D它就不能,所以不需要它

有办法吗

我找到了使用空规则的解决方案

D : 
最后,使缺少的D不会失败。因此,现在一切正常,但如果D缺失,则B将被重做,这可以在B配方中测试:

B : D
    if [ D ] ; then echo "doing B with D"; fi

但这似乎真的有点骇人听闻……

您可以通过将B标记为中间值来绕过从旧D重新生成B的问题:

 .INTERMEDIATE : B

然后,您可以删除D的空规则,并匹配“正确”行为的四个标准。

谢谢,就是这样!GNU文档说明.INTERMEDIATE.INTERMEDIATE依赖的目标被视为中间文件。请参见隐式规则链,所以我认为它只与隐含的规则有关。