美文网首页
make之eval函数

make之eval函数

作者: frank_545b | 来源:发表于2018-09-17 15:52 被阅读0次

函数原型:
$(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组合注意事项

image
image

第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函数

    函数原型:$(eval text)它的意思是 text 的内容将作为makefile的一部分而被make解析和执行...

  • JS之eval()

    Javascript 之 eval() 语法 eval(string) 描述 eval()是一个顶级函数并且跟任何...

  • PHP代码执行

    Eval函数介绍 Eval函数的语法如下: eval ( string $code ) $code是字符串型变量,...

  • 08.eval、exec和其他函数

    eval、exec和其他函数 一、eval函数 1). eval函数的功能 将字符串形式的变量转换成Python的...

  • 二级Python小知识点---eval函数的功能

    eval函数的功能: eval函数的参数必须是字符串。所以经常和input联合使用。 eval函数的功能,通俗的说...

  • python之eval函数

    str()函数可以实现list,turple,dict到string的转换eval()函数可以实现将string转...

  • PHP代码审计-常见危险函数

    PHP代码执行函数 eval & assert & preg_replace eval 函数 php官方手册:ht...

  • eval介绍

    eval 的定义和用法 如果参数是表达式,eval()函数会执行表达式;如果参数是 js 语句,eval()函数会...

  • Python语法之eval()函数

    eval()函数 python中的eval()函数就是实现list、dict、tuple与str之间的转化;str...

  • 函数定义,函数劫持,全局函数

    函数的定义 函数劫持 全局函数(掌握isNaN eval)

网友评论

      本文标题:make之eval函数

      本文链接:https://www.haomeiwen.com/subject/lixrnftx.html