开发者

Complex conditions check in Makefile

In my Makefile I would like to check the following complex condition:

ifdef VAR1 || VAR2 || VAR3
action
endif

however the documentation says the syntax like that is not supported. So the only simple workaround that came to my mind is to use the concatenation:

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

Are there an开发者_运维百科y other more correct solutions?

For the following case:

ifdef VAR1 && VAR2 && VAR3
action
endif

one need to write

ifdef VAR1
ifdef VAR2
ifdef VAR3
action
endif
endif
endif

which is also ugly. Are there more elegant alternatives?


If your make is GNU-make and all the defined variables include a non-space character,

ifdef VAR1 && VAR2 && VAR3

can be written as

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

On a related note, probably and function requires version 3.81 or later.

In case some defined variables may be empty strings, if we prepare the following functions:

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

then the following conditions:

ifdef VAR1 || VAR2
ifdef VAR1 && VAR2

can be written respectively using call function:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜