Есть ли логический оператор OR для "ifneq"?

Существует ли логический оператор OR для оператора ifneq... endif?

То есть, я не хотел бы выполнять некоторые инструкции, если определена переменная 'var1' или 'var2'. Что-то вроде этого:

ifneq ($(WNDAP660),y) OR $(WNADAP620),y))
...
endif

Я пробовал ifneq ($(WNDAP660),$(filter $(WNADAP620),y y)), но он не работает.

Ответ 1

Попробуйте следующее:

ifeq ($(filter y,$(WNDAP660) $(WNADAP620)),)
...
endif

Ответ 2

Существует ли логический оператор OR для 'ifneq'

НЕТ. Posix Make анемично. Для любого из них нет логического ИЛИ. См., Например, Логические И, ИЛИ, операторы XOR внутри условия ifeq... endif construct в списке рассылки GNU. Их просили на протяжении десятилетий (буквально).

Posix make почти бесполезен, и одной из первых вещей, которые вы обычно делаете в BSD-системе, является установка порта GNU Make (gmake), чтобы вы могли компилировать библиотеки и программы.

Если вы используете GNU Make, у вас есть другие варианты.

Один из вариантов - использовать математику оболочки для моделирования схемы. Например, из Crypto ++ GNUmakefile:

IS_DARWIN = $(shell uname -s | $(EGREP) -i -c "darwin")
GCC42_OR_LATER = $(shell $(CXX) -v 2>&1 | $(EGREP) -i -c "^gcc version (4\.[2-9]|[5-9])")
CLANG_COMPILER = $(shell $(CXX) --version 2>&1 | $(EGREP) -i -c "clang")

# Below, we are building a boolean circuit that says "Darwin && (GCC 4.2 || Clang)"
MULTIARCH_SUPPORT = $(shell echo $$(($(IS_DARWIN) * ($(GCC42_OR_LATER) + $(CLANG_COMPILER)))))
ifneq ($(MULTIARCH_SUPPORT),0)
  CXXFLAGS += -arch x86_64 -arch i386
else
  CXXFLAGS += -march=native
endif

При построении такой схемы используйте -c для grep и egrep для подсчета ударов. Затем используйте значения non-0 и 0. Это в случае, если что-то имеет значение, скажем, 2. Таким образом, тест выше ifneq ($(MULTIARCH_SUPPORT),0) (если не равен 0).

Другой альтернативой является использование GNU Make Standard Library. Он добавляет следующие операторы: not, and, or, xor, nand, nor или xnor в версию CVS.

Ответ 3

Сырой, но эффективный:

ifneq ($(WNDAP660),y) 
 ifneq ($(WNADAP620),y)
 ...
 endif
endif

Ответ 4

Я тестировал следующий код, который хорошо работает

ifeq ($(var1),value1) or ($(var2), value2)
   #do something here
endif