James Bryant

【转】Makefile变量

0
阅读(1052)

自动化变量

$?所有比目标新的依赖的集合,以空格分隔
$@规则中的目标文件集,如果有多个目标,那么就是匹配于目标中模式定义的集合
$%仅当目标是函数库文件中,表示规则中的目标成员名,如果不是,为空
$<依赖目标中的第一个目标的名字
$^所有依赖目标的集合,以空格分隔,去除重复的依赖目标
$+所有依赖目标的集合,不去除重复的依赖目标
$*表示目标模式中 %之前的部分
$(@D)表示$@的目录部分(不以\结尾)
$(@F)表示$@的文件部分
。。。另外6个同理

赋值

=是最基本的赋值,会把整个makefile展开之后再决定是多少

x=foo y=$(x)bar #y是asdbar,不是foobar x=asd

:=是覆盖之前的值,和=不同,和赋值的位置有关

x=foo y:=$(x)bar #y是foobar x=asd

?=是如果没有被赋值过就赋予等号后面的值,赋过了就不管了
+=是添加等号后面的值

变量替换

makefile中有两种变量替换,

  1. 形如$(var:a=b)或者${var:a=b},是把var中以a结尾的变量替换为b
  2. 形如foo:=a.o b.o c.o bar:=$(foo:%.o=%.c)则bar中是a.c b.c c.c

VPATH

如果没有指明VPATH变量,make只会在当前目录中去寻找依赖文件和目标文件,如果定义了VPATH,则make会在当前目录找不到的情况下,到所制定的目录中去找文件

VPATH=src:../headers

VPATH也可以用来搜索文件,通常有三种用法:
VPATH 为符合模式的文件指定搜索目录
VPATH 清除符合模式的文件的搜索目录
VPATH 清除所有已被设置好了的文件搜索目录
这里,需要包含 “%”字符,eg: vpath %.h ../headers
如果多条vpath语句中出现了重复的,则会按照先后顺序搜索
print:.c #依赖关系的通配符会被自动展开,表示print目标依赖于所有的.c 文件
object=.c #变量中的通配符不会被展开object就是 “.c”需要使用wildcard来展开

Baidu
map