8.8 eval函数

¾ 函数功能: 函数“ eval”是一个比较特殊的函数。使用它可以在Makefile中构
造一个可变的规则结构关系(依赖关系链),其中可以使用其它变量和函数。
函数“ eval”对它的参数进行展开,展开的结果作为Makefile的一部分, make
可以对展开内容进行语法解析。展开的结果可以包含一个新变量、目标、隐含
规则或者是明确规则等。也就是说此函数的功能主要是:根据其参数的关系、
结构,对它们进行替换展开。
¾ 返回值: 函数“ eval”的返回值时空,也可以说没有返回值。
¾ 函数说明:“ eval”函数执行时会对它的参数进行两次展开。第一次展开过程
发是由函数本身完成的,第二次是函数展开后的结果被作为Makefile内容时由
make解析时展开的。明确这一过程对于使用“ eval”函数非常重要。理解了函
数“ eval”二次展开的过程后。实际使用时,如果在函数的展开结果中存在引
用(格式为: $(x)),那么在函数的参数中应该使用“ $$”来代替“ $”(参考 6.1
变量的引用 一节)。因为这一点,所以通常它的参数中会使用函数“ value” 来
取一个变量的文本值。
我们看一个例子。例子看起来似乎非常复杂,因为它综合了其它的一些概念和函数。
不过我们可以考虑两点:其一,通常实际一个模板的定义可能比例子中的更为复杂;其
二,我们可以实现一个复杂通用的模板,在所有Makefile中包含它,亦可作到一劳永逸。
相信这一点可能是大多数程序员所推崇的。

示例:

# sample Makefile
PROGRAMS = server client
server_OBJS = server.o server_priv.o server_access.o
server_LIBS = priv protocol
client_OBJS = client.o client_api.o client_mem.o
client_LIBS = protocol# Everything after this is generic.PHONY: allall: $(PROGRAMS)#函数模板定义(自定义函数)
define PROGRAM_template
$(1): $$($(1)_OBJS) $$($(1)_LIBS:%=-l%) #$$($(1)_LIBS:%=-l%)为简单的替换,将$($(1)_LIBS)替换为 -l$($(1)_LIBS)
ALL_OBJS += $$($(1)_OBJS)
endef$(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog))))
#展开为:
#server : $(server_OBJS) –l$(server_LIBS)
#client : $(client_OBJS) –l$(client_LIBS)
#$(PROGRAMS):
$(LINK.o) $^ $(LDLIBS) -o $@ #“ $(LINK.o)”为“ $(CC) $(LDFLAGS)”,意思是对所有的.o文件和指定的库文件进行#链接。可参考 10.2 make隐含规则一览 一节clean:
rm -f $(ALL_OBJS) $(PROGRAMS)

来看一下这个例子:它实现的功能是完成“ PROGRAMS”的编译链接。例子中
“ $(LINK.o)”为“ $(CC) $(LDFLAGS)”,意思是对所有的.o文件和指定的库文件进行
链接。可参考 10.2 make隐含规则一览 一节
“ $(foreach prog,$(PROGRAM),$(eval $(call PROGRAM_template,$(prog))))”展开为:
server : $(server_OBJS) –l$(server_LIBS)
client : $(client_OBJS) –l$(client_LIBS)

参考:《Makefile编程.pdf》

Makefile eval函数相关推荐

  1. makefile eval函数详解

    函数功能:函数"eval"是一个比较特殊的函数.使用它可以在Makefile中构造一个可变的规则结构关系(依赖关系链),其中可以使用其它变量和函数.函数"eval&quo ...

  2. 微信小程序开发之不能使用eval函数的问题

    2019独角兽企业重金招聘Python工程师标准>>> 一 eval函数问题 JavaScript中的eval函数是颇受开发者争议的问题之一,问题主要在于其可能导致的不安全性.有关此 ...

  3. python中eval()函数的使用

    python中eval()函数的使用 python eval函数功能:将字符串str当成有效的表达式来求值并返回计算结果. 函数定义: eval(expression, globals=None, l ...

  4. python中的EVAL函数的定义和用法!

    https://blog.csdn.net/weixin_42859280/article/details/84673079 Python 内置函数 Python 内置函数 描述: eval() 函数 ...

  5. 简单介绍python的input,print,eval函数

    这篇文章主要为大家概述了python的input,print,eval函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助 input()函数 input()函数可以通过控制台 ...

  6. Python中eval函数的表达式如何使用

    这篇文章主要介绍了Python中eval函数的表达式用法示例,文中通过示例对比来为大家进行详细的讲解,有需要的朋友可以借鉴参下,希望有所帮助 eval 是干嘛的? 解析字符串表达式并执行,并返回一个值 ...

  7. js的eval函数解析后台返回的json数据时为什加上圆括号eval((+data+)),而HTML页面定义的数据不用...

    一,情况如下,这是成功代码: $(function () {$.ajax({url: "Demo.aspx",type: "post",data: { Id: ...

  8. R语言eval函数评估表达式或者字符串实战

    R语言eval函数评估表达式或者字符串实战 目录 R语言eval函数评估表达式或者字符串实战 #基本语法 #eval函数评估表达式

  9. PHP eval函数

    代码:eval("echo'hello world';"); 上边代码等同于下边的代码:echo"hello world"; 在浏览器中都输出:hello wo ...

  10. JSONObject JSONArray各种用法以及js eval()函数与JSON.parse的区

    2019独角兽企业重金招聘Python工程师标准>>> 一.在后台使用JSONObject对象,并将从数据库中取出来的数据直接使用 JSONObject的put方法放进去,再将这个J ...

最新文章

  1. LeetCode简单题之检查是否区域内所有整数都被覆盖
  2. C语言 #ifndef 引起的redefinition of xxx 问题解决
  3. 修改Activity响应音量控制键修改的音频流
  4. C# 根据节点索引访问XML配置文件
  5. 5G NGC — 关键技术 — 网络切片 — 切片的选择
  6. 奇奇怪怪的大佬:理发店小弟到阿里P10
  7. java取余时前者前者小于后者_Java基本语法
  8. flyway java使用,如何使用flyway创建数据库?
  9. 面试精讲之面试考点及大厂真题 - 分布式专栏 13项目中为什么要使用消息队列
  10. oracle试图怎么使用,oracle 视图的介绍和使用
  11. dnf服务器系统,可以挂dnf的云服务器
  12. 《孤尽班T31-04-工程结构规约》
  13. 上海热门的众创空间平台都有哪些?
  14. 油画特效软件akvis artwork破解版安装及破解教程
  15. oracle误删除一条数据库,Oracle误删除数据的恢复方法
  16. html给文字添加下划线
  17. 力扣解法汇总720-词典中最长的单词
  18. 网站外链优化方案怎么制定
  19. 穿越火线游戏服务器停服维护中,cf停机维护
  20. 2020.8 复习 7-11 分钟秒钟的时间相减 //PTA

热门文章

  1. 第 22 章 动态属性和特性
  2. 【安安教具】-【数学】-【一阶线性齐次方程】模拟器 教你如何用python制作一阶线性齐次方程模拟器 python项目小发明
  3. android 画布画笔,安卓画笔笔锋的实现探索(一)
  4. 基于jeecgboot的flowable流程增加节点表单的支持(二)
  5. VsCode+PHP开发 推荐插件
  6. 数据统计分析用什么软件(目前最好的7个数据分析软件)
  7. horner算法matlab实现,使用Euclid和Horner算法的多项式求值
  8. c语言中next如何用,C++ STL prev()和next()函数用法详解
  9. 杨忠愍斗严嵩,为国为民,名垂千古
  10. js操作图片像素进行编辑