资源描述:
《makefile(函数调用)_linux》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、makefile(函数调用)_linux文本转换函数函数允许您在makefile文件中处理文本、计算文件、操作使用命令等。在函数调用时您必须指定函数名以及函数操作使用的参数。函数处理的结果将返回到makefile文件中的调用点,其方式和变量替换一样。8.1函数调用语法函数调用和变量引用类似,它的格式如下:$(functionarguments)或这样:${functionarguments}这里‘function’是函数名,是make内建函数列表中的一个。当然您也可以使用创建函数call创建的您自己的函数。‘arguments’是该函数的参数
2、。参数和函数名之间是用空格或Tab隔开,如果有多个参数,它们之间用逗号隔开。这些空格和逗号不是参数值的一部分。包围函数调用的定界符,无论圆括号或大括号,可以在参数中成对出现,在一个函数调用中只能有一种定界符。如果在参数中包含变量引用或其它的函数调用,最好使用同一种定界符,如写为‘$(substa,b,$(x))',而不是`$(substa,b,${x})'。这是因为这种方式不但比较清楚,而且也有在一个函数调用中只能有一种定界符的规定。为每一个参数写的文本经过变量替换或函数调用处理,最终得到参数的值,这些值是函数执行必须依靠的文本。另外,变量替
3、换是按照变量在参数中出现的次序进行处理的。逗号和不成对出现的圆括号、大括号不能作为文本出现在参数中,前导空格也不能出现在第一个参数中。这些字符不能被变量替换处理为参数的值。如果需要使用这些字符,首先定义变量comma和space,它们的值是单独的逗号和空格字符,然后在需要的地方因用它们,如下例:comma:=,empty:=space:=$(empty)$(empty)foo:=abcbar:=$(subst$(space),$(comma),$(foo))#barisnow`a,b,c'.这里函数subst的功能是将变量foo中的空格用逗号
4、替换,然后返回结果。8.2字符串替换和分析函数这里有一些用于操作字符串的函数:$(subst from,to,text)在文本‘text’中使用‘to’替换每一处‘from’。例如:$(substee,EE,feetonthestreet)结果为‘fEEtonthestreet’。$(patsubst pattern,replacement,text)寻找‘text’中符合格式‘pattern’的字,用‘replacement’替换它们。这里‘pattern’中包含通配符‘%’,它和一个字中任意个数的字符相匹配。如果‘replacement’
5、中也含有通配符‘%’,则这个‘%’被和‘pattern’中通配符‘%’匹配的文本代替。在函数patsubst中的‘%’可以用反斜杠(‘’)引用。引用字符‘%’的反斜杠可以被更多反斜杠引用。引用字符‘%’和其它反斜杠的反斜杠在比较文件名或有一个stem(径)代替它之前从格式中移出。使用反斜杠引用字符‘%’不会带来其它麻烦。例如,格式‘the%weird\%pattern\'是‘the%weird'加上通配符‘%'然后和字符串‘pattern\'连接。最后的两个反斜杠由于不能影响任何统配符‘%’所以保持不变。在字之间的空格间被压缩为单
6、个空格,前导以及结尾空格被丢弃。例如:$(patsubst%.c,%.o,x.c.cbar.c)的结果为:‘x.c.obar.o'。替换引用是实现函数patsubst功能一个简单方法:$(var:pattern=replacement)等同于:$(patsubstpattern,replacement,$(var))另一个通常使用的函数patsubst的简单方法是:替换文件名的后缀。$(var:suffix=replacement)等同于:$(patsubst%suffix,%replacement,$(var))例如您可能有一个OBJ文件的
7、列表:objects=foo.obar.obaz.o要得到这些文件的源文件,您可以简单的写为:$(objects:.o=.c)代替规范的格式:$(patsubst%.o,%.c,$(objects))$(strip string)去掉前导和结尾空格,并将中间的多个空格压缩为单个空格。这样,‘$(stripabc)'结果为‘abc’。函数strip和条件语句连用非常有用。当使用ifeq或ifneq把一些值和空字符串‘’比较时,您通常要将一些仅由空格组成的字符串认为是空字符串(参阅makefile中的条件语句)。如此下面的例子在实现预期结果时可能
8、失败:.PHONY:allifneq "$(needs_made)"""all:$(needs_made)elseall:;@echo'Nothingtomake