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']"
如果仅在函数调用后检查值,则输出预期值。
只有来自我发现warning
和info
的功能才会出现意外行为。
有人可以解释一下吗?
使用$(info OUT)
代替$(warning OUT)
表现出类似的行为。我没有在NDK文档中找到这些函数中的任何一个。
答案 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。