代码之家  ›  专栏  ›  技术社区  ›  rubo77

在gnu Makefile中组合多个ifeq和ifneq

  •  1
  • rubo77  · 技术社区  · 8 年前

    如果语法是

    ifeq ($(VAR1),some-string)
    

    结合

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

    再加上一些。。。

    有一条班轮吗?喜欢(幻想曲):

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

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

    2 回复  |  直到 8 年前
        1
  •  3
  •   Renaud Pacalet    8 年前

    不,没有 and 条件的运算符(但是 可以在条件语句中使用的函数)。这个 if , or 条件函数认为空字符串为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 ,
    • 否则的价值 变量1 .

    所以,当且仅当 VAR1 == some-string . 同样适用于 NOMATCH1 :

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

    正常1 当且仅当 VAR2 != some-other-string .

    现在,可以使用条件函数来表示主条件:

    ifeq ($(or $(MATCH1),$(MATCH2),...),)
      ifneq ($(and $(NOMATCH1),$(NOMATCH2),...),)
    <do something>
      endif
    endif
    
        2
  •  0
  •   Zelnes    8 年前
    # 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)
    

    虽然它仅限于没有任何空格的值,但它是有效的。此外,它只检查和条件。

    你仍然可以改善你的需要