在我的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
这也很难看。还有更优雅的选择吗?
答案 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),)