永发信息网

如何在makefile call函数中赋值全局变量

答案:2  悬赏:80  手机版
解决时间 2021-03-14 02:15
如何在makefile call函数中赋值全局变量
最佳答案
“call”函数是唯一一个可以创建定制参数化的函数的引用函数。我们可以将一个变量定义为一个复杂的表达式,用“call”函数根据不同的参数对它进行展开来获得不同的结果。
函数语法:
$(call VARIABLE,PARAM,PARAM,...)
函数功能:在执行时,将它的参数“PARAM”依次赋值给临时变量“$(1)”、“$(2)”(这些临时变量定义在“VARIABLE”的值中,参考下边的例子)…… call函数对参数的数目没有限制,也可以没有参数值,没有参数值的“call”没有任何实际存在的意义。执行时变量“VARIABLE”被展开为在函数上下文有效的临时变量,变量定义中的“$(1)”作为第一个参数,并将函数参数值中的第一个参数赋值给它;变量中的“$(2)”一样被赋值为函数的第二个参数值;依此类推(变量$(0)代表变量“VARIABLE”本身)。之后对变量“VARIABLE” 表达式的计算值。
返回值:参数值“PARAM”依次替换“$(1)”、“$(2)”…… 之后变量“VARIABLE”定义的表达式的计算值。
函数说明:1. 函数中“VARIBLE”是一个变量名,而不是对变量的引用。因此,通常“call”函数中的“VARIABLE”中不包含“$”(当然,除了此变量名是一个计算的变量名)。2. 当变量“VARIBLE”是一个make内嵌的函数名时(如“if”、“foreach”、“strip”等),对“PARAM”参数的使用需要注意,因为不合适或者不正确的参数将会导致函数的返回值难以预料。3.函数中多个“PARAM”之间使用逗号分割。4. 变量“VARIABLE”在定义时不能定义为直接展开式!只能定义为递归展开式。
函数示例:
首先,来看一个简单的例子。
示例1:
reverse = $(2) $(1) foo = $(call reverse,a,b)
变量“foo”的值为“ba”。这里变量“reverse”中的参数定义顺序可以根据需要来调整,并不是需要按照“$(1)”、“$(2)”、“$(3)”…… 这样的顺序来定义。
看一个稍微复杂一些的例子。我们定义了一个宏“pathsearch”来在“PATH”路径中搜索第一个指定的程序。
示例2:
pathsearch = $(firstword $(wildcard $(addsuffix /$(1),$(subst :, ,$(PATH))))) LS := $(call pathsearch,ls)
变量“LS”的结果为“/bin/sh”。执行过程:函数“subst”将环境变量“PATH”转换为空格分割的搜索路径列表;“addsuffix”构造出可能的可执行程序“$(1)”(这里是“ls”)带路径的完整文件名(如:“/bin/$(1)”),之后使用函数“wildcard”匹配,最后“firstword”函数取第一个文件名。 函数“call”以可以套嵌使用。每一层“call”函数的调用都为它自己的局部变量“$(1)”等赋值,覆盖上一层函数为它所赋的值。
示例3:
map = $(foreach a,$(2),$(call $(1),$(a))) o = $(call map,origin,o map MAKE)
那么变量“o”的值就为“file file default”。我们这里使用了“origin”函数。我们分析函数的执行过程:首先,“o=$(call map,origin, o map MAKE)”这个函数调用使用了变量“map”所定义的表达式;使用内嵌函数名“origin”作为它的第一个参数值,使用Makefile中的变量“o map MAKE”作为他的第二个参数值。当使用“call”函数每一的展开后等价于“$(foreach a,o map MAKE,$(origin $(a)))”。 注意:和其它函数一样,“call”函数会保留出现在其参数值列表中的空字符。因此在使用参数值时对空格处理要格外小心。如果参数中存在多余的空格,函数可能会返回一个莫名奇妙的值。为了安全,在变量作为“call”函数参数值之前,应去掉其值中的多余空格(可以使用 “strip”函数 )。
全部回答
期待看到有用的回答!
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
湘水湾在什么地方啊,我要过去处理事情
果然不错在什么地方啊,我要过去处理事情
求S7-1200控制伺服电机程序
小熊电炖盅通着电才放冷水导致漏水什么原因,
我们吃的花生油主要是从花生种子的哪一部分结
海贼王艾斯路飞萨博谁最大
问一下山东临沂到淄博沂源,坐汽车大约花多长
我的电脑怎样让对方远程装软件
城口县公路路政管理大队交通综合执法大队二中
商品楼楼顶漏雨没有维修金怎么维修
新概念2学的差不多,但还没学完,就学新概练3
ug制图模块建模软件多少钱
从荷兰进口快递到中国tnt门到门运费多少 八方
莓茶夏天喝好不好
桦樽米线·米粉这个地址在什么地方,我要处理
推荐资讯
手机刷机之后上wifi能被对方追踪到吗?
怎样才能去清华大学?
本人文化分四百多分要不要考虑学艺术
谁有最近我的妹妹有点怪百度云资源,高清有字
鲁迅的哥哥是谁
安特鲁烘焙坊在什么地方啊,我要过去处理事情
根据统计,2004年亚洲人口约有39亿,比欧洲人
9999乘以7778加3333乘以6666,用简便方法计算
结婚后城市转农村户口
中国邮政(华站邮政所)地址在什么地方,想过去
安徽到河南邮费是多少
李锦记蚝油为什么不加入无限极
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?