在make函数内部使用eval

问题描述 投票:0回答:2

((注意-这与我之前的问题类似,但是原因似乎不同,因此我在这里发布了一个新问题)。

我正在调试一些makefile,这些makefile充满了一些非常复杂的eval。我希望能够准确地将评估扩展到什么,然后调用评估。我需要这样做,以便可以轻松打开/关闭调试,但是在函数中我发现eval有一些奇怪的行为。我有:

FOO := a:=foo
$(eval $(FOO))
$(info a=$(a))   #a=foo -- OK

define eval_dbg
$(info eval_dbg: running [$1]) # $1 is "a:=bar"
$(eval $(1))                   # fails - missing seperator...
endef

$(call eval_dbg,a:=bar)    #causes error...
$(info a=$a)

但是,我得到:

a=foo
eval_dbg: running [a:=bar]
test2.mk:17: *** missing separator.  Stop.

是否可以评估调用参数?

debugging makefile gnu-make
2个回答
0
投票

问题是,对eval(...)的调用结果是空字符串,因此实际上您正在向call传递一个参数-定义的函数eval_dbg-包含空格,而call则不不喜欢空格。

define func_1
$(info hello)
endef

$(call func_1) # this works                                                     

define func_2
$(info hello)

endef

$(call func_2) # this fails 

define func_3
$(info hello)
$(eval a:=b)
endef

$(call func_3) # this also fails

但是没有理由从函数内调用eval。如图所示,您可以打印该语句,然后在其上调用eval。或者您可以将eval的调用结果传递给call

define foo_double
$(1):=foo_$(1)$(1)
endef

$(info $(call foo_double,a))
$(eval $(call foo_double,a))

$(info a is $a)

0
投票

问题是由于“定义”中的注释

基本上,“定义”与变量分配相同(换行符除外)。 “致电”可以扩展,但不能评估。因此,这些评论没有得到评估就进入了评论流->发生错误!

所以道德:

  1. 定义不是宏;这是一个字符串
  2. 通话不是评估;它是一个扩展
  3. 注释不是空格;他们被评估
© www.soinside.com 2019 - 2024. All rights reserved.