用武力制定隐性规则 vs .phony

nac*_*hum 3 makefile gnu-make

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

$(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 makefile 不使用.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)/$*
Run Code Online (Sandbox Code Playgroud)

Eld*_*mov 5

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

来自“虚假目标”章节:

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

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

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

$(addprefix $(tsdir)/, $(projects)) : $(tsdir)/% :  
    make -C $(prereqdir)/$*
Run Code Online (Sandbox Code Playgroud)