系统地介绍了Makefile中常用函数的用法,包括字符串处理、文件名处理、条件函数和输出函数等多个方面。通过详细的示例和说明,读者能够了解每个函数的语法和用途。

1. 函数

1.1 函数的调用方法

函数以$开头,其余部分被(){}包裹。

$(function  args1,args2,....)
${function args1,args2,....}

function:函数名
args:函数参数,每个函数需要的参数个数不一样,参数之间用逗号隔开

1.2 函数分类

make里的函数大致分为字符串处理函数,文件名处理函数,条件函数信息输出函数和一些其他函数

1.3 自定义函数

make支持自定义函数,你可以使用自定义函数实现各种功能,但这跟我对make的使用理念相违背,我认为makefile的内容应该是简单明了,让人一目了然的,所以个人并没有对自定义函数有过多的学习,想要深入学习的朋友可以参考一些其他教程。

在函数的示例代码里我会使用info函数,它是一个简单的用于信息输出函数,格式为$(info something),你可以在something的位置放置任何你想输出的内容。

2.字符串处理函数

2.1 subst

作用:text里的所有old都会被替换成new
语法:$(subst old,new,text)
返回值:被替换后的文本
示例:把.c替换成.o

var1 = demo1.c demo2.c demo3.c 
var2 = demo1.c.c demo2.c demo3.c
result1 = $(subst .c,.o,$(var1))
result2 = $(subst .c,.o,$(var2))
all:
@echo $(result1) # demo1.o demo2.o demo3.o
@echo $(result2) # demo1.o.o demo2.o demo3.o

2.2 patsubst

作用:模式替换
语法:$(patsubst pattern, replacement, text)

  • pattern:需要替换的模式
  • replacement:需要替换为
  • text:待处理文本

返回值:被替换后的文本
示例:

var1 = demo1.c demo2.c demo3.c 
var2 = demo1.c.c demo2.c demo3.c
result1 = $(patsubst %.c,%.o,$(var1))
result2 = $(patsubst %.c,%.o,$(var2))
all:
@echo $(result1) # demo1.o demo2.o demo3.o
@echo $(result2) # demo1.c.o demo2.o demo3.o

2.3 strip

作用:去除前后的空格
语法:$(strip text)
返回值:去除后的问文本
示例:

var1 = xx demo1.c demo2.c
var2 := $(subst xx, ,$(var1)) # for space
var3 = $(strip $(var2)) # 替换
all:
$(info $(var2)) # demo1.c demo2.c
$(info $(var3)) #demo1.c demo2.c

2.4 findstring

作用:查找字符串
语法:$(findstring 需查找的字符串,待查找的list)
返回值:如果找到了,则返回对应的字符串,如果没找到,则反回空串
示例:

var1 = demo1.c demo2.c demo3.c 
var2 = $(findstring demo2,$(var1))
var3 = $(findstring demo4,$(var1))
all:
$(info $(var2)) # demo2
$(info $(var3)) # 空

2.5 filter

作用:过滤字符串,把符合模式的字符串都返回,如果没有,为空
语法:$(filter 模式1 模式2 ... ,list)
返回值:空/符合的字符串
示例:

var1 = demo1.c demo2.c demo1.h demo2.h demo1.o demo2.o 
var2 = $(filter %.c,$(var1))
var3 = $(filter %.c %o,$(var1))
all:
$(info $(var2)) # demo1.c demo2.c
$(info $(var3)) # demo1.c demo2.c demo1.o demo2.o

2.6 filter-out

作用:与filter相反,保留不符合的
语法:$(filter-out 模式1 模式2 ... ,list)
返回值:不符合任何一个模式的内容
示例:

var1 = demo1.c demo2.c demo1.h demo2.h demo1.o demo2.o 
var2 = $(filter-out %.c,$(var1))
var3 = $(filter-out %.c %o,$(var1))
all:
$(info $(var2)) # demo1.h demo2.h demo1.o demo2.o
$(info $(var3)) # demo1.h demo2.h

2.7 sort

作用:将list内容按照字典序排序,移除重复项
语法:$(sort list)
示例:

var1 = aa aa ab bb c d  
var2 = $(sort $(var1))
all:
$(info $(var2)) # aa ab bb c d

2.8 word

作用:取出list里的某个元素,n从1开始。
语法:$(word n,list)
返回值:word里的一个元素。n<=0, 报错。n > 列表项数,空
示例:

var1 = a b c d e
var2 = $(word 8,$(var1))
all:
$(info $(word 2,$(var1))) #b
$(info $(word 6,$(var1))) #空
$(info $(word 0,$(var1))) #错误

2.9 wordlist

作用:返回文本指定范围内的单词列表
语法:$(wordlist start,end,list)
返回值:start>0,否则error。 end无要求,大于列表的
示例:

var1 = a b c d e
var2 = $(word-list 8,$(var1))
all:
$(info $(wordlist 1,5,$(var1))) # a b c d e
$(info $(wordlist 2,6,$(var1))) # b c d e
$(info $(wordlist 0,5,$(var1))) # Error,Stop

2.10 words

作用:返回列表中的字符串个数
语法:$(words list)
返回值:一个数字
示例:

var1 = a b c d e
var2 = $(words $(var1))
all:
$(info $(var2)) # 5

2.11 firstword

作用:返回第一项
语法:$(firstword list)
示例:

var1 = a b c d e
var2 = $(firstword $(var1))
all:
$(info $(var2)) # a

2.12 lastword

作用:返回最后一项
语法:$(lastword list)
示例:

var1 = a b c d e
var2 = $(firstword $(var1))
all:
$(info $(var2)) # e

3.文件名处理函数

3.1 dir

作用:返回目录名,就是把文件名去掉
语法:$(dir text)
返回值:目录名
示例:

var1 = demo/a.c    c.c
var2 = $(dir $(var1))
all:
$(info $(var2)) #demo/ ./

3.2 notdir

作用:获取文件名
语法:$(notdir text)
返回值:文件名
示例:

var1 = demo/a.c    c.c
var2 = $(notdir $(var1))
all:
$(info $(var2)) #a.c c.c

3.3 suffix

作用:返回文件的扩展名
语法:$(suffix text)
返回值:文件的扩展名
示例:

var1 = demo/a.c    c.c
var2 = $(suffix $(var1))
all:
$(info $(var2)) #.c .c

3.4 basename

作用:返回文件的名称,就是去除文件的扩展名,会保留路径
语法:$(basename text)
返回值:
示例:

var1 = demo/a.c    c.c  a
var2 = $(basename $(var1))
all:
$(info $(var2)) #demo/a c a

3.5 addsuffix

作用:为列表里的每一项都添加后缀名
语法:$(addsuffix suffix,list)
返回值:添加完后的列表
示例:

var1 = a b c d 
var2 = $(addsuffix .c,$(var1))
all:
$(info $(var2)) # a.c b.c c.c d.c

3.6 addprefix

作用:
语法:$(addprefix prefix,list)
示例:

var1 = a b c d 
var2 = $(addprefix demo/,$(var1))
all:
$(info $(var2)) # demo/a demo/b demo/c demo/d

3.7 join

作用:把第二个list的内容添加到第一个后,一一对应,如果数量不相等,直接放进去
语法:$(join list1,list2)
示例:

var1 = a  b  c  d  e
var2 = .c .c .c .c
var3 = $(join $(var1),$(var2))
all:
$(info $(var3)) # a.c b.c c.c d.c e

3.8 wildcard

作用:返回符合通配符的文件列表,在当前目录下查找
语法:$(wildcard pattern)
示例:

var1 = $(wildcard %.c)    #当前路径下的.c文件
var2 = $(wildcard src/%.c)#./src下的.c文件
var3 = $(wildcard ../%.c) # 上级目录下的.c文件
all:
$(info $(var1))
$(info $(var2))
$(info $(var3))

3.9 realpath

作用:返回文件的绝对路径。如果文件不存在,就不返回相关的东西。
语法:$(realpath files)
示例:

var1 = demo.c
var2 = $(realpath $(var1))
all:
$(info $(var2))

3.10 abspath

作用:返回文件的绝对路径。如果文件不存在,就返回当前目录的绝对路径。
语法:$(abspath files)
示例:

var1 = demo.c
var2 = $(abspath $(var1))
all:
$(info $(var2))

4. 条件函数

4.1 if

作用:如果条件不为空,就返回第一部分,为空,返回第二部分
语法:$(if condition,then-part,else-part)
示例:

var1 = $(if   ,1 2 3 ,4 5 6 )
var2 = $(if something,1 2 3 ,4 5 6)
all:
$(info $(var1)) # 1 2 3
$(info $(var2)) # 4 5 6

4.2 or

作用:返回第一个不为空的变量。如果全都为空,返回空
语法:$(or condition1,condition2,....)
示例:

var1 =  
var2 =
var3 = 123
result = $(or $(var1),$(var2),$(var3))
all:
$(info $(result)) # 123

4.3 and

作用: 如果条件中有一个为空串,则返回空,如果全都不为空,则返回最后一个条件。
语法:$(and condition1,condition2,...)
示例:

var1 =  000
var2 = 123
var3 = 456
var4 =
result1 = $(and $(var1),$(var2),$(var3))
result2 = $(and $(var1),$(var2),$(var3),$(var4))
all:
$(info $(result1)) # 456
$(info $(result2)) # 空

5. 输出函数

5.1 info

作用: 打印一些信息
语法:$(info something)
示例:

$(info 使用info)
$(warning 使用warning)
$(error 使用error)

输出结果
使用info
let:2: 使用warning
let:3: *** 使用error. Stop.

5.2 warning

作用: 打印警告信息,带行号,但不会终止
语法:$(warning something)
示例:

$(info 使用info)
$(warning 使用warning)
$(error 使用error)

输出结果
使用info
let:2: 使用warning
let:3: *** 使用error. Stop.

5.3 error

作用: 打印错误信息,带行号,并终止make运行
语法:$(error something)
示例:

$(info 使用info)
$(warning 使用warning)
$(error 使用error)

输出结果
使用info
let:2: 使用warning
let:3: *** 使用error. Stop.

foreach

作用:对每一项进行操作,把操作的结果返回给接收的变量
语法:$(foreach each,list,op)
示例:

list = 1 2 3 4 5
result = $(foreach each,$(list),$(addsuffix .c,$(each)))
all:
$(info $(result)) # 1.c 2.c 3.c 4.c 5.c

file

作用:读写文件。覆盖写入:> 追加:>> 读取:<
语法:$(file op filename,text)
示例:

result1 = $(file > demo1,text1)  # 覆盖写入,无返回
result2 = $(file >> demo1,text1) # 追加,返回追加进去的内容
result3 = $(file < demo1) # 读取内容
all:
$(info $(result1))
$(info $(result2))
$(info $(result3))

eval

作用:把一段文本当作makefile内容
语法:$(eval $(text))
示例:

define var = 
targets:
@echo hello
endef
$(eval $(var))

shell

作用:把shell的值作为返回值
语法:$(shell shell指令)
示例:

var = $(shell ls -al)
$(info $(var)))