2011-11-28 115 views
10

'ifneq ... endif'语句是否存在逻辑OR运算符?'ifneq'是否存在逻辑OR运算符?

也就是说,如果定义了变量'var1'或'var2',我不想执行一些语句。这样的事情:

ifneq ($(WNDAP660),y) OR $(WNADAP620),y)) 
... 
endif 

我试过ifneq ($(WNDAP660),$(filter $(WNADAP620),y y)),但它不工作。

+1

你可能想的和,而不是OR,不是吗?如果你写了'y!= WNDAP660 || y!= WNADAP620',那么至少有一个,也可能两个选择都是真的,所以总是会采取行动。 –

+0

[Makefile ifeq logical or]可能重复(http://stackoverflow.com/questions/7656425/makefile-ifeq-logical-or) –

+0

较旧的重复项:* [复杂条件检查Makefile](http:// stackoverflow。 COM /问题/ 5584872 /复杂的条件,办理登机手续,生成文件)*。 –

回答

8

试试这个:

ifeq ($(filter y,$(WNDAP660) $(WNADAP620)),) 
... 
endif 
+0

你能解释我吗?假设我想要ifeq($(WNDAP660),y)或$(WNADAP620),y))那么我该怎么做? –

+1

只是否定条件:'ifneq($(filter y,$(WNDAP660)$(WNADAP620)),)' –

+0

如果您的任何变量设置为“y”,则filter将返回它们,比如说如果它们中没有一个被设置,则对于单个设置变量,“Y”,对于两个设置变量都设置为“YY”。 –

2

原油,但有效:

ifneq ($(WNDAP660),y) 
ifneq ($(WNADAP620),y) 
... 
endif 
endif 
3

是否有逻辑OR运算符为 'ifneq'

NO。 Posix Make是贫血的。他们中没有任何逻辑OR。例如,请参阅GNU make邮件列表上的Logical AND, OR, XOR operators inside ifeq ... endif construct condition。他们已被要求数十年(字面上)。

Posix make几乎是无用的,你通常在BSD系统上做的第一件事情是安装GNU Make(gmake)端口,以便编译库和程序。

如果您使用的是GNU Make,那么您还有其他选择。

一种替代方法是使用壳数学来模拟电路。例如,下面是从Crypto++'sGNUmakefile

IS_DARWIN = $(shell uname -s | $(EGREP) -i -c "darwin") 
GCC42_OR_LATER = $(shell $(CXX) -v 2>&1 | $(EGREP) -i -c "^gcc version (4\.[2-9]|[5-9])") 
CLANG_COMPILER = $(shell $(CXX) --version 2>&1 | $(EGREP) -i -c "clang") 

# Below, we are building a boolean circuit that says "Darwin && (GCC 4.2 || Clang)" 
MULTIARCH_SUPPORT = $(shell echo $$(($(IS_DARWIN) * ($(GCC42_OR_LATER) + $(CLANG_COMPILER))))) 
ifneq ($(MULTIARCH_SUPPORT),0) 
    CXXFLAGS += -arch x86_64 -arch i386 
else 
    CXXFLAGS += -march=native 
endif 

当建立这样的电路,可使用用于-cgrepegrep计数命中。然后使用non-00值。这是在某种情况下,例如,价值为2。这就是为什么上面的测试是ifneq ($(MULTIARCH_SUPPORT),0),如果不等于0)。

另一种选择是使用GNU Make Standard Library。它将以下运算符添加到CVS版本中:not,and,or,xor,nand,nor,xnor。

0

我已经测试了下面的代码,效果很好

ifeq ($(var1),value1) or ($(var2), value2) 
    #do something here 
endif 
+0

忽略了我在Fedora上的GNU make 4.1中的第二个条件 –