在GNU make中,有没有办法检测或强制发出(假冒)目标没有导致任何重建动作,即使它的配方被触发了?
我想要的是递归调用,例如:
target: subtarget
# recipe
.PHONY: subtarget
subtarget:
$(MAKE) -C subdir something
当然,递归make
调用很有可能发现something
没有任何内容可做。但到那时,由于subtarget
的配方已经开始,target
的配方也将始终执行。有什么方法可以避免这种情况吗?
(我已经看到GNU手册建议不要使用虚假目标作为先决条件,但这本身似乎限制了它们的用处。)
在我看来,这应该是一个常见问题,但我没有找到任何参考资料。非常感谢任何帮助。
ADDED:在我想要使用它的上下文中,我不一定知道something
完全构建的内容:它也可能是一个虚假的目标,最终会创建一堆{{1我不知道或想知道这个级别的文件(关注点和所有这些)。否则,将*.xyz
添加为subdir/something
的先决条件很容易。
答案 0 :(得分:4)
不,没有办法发信号通知不运行目标。在修改时间看仅以告知何时重建某些内容。
但是,如果没有任何先决条件比它更新,make将不会重建目标,即使调用了该先决条件的配方。
因此,在您的情况下,您需要删除.PHONY
,然后target
取决于something
,而不是某些虚假规则subtarget
。最后,您必须确保始终运行子目标本身。一种简单的方法是使用旧式FORCE
方法(请注意,这对make
并不特殊;将其命名为FORCE
只是一种约定。像这样:
target: something
# recipe
something: FORCE
$(MAKE) -C subdir $@
FORCE: ;
现在something
总是重新制作(因此子制作始终会运行),但target
只会在something
实际更改其时间戳时重新制作。