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.