函数原型:

$(eval text)

它的意思是 text 的内容将作为makefile的一部分而被make解析和执行。

需要注意的是该函数在执行时会对它的参数进行两次展开,第一次展开是由函数本身完成,第二次是函数展开后的结果被作为makefile内容时由make解析时展开.

1.函数二次展开示例

define MA
aa:aa.c
gcc -g -o aa aa.c
endef $(eval $(call MA) )

会产生一个这样的编译:gcc -g -o aa aa.c

2.模板示例

2.1 模板引出示例

PROGRAMS := SERVER CLIENT

SERVER_OBJS := server.o 

CLIENT_OBJS := client.o 

.PHONY: all
all: $(PROGRAMS) SERVER: $(SERVER_OBJS)
ALL_OBJS += $(SERVER_OBJS) $(info $(ALL_OBJS)) CLIENT: $(CLIENT_OBJS)
ALL_OBJS += $(CLIENT_OBJS) $(info $(ALL_OBJS)) #从上面可以看出,生成SERVER和CLIETN的两个规则基本上是一样的,那么可以使用更通用的规则表示 $(PROGRAMS):
gcc $^ -o $@

2.2 call与eval组合注意事项



第8行 引用变量SERVER_OBJS前多了一个空格,显然是引用不到server.o

第9行 可以正常引用

第20,25行 由于29行eval还没有执行,所以为空

第27行 打印函数call调用后的返回值,可以看到依赖展开后 中间多了一个空格

2.3 call与eval组合完整示例

CC=gcc
PROGRAMS=SERVER CLIENT SERVER_OBJS:=server.o CLIENT_OBJS:=client.o .PHONY: all
all: $(PROGRAMS) #define PROGRAM_TEMPLATE
#$(1):$$($(1)_OBJS)
#ALL_OBJS += $$($(1)_OBJS)
#endef define PROGRAM_TEMPLATE
$(strip $(1)):$$($(strip $(1))_OBJS)
ALL_OBJS += $$($(strip $(1))_OBJS)
endef #$(info 111$(ALL_OBJS)) #下面两行的区别在于call函数中 逗号和参数[$(prog)]之间的空格.
#因此,PROGRAM_TEMPLATE更好的写法是去掉参数前面的空格,如果有的话
$(foreach prog, $(PROGRAMS), $(eval $(call PROGRAM_TEMPLATE, $(prog))))
#$(foreach prog, $(PROGRAMS), $(eval $(call PROGRAM_TEMPLATE,$(prog)))) #$(info 222-$(ALL_OBJS)) $(PROGRAMS):
gcc $^ -o $@ clean:
rm -f $(ALL_OBJS) $(PROGRAMS)

make之eval函数的更多相关文章

  1. JS eval()函数的一些见解

    一.eval是基本使用规则 1 eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码. 2 eval(string) 3 string必需.要计算的字符串,其中含有要计算的 ...

  2. 浅谈JavaScript eval() 函数

    用js的人都应该知道eval()函数吧,虽然该函数用的极少,但它却功能强大,那么问题来了,为什么不常用呢?原因很简单,因为eval()函数是动态的执行其中的字符串,里面有可能是脚本,那么这样的话就有可 ...

  3. [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")

    javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢?   原因在于: ...

  4. JavaScript的eval函数

    eval() 函数可将字符串转换为代码执行,并返回一个或多个值 函数原型为: 返回值 = eval( codeString ) 函数说明: 如果eval函数在执行时遇到错误,则抛出异常给调用者. 类似 ...

  5. python笔记-调用eval函数出现invalid syntax错误

    本来是想打算使用eval函数对变量进行赋值的,没想到出现了invalid syntax错误.源代码如下 In [2]: eval('a = 1') File "<string>& ...

  6. JavaScript中Eval()函数的作用

    这一周感觉没什么写的,不过在研究dwz源码的时候有一个eval()的方法不是很了解,分享出来一起学习 -->首先来个最简单的理解 eval可以将字符串生成语句执行,和SQL的exec()类似. ...

  7. JavaScript eval() 函数

    定义和用法:eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码. 语法:eval(string) 参数 描述 string 必需.要计算的字符串,其中含有要计算的 Java ...

  8. JavaScript中的eval()函数

    和其他很多解释性语言一样,JavaScript同样可以解释运行由JavaScript源代码组成的字符串,并产生一个值.JavaScript通过全局函数eval()来完成这个工作. eval(“1+2” ...

  9. eval 函数的应用 (去除包装在列表外面的引号)

    a="[u'ANDROID-5a9ac5c22ad94e26b2fa24e296787a35', u'0', 0, 0, 0, 1]" 此时的a是一个字符串,目的是要去掉a上面的引 ...

  10. eval() 函数

    eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码. var str = '12+45*45'; alert(eval(str))//计算结果 还有一个重要作用可以把字符串 ...

随机推荐

  1. 使用Facebook的create-react-app脚手架快速构建React开发环境(ant.design,redux......)

    编程领域中的“脚手架(Scaffolding)”指的是能够快速搭建项目“骨架”的一类工具.例如大多数的React项目都有src,public,webpack配置文件等等,而src目录中又包含compo ...

  2. Spark学习视频整合

    1.<Scala深入浅出实战经典>http://pan.baidu.com/s/1pJnAUr5 2.<Spark纯实战公益大讲坛>http://pan.baidu.com/s ...

  3. Wishbone B3总线Generic RAM写法

    以下Verilog HDL代码符合wishbone总线B3标准协议,在Altera和Xilinx的开发工具上可以实现综合,自动推断并采用片上RAM资源,可以完成内存内容的初始化. /* ******* ...

  4. reconstruct-original-digits-from-english(好)

    https://leetcode.com/problems/reconstruct-original-digits-from-english/ //https://discuss.leetcode.c ...

  5. 爬虫之多线程 多进程 自定义异步IO框架

    什么是进程? 进程是程序运行的实例,是系统进行资源分配和调度的一个独立单位,它包括独立的地址空间,资源以及1个或多个线程. 什么是线程? 线程可以看成是轻量级的进程,是CPU调度和分派的基本单位. 进 ...

  6. PHP100精华:很靠谱linux常用命令

    vim是打开vim编辑器,别的编辑器还有vi(功能没有vim 强大),nano,emacs等等,感觉还是vim最强大,其次是vi,别的就要差一些了. 我听我们老师说,用图形界面本身已经会被高手笑了,如 ...

  7. WPF使用ARCGIS App文件配置Cs后台文件

    using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...

  8. 网页图表控件Highcharts选项配置参数

    Highcharts提供大量的选项配置参数,您可以轻松定制符合用户要求的图表,目前官网只提供英文版的开发配置说明文档,而中文版的文档网上甚少,且零散不全.这里,我把Highcharts常用的最核心的参 ...

  9. 模块化开发RequireJS之路径解析

    1.requirejs遵循AMD规范,将需要的都加载好(前置加载).注:cmd是就近加载. define(['jQuery','dialog'],function($,d){ // 业务逻辑 }) ( ...

  10. JavaScript入门:002—JS代码放置的位置

    JavaScript在页面中使用,那么这些JS代码应该放在什么位置呢?以下来看一下. 一般来说有两种方式.写在界面上和使用.js文件.1.1界面上的Head部分能够直接放在head标签内,例如以下代码 ...