有人可以在这里阐明差异:
$(tsdir)/proj
包含先决条件$(tsdir)/proja
和$(tsdir)/projb
。我希望每次构建proja
时都要调用projb
和proj
的makefile。如果proja
或projb
已过期且已更新,则其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)/$*
答案 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
...