分类:
2010-10-08 23:03:02
GNU Make的使用简记 2
Email: |
zcatt@163.com |
Blog |
http://zcatt.cublog.cn |
文档简要整理了GNU
Make的语法,函数,和命令。备忘和参考。本文的pdf格式已经发布到
百度wenku.
除了少数的例外,变量在读入的时候就会被展 开。这些少数的例外包括,recipe中,变量定义'='的右侧,define中。(deferred, 参见2.4)
变量名中不能包含':'
,
'#'
,
'='
字符,和头尾的空白符。
变量名是大小写敏感的。推荐脚本内部使用的 变量名用小写。
另外,还有一些有专门用途的自动变量automatic variables值 得注意。
变量的引用形式 $(var_name)
或
${var_name}
。推荐使用小括号。对于单个字符的变量名,可以不使用大小括号, 例如$x,但这种用法不推荐。
'='
,recursively
expanded varible,递归扩展的变量。使用'='
定义的变量右侧是deferred的,每次使用时,都会按字面展开,如果字面中还有其他变量的引用,则按照当前展开时的变量值继续展
开变量,直到字面中的变量展开完毕,这就是recursively递归的意义所在。(deferred,参见2.4)
下例中的$(foo)是'Huh?'
|
使用'='
定义变量有两点要注意一点,形如下的定义会产生变量扩展的无穷迭代。
|
另一点,每次使用变量时,都会执行扩展,效 率较低。
':='
,simply expanded
variables,简单展开变量。使用':='
定义的变量在定义的时候就展开一次,其中的变量引用就按照当前的值展开。':='
定义的变量使用时,就按照上述已经展开好的内容展开。(immediate,参见2.4)
下例中y是foo bar
|
'?='
,条件变量赋值,仅当变量还没有定义时才有意义。如果变量已经定义过了,则忽略这个'?='
变量定义。
'+='
可用于追加内容。
使用define…endef
也可以定义变量,而且define中允许使用换行符。
|
已定义的变量名可以使用undefine取消。
一般的变量是全局范围的,如果变量的作用域 需要限定在某个target中,可以使用下面的形式
|
例如
|
变量引用除了前面描述的$(varName)
和${varName}
外,还有
下面较复杂的用法:替
代引用
形式如下,变量中的字符a将被替代为b。另外也可以使用通配符%.
|
下述例子中,bar都是a.c b.c c.c。
|
|
展开的变量名中出现变量应用,称作computed variable name或nested variable reference。
下例中a是z.
|
另两个例子
x = y y = z z = u a := $($($(x)) x = $(y) y = z z =
Hello a := $($(x)) |
嵌套变量名这种用法可以实现更加灵活的函数 和变量引用。下面例子。
|
另一个例子
|
MAKEFILELIST
按照make分析的顺序排列的,make已经处理/分析过的makefile文件名列表。
.DEFAULT_GOAL
如果make没有指定创建或更新的target,则创建和更新.DEFAULT_GOAL
指定的target.
.VARIABLES
所有全局变量的名字列表。
.INCLUDE_DIRS
make搜寻included makefile路径的列表。
make读入脚本变量前,会优先读入环境变量MAKEFILES。但一般MAKEFILES变量仅用于make的递归调用,用于传递信息。通常不要使用这个变量。
当make在当前目录下搜寻不到指定文件时,会
到VPATH指的
目录下搜索。通常是用在prerequisite files在当前目录下的情况。VPATH中的各路径用':'
或ws分隔。
例如
|
参考vpath命令。
自动变量是一类特殊的变量,它的取值依赖于rule的target和prerequisite,仅使用在recipe中。
$@
rule的target名(文件名)。
$%
target是归档成员(archive member)时,$%是target成员名。例如,target是'foo.a(bar.o)'
时,$%
是'bar.o'
,$@
是'foo.a'
。如果target不是archive member时,$%
返回空。
$<
prerequisite中的第一项的名字。
$?
prerequisite列表中比target新的所有项的列表,空格间隔。
$^
prerequisite列表中的所有项,空格间隔。重复的项取消重复,只保留一个。
$+
同$+,但保留重复。
$|
所有order-only prerequisite的成员列表,空格间隔。
$*
返回隐式规则implicit
rule匹配的部分stem。例如target是'dir/a.foo.b'
,
规则是'a.%.b'
,那么$*
是'dir/foo
'。在static
pattern rule中,stem是通配符'%'
匹配的部分。
$(@D)
target文件名的目录路径部分,结尾的斜杠去掉。例如$@
是'dir/foo.o'
,那么$(@D)
是'dir'
。如果$@
不含目录路径,那么$@
是'.'
。
$(@F)
target文件名中不是目录路径的部分。等同于$(notdir $@)
$(*D)
,
$(*F)
target stem部分的的dir和notdir部分。
$(%D),
$(%F)
target archive member名的dir 和notdir部分。
$(
,
$(
prerequisite列表中第一项的dir和notdir部分。
$(^D)
,
$(^F)
prerequisite列表中所有项的dir和notdir部分。
其他类似的还有 $(+D)
,
$(+F)
,
$(?D)
,
$(?F)
。
条件判断的形式
|
conditional-directive的形式, 推荐使 用括号的形式。
|
函数的调用形式,推荐使用小括号形式。
or
|
make除了支持一些built-in自带的函数外,还允许用户创建自己的函数,使用call调用。
文本转换函数处理的文本,是空格间隔的词(word)的形式。
$(subst
from,to,text)
text中的from替换成to.
|
$(patsubst
pattern,replacement,text)
text中空格间隔的word词,符合pattern的,用replacement替换。多个连续空格将压缩称一个空格。另外,允许使用统配符'%'
,如果需要使用'%'
字符,可
以前缀'\'
转义。
|
几个简单的等价形式
|
|
$(strip
string)
去除头尾空格,中间的连续空格用一个空格替 换。
$(findstring
find,
in)
in中查找find字串,有则返回查找到的字串,没有则返回空。常用到条件检测中。
$(filter
pattern…,
text)
返回text中所有匹配任何一个pattern的词word,剔除不匹配pattern的词。可以使用通配符'%'
|
$(filter-out
pattern…,
text)
同filter函数相反,保佑不匹配的,剔除匹 配的。
$(sort
list)
按照词序排序list中的词,剔除重复的。
|
$(word
n,text)
返回list中第n个word词。从1开始计数。
|
$(wordlist
s,e,text)
返回text中第s个到第e个词。
|
$(words
text)
返回text中词的总数。
$(firstword
names…)
返回names中的第一个词。
$(lastword
names…)
返回names中的最后一个词。
$(dir
names…)
抽取names中每个文件名的目录路径部分。目录 路径部分是指到最后一个路径分隔符的部分。
|
$(notdir
names…)
抽取除目录路径外的部分。如果文件名不含目 录路径部分,即文件分隔符,则不变返回。
|
$(suffix
names…)
抽取文件名后缀。
|
$(basename
names…)
除了后缀,抽取其余部分。
|
$(addsuffix
suffix,
names…)
给names中的每个词添加后缀suffix。
|
$(addprefix
prefix,
names…)
给names中的每个词添加前缀。
$(join
list1,
list2)
list1和list2中的词一对一的链接起来。
|
$(wildcard
pattern)
返回当前文件名符合pattern的空格间隔的文件名列表。pattern是文件名的pattern,可以使用通配符'*'
,
'?'
,和
'[…]'
。
$(realpath
names…)
返回文件名的正则绝对路径。
$(abspath
names…)
返回文件名的绝对路径。注意与正则绝对路径 不同,绝对路径不要求解析符号链接,不要求文件和目录真实存在。
$(if
condition,
then-part[, else-part])
$(or
condition1[,condition2[,condition3…]])
$(and
condition1[,condition2[,condition3…]])
$(foreach
var,list,text)
var依次取值list中的每个值,代换到text中。
|
使用call可以调用你自己定义的带入口参数的函 数
$(call
variable,param,param,...)
当make调用这个函数时,make会赋值临时变量$(0) 为variabile, $(1) ,$(2)…等为param…
|
不展开,而返回一个变量的值。
$(value
variable)
variable是变量的名字,而不是变量的引用。
|
'@echo
$(FOO)'
的输出,$P被认为是make的单字符变量,没有定义而认为空,最
终$(FOO)输
出为ATH。
eval可以用于构造makefile中的结构。它展开两次,第一次是eval函数自己的展开,第一次展开的结果作为脚本内容进行第二次展开,第二次展开是make脚本的展开。
eval函数的返回是空串,因此eval函数实际上可以放在任何地方而不会产生make的语法错误。
P
|
shell函数将调用shell命令,返回shell命令的结果。注意返回的结果中,make将把换行符转换成一个空格,去掉每行头尾的多余空格。
|
$(error
text…)
产生一个错误fatal error,并输出消息text。
$(warning
text…)
产生一个警告信息。
$(info
text…)
打印提示信息。