captivated 发表于 2011-05-20 13:20

我一直没弄明白makefile里面的eval函数,哪位大侠详细讲讲?

本帖最后由 captivated 于 2011-05-23 17:52 编辑

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

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

完全看不明。同时他给了一个示例:# 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: all
all: $(PROGRAMS)

define PROGRAM_template
$(1): $$($(1)_OBJS)$$($(1)_LIBS:%=-l%)
ALL_OBJS   += $($(1)_OBJS)
endef

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

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

clean:
      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!

captivated 发表于 2011-05-20 13:27

本帖最后由 captivated 于 2016-10-29 06:50 编辑


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

我确实 222222...

captivated 发表于 2011-05-20 13:33

你妹...没人回没人理会,偶再顶...

captivated 发表于 2011-05-20 15:38

你妹啊你妹...为神马还是没回复啊...
拜托,帖子的示例要是觉得有点小复杂可以不用看,不过...倒是告诉我eval函数到底干神马啊...它到底对其参数做了些啥?最好关于makefile的变量展开有个明确的讨论啊...

captivated 发表于 2011-05-20 16:00

......CUer 都哪去了... 哪去了?... {:3_190:}

cokeboL 发表于 2011-05-20 16:10

回复 5# captivated


    不懂。。。来捧场。。

captivated 发表于 2011-05-20 16:15

回复 6# cokeboL


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

    谢谢捧场....

captivated 发表于 2011-05-20 18:17

你妹啊......      CUer呢......

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

captivated 发表于 2011-05-20 21:36

本帖最后由 captivated 于 2012-05-14 14:43 编辑

1111111111111

shimmey 发表于 2011-05-22 08:15

去查一下GNUMake的文档呢?
今天没带着,等去公司了帮你查一下……
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 我一直没弄明白makefile里面的eval函数,哪位大侠详细讲讲?