Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top