百分号在makefile中的作用是什么?

Ank*_*rVj 46 makefile

我有一个看起来像这样的makefile:

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

%-test: 
       Something here
Run Code Online (Sandbox Code Playgroud)

我理解它在目标规则行中的用途.%第一行的标志是什么?在目标规则行中有百分号签名吗?

当我写的时候make sometarget,makefile中的行是不是作为任何规则的一部分写的(就像这个makefile中的第一行一样)执行了吗?如果是,那么执行的顺序是什么?

eri*_*ous 40

正如您可以在GNU make手册中看到的那样,百分比充当通配符.patsubst 函数的第一个参数构成了模式.将最后一个参数中的每个项目/单词与此模式进行比较,如果匹配,则将其替换为第二个参数.如果模式中存在通配符(%),则它将匹配任意数量的字符,并且这些字符将复制到第二个参数中%的位置处的替换字符串中.

在您的示例中,模式只是通配符,因此它将匹配函数的最后一个参数中的任何单词,并且此单词将被复制到%位置的替换字符串(第二个参数)中.

一个例子可以使事情更清楚.我们假设TEST_SUBDIRS包含两个名称.

TEST_SUBDIRS := test1 test2
include $(patsubst %,$(src)/%/Make.tests, $(TEST_SUBDIRS))
Run Code Online (Sandbox Code Playgroud)

这相当于以下内容.

include $(src)/test1/Make.tests $(src)/test2/Make.tests
Run Code Online (Sandbox Code Playgroud)

makefile是逐行处理的.变量赋值是"内部化的",include语句导致其他文件的内容按字面插入该位置,之后该内容作为makefile的一部分进行处理.
在读取规则时从规则形成依赖图,并且在处理整个文件之后,执行必要的配方以更新所请求的目标.