可以通过其配方表示目标尚未重建吗?

时间:2013-06-02 18:25:04

标签: gnu-make

在GNU make中,有没有办法检测或强制发出(假冒)目标没有导致任何重建动作,即使它的配方被触发了?

我想要的是递归调用,例如:

target: subtarget
        # recipe

.PHONY: subtarget
subtarget:
        $(MAKE) -C subdir something

当然,递归make调用很有可能发现something没有任何内容可做。但到那时,由于subtarget的配方已经开始,target的配方也将始终执行。有什么方法可以避免这种情况吗?

(我已经看到GNU手册建议不要使用虚假目标作为先决条件,但这本身似乎限制了它们的用处。)

在我看来,这应该是一个常见问题,但我没有找到任何参考资料。非常感谢任何帮助。

ADDED:在我想要使用它的上下文中,我不一定知道something完全构建的内容:它也可能是一个虚假的目标,最终会创建一堆{{1我不知道或想知道这个级别的文件(关注点和所有这些)。否则,将*.xyz添加为subdir/something的先决条件很容易。

1 个答案:

答案 0 :(得分:4)

不,没有办法发信号通知不运行目标。在修改时间看以告知何时重建某些内容。

但是,如果没有任何先决条件比它更新,make将不会重建目标,即使调用了该先决条件的配方。

因此,在您的情况下,您需要删除.PHONY,然后target取决于something,而不是某些虚假规则subtarget。最后,您必须确保始终运行子目标本身。一种简单的方法是使用旧式FORCE方法(请注意,这对make并不特殊;将其命名为FORCE只是一种约定。像这样:

target: something
        # recipe

something: FORCE
        $(MAKE) -C subdir $@

FORCE: ;

现在something总是重新制作(因此子制作始终会运行),但target只会在something实际更改其时间戳时重新制作。