Makefile ifeq逻辑或
你如何使用make的ifeq
操作符执行逻辑OR?
例如,我有(简化):
ifeq ($(GCC_MINOR), 4) CFLAGS += -fno-strict-overflow endif ifeq ($(GCC_MINOR), 5) CFLAGS += -fno-strict-overflow endif
但是想巩固这些路线。
(是的,是的,autotools,configuration等等,对于目前的情况来说太沉重了,想把所有的东西放在Makefile里面)
[这个问题的逻辑对立: 如何在'ifeq'语句中使用多个条件 ]
正如邮件列表存档一样,
- http://osdir.com/ml/gnu.make.windows/2004-03/msg00063.html
- http://osdir.com/ml/gnu.make.general/2005-10/msg00064.html
可以使用过滤function。
例如
ifeq ($(GCC_MINOR),$(filter $(GCC_MINOR),4 5))
filterX,AB将返回等于X的A,B的那些。
这是一个变化
ifneq (,$(filter $(GCC_MINOR),4 5))
如果使用空string进行否定比较(如果GCC_MINOR与参数不匹配,则filter将返回空string)
这些方法的缺点是参数必须是单个单词。
你可以引入另一个variables。 它并没有巩固两个检查,但至less避免了必须把身体两次:
do_it = ifeq ($(GCC_MINOR), 4) do_it = yes endif ifeq ($(GCC_MINOR), 5) do_it = yes endif ifdef do_it CFLAGS += -fno-strict-overflow endif
我不认为有一个简洁明智的方法来做到这一点,但是有详细的,明智的方式(如Foo Bah)和简洁的病理方式,比如
ifneq (,$(findstring $(GCC_MINOR),4-5)) CFLAGS += -fno-strict-overflow endif
(如果string$(GCC_MINOR)出现在string4-5内,它将执行该命令)。
这里更灵活的变体:它使用shell,但允许检查任意条件:
ifeq ($(shell test ".$(GCC_MINOR)" = .4 -o \ ".$(GCC_MINOR)" = .5 -o \ ".$(TODAY)" = .Friday && printf "true"), true) CFLAGS += -fno-strict-overflow endif
ifeq ($(GCC_MINOR), 4) CFLAGS += -fno-strict-overflow endif ifeq ($(GCC_MINOR), 5) CFLAGS += -fno-strict-overflow endif
另外你可以考虑在这种情况下使用的是:
GCC42_OR_LATER = $(shell $(CXX) -v 2>&1 | $(EGREP) -c "^gcc version (4.[2-9]|[5-9])") # -Wstrict-overflow: http://www.airs.com/blog/archives/120 ifeq ($(GCC42_OR_LATER),1) CFLAGS += -Wstrict-overflow endif
我实际上在我的代码中使用相同的,因为我不想保持一个单独的config
或Configure
。
但是你必须使用一种便携式,非贫血的产品,比如GNU make( gmake
),而不是Posix的产品。
它并没有解决逻辑AND
和OR
的问题。