复杂条件检查Makefile

dma*_*a_k 24 makefile

在我的Makefile中,我想检查以下复杂情况:

ifdef VAR1 || VAR2 || VAR3
action
endif
Run Code Online (Sandbox Code Playgroud)

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

ifneq ($(VAR1)$(VAR2)$(VAR3),)
action
endif
Run Code Online (Sandbox Code Playgroud)

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

对于以下情况:

ifdef VAR1 && VAR2 && VAR3
action
endif
Run Code Online (Sandbox Code Playgroud)

一个人需要写

ifdef VAR1
ifdef VAR2
ifdef VAR3
action
endif
endif
endif
Run Code Online (Sandbox Code Playgroud)

这也很难看.还有更优雅的选择吗?

Ise*_*ria 32

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

ifdef VAR1 && VAR2 && VAR3
Run Code Online (Sandbox Code Playgroud)

可写成

ifneq ($(and $(VAR1),$(VAR2),$(VAR3)),)
Run Code Online (Sandbox Code Playgroud)

在相关的说明中,可能的make功能需要3.81或更高版本.

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

ifndef_any_of = $(filter undefined,$(foreach v,$(1),$(origin $(v))))
ifdef_any_of = $(filter-out undefined,$(foreach v,$(1),$(origin $(v))))
Run Code Online (Sandbox Code Playgroud)

那么以下条件:

ifdef VAR1 || VAR2
ifdef VAR1 && VAR2
Run Code Online (Sandbox Code Playgroud)

可分别写为:

ifneq ($(call ifdef_any_of,VAR1 VAR2),)
ifeq ($(call ifndef_any_of,VAR1 VAR2),)
Run Code Online (Sandbox Code Playgroud)

  • 十分感谢!我最新了解`$(或......)`加上'$(和......)`. (2认同)