'ifneq'是否存在逻辑OR运算符?
'ifneq ... endif'语句是否存在逻辑OR运算符?'ifneq'是否存在逻辑OR运算符?
也就是说,如果定义了变量'var1'或'var2',我不想执行一些语句。这样的事情:
ifneq ($(WNDAP660),y) OR $(WNADAP620),y))
...
endif
我试过ifneq ($(WNDAP660),$(filter $(WNADAP620),y y))
,但它不工作。
试试这个:
ifeq ($(filter y,$(WNDAP660) $(WNADAP620)),)
...
endif
你能解释我吗?假设我想要ifeq($(WNDAP660),y)或$(WNADAP620),y))那么我该怎么做? –
只是否定条件:'ifneq($(filter y,$(WNDAP660)$(WNADAP620)),)' –
如果您的任何变量设置为“y”,则filter将返回它们,比如说
原油,但有效:
ifneq ($(WNDAP660),y)
ifneq ($(WNADAP620),y)
...
endif
endif
是否有逻辑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
当建立这样的电路,可使用用于-c
和grep
egrep
计数命中。然后使用non-0
和0
值。这是在某种情况下,例如,价值为2
。这就是为什么上面的测试是ifneq ($(MULTIARCH_SUPPORT),0)
(,如果不等于0)。
另一种选择是使用GNU Make Standard Library。它将以下运算符添加到CVS版本中:not,and,or,xor,nand,nor,xnor。
我已经测试了下面的代码,效果很好
ifeq ($(var1),value1) or ($(var2), value2)
#do something here
endif
忽略了我在Fedora上的GNU make 4.1中的第二个条件 –
你可能想的和,而不是OR,不是吗?如果你写了'y!= WNDAP660 || y!= WNADAP620',那么至少有一个,也可能两个选择都是真的,所以总是会采取行动。 –
[Makefile ifeq logical or]可能重复(http://stackoverflow.com/questions/7656425/makefile-ifeq-logical-or) –
较旧的重复项:* [复杂条件检查Makefile](http:// stackoverflow。 COM /问题/ 5584872 /复杂的条件,办理登机手续,生成文件)*。 –