Подтвердить что ты не робот

Условное ИЛИ в make файле

Я хотел бы включить подробный компиляции в моем make файле, но я не могу понять, как сделать условный OR.

Позвольте мне объяснить: я хочу, чтобы указать подробную компиляцию, установив V=1 или VERBOSE=1. Я хочу сохранить VERBOSE=1 доступным, потому что у нас есть некоторые скрипты, которые его используют (и использовать другие make файлы, которые знают только VERBOSE)

Таким образом, результат должен состоять в том, что эти две команды одинаковы:

make all VERBOSE=1 # pain to write
make all V=1

Теперь мой make файл выглядит так:

ifdef VERBOSE
[issue compilation commands with verbose mode]
endif

То, что я хотел бы достичь, близок к препроцессору в C:

if defined(VERBOSE) || defined(V)
[issue compilation commands with verbose mode]
endif

Вы знаете, как это сделать?

4b9b3361

Ответ 1

Мне нравится следующее:

ifneq "$(or $(LINUX_TARGET),$(OSX_TARGET))" ""

endif

Как и для метода $(strip), но используя более интуитивно понятное ключевое слово $(или

Ответ 2

Насколько я знаю, условный материал в GNU make не допускает OR и ANDS. Вы всегда можете сделать что-то вроде:

ifdef VERBOSE
DOVERBOSE = yes
endif
ifdef V
DOVERBOSE = yes
endif

ifeq( $DOVERBOSE, yes )
    main verbose stuff here
endif

но я не понимаю, почему вам нужно сначала ввести (вряд ли самодокументирующее) определение V.

Ответ 3

Мне нравится подход Нила Баттерворта, но если вы действительно хотите сделать это в описываемом вами стиле, это даст вам OR:

ifneq "$(strip $(VERBOSE) $(V))" ""
[be verbose]
endif

Ответ 4

VERBOSE := $(or $(VERBOSE),$(V))

... затем...

ifeq ($(VERBOSE),1)
#Conditional stuff
endif

Ответ 5

Хорошо, очень поздно для вечеринки, но я наткнулся на это и хотел добавить другое решение для других, которые искали, как добавить логику в make файлы: в основном, делать логику в оболочке и получать выход таким образом.

ifneq ( $(shell ( [ $(VERBOSE) ] || [ $(V) ] ) && echo y ),)

кажется более запутанным, но если у вас есть оператор if с множеством ands и ors, это обеспечивает большую гибкость и будет легче читать, чем вложенные операторы $(и.. $(или...)).