在gnu Makefile中组合多个ifeq和ifneq

时间:2018-07-25 11:39:29

标签: makefile

如果语法类似于

,如何添加多个选择
ifeq ($(VAR1),some-string)

组合
ifneq ($(VAR2),some-other-string)

结合更多...

有一个班轮吗?像(幻想代码):

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

我发现this answer不清楚,因为ifeq语句中没有方程式。

2 个答案:

答案 0 :(得分:3)

否,条件语句没有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)

NOMATCH1将仅在VAR2 != some-other-string中为非空。

现在,您的主要条件可以使用条件函数表示:

ifeq ($(or $(MATCH1),$(MATCH2),...),)
  ifneq ($(and $(NOMATCH1),$(NOMATCH2),...),)
<do something>
  endif
endif

答案 1 :(得分: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条件。

您仍然可以改善自己的需求