免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 24598917 | 回复: 24598917

我一直没弄明白makefile里面的eval函数,哪位大侠详细讲讲? [复制链接]

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
发表于 2011-05-20 13:20 |显示全部楼层
本帖最后由 captivated 于 2011-05-23 17:52 编辑

RT... 一直不明白eval函数到底表示什么意思,以及应当如何使用它...
翻查某makefile中文手册,里面这样讲:

函数功能:函数“eval”是一个比较特殊的函数。使用它可以在Makefile中构造一个可变的规则结构关系(依赖关系链),其中可以使用其它变量和函数。函数“eval”对它的参数进行展开,展开的结果作为Makefile的一部分,make可以对展开内容进行语法解析。展开的结果可以包含一个新变量、目标、隐含规则或者是明确规则等。也就是说此函数的功能主要是:根据其参数的关系、结构,对它们进行替换展开。
返回值:函数“eval”的返回值时空,也可以说没有返回值。
函数说明:“eval”函数执行时会对它的参数进行两次展开。第一次展开过程发是由函数本身完成的,第二次是函数展开后的结果被作为Makefile内容时由make解析时展开的。明确这一过程对于使用“eval”函数非常重要。理解了函数“eval”二次展开的过程后。实际使用时,如果在函数的展开结果中存在引用(格式为:$(x)),那么在函数的参数中应该使用“$$”来代替“$”。因为这一点,所以通常它的参数中会使用函数“value”来取一个变量的文本值。

完全看不明。同时他给了一个示例:
  1. # sample Makefile


  2. PROGRAMS    = server client
  3.    
  4. server_OBJS = server.o server_priv.o server_access.o
  5. server_LIBS = priv protocol
  6.    
  7. client_OBJS = client.o client_api.o client_mem.o
  8. client_LIBS = protocol

  9. # Everything after this is generic
  10. .PHONY: all
  11. all: $(PROGRAMS)

  12. define PROGRAM_template
  13. $(1): $$($(1)_OBJS)  $$($(1)_LIBS:%=-l%)
  14. ALL_OBJS   += $($(1)_OBJS)
  15. endef

  16. $(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog))))

  17. $(PROGRAMS):
  18.         $(LINK.o) $^ $(LDLIBS) -o $@   

  19. clean:
  20.         rm -f $(ALL_OBJS) $(PROGRAMS)
复制代码
上面这个例子的解释是:它实现的功能是完成“PROGRAMS”的编译链接。例子中“$(LINK.o)”为“$(CC) $(LDFLAGS)”,意思是对所有的.o文件和指定的库文件进行链接。
“$(foreach prog,$(PROGRAM),$(eval $(call PROGRAM_template,$(prog))))”展开为:
server : $(server_OBJS) –l$(server_LIBS)
client : $(client_OBJS) –l$(client_LIBS)

不是说了eval函数是没有返回值的么?!为什么那么用?



有哪位大侠能详细解释一下么?能否详细解释上述示例,并最好能给个比较简单的示例以帮助在下理解eval函数!多谢!yo lu xi ku ko za yi ma si!

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
发表于 2011-05-20 13:27 |显示全部楼层
本帖最后由 captivated 于 2016-10-29 06:50 编辑


。。。
提示一下,回复在 22L

我确实 222222...

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
发表于 2011-05-20 13:33 |显示全部楼层
你妹...没人回没人理会,偶再顶...

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
发表于 2011-05-20 15:38 |显示全部楼层
你妹啊你妹...为神马还是没回复啊...
拜托,帖子的示例要是觉得有点小复杂可以不用看,不过...倒是告诉我eval函数到底干神马啊...它到底对其参数做了些啥?最好关于makefile的变量展开有个明确的讨论啊...

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
发表于 2011-05-20 16:00 |显示全部楼层
......CUer 都哪去了... 哪去了?... {:3_190:}

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2011-05-20 16:10 |显示全部楼层
回复 5# captivated


    不懂。。。来捧场。。

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
发表于 2011-05-20 16:15 |显示全部楼层
回复 6# cokeboL


    终于有回复的了...鸡冻...

    谢谢捧场....

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
发表于 2011-05-20 18:17 |显示全部楼层
你妹啊......      CUer呢......

LZ我卯上了... 一定要顶到此贴得到正确回复...

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
发表于 2011-05-20 21:36 |显示全部楼层
本帖最后由 captivated 于 2012-05-14 14:43 编辑

1111111111111

论坛徽章:
0
发表于 2011-05-22 08:15 |显示全部楼层
去查一下GNUMake的文档呢?
今天没带着,等去公司了帮你查一下……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP