Makefile $(变量)和%模式规则之间的差异

Makefile $(变量)和%模式规则之间的差异,makefile,gnu-make,Makefile,Gnu Make,我正慢慢地在gnu make文档丛林中奋力前行(尽管它非常优秀——只是很多) 我遇到了模式规则: 还有可用作目标的通配符: FILES = $(wildcard *.png) 现在我可以写: $(FILES): file1 file2 run command here 第一个用例和第二个用例之间有什么区别吗?在%.png的情况下:如果任何其他规则反过来要求某个文件,该文件本身没有明确的规则,但以.png结尾,则将调用该规则 因此,%.png:%.jpeg(例如)说,“除非有更具体的规

我正慢慢地在gnu make文档丛林中奋力前行(尽管它非常优秀——只是很多)

我遇到了模式规则:

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

FILES = $(wildcard *.png)
现在我可以写:

$(FILES): file1 file2
    run command here

第一个用例和第二个用例之间有什么区别吗?

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

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

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

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


当然,使用通配符源是相当“危险”的,因为丢失的文件不会被
make
检测到,因此可能会有生成的“假阳性”结果。

如果规则生成所有目标,那么使用
$(文件)
作为目标有问题吗?它可以工作(至少在GNU make中),但是,只有当一次执行规则创建所有命名目标时,才能执行。而
%.png
一次创建一个目标。非常感谢您澄清这一点。这对我很有帮助。非常聪明的问题!
$(FILES): file1 file2
    run command here