$(VARIABLE) 和 % 模式规则之间的区别

Difference between $(VARIABLE) and % pattern rule

我正在 gnu make 文档丛林中慢慢奋斗(尽管它非常好 — 只是很多)。

我遇到了模式规则:

%.png: file1 file2
    run command here

还有可用作目标的通配符:

FILES = $(wildcard *.png)

现在我可以写了:

$(FILES): file1 file2
    run command here

第一个和第二个用例有区别吗?

%.png的情况下:如果任何其他规则反过来要求某个文件,该文件本身没有明确的规则,但以.png结尾,那么该规则将被调用。

因此,%.png: %.jpeg(例如)说,“除非有更具体的规则,否则这里是如何从 JPEG 转换为 PNG 图像。”

$(FILES) 正在枚举您可能想要创建的依赖项列表。对于规则的目标来说,这并不是真正的事情,而是对于一个人的依赖关系。

例如,像 images.zip: $(FILES) 这样的虚假目标可以用来表示所有 $(FILES) 必须是最新的才能生成 images.zip.

当然,使用通配符源相当“危险”,因为丢失的文件不会被 make 检测到,因此可能会产生“误报”的构建结果。