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

标签 shell makefile

我想创建一个函数,它将列表作为参数,执行一些操作并返回一个列表(或一个标量值)。我想使用“定义”来定义函数。功能:

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

您必须非常小心 $对比 $$ ,一如既往地使用 evalcall一起。然后,您可以像这样调用:
$(eval $(call myfuntest,return_value,$(abc)))

关于shell - 如何从 MAKEFILE 中的用户定义函数传递和返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29091370/

相关文章:

shell - 使用 ssh 远程加 grep

linux - 将代码从一个文件复制到另一个文件的命令

linux - 如何理解Linux内核模块的 "Building Separate Files"?

c++ - Autotools:在 Makefile.am 中生成源代码和 header

linux - 重命名文件和目录(添加前缀)

c - 完成大写目录时 libreadline 出现问题

Linux:如果目标目录不存在,则复制并创建它

c - 通过Cgo访问aerospike C客户端报错

makefile - 编写 makefile 时如何在退出时终止子进程?

linux - 由于缺少 Build.include 文件,Ubuntu 20.04 中的 objtool 制作失败?