其实定义起来很简单, 没有我想象中的 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仍保持是动态链接.
阅读(2040) | 评论(0) | 转发(0) |