Условное ИЛИ в 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
Ты знаешь как это сделать?
5 ответов
Я делаю так:
ifneq "$(or $(LINUX_TARGET),$(OSX_TARGET))" ""
endif
Аналогично подходу $(strip, но с использованием более интуитивного $ (или ключевого слова)
VERBOSE := $(or $(VERBOSE),$(V))
...затем...
ifeq ($(VERBOSE),1)
#Conditional stuff
endif
Насколько я знаю, условные вещи в GNU make не позволяют использовать OR и ANDS. Вы всегда можете сделать что-то вроде:
ifdef VERBOSE
DOVERBOSE = yes
endif
ifdef V
DOVERBOSE = yes
endif
ifeq( $DOVERBOSE, yes )
main verbose stuff here
endif
но я не понимаю, зачем вам сначала вводить (вряд ли самодокументированное) определение V.
Мне нравится подход Нила Баттерворта, но если вы действительно хотите сделать это в описанном вами стиле, это даст вам ИЛИ:
ifneq "$(strip $(VERBOSE) $(V))" ""
[be verbose]
endif
Хорошо, очень поздно для вечеринки, но я столкнулся с этим и хотел добавить другое решение для других, которые искали, как добавить логику в make-файлы: в основном, делать логику в оболочке и получать вывод таким образом.
ifneq ( $(shell ( [ $(VERBOSE) ] || [ $(V) ] ) && echo y ),)
это кажется более запутанным, но если у вас есть оператор if со многими ands и ors, это обеспечивает большую гибкость и будет легче читать, чем вложенные операторы $(и.. $(или...)).