MakeFile中常用的函数

1:patsubst

格式:$(patsubst pattern,replacement,text)

轮询text中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔),如果符合pattern的格式(例如pattern为<%.c>那么这些单词中后缀为.c的单词是符合要求的),然后将符合要求的单词根据replacement要求的格式进行替换。

例如:
当前目录下有文件  a.c  b.c  f.h  g.h

那么运行:

TEXT := a.c b.c f.h g.h

AFTER_TEXT := $(patsubst %.c,%.o,$(TEXT))

变量TEXT内包含了这四个文件,轮询变量TEXT,将符合模式[%.c]的单词替换为[%.o],将结果赋给变量AFTER_TEXT,它的值为:a.o b.o     ,因为只有a.c b.c符合模式[%.c],所以结果中是不会有f.o g.o的。

2:subst

格式:$(subst pattern,replacement,text)

轮询text中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔),将单词中“pattern"替换为“replacement”

例如:
当前目录下有文件  a.c  b.c  f.h  g.h

那么运行:

TEXT := a.c b.c f.h g.h

AFTER_TEXT := $(subst c,o,$(TEXT))

AFTER_TEXT的结果为:a.o b.o f.h g.h

可以看到,结果中包含了f.h,g.h,这是因为subst不会进行模式匹配,不会判断单词是否含有c,简单替换后就返回结果,即使单词中没有字符c,也会返回这个单词作为结果。

3:foreach

格式:$(foreach var, text, commond)

foreach是makefile中的循环语句。

var是foreach的循环临时变量,类似于C语言的:for(int i=0 ;i<100;i++)中的局部变量i

text是包含多个单词的变量,例如:TEXT := a.c b.c f.h g.h

commond是每次循环对var变量进行操作的语句

例如:

当前目录下有文件  a.c  b.c  f.h  g.h

那么运行:

TEXT := a.c b.c f.h g.h

RESULT=$(foreach name,$(TEXT),$(name).S)

那么RESULT变量的内容是:a.c.S  b.c.S  f.h.S  g.h.S

轮询变量TEXT并将当前项的值放在局部变量name中,返回$(name).S

4:wildcard

格式:$(wildcard pattern)

wildcard用于通配指定目录下的所有符合格式的文件并作为返回值,如果没有符合格式的文件那么返回空。

要注意的是,通配符*是应用在系统中的,通配符%是应用在这个Makefile文件中的;换句话说,通配符%是用来匹配Makefile变量的,而通配符*是用来匹配shell命令行中的文件名,字符串等。

例如:

当前有目录dir1 dir2 dir3 dir4,四个目录依次存在文件1.c 2.c 3.c 4.c

那么运行:

TEXT := dir1 dir2 dir3 dir4

RESULT=$(foreach dir,$(TEXT),$(wildcard $(dir)/*.c))

那么RESULT变量的内容是:dir1/1.c  dir2/2.c  dir3/3.c  dir4/4.c

每次循环,wildcard将会寻找$(dir)/目录下的*.c文件并返回这些文件名,wildcard执行的顺序是:

$(wildcard dir1/*.c)

$(wildcard dir2/*.c)

$(wildcard dir3/*.c)

$(wildcard dir4/*.c)

执行的结果依次是 dir1/1.c  dir2/2.c  dir3/3.c  dir4/4.c,每次执行的结果都作为foreach每次循环的结果返回给变量RESULT,因此变量RESULT的值是: dir1/1.c  dir2/2.c  dir3/3.c  dir4/4.c

5:notdir

格式: $(notdir text)

notdir用于去除字符串中的目录。

例如:

TEXT :=dir1/dir2/dir3/1.c \

        dir1/dir3/dir2/3.c

RESULT = $(notdir $(TEXT))

执行之后RESULT的值为:1.c 3.c

6:abspath

格式: $(abspath dir)

获取目录dir的绝对路径,等价于在命令行键入pwd命令

7:addprefix

格式: $(addprefix pattern, text)

给text中的每一项添加pattern前缀并返回

8:eval

格式: $(eval func)

将Makefile的宏包(函数)执行;并导出宏包中的变量为全局变量。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值