Как функция eval может использоваться в makefile?
в руководстве:
функция eval очень особенная: она позволяет вам определить новое конструкции makefile, которые не являются постоянными; которые являются результатом оценка других переменных и функций. Аргумент функции eval функция расширяется, затем результаты этого расширения анализируются как синтаксис файла Makefile.
важно понимать, что аргумент eval расширяется дважды; сначала функцией eval, затем результатами этого расширение расширяется снова, когда они анализируются как синтаксис makefile. Это означает тебя. может потребоваться предоставить дополнительные уровни экранирования для символов"$", когда использование eval.
"расширенный дважды" меня смущает.
например, я создаю makefile:
define func
tmp = $(OBJPATH)/$(strip )
objs += $$(tmp)
$$(tmp) :
gcc $$^ -o $$@
endef
all : foo
$(eval $(call func, foo, 1.c))
как будет расширена функция eval ?
1 ответов
самый простой способ понять это-заменить eval на info:
$(info $(call func, foo, 1.c))
это отобразит в качестве вывода результат первого расширения, поэтому вы можете увидеть, что make на самом деле будет разбором. Вы не предоставили значения для переменной OBJPATH, но если это было obj
например, тогда в вашем случае первое расширение (функции вызова) приводит к:
tmp = obj/foo
objs += $(tmp)
$(tmp) : 1.c
gcc $^ -o $@
затем анализатор make оценит это, и в процессе он снова расширит его, поэтому такие вещи, как $(tmp)
расширяются.