Условное ИЛИ в 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

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


person Gui13    schedule 16.05.2011    source источник
comment
ifeq stackoverflow.com/questions/7656425/makefile-ifeq-logical-or   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 24.06.2016


Ответы (5)


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

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

endif

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

person Jerome    schedule 16.11.2012
comment
Нииииис, так понятнее. Я не знал о or. - person Gui13; 16.12.2012
comment
Я переключился на ваш ответ, потому что он семантически точно решает мою проблему. - person Gui13; 23.12.2016

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

...тогда...

ifeq ($(VERBOSE),1)
#Conditional stuff
endif
person Rich    schedule 28.05.2014

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

ifneq "$(strip $(VERBOSE) $(V))" ""
[be verbose]
endif
person Beta    schedule 16.05.2011

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

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

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

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

person Community    schedule 16.05.2011
comment
Как насчет ifdef V \ VERBOSE=v \ endif, а все остальное оставить как есть? - person Beta; 16.05.2011
comment
@Бета тоже неплохо! Но твой ответ мне нравится больше. - person Gui13; 17.05.2011

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

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

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

person John    schedule 28.10.2015
comment
Он предлагает большую гибкость, за исключением того, что он ограничивает вас использованием конкретной оболочки, для которой вы его кодируете (в вашем случае BASH). - person villapx; 25.04.2016