我想写一个函数,根据参数返回不同的值。 我写过:
define function
ifeq($(1),a)
aaaa
else
bbbb
endif
endef
$(info MSG: $(call function,a))
我得到输出:
MSG: ifeq(a,a)
aaaa
else
bbbb
endif
这是函数的整体而不是 aaaa 。
我应该如何重写函数或更改调用它的方式才能从匹配的if分支中获取文本?
更新: 此外,我试图在 eval 中包含函数调用,但是缺少分隔符错误。
答案 0 :(得分:2)
使用filter-out
比使用filter
两次更容易:
$(if $(filter-out $(1),$(2)),bbbb,aaaa)
(注意我必须反转条件的两条腿,因为filter-out
会在它们不匹配时给出输出(因此if
为“真”)。
答案 1 :(得分:0)
我想出了这样一个决定。也许不是很优雅,但它仍然能满足我的需求:
txtcmp = $(and $(filter $(1),$(2)),$(filter $(2),$(1)))
define function
$(if $(call txtcmp,$(1),a),aaaa,bbbb)
endef
$(info MSG: $(call function,b))
答案 2 :(得分:0)
考虑到txtcmp
的实现,如果两个参数相等,则需要一个函数来测试。如果是,则返回一个值,否则返回另一个值。
您的解决方案看起来不错,但可以稍微改进一下:
function = $(if $(call txtcmp,$(1),a),aaaa,bbbb)
注意,还有另一个文本搜索功能 - findstring
。使用它而不是filter
会产生稍微不同的结果:
txtcmp = $(and $(filter $(1),$(2)),$(filter $(2),$(1)))
function = $(if $(call txtcmp,$(1),a),aaaa,bbbb)
$(info MSG: $(call function,b))
$(info MSG: $(call function,a))
$(info MSG: $(call function, a))
txtcmp = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
$(info MSG: $(call function,b))
$(info MSG: $(call function,a))
$(info MSG: $(call function, a))
运行上面的makefile将输出:
MSG: bbbb
MSG: aaaa
MSG: aaaa
MSG: bbbb
MSG: aaaa
MSG: bbbb
make: *** No targets. Stop.