码迷,mamicode.com
首页 > 其他好文 > 详细

Makefile学习之路5——通过函数增强功能

时间:2017-04-23 18:09:04      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:nbsp   src   pattern   lib   log   text   命名   path   prefix   

通过函数能显著增强Makefile的功能。对于simple项目的Makefile,尽管使用了模式规则,但还是有一件比较麻烦的事情,就是要在Makefile中指明每一个项目源文件。下面介绍几个后期会使用到的函数,更多请参考《GUN Make》。

1.abspath函数

从命名就应该能够猜出它的作用。abspath函数用于将_name中的各路径名转化成绝对路径,并将转化后的结果返回。调用形式为:

$(abspath _name)

1 .PHONY: all
2 root :=$(abspath /uer/../lib)
3 all:
4     @echo $(root)

技术分享

 

2.addprefix函数

addprefix函数用于给名字列表_name中的每一个名字增加前缀_prefix,并将增加了前缀的名字列表返回,调用形式为:

$(addprefix _prefix,_name)

1 .PHONY: all
2 without_dir=main.c foo.c
3 with_dir :=$(addprefix objs/,$(without_dir))
4 all:
5     @echo $(with_dir)

技术分享

 

3.addsuffix函数

和前面addprefix刚好相反,addsuffix函数为_name增加后缀_suffix,调用形式为:

$(addsuffix _suffix,_name)

1 .PHONY: all
2 without_dir=main foo
3 with_dir :=$(addsuffix .c,$(without_dir))
4 all:
5     @echo $(with_dir)

技术分享

 

4.filter函数

filter函数被用于从一个名字列表_text中根据模式_patterm得到满足需要的名字列表并返回,其形式是:

$(filter _pattern,_text)

1 .PHONY: all
2 sources =foo.o bar.c main.c hell.s
3 sources :=$(filter %.c %.s,$(sources))
4 all:
5     @echo $(sources)

技术分享

 

5.eval函数

eval函数的存在使得Makefile具有动态语言的特征。eval函数使得make将再一次解析_text语句。eval返回空字符串,调用形式为:

$(eval _text)

1 .PHONY: all
2 sources =foo.o bar.c main.c hell.s
3 $(eval sources :=$(filter %.c %.s,$(sources)))
4 all:
5     @echo $(sources)

技术分享

虽然它和上面第四个函数运行结果完全一样,但是在某些场合却必须用eval。可参考:http://bbs.chinaunix.net/thread-2321462-3-1.html

eval的二次展开,是递归的一种形式,因为有时候在Makefile的表达式中,最后得出来的可能还是Makefile的表达式而非真正我们想要传递的值,需要再展开Makefile的表达式得到最终的结果。

Makefile学习之路5——通过函数增强功能

标签:nbsp   src   pattern   lib   log   text   命名   path   prefix   

原文地址:http://www.cnblogs.com/yangguang-it/p/6752998.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!