Makefile ifeq логично или - PullRequest
       2

Makefile ifeq логично или

81 голосов
/ 05 октября 2011

Как выполнить логическое ИЛИ, используя оператор make * ifeq?

Например, у меня есть (упрощенно):

ifeq ($(GCC_MINOR), 4)
    CFLAGS += -fno-strict-overflow
endif
ifeq ($(GCC_MINOR), 5)
    CFLAGS += -fno-strict-overflow
endif

, но я хотел бы объединить эти строки.

(да, да, автоинструмент, конфигурация и т. Д.; Слишком сложный для текущей ситуации, хотел бы хранить здесь все в Makefile)

[логическая противоположность этого вопроса: Как использовать множественное условие в выражении 'ifeq' ]

Ответы [ 5 ]

81 голосов
/ 21 марта 2012

Как указано в архиве списка рассылки,

можно использовать фильтр функция.

Например,

 ifeq ($(GCC_MINOR),$(filter $(GCC_MINOR),4 5))

фильтр X, AB вернет те из A, B, которые равны X.

AВариант:

 ifneq (,$(filter $(GCC_MINOR),4 5))

, где вместо этого используется отрицательное сравнение с пустой строкой ( filter вернет пустую строку, если GCC_MINOR не соответствует аргументам)

Недостатком этих методов является то, что аргументами должны быть отдельные слова.

23 голосов
/ 05 октября 2011

Вы можете ввести другую переменную.Он не объединяет обе проверки, но по крайней мере избавляет от необходимости помещать тело дважды:

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
13 голосов
/ 05 октября 2011

Я не думаю, что есть краткий, разумный способ сделать это, но есть подробные, разумные способы (такие как Фу Баха) и краткие, патологические способы, такие как

ifneq (,$(findstring $(GCC_MINOR),4-5))
    CFLAGS += -fno-strict-overflow
endif

(которая выполнит команду при условии, что строка 4 (GCC_MINOR) появится внутри строки 4-5).

6 голосов
/ 29 сентября 2016

Здесь более гибкий вариант: он использует внешнюю оболочку, но позволяет проверять произвольные условия:

ifeq ($(shell test ".$(GCC_MINOR)" = .4  -o  \
                   ".$(GCC_MINOR)" = .5  -o  \
                   ".$(TODAY)"     = .Friday  &&  printf "true"), true)
    CFLAGS += -fno-strict-overflow
endif
0 голосов
/ 08 июня 2015
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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...