加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 18:18:49 所属栏目:安全 来源:网络整理
导读:我想创建一个函数,它将列表作为参数,执行一些操作并返回一个列表(或标量值).我想使用’define’定义函数.功能: 1)对输入列表执行操作 2)检查结果列表是否为空,如果列表为空则引发错误. 3)否则返回结果列表 这在C/C++等语言中很容易实现.当我尝试在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’中返回

解决方法

用户定义的宏必须是单个“表达式”.返回的值是扩展表达式的结果.您绝对不能在用户定义的宏中使用ifneq或变量赋值或其他类似的东西.

您可以创建一个与调用一起使用的makefile片段,但它只能与eval一起使用,这意味着它是makefile的一个单独部分,而不是通常定义的“函数”.

因此,如果您可以使用make函数构建用户定义的宏,以便扩展的结果是您想要的结果,那么您可以将其作为宏来实现;例如:

myfuntest = $(or $(filter %pattern,$(1)),$(error this is an error))

results := $(call myfuntest,foo barpattern biz baz)

如果过滤器的结果将是匹配单词的列表并且将分配给结果,否则它将运行错误函数.

但是,如果您的函数更复杂且无法以表达式格式表示,则必须使用eval,并传入要分配的变量的名称,如下所示:

define myfuntest
  ... compute fnames from $(2) ...
$(1) := $$(fnames)
endef

在使用eval和一起调用时,你必须非常小心$vs. $$.然后你调用它:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读