在 makefile 中,百分号符号有什么作用?

71

我有一个类似于这样的Makefile:

include $(patsubst %,$(src)/%/Make.tests, $(TEST_SUBDIRS))

%-test: 
       Something here

我明白目标规则行中的意图。第一行中的 % 符号是什么作用?它与目标规则行中的百分号符号有关吗?

当我写 make sometarget 时,没有作为任何规则的 makefile 中的行(例如此 makefile 中的第一行)是否会被执行?如果是,则执行的顺序是什么?

1个回答

54

正如您可以在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的一部分进行处理。
依赖关系图形在读取规则时被形成,并且在整个文件被处理后,必要的任务将被执行以更新所请求的目标。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接