使用if inside宏

时间:2017-01-23 09:29:25

标签: makefile gnu-make

我想写一个函数,根据参数返回不同的值。 我写过:

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 中包含函数调用,但是缺少分隔符错误。

3 个答案:

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