在手册中:
“扩大两次”让我感到困惑。eval功能非常特别:它允许您定义新的 makefile构造不是常量;这是结果 评估其他变量和函数。 eval的论据 扩展函数,然后将该扩展的结果解析为 makefile语法。
重要的是要意识到eval参数扩展了两次; 首先通过eval函数,然后是扩展的结果 当它们被解析为makefile语法时再次展开。这意味着你 可能需要为“$”字符提供额外的转义级别 使用eval。
例如,我创建了一个makefile:
define func
tmp = $(OBJPATH)/$(strip $1)
objs += $$(tmp)
$$(tmp) : $2
gcc $$^ -o $$@
endef
all : foo
$(eval $(call func, foo, 1.c))
如何扩展eval功能?
答案 0 :(得分:18)
理解它的最简单方法是用信息替换eval:
$(info $(call func, foo, 1.c))
这将显示第一个扩展的结果作为输出,因此您可以看到实际将解析的make。您没有提供OBJPATH变量的值,但如果它是obj
,那么在您的情况下,第一个扩展(调用函数)会导致:
tmp = obj/foo
objs += $(tmp)
$(tmp) : 1.c
gcc $^ -o $@
然后make解析器将对此进行评估,并且在此过程中它将再次展开它,因此$(tmp)
之类的内容将被扩展。
答案 1 :(得分:2)
这对我来说是个问题,但我找到了一个很好的解决方法。就我而言,它与 AWS docker 登录有关。我以前在我的 shell 脚本中有:
eval $(aws ecr get-login --region eu-west-1 --no-include-email --profile someprofile)
但是将其放入 Makefile
时它不起作用。解决方法是将行更改为:
$$(aws ecr get-login --region eu-west-1 --no-include-email --profile someprofile)