我想创建一个函数,它将列表作为参数,执行一些操作并返回一个列表(或一个标量值)。我想使用“定义”来定义函数。功能:
1) 对输入列表执行操作
2) 检查结果列表是否为空,如果列表为空,则引发错误。
3) 否则返回结果列表
这在 C/C++ 等语言中很容易实现。当我尝试在 MAKEFILE 中执行此操作时遇到问题。
a) 你能给我指出一些例子或在这里发布一个例子吗?。
b) MAKEFILE 函数如何返回值?
我检查了 makefile 文档和网络上的其他几个地方,但找不到任何有用的东西。这会给我一个从函数开始的想法。感谢您的帮助!
define myfuntest
fnames := $(filter %pattern, $(1))
ifneq ($(fnames),)
$(error this is an error)
endif
endef
调用函数类似于:
abc := Documents Downloads
return_value := $(call mytestfun,$(abc))
我希望在“return_value”中返回“fnames”
最佳答案
用户定义的宏必须是单个“表达式”。返回值是表达式展开的结果。你绝对不能用ifneq
或变量赋值或用户定义宏中的其他类似内容。
您可以创建一个与 call
一起使用的 makefile 文件。 ,但它只能与 eval
一起使用,这意味着它是 makefile 的一个单独部分,而不是通常定义的“函数”。
因此,如果您可以仅使用 make 函数构建用户定义的宏,以便扩展的结果是您想要的结果,那么您可以将其作为宏来执行;例如:
myfuntest = $(or $(filter %pattern,$(1)),$(error this is an error))
results := $(call myfuntest,foo barpattern biz baz)
如果
filter
的结果将是匹配单词的列表,并将分配给 results
,否则它将运行 error
功能。但是,如果您的函数更复杂且无法以表达式格式表示,则必须使用
eval
, 并传入要分配的变量的名称,如下所示:define myfuntest
... compute fnames from $(2) ...
$(1) := $$(fnames)
endef
您必须非常小心
$
对比 $$
,一如既往地使用 eval
和 call
一起。然后,您可以像这样调用:$(eval $(call myfuntest,return_value,$(abc)))
关于shell - 如何从 MAKEFILE 中的用户定义函数传递和返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29091370/