在GNU make中,有没有办法检测或强制发出信号,表明一个(虚假的)目标没有导致任何重建操作,即使它的配方已经被触发?
我想要的是一个递归的make调用,比如:
target: subtarget
# recipe
.PHONY: subtarget
subtarget:
$(MAKE) -C subdir something当然,很有可能递归make调用发现something没有什么可做的。但到那时,由于subtarget的配方已经启动,target的配方也将始终执行。有什么方法可以避免这种情况吗?
(我看到GNU手册建议不要使用虚假目标作为先决条件,但这本身似乎对它们的有用性有很大的限制。)
在我看来,这应该是一个常见的问题,但我没有找到任何参考资料。任何帮助都是非常感谢的。
补充道:在我想使用它的上下文中,我不一定确切地知道something构建了什么:它也可能是一个虚假的目标,最终创建了一堆我不知道或不想知道的*.xyz文件(关注点分离等等)。否则,很容易将subdir/something作为subtarget的先决条件添加。
发布于 2013-06-03 04:43:40
不,没有办法向make发出不运行目标的信号。Make仅查看修改时间,以告知何时重新构建某些内容。
但是,如果目标的先决条件都不是新的,则make不会重新构建目标,即使调用了该先决条件的配方也是如此。
因此,在您的情况下,您需要删除.PHONY,然后让target依赖于something,而不是一些虚假的规则subtarget。最后,您必须确保子目标本身始终在运行。一种简单的方法是使用老式的FORCE方法(注意,这并不是make所特有的;将其命名为FORCE只是一种惯例)。如下所示:
target: something
# recipe
something: FORCE
$(MAKE) -C subdir $@
FORCE: ;现在something总是被重做(因此子target总是运行),但是只有当something实际更改了它的时间戳时,才会重做它。
https://stackoverflow.com/questions/16885893
复制相似问题