复杂条件检查Makefile

时间:2011-04-07 17:07:23

标签: makefile

在我的Makefile中,我想检查以下复杂情况:

ifdef VAR1 || VAR2 || VAR3
action
endif

然而文档说不支持这样的语法。因此,我想到的唯一简单的解决方法是使用连接:

ifneq ($(VAR1)$(VAR2)$(VAR3),)
action
endif

还有其他更正确的解决方案吗?

对于以下情况:

ifdef VAR1 && VAR2 && VAR3
action
endif

需要写

ifdef VAR1
ifdef VAR2
ifdef VAR3
action
endif
endif
endif

这也很难看。还有更优雅的选择吗?

1 个答案:

答案 0 :(得分:30)

如果make是GNU-make,并且所有定义的变量都包含非空格 字符,

ifdef VAR1 && VAR2 && VAR3

可以写成

ifneq ($(and $(VAR1),$(VAR2),$(VAR3)),)

在相关说明中,and函数可能需要3.81或更高版本。

如果某些已定义的变量可能是空字符串, 如果我们准备以下功能:

ifndef_any_of = $(filter undefined,$(foreach v,$(1),$(origin $(v))))
ifdef_any_of = $(filter-out undefined,$(foreach v,$(1),$(origin $(v))))

然后是以下条件:

ifdef VAR1 || VAR2
ifdef VAR1 && VAR2

可以使用call函数分别编写:

ifneq ($(call ifdef_any_of,VAR1 VAR2),)
ifeq ($(call ifndef_any_of,VAR1 VAR2),)