我想创建一个以列表作为参数,执行某些操作并返回列表(或标量值)的函数。我想使用' define'来定义函数。功能:
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))
我想要' fnames'退回' return_value'
答案 0 :(得分:5)
用户定义的宏必须是单个"表达式"。返回的值是扩展表达式的结果。您绝对不能在用户定义的宏中使用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)))