我有一个看起来像这样的makefile:
include $(patsubst %,$(src)/%/Make.tests, $(TEST_SUBDIRS))
%-test:
Something here
我理解它在目标规则行中的用途。第一行中的%
符号是什么?在目标规则行中有百分号签名吗?
当我写make sometarget
时,makefile中的行是不是作为任何规则的一部分写的(就像这个makefile中的第一行一样)执行了吗?如果是,那么执行的顺序是什么?
答案 0 :(得分:39)
正如您在the GNU make manual中所读到的那样,百分比充当了通配符。 patsubst
function的第一个参数构成了模式。将最后一个参数中的每个项目/单词与此模式进行比较,如果匹配,则将其替换为第二个参数。如果模式中存在通配符(%),则它将匹配任意数量的字符,并且这些字符将复制到第二个参数中%的位置处的替换字符串中。
在您的示例中,模式只是通配符,因此它将匹配函数的最后一个参数中的任何单词,并且此单词将被复制到%位置的替换字符串(第二个参数)中。
一个例子可能会使事情变得更加清晰。我们假设TEST_SUBDIRS
包含两个名称。
TEST_SUBDIRS := test1 test2
include $(patsubst %,$(src)/%/Make.tests, $(TEST_SUBDIRS))
这相当于以下内容。
include $(src)/test1/Make.tests $(src)/test2/Make.tests
按顺序逐行处理makefile。变量赋值是“内部化的”,include语句导致其他文件的内容按字面插入该位置,之后该内容作为makefile的一部分进行处理。
依赖图是在读入规则时根据规则形成的,在处理完整个文件后,执行必要的配方以更新请求的目标。