首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据目标的配方,是否可以发出目标尚未重建的信号?

根据目标的配方,是否可以发出目标尚未重建的信号?
EN

Stack Overflow用户
提问于 2013-06-03 02:25:04
回答 1查看 410关注 0票数 2

在GNU make中,有没有办法检测或强制发出信号,表明一个(虚假的)目标没有导致任何重建操作,即使它的配方已经被触发?

我想要的是一个递归的make调用,比如:

代码语言:javascript
复制
target: subtarget
        # recipe

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

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

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-03 04:43:40

不,没有办法向make发出不运行目标的信号。Make仅查看修改时间,以告知何时重新构建某些内容。

但是,如果目标的先决条件都不是新的,则make不会重新构建目标,即使调用了该先决条件的配方也是如此。

因此,在您的情况下,您需要删除.PHONY,然后让target依赖于something,而不是一些虚假的规则subtarget。最后,您必须确保子目标本身始终在运行。一种简单的方法是使用老式的FORCE方法(注意,这并不是make所特有的;将其命名为FORCE只是一种惯例)。如下所示:

代码语言:javascript
复制
target: something
        # recipe

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

FORCE: ;

现在something总是被重做(因此子target总是运行),但是只有当something实际更改了它的时间戳时,才会重做它。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16885893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档