((注意-这与我之前的问题类似,但是原因似乎不同,因此我在这里发布了一个新问题)。
我正在调试一些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.
是否可以评估调用参数?
问题是,对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)
问题是由于“定义”中的注释。
基本上,“定义”与变量分配相同(换行符除外)。 “致电”可以扩展,但不能评估。因此,这些评论没有得到评估就进入了评论流->发生错误!
所以道德: