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'语句中使用多个条件 ]

正如邮件列表存档一样,

可以使用过滤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 

我实际上在我的代码中使用相同的,因为我不想保持一个单独的configConfigure

但是你必须使用一种便携式,非贫血的产品,比如GNU make( gmake ),而不是Posix的产品。

它并没有解决逻辑ANDOR的问题。