Complex conditions check in Makefile

2019-01-16 20:00发布

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 any 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?

标签: makefile
1条回答
beautiful°
2楼-- · 2019-01-16 20:25

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 as:

ifneq ($(call ifdef_any_of,VAR1 VAR2),)
ifeq ($(call ifndef_any_of,VAR1 VAR2),)
查看更多
登录 后发表回答