Сделать файл 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']
5 ответов:
Как найдено в архиве списка рассылки,
- http://osdir.com/ml/gnu.make.windows/2004-03/msg00063.html
- http://osdir.com/ml/gnu.make.general/2005-10/msg00064.html
можно использовать фильтр
ifeq ($(GCC_MINOR),$(filter $(GCC_MINOR),4 5))фильтр X, A B вернет те из A, B, которые равны X.
вариант этого
ifneq (,$(filter $(GCC_MINOR),4 5))где вместо этого используется отрицательное сравнение с пустой строкой (фильтр вернет En пустую строку, если gcc_minor не соответствует аргументам)
недостатком этих методов является то, что аргументы должны быть одиночными словами.
вы можете ввести другую переменную. Он не консолидирует обе проверки, но по крайней мере избегает необходимости дважды вставлять тело:
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
Я не думаю, что есть краткий, разумный способ сделать это, но есть многословные, разумные способы (такие как Foo Bah) и краткие, патологические способы, такие как
ifneq (,$(findstring $(GCC_MINOR),4-5)) CFLAGS += -fno-strict-overflow endif(который будет выполнять команду при условии, что строка $(GCC_MINOR) появляется внутри строки 4-5).
здесь более гибкий вариант: он использует внешнюю оболочку, но позволяет проверить произвольные условия:
ifeq ($(shell test ".$(GCC_MINOR)" = .4 -o \ ".$(GCC_MINOR)" = .5 -o \ ".$(TODAY)" = .Friday && printf "true"), true) CFLAGS += -fno-strict-overflow endif
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), и не .и это не решает проблему логического
ANDиOR.
Comments