如何在makefile中使用eval函数?

时间:2012-05-03 16:26:46

标签: linux makefile

在手册中:

  

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功能?

2 个答案:

答案 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)