Makefile常用函数
Makefile中函数使用方式:
1. $(function param1,param2,param3,...)
2. ${function param1,param2,param3,...}
函数名和参数用空格隔开,参数名之间用逗号隔开。
1. subst
subst函数是用来替换字符串,语法如下:
$(subst old_str,new_str,src_str)
将src_str中old_str字符串全部替换为new_str, 函数返回值为替换后的新字符串,例子:
var1 = abcdefg
var2 = $(subst de,DE,$(var1))
show:
@echo var1 : $(var2)
var2结果为:abcDEfg
2. patsubst
patsubst函数功能是完成模式字符串替换,语法如下:
$(patsubst pattern,replacement,src_str)
该函数是将src_str中符合模式pattern的字串替换为replacement;一个常用的例子,通过.c文件名生成.o文件名:
var1 = a.c b.c c.c
var2 = $(patsubst %.c,%.o,$(var1))
show:
@echo var1 : $(var2)
var2结果为a.o b.o c.o
3. dir
dir函数功能是获取目录,语法如下:
$(dir src_str)
从src_str中提取目录,不包含文件名,例子:
var1 = home/makefile/src/main.c
var2 = $(dir $(var1))
show:
@echo var2 : $(var2)
var2 的值为 home/makefile/src/
4. notdir
这个函数作用是去掉目录,只保留文件名称,语法如下:
$(notdir src_str)
例子:
var1 = home/makefile/src/main.c
var2 = $(dir $(var1))
show:
@echo var2 : $(var2)
var2 的值为 main.c
5. foreach
foreach函数作用是通过循环完成指定的操作,语法如下:
$(foreach var,list,cmd)
该函数循环逐个遍历list中的成员,每次循环将list的成员然后赋给var,同时执行cmd;
例子:
var1 = a b c d
var2 = $(foreach var,$(var1),$(var).o)
show:
@echo var2 : $(var2)
var2的值最后为 a.o b.o c.o d.o
6. wildcard
在makefile的语法中,通配符会被自动展开,但是在变量定义和函数引用的时候会失效,这个时候为了保证通配符也能被展开,就要使用wildcard函数,语法如下:
$(wildcard pettern)
例子:
假如在工作目录下有以下两个文件:a.c, b.c
var1 = *.c
var2 = $(wildcard *.c)
show:
@echo var1 : $(var1)
@echo var2 : $(var2)
var1值为 *.c
var2值为 a.c b.c
7.origin
makfile中变量的来源有以下方式:
1.命令行传入;
比如我们调用 make PARAM=1,那么PARAM就是从命令行传入的参数,在makefile中可以被使用;
2.makefile中默认变量;
比如 常见的CC、CXX、CFLAGS等等;
3.环境变量;
makefile中环境变量可以理解为在整个工程里面,所有makefile都可以使用的变量,就相当于全局变量,所有的makefile都可以指直接使用;
4.makfile中定义;
这个就是我们在makefile中定义的变量,比如 PARAM = 1
5.自动化变量
这个就是makefile中@、%、<,等。
通过origin函数我们可以知道makefile中的变量是从哪里来的,或者是否被定义。
该函数使用方法:
$(origin var)
比如我们有以下makefile:
TEST_PARAM := 1
show:
@echo $(origin TEST_PARAM)
@echo $(origin INPUT)
@echo $(origin CC)
@echo $(origin @)
@echo $(origin NO_DEF)
我们使用以下命令: make show INPUT=2,会得到以下结果:
file --> 表示TEST_PARAM是在文件中定义的
command line --> 表示INPUT是从命令行输入的
default --> 表示CC是makefile中默认定义的
automatic --> 表示@是自动化变量
undefined --> 表示NO_DEF变量未定义
8.filter
该函数使用方法: $(filter pattern1 pattern2 ..., src_str)
该函数通过pattern(可以有多个pattern)过滤掉src_str中不符合的字符。
例子:
TEST_STR = a.c a.h b.c b.h c.c c.h d.cpp d.h
FILTER_STR = $(filter %.c %.cpp,$(TEST_STR))
show:
@echo $(FILTER_STR)
结果输出:a.c b.c c.c d.cpp, 只保留以.c和.cpp结尾的字符
9.firstword
顾名思义取字符串中的第一个单单词,用法:$(firstword src_str)
还是用上面的例子:
TEST_STR = a.c a.h b.c b.h c.c c.h d.cpp d.h
show:
@echo $(firstword $(TEST_STR))
结果输出:a.c