在GNU Makefile中合并多个ifeq和ifneq

6
如果语法如下,我该如何添加多个选择项?
ifeq ($(VAR1),some-string)

与之结合
ifneq ($(VAR2),some-other-string)

结合更多的内容……

有没有一个一行代码的解决方案?就像(幻想代码):

ifeq $VAR1=some-string and not $VAR2=some-other-string

我发现了这个答案,但是其中的ifeq语句没有方程式,让我感到困惑。

2个回答

9
不,条件语句中没有and运算符(但可以在条件语句中使用and函数)。ifandor条件函数认为空字符串为false,其他任何内容都为true(包括只包含空格的字符串)。你找到的答案中的第一个建议测试变量是否为空字符串。第二个建议测试变量是否定义。在这两种情况下,它都不测试它们的值是否等于参考字符串。这可能是你不明白原因的原因。
在你的(简单)情况下,你可以嵌套条件语句。
ifeq ($(VAR1),some-string)
  ifneq ($(VAR2),some-other-string)
<do something>
  endif
endif

只有当两个条件都满足时,<do something> 才会被执行。
对于有许多条件的复杂情况,您可以计算各个匹配变量:
MATCH1 := $(if $(strip $(VAR1)),$(patsubst some-string,,$(VAR1)),NO)

变量MATCH1将取以下值:

  • NO如果VAR1未定义,为空字符串或为空格字符串,
  • 空字符串如果它等于some-string,
  • 否则为VAR1的值。

因此,当且仅当VAR1 == some-string时,它将是空字符串。对于NOMATCH1也是如此:

MOMATCH1 := $(if $(strip $(VAR2)),$(patsubst some-other-string,,$(VAR2)),NO)

如果VAR2 != some-other-string, 则NOMATCH1将不为空。现在,您可以使用条件函数来表达您的主要条件:
ifeq ($(or $(MATCH1),$(MATCH2),...),)
  ifneq ($(and $(NOMATCH1),$(NOMATCH2),...),)
<do something>
  endif
endif

2
你可以缩进,但为了避免问题,请使用空格而不是制表符。制表符会被make解释为配方行的前导字符。 - Renaud Pacalet
在我的Makefile中,我可以只使用空格缩进ifeq吗?https://github.com/freifunk-kiel/site-ffki/blob/nightly/site.mk#L84,在该Makefile的后续内容中,我也使用了制表符缩进,这是个问题吗?如果不是,为什么?如果可以的话,也许你可以开始一个PR来正确添加缩进? :) - rubo77
1
抱歉,我的注释没有表达清楚:你可以使用缩进来缩进条件语句,但是对于这个嵌套的条件语句中最内层的 make 语句要小心。使用制表符进行缩进可能会导致意外的结果(错误)。在你在 GitHub 上的情况下,这些语句只是变量赋值,而不是 make 规则。即使使用制表符缩进,应该也没问题。 - Renaud Pacalet
@rubo77:我刚刚仔细查看了你的GitHub存储库。小心,你的site.mk Makefile的第86行(GLUON_SITE_PACKAGES += -ffffm-button-bind)将永远不会被make使用,因为它所包含的两个嵌套条件是相互排斥的...这可能不是你想要的。 - Renaud Pacalet
太好了!+1 我会尝试的。 - rubo77
显示剩余2条评论

0
# Param 1 : Thing to do
# Param 2: VAR VALUE VAR1 VALUE1 VAR2 VALUE2 ...
# Each param VAR/VALUE must be space separated
define rec_check
    $(if $(strip $(2)),$(if $(findstring _$($(word 1,$(2)))_,_$(word 2,$(2))_),$(call rec_check,$(1),$(subst $(word 1,$(2)) $(word 2,$(2)),,$(2)))),$(1))
endef

# Usage :
# MY_VAR=ok
# MY_VAR2=ok
# $(call rec_check,echo "It works",MY_VAR ok MY_VAR2 ok)
# $(call rec_check,echo "It does not work",MY_VAR ok MY_VAR2 ok2)

虽然它仅限于没有空格的值,但它可以工作。此外,它仅检查AND条件。

您仍然可以根据需要进行改进。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接