Ответ 1
Попробуйте следующее:
ifeq ($(filter y,$(WNDAP660) $(WNADAP620)),)
...
endif
Существует ли логический оператор OR для оператора ifneq... endif?
То есть, я не хотел бы выполнять некоторые инструкции, если определена переменная 'var1' или 'var2'. Что-то вроде этого:
ifneq ($(WNDAP660),y) OR $(WNADAP620),y))
...
endif
Я пробовал ifneq ($(WNDAP660),$(filter $(WNADAP620),y y))
, но он не работает.
Попробуйте следующее:
ifeq ($(filter y,$(WNDAP660) $(WNADAP620)),)
...
endif
Существует ли логический оператор 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.
Сырой, но эффективный:
ifneq ($(WNDAP660),y)
ifneq ($(WNADAP620),y)
...
endif
endif
Я тестировал следующий код, который хорошо работает
ifeq ($(var1),value1) or ($(var2), value2)
#do something here
endif