2

在 GNU make 中,是否有任何方法可以检测或强制表示(假)目标没有导致任何重建操作,即使它的配方已被触发?

我想要的是一个递归的拨打电话,比如:

target: subtarget
        # recipe

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

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

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

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

补充:在我想使用它的上下文中,我不一定知道something确切构建的是什么:它也可能是一个虚假目标,最终会创建一堆*.xyz我在这个级别不知道或想知道的文件(关注点分离等等)。否则很容易将subdir/something其作为先决条件添加到subtarget.

4

1 回答 1

4

不,没有办法让 make 不运行目标。Make查看修改时间以判断何时重建某些内容。

但是,如果它的先决条件都不比它更新,make 将不会重建目标,即使该先决条件的配方已被调用。

因此,在您的情况下,您需要删除.PHONY,然后target依赖something,而不是某些虚假规则subtarget。最后,您必须确保子目标本身始终运行。一个简单的方法是使用老式FORCE方法(注意这不是特殊的make;命名它FORCE只是一个约定)。像这样的东西:

target: something
        # recipe

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

FORCE: ;

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

于 2013-06-02T20:43:39.547 回答