有人可以阐明这里的区别:
$(tsdir)/proj具有先决条件$(tsdir)/proja$(tsdir)/projb。我希望每次必须构建proja时都调用projbproj的makefile。如果projaprojb已过期且已更新,则它们的makefile将分别触摸$(tsdir)/proja$(tsdir)/projb。如果这些文件比$(tsdir)/proj更新,则重建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)/$*

最佳答案

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

Phony Targets章:

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

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

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

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

09-17 13:35