Makefile中的自动化变量
参考链接:https://seisman.github.io/how-to-write-makefile/implicit_rules.html#id8
简介
所谓自动化变量,就是这种变量会把模式中所定义的一系列的文件自动地挨个取出,直至所有的符合模式的文件都取完。这种自动化变量只应出现在规则的命令中。
变量列表
下面是所有的自动化变量及其说明:
$@
: 表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,$@
就是匹配于目标中模式定义的集合。$%
: 仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是foo.a(bar.o)
,那么,$%
就是bar.o
,$@
就是foo.a
。如果目标不是函数库文件(Unix下是.a
,Windows下是.lib
),那么,其值为空。$<
: 依赖目标中的第一个目标名字。如果依赖目标是以模式(即%
)定义的,那么$<
将是符合模式的一系列的文件集。注意,其是一个一个取出来的。$?
: 所有比目标新的依赖目标的集合。以空格分隔。$^
: 所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那么这个变量会去除重复的依赖目标,只保留一份。$+
: 这个变量很像$^
,也是所有依赖目标的集合。只是它不去除重复的依赖目标。$*
: 这个变量表示目标模式中%
及其之前的部分。如果目标是dir/a.foo.b
,并且目标的模式是a.%.b
,那么,$*
的值就是dir/a.foo
。这个变量对于构造有关联的文件名是比较有较。如果目标中没有模式的定义,那么$*
也就不能被推导出,但是,如果目标文件的后缀是make所识别的,那么$*
就是除了后缀的那一部分。例如:如果目标是foo.c
,因为.c
是make所能识别的后缀名,所以,$*
的值就是foo
。这个特性是GNU make的,很有可能不兼容于其它版本的make,所以,你应该尽量避免使用$*
,除非是在隐含规则或是静态模式中。如果目标中的后缀是make所不能识别的,那么$*
就是空值。