函数原型:

$(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. 两篇整合Activiti Modeler到业务系统

    1. 无法进入editor. http://localhost:8080/YouPRJ/modeler/service/editor?id=2050,前提是这个id必需存在与act_re_model表 ...

  2. 如何在sublime3项目设置中设置python模块的搜索路径?ImportError: No module named *的解决办法

    问题:之前使用pycharm,用的挺溜,但是电脑配置实在不争气,pycharm启动久了,耗去大量内存,导致运行起来越来越慢,于是转向使用sublime text. 把项目从pycharm切换到subl ...

  3. @MySQL为表字段添加索引

    删除索引~ DROP INDEX `idx_dict_type` ON `article` 1.添加PRIMARY KEY(主键索引): ALTER TABLE `table_name` ADD PR ...

  4. Qunit的使用

    1.新建一个html页面,如下 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "ht ...

  5. IP地址转换、主机大小端、htonl、ntohl实现

    copy   #include <IOSTREAM> //#include <WINSOCK.H> using std; typedef  uint16; unsigned   ...

  6. centos6.8服务器配置之vsftpd配置

    vsftpd: version 2.2.2一.安装:因对版本要求不高,所以采用yum安装 yum install -y vsftpdckconfig vsftpd on 二.配置: 1.建立ftp用户 ...

  7. Web.xml 错误或异常页面配置

         <error-page>          <error-code>404</error-code>          <location>/ ...

  8. 记一次MySQL找回用户数据

    事情经过 有天,我们公司外区的一个销售C说他8月3号以前的工作流记录找不到了.问清缘由,原来是更新了微信号(我们公司的工作流是基于企业微信开发的).经过分析,微信号和流程数据并没什么关系,所以初步得出 ...

  9. Git原始笔记

    .dir .mkdir lxit .cd lxit .git init(git仓库不要动!!! 除非用命令动它里面的文件,新添加的可以动) .ls .pwd Config: git config -- ...

  10. .gitignore 里面常写的值

    一般用这个文件来控制一些不想提交的内容 这个可以做一个参考 # Windows image file caches Thumbs.db ehthumbs.db   # Folder config fi ...