Условное ИЛИ в make-файле - PullRequest
13 голосов
/ 16 мая 2011

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

Позвольте мне объяснить: я хочу иметь возможность указать компиляцию verbose , установив 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 ]

13 голосов
/ 16 ноября 2012

Мне нравится вот что:

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

endif

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

5 голосов
/ 28 мая 2014
VERBOSE := $(or $(VERBOSE),$(V))

... тогда ...

ifeq ($(VERBOSE),1)
#Conditional stuff
endif
4 голосов
/ 16 мая 2011

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

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

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

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

3 голосов
/ 16 мая 2011

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

ifneq "$(strip $(VERBOSE) $(V))" ""
[be verbose]
endif
0 голосов
/ 28 октября 2015

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

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

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

...