Я пишу общие make-файлы и функции для удобства пользователей, поэтому, естественно, они должны иметь максимально простой интерфейс.При определении функций я использую эту парадигму:
define FUNCTION
target: $1
endef
FUNCTION2 = $(eval $(call FUNCTION,$1))
Теперь вместо того, чтобы сказать им сделать это
$(eval $(call FUNCTION,
аргумент ))
Я могу сказать имсделать это
$(call FUNCTION2,
аргумент )
, что проще.
Это работало как заклинание, пока кто-то не решил использовать .EXPORT_ALL_VARIABLES
, так что у нас общий код (SSCCE) выглядит следующим образом:
define FUNCTION
target: $1
endef
FUNCTION2 = $(eval $(call FUNCTION,$1))
.EXPORT_ALL_VARIABLES:
all:
echo OK
Теперь, когда вы make
это, вы получите:
Makefile:5: *** prerequisites cannot be defined in recipes. Stop.
Ну, я думаю, это потому, что подпроцесс echo
рецепта оценивает "переменную" FUNCTION2
, которая затем неожиданно помещает строку предварительных условий в рецепт.Или что-то типа того.
Итак, мой вопрос: кто виноват?
Моя парадигма неверна, и я не должен ее использовать, потому что пользователи тогда не могут использовать .EXPORT_ALL_VARIABLES
?Если да, есть ли способ исправить ситуацию, чтобы пользователи все еще могли вызывать простой FUNCTION2
?
Или .EXPORT_ALL_VARIABLES
злая особенность и не должна использоваться?