Makefile 在gnu生成文件中组合多个ifeq和ifneq

Makefile 在gnu生成文件中组合多个ifeq和ifneq,makefile,Makefile,如果语法如下,如何添加多个选择 ifeq ($(VAR1),some-string) 结合 ifneq ($(VAR2),some-other-string) 再加上一些 有一艘班轮吗?比如(幻想代码): 我发现这对我来说并不清楚,因为在ifeq语句中没有等式。不,没有条件的和操作符(但是有一个和函数可以在条件中使用)。如果,和和或条件函数,认为空字符串是false,其他任何东西都是真的(包括只包含空格的字符串)。答案中的第一个建议测试变量是否为空字符串。第二个测试是否定义了变量。在这两种情

如果语法如下,如何添加多个选择

ifeq ($(VAR1),some-string)
结合

ifneq ($(VAR2),some-other-string)
再加上一些

有一艘班轮吗?比如(幻想代码):


我发现这对我来说并不清楚,因为在ifeq语句中没有等式。

不,没有条件的
操作符(但是有一个
函数可以在条件中使用)。<代码>如果,<代码>和和条件函数,认为空字符串是false,其他任何东西都是真的(包括只包含空格的字符串)。答案中的第一个建议测试变量是否为空字符串。第二个测试是否定义了变量。在这两种情况下,它都不会测试它们的值是否等于引用字符串。这可能就是为什么你现在还不清楚的原因

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

ifeq ($(VAR1),some-string)
  ifneq ($(VAR2),some-other-string)
<do something>
  endif
endif
变量
MATCH1
将取值:

  • NO
    如果
    VAR1
    未定义,则为空字符串或空格字符串
  • 空字符串,如果它等于某个字符串
  • 否则,
    VAR1
    的值
  • 因此,当且仅当
    VAR1==some string
    时,它将是空字符串。与NOMATCH1相同

    MOMATCH1 := $(if $(strip $(VAR2)),$(patsubst some-other-string,,$(VAR2)),NO)
    
    NOMATCH1
    当且仅当
    VAR2!=其他一些字符串

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

    ifeq ($(or $(MATCH1),$(MATCH2),...),)
      ifneq ($(and $(NOMATCH1),$(NOMATCH2),...),)
    <do something>
      endif
    endif
    
    ifeq($(或$(匹配1),$(匹配2),…),)
    ifneq($(和$(NOMATCH1),$(NOMATCH2),…),)
    恩迪夫
    恩迪夫
    
    虽然它仅限于没有任何空格的值,但它是有效的。而且,它只检查和设置条件


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

    您可以缩进,但为了避免问题,请使用空格,而不是制表符。制表符由make解释为配方行的主要字符。因此,在我的Makefile中,我可以仅用空格来索引ifeq,在Makefile后面的内容中,我也用制表符缩进了,这有问题吗?如果不是,为什么不呢?也许您可以在我的Makefile上启动PR以正确添加缩进?:)很抱歉,我的评论不够清晰:如果愿意,您可以使用制表符缩进条件语句本身,但请注意这个条件嵌套中最里面的make语句。用制表符缩进可能会导致意外结果(错误)。在GitHub上,这些语句只是变量赋值,而不是生成规则。即使使用制表符缩进,也应该可以。@rubo77:我只是更好地查看了您的GitHub存储库。小心,make永远不会使用
    SITE.mk
    Makefile的第86行(
    glion\u SITE\u PACKAGES+=-ffffffm button bind
    ),因为它包含的两个嵌套条件是互斥的。。。可能不是你想要的。谢谢,你说得对。我怎么能把我的两个谎言合二为一呢?我不能在$()中使用shell活动吗?
    MOMATCH1 := $(if $(strip $(VAR2)),$(patsubst some-other-string,,$(VAR2)),NO)
    
    ifeq ($(or $(MATCH1),$(MATCH2),...),)
      ifneq ($(and $(NOMATCH1),$(NOMATCH2),...),)
    <do something>
      endif
    endif
    
    # 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)