Проверка сложных условий в Makefile

В моем 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

который также является уродливым. Есть ли более элегантные альтернативы?

Ответ 1

Если ваш make является GNU-make и все определенные переменные содержат непробельный символ,

ifdef VAR1 && VAR2 && VAR3

можно записать как

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

На связанной ноте, вероятно, и функция требует версию 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

может быть написано соответственно с помощью функции вызова:

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