Android.mk:为什么$(info)和$(警告)不反映从函数内分配的变量值?

时间:2014-11-26 20:00:57

标签: makefile

Android.mk文件中使用的简单测试代码:

my_var := 'Foo'
$(warning $(my_var))

产生预期的产出:

jni/Android.mk:6: 'Foo'

但是,在定义函数并调用它时,似乎忽略了局部变量(就好像首先处理了warning行一样)。 E.g:

define my_func
    my_var := 'Test $1'
    $(warning "MYFUNC: <$1> [$(my_var)]")
endef

$(call my_func,'foo')
$(call my_func,'bar')

输出:

jni/Android.mk:10: "MYFUNC: <'foo'> []"
jni/Android.mk:11: "MYFUNC: <'bar'> []"

如果在函数范围之外定义此my_var

my_var := 'norf'
define my_func
    my_var := 'Test $1'
    $(warning "MYFUNC: <$1> [$(my_var)]")
endef

$(call my_func,'foo')
$(call my_func,'bar')

输出:

jni/Android.mk:10: "MYFUNC: <'foo'> ['norf']"
jni/Android.mk:11: "MYFUNC: <'bar'> ['norf']"

当在foreach循环中使用时,它再次表现为好像它是my_func函数中的第一行(事实上,将它作为第一行给出相同的输出):

define my_func
    my_var := 'Test $1'
    $(warning "MYFUNC: <$1> [$(my_var)]")
endef

items := foo bar qux norf
$(foreach item,$(items),$(eval $(call my_func,$(item))))

输出:

jni/Android.mk:10: "MYFUNC: <foo> []"
jni/Android.mk:10: "MYFUNC: <bar> ['Test foo']"
jni/Android.mk:10: "MYFUNC: <qux> ['Test bar']"
jni/Android.mk:10: "MYFUNC: <norf> ['Test qux']"

如果仅在函数调用后检查值,则输出预期值。 只有来自我发现warninginfo的功能才会出现意外行为。


有人可以解释一下吗?

使用$(info OUT)代替$(warning OUT)表现出类似的行为。我没有在NDK文档中找到这些函数中的任何一个。

1 个答案:

答案 0 :(得分:2)

定义规则的评估顺序非常棘手,在这种情况下,问题是过早地评估警告,并且根本不会评估变量赋值。

通过像这样修改你的例子,我得到了它的工作:

define my_func
    my_var := 'Test $1'
    $$(warning "MYFUNC: <$1> [$$(my_var)]")
endef

$(eval $(call my_func,'foo'))
$(eval $(call my_func,'bar'))

通过使用$$来使用变量和警告,对它们的评估被推迟到我添加的包装$(eval)调用,然后在分配变量之后发生。

有关此主题的更多提示和解释,请参阅https://unix.stackexchange.com/questions/154557