【问题标题】:Complex conditions check in MakefileMakefile 中的复杂条件检查
【发布时间】:2011-04-07 17:07:23
【问题描述】:

在我的 Makefile 中,我想检查以下复杂条件:

ifdef VAR1 || VAR2 || VAR3
action
endif

但是文档说不支持这样的语法。所以我想到的唯一简单的解决方法是使用串联:

ifneq ($(VAR1)$(VAR2)$(VAR3),)
action
endif

还有其他更正确的解决方案吗?

对于以下情况:

ifdef VAR1 && VAR2 && VAR3
action
endif

需要写

ifdef VAR1
ifdef VAR2
ifdef VAR3
action
endif
endif
endif

这也很丑陋。还有更优雅的选择吗?

【问题讨论】:

标签: makefile


【解决方案1】:

如果您的 make 是 GNU-make 并且所有定义的变量都包含非空格 性格,

ifdef VAR1 && VAR2 && VAR3

可以写成

ifneq ($(and $(VAR1),$(VAR2),$(VAR3)),)

在相关说明中,and 函数可能需要 3.81 或更高版本。

如果某些定义的变量可能是空字符串, 如果我们准备以下函数:

ifndef_any_of = $(filter undefined,$(foreach v,$(1),$(origin $(v))))
ifdef_any_of = $(filter-out undefined,$(foreach v,$(1),$(origin $(v))))

那么以下条件:

ifdef VAR1 || VAR2
ifdef VAR1 && VAR2

可以分别使用call函数编写:

ifneq ($(call ifdef_any_of,VAR1 VAR2),)
ifeq ($(call ifndef_any_of,VAR1 VAR2),)

【讨论】:

  • 太好了,谢谢!对我来说是新的了解$(or ...) 加上$(and ...)
  • @dma_k:抱歉,之前的回答可能有点冗长。我编辑了答案。
  • 你能解释一下foreach v 部分吗?
  • 如果语法类似于ifeq ($(VAR1),some-string)结合ifeq ($(VAR2),some-other-string),我该如何添加多项选择
  • @rubo77:对于foreach 功能,this document 会有所帮助。 v 是任意名称。它可以是wx 或其他任何名称,只要它与origin $(v) 中的名称匹配即可。
猜你喜欢
  • 2014-11-04
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
相关资源
最近更新 更多