在 gnu Makefile 中组合多个 ifeq 和 ifneq

rub*_*o77 4 makefile

如果语法类似于,如何添加多个选择

ifeq ($(VAR1),some-string)
Run Code Online (Sandbox Code Playgroud)

结合

ifneq ($(VAR2),some-other-string)
Run Code Online (Sandbox Code Playgroud)

再加上一些……

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

ifeq $VAR1=some-string and not $VAR2=some-other-string
Run Code Online (Sandbox Code Playgroud)

我发现这个答案我不清楚,因为那里的 ifeq 语句中没有等式。

Ren*_*let 6

不,and条件没有运算符(但有一个and可以在条件中使用的函数)。的ifand并且or有条件的功能考虑空字符串是错误的,并且别的为真(只包含空格包括字符串)。您找到的答案中的第一个建议测试变量是否为空字符串。第二个测试是否定义了变量。在这两种情况下,它都不会测试它们的值是否等于引用字符串。这可能是您没有立即清楚的原因。

在您的(简单)情况下,您可以嵌套条件:

ifeq ($(VAR1),some-string)
  ifneq ($(VAR2),some-other-string)
<do something>
  endif
endif
Run Code Online (Sandbox Code Playgroud)

<do something> 当且仅当两个条件通过时才会考虑。

对于具有许多条件的复杂情况,您可以计算单个匹配变量:

MATCH1 := $(if $(strip $(VAR1)),$(patsubst some-string,,$(VAR1)),NO)
Run Code Online (Sandbox Code Playgroud)

变量MATCH1将取值:

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

因此,当且仅当 为空字符串VAR1 == some-string。同样适用于NOMATCH1

MOMATCH1 := $(if $(strip $(VAR2)),$(patsubst some-other-string,,$(VAR2)),NO)
Run Code Online (Sandbox Code Playgroud)

NOMATCH1当且仅当 为非空VAR2 != some-other-string

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

ifeq ($(or $(MATCH1),$(MATCH2),...),)
  ifneq ($(and $(NOMATCH1),$(NOMATCH2),...),)
<do something>
  endif
endif
Run Code Online (Sandbox Code Playgroud)

  • 您可以缩进,但为了避免出现问题,请使用空格,而不是制表符。制表符被 make 解释为配方行的主角。 (2认同)