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