Makefile ifeq逻辑或

时间:2011-10-05 03:33:43

标签: makefile

如何使用make的ifeq运算符执行逻辑OR?

例如,我有(简化):

ifeq ($(GCC_MINOR), 4)
    CFLAGS += -fno-strict-overflow
endif
ifeq ($(GCC_MINOR), 5)
    CFLAGS += -fno-strict-overflow
endif

但想巩固这些界限。

(是的,是的,autotools,configure等等;对于当前的情况太过苛刻,想在这里保留Makefile中的所有内容)

[与此问题完全相反:How to Use of Multiple condition in 'ifeq' statement]

7 个答案:

答案 0 :(得分:81)

如邮件列表档案中所示,

可以使用过滤器功能。

例如

 ifeq ($(GCC_MINOR),$(filter $(GCC_MINOR),4 5))

过滤器X,A B 将返回等于X的A,B的那些。

这是一个变种

 ifneq (,$(filter $(GCC_MINOR),4 5))

其中使用与空字符串的负比较(如果GCC_MINOR与参数不匹配, filter 将返回空字符串)

这些方法的缺点是参数必须是单个词。

答案 1 :(得分:23)

您可以引入另一个变量。它并没有巩固两个检查,但它至少避免了必须将身体放入两次:

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

答案 2 :(得分:12)

我认为没有一种简洁明智的方法可以做到这一点,但是有冗长,明智的方式(例如Foo Bah's)和简洁的,病态的方式,例如

ifneq (,$(findstring $(GCC_MINOR),4-5))
    CFLAGS += -fno-strict-overflow
endif

(如果字符串$(GCC_MINOR)出现在字符串4-5中,它将执行命令。)

答案 3 :(得分:6)

这里有更灵活的变体:它使用外部shell,但允许检查任意条件:

ifeq ($(shell test ".$(GCC_MINOR)" = .4  -o  \
                   ".$(GCC_MINOR)" = .5  -o  \
                   ".$(TODAY)"     = .Friday  &&  printf "true"), true)
    CFLAGS += -fno-strict-overflow
endif

答案 4 :(得分:0)

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

但你必须使用可移植的非贫血make,如GNU make(gmake),而不是Posix的make

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

答案 5 :(得分:0)

如果您希望在逻辑上“或”几个布尔标志一起,一个实用的技巧可以是简单地让字符串连接:如果最终结果是一个空字符串,然后没有一个选项是真的,else非空然后至少其中一个被启用:

# Use `docker build --pull` in case either `PULL=whatever` is set OR if the `CI` environment variable is present.
ifneq ($(PULL)$(CI),)
PULL_OR_NOT := --pull
endif

build:
    docker build $(PULL_OR_NOT)

答案 6 :(得分:0)

请注意,replace 将捕获根本未定义 GCC_MINOR 的情况。

如果您想捕获 GCC_MINOR==4 或 GCC_MINOR==5,这将起作用:

ifeq ($(GCC_MINOR),$(filter $(GCC_MINOR),4 5))