Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2315201
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: LINUX

2010-05-06 21:45:36

其实定义起来很简单, 没有我想象中的 def, command, function 之类的关键字, 而是等同于变量定义, 下面是尝试在实际项目中使用的函数定义:

[zrf@DMLinux pes]$ cat Makefile.common
# The following function make the input token uniq.
# the token may be not in the input order
# usage: uniq_result=$(call uniq, A B A B B C)
# expected result: uniq_result is A B C
uniq=$(shell echo $1 | sed 's/[ \t]\+/\n/g' | sed 's/^/ /' | sort -u | tr -d '\n')

# The following function link the -lnet* and -lwrap library statically while
# keep other libraries being link dynamically by wrapping the -lxxx option with
# -Wl,-Bstatic ... -Wl,-Bdynamic
link_some_lib_staticlly=$(shell echo $1 | sed 's/-l\(net[^ \t]*\|wrap\)\( -l\(net[^ \t]*\|wrap\)\)*/-Wl,-Bstatic & -Wl,-Bdynamic/g')

自定义函数的关键是一定要用=号, 而不是:=, :=与=的差别是:=是即时求值, =则是使用时才求值. 把:看作一个站着的小人, :=可以看作"立等可取"来助记.

命令定义中可以用$1, $2, $3来引用传递的参数, 注释里已经有了自定义函数的使用
call是个特殊的make函数, 用于调用其它函数, 参数以逗号分隔.

借助这种方法, 可以让那些频繁而又重复的操作被封装进一个函数里, 不需要到处复制, DRY远处不在.

上面这两个自定义函数的功能是:
让 LDLIBS这样的变量中内容精简, 同时能灵活地指定某个库是以静态方式链接到最终可执行文件里, 而多数其它的常用库, 如libc仍保持是动态链接.

阅读(1992) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~