2011-11-28 45 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中的第二個條件 –