2011-04-07 62 views
15

查一下我的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 

这也是难看。有更多优雅的替代品吗?

+0

相关(不重复):* [在Makefile中大于字符串比较](http:// stackoverflow.com/questions/3437160)* – 2016-06-27 10:58:16

回答

18

如果您make是GNU的品牌和所有定义的变量包括非空间 字符,

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 

可以分别被写为:

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

太好了,谢谢!学习'$(或...)'加'$(和...)'的新内容。 – 2011-04-08 11:36:17

+0

我很高兴它帮助:-) – 2011-04-08 13:39:37

+0

@dma_k:对不起,可能以前的答案有点冗长。我编辑了答案。 – 2011-04-09 12:08:46