在makefile中使用call和eval

时间:2019-07-19 19:55:57

标签: makefile gnu-make

如果我有以下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)相比,这样做有什么好处?

1 个答案:

答案 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换行符。