Makefile ifeq逻辑或

Pat*_*Pat 83 makefile

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

例如,我有(简化):

ifeq ($(GCC_MINOR), 4)
    CFLAGS += -fno-strict-overflow
endif
ifeq ($(GCC_MINOR), 5)
    CFLAGS += -fno-strict-overflow
endif
Run Code Online (Sandbox Code Playgroud)

但想巩固这些界限.

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

[与此问题逻辑相反:如何在'ifeq'语句中使用多个条件 ]

mis*_*_mp 89

如邮件列表档案中所示,

一个人可以使用过滤功能.

例如

 ifeq ($(GCC_MINOR),$(filter $(GCC_MINOR),4 5))
Run Code Online (Sandbox Code Playgroud)

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

这种变化是

 ifneq (,$(filter $(GCC_MINOR),4 5))
Run Code Online (Sandbox Code Playgroud)

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

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

  • 最后一点:在上面的两个变体中,如果$(GCC_MINOR)为空,则第一个将解析为真,而第二个则不会(因此第二个是通常更好的解决方案). (7认同)
  • 实际上,它应该是 `ifneq (,$(filter 4 5,$(GCC_MINOR)))` :) (3认同)
  • 也许为了简单而保持原样更好? (2认同)

Foo*_*Bah 25

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

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
Run Code Online (Sandbox Code Playgroud)

  • 大规模的可维护性对我来说似乎并不是很好:/然后,一旦我们开始谈论规模,我想我们正在谈论autotools (5认同)
  • @Pat:我更喜欢这种方法,我可以在 Makefile 的一个地方将分配分开,可能会使用 ifeq/else ifeq/else 与更多值进行比较,而不是使用过滤器功能,这可能会使非常长的难以阅读的行. (3认同)

rua*_*akh 14

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

ifneq (,$(findstring $(GCC_MINOR),4-5))
    CFLAGS += -fno-strict-overflow
endif
Run Code Online (Sandbox Code Playgroud)

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

  • 无论好坏(可能更糟),只是我正在寻找的那种肮脏的黑客; 谢谢 (3认同)

sqr*_*163 7

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

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