我有一个类似于这样的Makefile:
include $(patsubst %,$(src)/%/Make.tests, $(TEST_SUBDIRS))
%-test:
Something here
我明白目标规则行中的意图。第一行中的 %
符号是什么作用?它与目标规则行中的百分号符号有关吗?
当我写 make sometarget
时,没有作为任何规则的 makefile 中的行(例如此 makefile 中的第一行)是否会被执行?如果是,则执行的顺序是什么?
我有一个类似于这样的Makefile:
include $(patsubst %,$(src)/%/Make.tests, $(TEST_SUBDIRS))
%-test:
Something here
我明白目标规则行中的意图。第一行中的 %
符号是什么作用?它与目标规则行中的百分号符号有关吗?
当我写 make sometarget
时,没有作为任何规则的 makefile 中的行(例如此 makefile 中的第一行)是否会被执行?如果是,则执行的顺序是什么?
正如您可以在GNU make手册中阅读到的那样,百分号(%)作为通配符。 patsubst
函数的第一个参数形成了模式。上述最后一个参数中的每个项/单词都与此模式进行比较,如果匹配,则用第二个参数替换它。如果模式中有通配符(%),则它将匹配任意数量的字符,并将这些字符复制到第二个参数中%所在的位置。
在您的示例中,模式只是通配符号,因此它将匹配函数的最后一个参数中的任何单词,并将此单词复制到替换字符串(第二个参数)中的%处。
举个例子可能会更清楚一些。假设TEST_SUBDIRS
包含两个名称。
TEST_SUBDIRS := test1 test2
include $(patsubst %,$(src)/%/Make.tests, $(TEST_SUBDIRS))
这等同于以下内容。
include $(src)/test1/Make.tests $(src)/test2/Make.tests
Makefile会按顺序逐行处理。变量分配被“内部化”,包含语句使其他文件的内容直接插入到该位置,然后该内容作为makefile的一部分进行处理。
依赖关系图形在读取规则时被形成,并且在整个文件被处理后,必要的任务将被执行以更新所请求的目标。