依赖现有目标和缺少依赖项

时间:2011-11-17 15:14:46

标签: makefile gnu-make

我有一个makefile,例如:

A : B
    echo "made A"
B : D
    echo "made B"

在这里,B存在,但D不存在(有时,它确实存在,有时它不会)

现在如果我执行make,就会对我大喊:     make: * 没有规则来制作' B'所需的目标' D'停止。

有没有办法正确行事,即:

  • 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

但它看起来真的很乱......

1 个答案:

答案 0 :(得分:3)

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

 .INTERMEDIATE : B

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