如何使用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]
答案 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
我实际上在我的代码中使用相同的内容,因为我不想保持单独的config
或Configure
。
但你必须使用可移植的非贫血make
,如GNU make(gmake
),而不是Posix的make
。
它没有解决逻辑AND
和OR
的问题。
答案 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))