Как функция 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) расширяются.