如果我有以下Makefile:
define FOO
$1: ;
@echo $1 $2
endef
$(call FOO,foo,foo1)
$(eval $(call FOO,bar,bar1))
然后我得到:
tmp> make foo
foo foo1
tmp> make bar
bar bar1
这两个调用都可以正确扩展,正确处理参数,并作为Makefile的一部分进行解析。 $(eval $(call ...))
格式似乎在我见过的Makefile中更流行。与直接使用$(call MACRO)
相比,这样做有什么好处?
答案 0 :(得分:1)
第一个只能工作,因为您在第一行添加了一个额外的分号。同样,如果将定义的命令扩展为包含多行,则它将不起作用。
例如,如果您写:
define FOO
$1:
@echo $1 $2
endef
此功能不适用于$(call ...)
,但适用于$(eval $(call ...))
。同样,如果您写:
define FOO
$1: ;
@echo $1
@echo $2
endef
此功能不适用于$(call ...)
,但适用于$(eval $(call ...))
。
基本上,call
本身会使make将整个结果视为一条长行,就好像换行符已转换为空格一样(尽管实际上并没有发生)。如果结果是有效的makefile语法,则可以使用。如果结果无效的makefile语法,则会失败。
eval
将重新解释call
函数的结果,以便将换行符视为实际的makefile换行符。