Условное ИЛИ в 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, это обеспечивает большую гибкость и будет легче читать, чем вложенные операторы $(и.. $(или...)).

Другие вопросы по тегам