Условное ИЛИ в make-файле
-
14-11-2019 - |
Вопрос
Я хотел бы включить подробную компиляцию в моем 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
Знаете ли вы, как это сделать?
Решение
Мне нравится это:
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 со множеством операторов and и or, это обеспечивает большую гибкость и его будет легче читать, чем вложенные $(и ..Операторы $(или ...)) .