如何在MAKEFILE中传递和返回用户定义函数的值?

时间:2015-03-17 04:38:16

标签: shell makefile

我想创建一个以列表作为参数,执行某些操作并返回列表(或标量值)的函数。我想使用' 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'

1 个答案:

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

$$$一样,您必须非常小心,与evalcall一起使用时一如既往。然后你调用它:

$(eval $(call myfuntest,return_value,$(abc)))