变量定义:
var = variable
var ?= variable
var := variable
var += variable or var
define var
variable
endef
延时变量:使用时扩展,并确定值(=、?=、define定义)
立即变量:定义时确定值(:=定义)+=:如果使用:=定义的变量则为立即变量,否则为延时变量
2.常用函数
(1)字符串替换及分析
$(subst from,to,text)
将文本text中的from替换为to
e.g.
$(subst ee,EE,feet)
--->fEEt
$(patsubst pattern,replacement,text)
将text中符合pattern的字符(串)替换为replacement,pattern与replacement可以为通配符
e.g.
$(patsubst %.c,%.o,x.c.c bar.c)
--->x.c.o bar.o
$(strip string)
去掉前导与结尾空格,并将中间的多个空格压缩为单个空格
e.g.
$(strip a b c)
--->a b c
$(findstring find,in)
在字符串in中查找find,若存在返回find,否则返回空
e.g.
$(findstring a,a b c)
--->a
$(findstring a,b c)
--->$(filter pattern,text)
返回在text中由空格隔开且匹配pattern的字,去除不符合格式pattern的字
e.g.
$(filter %.c %.s,foo.c bar.c baz.s ugh.h)
--->foo.c bar.c baz.s
$(filter-out pattern,text)
返回在text中由空格隔开且不匹配pattern的字,去除符合格式pattern的字
e.g.
$(filter-out %.c %.s,foo.c bar.c baz.s ugh.h)
--->ugh.h
$(sort list)
将list中的字按字母顺序排列并去掉重复的字,输出由单个空格隔开的字的列表
e.g.
$(sort foo bar lose)
--->bar foo lose
(2)文件名函数
$(dir names)
提取names中的路径部分
e.g.
$(dir src/foo.c hacks)
--->src/ ./
$(notdir names)
提取names中的文件名部分
e.g.
$(notdir src/foo.c hacks)
--->foo.c hacks
$(suffix names)
提取names中的文件后缀
e.g.
$(suffix src/foo.c src-1.0/bar.c hacks)
--->.c .c
$(basename names)
提取names中的除后缀外的所有字符
e.g.
$(basename src/foo.c src-1.0/bar hacks)
--->src/foo src-1.0/bar hacks
$(addsuffix suffix,names)
将后缀suffix添加到names
e.g.
$(addsuffix .c,foo bar)
--->foo.c bar.c
$(addprefix prefix,names)
将前缀prefix添加到names
e.g.
$(addprefix src/,foo bar)
--->src/foo src/bar
$(wildcard pattern)
匹配pattern格式的文件
e.g.
当前目录下存在1.c、2.c、1.h、2.h
src :=$(wildcard *.c)
--->1.c 2.c
(3)其他函数
$(foreach var,list,text)
list扩展之后的值赋给var,text引用该变量进行扩展
e.g.
将变量files的值设置为dirs中所有目录下的所有文件列表
dirs := a b c d
files :=$(foreach dir,$(dirs),$(wildcard $(dir)/*))
--->i)dir值为a,扩展结果为$(wildcard a/*)
ii)dir值为b,扩展结果为$(wildcard b/*)
iii)dir值为c,扩展结果为$(wildcard c/*)
iv)dir值为d,扩展结果为$(wildcard d/*)......<==>files :=$(wildcard a/* b/* c/* d/*)$(if condition,then-part[,else-part])
i)将condition的前导空格、结尾空格去掉,然后扩展;若扩展为非空字符,则condition为真;若扩展为空,则condition为假;
ii)若condition为真,则计算then-part作为函数返回值;
iii)若condition为假且else-part存在,则计算else-part作为函数返回值;若else-part不存在,则函数返回空值。
$(origin variable)
查询变量
返回值:
i)undefined 未定义
ii)default 默认定义
iii)environment 环境变量定义(-e选项未打开)
iv)environment override 环境变量定义(-e选项已打开)v)file Makefile中定义
vi)command line 命令行中定义
vii)override Makefile中使用override指令定义
viii)automatic 自动变量
$(shell command arguments)
执行命令行
e.g.
当前目录下存在1.c、2.c、1.h、2.h
src :=$(shell ls *.c)
--->1.c 2.c