Makefile ifeq логический или
Как вы выполняете логическое ИЛИ, используя оператор make ifeq
?
например, я (упрощен):
ifeq ($(GCC_MINOR), 4)
CFLAGS += -fno-strict-overflow
endif
ifeq ($(GCC_MINOR), 5)
CFLAGS += -fno-strict-overflow
endif
но хотел бы объединить эти строки.
(да, да, autotools, configure и т.д., слишком тяжелый для текущей ситуации, хотел бы сохранить все в Makefile здесь)
[логическая противоположность этого вопроса: Как использовать множественное условие в выражении ifeq]
Ответы
Ответ 1
Как указано в архиве списка рассылки,
можно использовать функцию фильтра.
Например
ifeq ($(GCC_MINOR),$(filter $(GCC_MINOR),4 5))
фильтр X, A B вернет те из A, B, которые равны X.
Это изменение
ifneq (,$(filter $(GCC_MINOR),4 5))
где вместо этого используется отрицательное сравнение с пустой строкой (фильтр будет возвращать пустую строку, если GCC_MINOR не соответствует аргументам)
Недостатком этих методов являются аргументы должны быть одиночными словами.
Ответ 2
Вы можете ввести другую переменную. Он не объединяет обе проверки, но, по крайней мере, избегает необходимости вставлять тело в два раза:
do_it =
ifeq ($(GCC_MINOR), 4)
do_it = yes
endif
ifeq ($(GCC_MINOR), 5)
do_it = yes
endif
ifdef do_it
CFLAGS += -fno-strict-overflow
endif
Ответ 3
Я не думаю, что там есть краткий, разумный способ сделать это, но есть многословные, разумные способы (такие как Foo Bah's) и лаконичные, патологические способы, такие как
ifneq (,$(findstring $(GCC_MINOR),4-5))
CFLAGS += -fno-strict-overflow
endif
(который выполнит команду при условии, что строка $(GCC_MINOR) появится внутри строки 4-5).
Ответ 4
Здесь более гибкий вариант: он использует внешнюю оболочку, но позволяет проверять произвольные условия:
ifeq ($(shell test ".$(GCC_MINOR)" = .4 -o \
".$(GCC_MINOR)" = .5 -o \
".$(TODAY)" = .Friday && printf "true"), true)
CFLAGS += -fno-strict-overflow
endif
Ответ 5
ifeq ($(GCC_MINOR), 4)
CFLAGS += -fno-strict-overflow
endif
ifeq ($(GCC_MINOR), 5)
CFLAGS += -fno-strict-overflow
endif
В этом случае вы можете использовать следующее:
GCC42_OR_LATER = $(shell $(CXX) -v 2>&1 | $(EGREP) -c "^gcc version (4.[2-9]|[5-9])")
# -Wstrict-overflow: http://www.airs.com/blog/archives/120
ifeq ($(GCC42_OR_LATER),1)
CFLAGS += -Wstrict-overflow
endif
Я действительно использую то же самое в своем коде, потому что я не хочу поддерживать отдельный config
или Configure
.
Но вы должны использовать переносимый, неанемический make
, такой как GNU make (gmake
), а не Posix make
.
И он не затрагивает проблему логических AND
и OR
.