Как сделать условную отладку в make - PullRequest
0 голосов
/ 30 сентября 2019

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

ifdef DEBUG_XX
define info_xx
$$(info XX $(1))
endef
else
info_xx :=
endif

some_var := 1
$(info def:$(call info_xx, called: some_var:$(some_var)))
$(call info_xx,called: some_var:$(some_var))

all:

Так, что мое сообщение появляется тогда и только тогда, когда определено DEBUG_XX. К сожалению, вышеприведенное выдает ошибку:

make-lib> make -f test.mk DEBUG_XX=y
def:$(info XX  called: some_var:1)
test.mk:11: *** missing separator.  Stop.

Кажется, что он оценивает вывод $(info), что не имеет особого смысла для меня ... Чего мне не хватает?

1 Ответ

0 голосов
/ 30 сентября 2019

Ошибка из-за двойного доллара перед «info», что является ошибкой: строка внутри «define» / «endef» сохраняется как литерал, который раскрывается только в операциях подстановки.

Однако, IMO, лучше переписать ваш код следующим образом:

info_xx=$(if $(DEBUG_XX),$(info XX $1))

Также обратите внимание, что:

$(info def:$(call info_xx, called: some_var:$(some_var)))

напечатает

XX called: some_var:1
def:

Это связано с тем, что расширение аргумента (то есть «вызов», а затем 2-я «информация») выполняется до того, как у 1-й «информации» будет возможность напечатать что-либо.

Вы можете исправить это с помощью info_xx=$(if $(DEBUG_XX),XX $1). Но тогда чистый $(call info_xx,called: some_var:$(some_var)), очевидно, приведет к ошибке.

...