2011-09-13 114 views
40

我有一个makefile,看起来像这样:百分比符号在makefile中做了什么?

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

%-test: 
     Something here 

我明白它是用于在目标规则线。在第一行中做什么%符号?目标规则行中是否有百分比符号?

当我编写make sometarget时,makefile中的行不是作为任何规则的一部分(如该makefile中的第一行)写入的行吗?如果是,那么执行的顺序是什么?

回答

33

正如你可以在the GNU make manual中看到的,百分比作为通配符。 patsubstfunction的第一个参数形成该模式。将最后一个参数中的每个项目/单词与此模式进行比较,如果匹配,则将其替换为第二个参数。如果模式中有通配符(%),则它将匹配任意数量的字符,并且这些字符将被复制到第二个参数中%所在的替换字符串中。

在您的示例中,模式只是通配符符号,所以它会匹配函数的最后一个参数中的任何单词,并且该单词将被复制到替换字符串中(第二个参数) 。

一个例子可能会使事情更加清晰。我们假设TEST_SUBDIRS包含两个名字。

TEST_SUBDIRS := test1 test2 
include $(patsubst %,$(src)/%/Make.tests, $(TEST_SUBDIRS)) 

这就相当于以下内容。

include $(src)/test1/Make.tests $(src)/test2/Make.tests 

甲生成文件由线顺序处理线。变量赋值是“内化的”,并且包含语句会导致其他文件的内容逐字地插入该位置,之后该内容将作为生成文件的一部分进行处理。
从规则中读取依赖关系图,并在处理整个文件之后,执行必要的配方以更新请求的目标。