Сделать файл 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']

581   5  

5 ответов:

Как найдено в архиве списка рассылки,

можно использовать фильтр

 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

    Ничего не найдено.