3

有人可以阐明这里的区别:

$(tsdir)/proj有先决条件$(tsdir)/proja$(tsdir)/projb. 我希望每次必须构建时都调用proja's 和's makefile 。如果或已经过时并且被更新了,那么它们的makefile将分别触及和。如果这些文件比 更新,则重建 proj。projbprojprojaprojb$(tsdir)/proja$(tsdir)/projb$(tsdir)/proj

我通过使用下面的代码和FORCE目标来完成这项工作。如果我尝试切换到使用.PHONY目标,这将不起作用。我更喜欢.PHONY这样做,因为这被认为是更“正确”的方式。但它不起作用,我不知道为什么。proja's 和projb's makefiles 不会被.PHONY目标调用,而是proj被重建。

我正在使用 GNU make 3.81。

谢谢纳楚姆

$(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)/$*
4

2 回答 2

4

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

来自Phony Targets章节:

由于它知道虚假目标不会命名可以从其他文件重新制作的实际文件,因此make跳过对虚假目标的隐式规则搜索

在您的情况下,我将只使用显式规则,可能使用静态模式

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

$(addprefix $(tsdir)/, $(projects)) : $(tsdir)/% :  
    make -C $(prereqdir)/$*
于 2013-03-02T12:27:20.890 回答
1

我怀疑您可以通过向(真实)时间戳文件添加虚假依赖项来获得所需的结果,该文件已从主项目proj中删除。

.PHONY: phony
phony: ; : $@

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

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

$(tsdir)/proj: $(tsdir)/proja $(tsdir)/projb
...
于 2013-03-04T12:15:31.700 回答