使用force vs .phony制定隐式规则

时间:2013-03-02 02:36:47

标签: makefile gnu-make

有人可以在这里阐明差异:

$(tsdir)/proj包含先决条件$(tsdir)/proja$(tsdir)/projb。我希望每次构建proja时都要调用projbproj的makefile。如果projaprojb已过期且已更新,则其makefile将分别触及$(tsdir)/proja$(tsdir)/projb。如果这些文件比$(tsdir)/proj更新,则重建项目

我通过使用以下代码和FORCE目标来完成此工作。如果我尝试切换为使用.PHONY目标,则无效。我更喜欢.PHONY,因为这可能是更“正确”的做法。但它不起作用,我不知道为什么。不会使用proja目标调用projb.PHONY的makefile,但会重建proj

我正在使用GNU make 3.81。

由于 Nachum

$(tsdir)/proj: $(tsdir)/proja $(tsdir)/projb
...

$(tsdir)/%: FORCE  
    make -C $(prereqdir)/$*

FORCE:

#or

$(tsdir)/proj: $(tsdir)/proja $(tsdir)/projb
...

.PHONY: $(addprefix $(tsdir)/, $(projects))

$(tsdir)/%:  
    make -C $(prereqdir)/$*

2 个答案:

答案 0 :(得分:4)

.PHONY目标应该代表任务,而不是真实文件,其中隐式规则搜索仅适用于文件。因此,没有办法用隐式规则构建虚假目标。

来自Phony Targets章节:

  

由于它知道虚假目标没有命名可以从其他文件重新创建的实际文件,make会跳过对虚假目标的隐式规则搜索

在您的情况下,我只会使用显式规则,可能使用static pattern

.PHONY: $(addprefix $(tsdir)/, $(projects))

$(addprefix $(tsdir)/, $(projects)) : $(tsdir)/% :  
    make -C $(prereqdir)/$*

答案 1 :(得分:1)

我怀疑你可以通过向(真实的)时间戳文件中添加一个假的依赖来获得你想要的结果,一个从主项目 proj 中删除。 / p>

.PHONY: phony
phony: ; : $@

ts := $(addprefix $(tsdir)/, $(projects))

${ts} : $(tsdir)/%: phony
    make -C $(prereqdir)/$*

$(tsdir)/proj: $(tsdir)/proja $(tsdir)/projb
...