Я озадачен разницей между функцией «shell
» MAKE и «$$
». В документации я считаю:
Функция оболочки принимает один аргумент, который расширяется (как и все аргументы) и передается субоболочке для исполнения. Стандартный вывод команды затем считывается и возвращается как значение функции.
Я полагал, что это был именно , что "$$" делает так, однако в этом небольшом примере:
a = $(shell find . -maxdepth 1 -type f -name "Makefile")
b = $$(find . -maxdepth 1 -type f -name "Makefile")
.PHONY: all A B
all: A B
A: $(a)
@echo "Target: $(@)"
@echo "Prereq: $(<)"
@echo "Var a: $(a)"
@echo "Var b: $(b)"
B: $(b)
@echo "Target: $(@)"
@echo "Prereq: $(<)"
@echo "Var a: $(a)"
@echo "Var b: $(b)"
Выходом является следующее:
Target: A
Prereq: Makefile
Var a: ./Makefile
Var b: ./Makefile
make: *** No rule to make target '$(find)', needed by 'B'. Stop.
Примечание здесь говорится: «Нет правила делать цель '$ (найти)'", как будто аргумент еще не был расширен. (Я также попытался сделать переменную просто расширенной, «b:=$$(...)
», но это ничего не изменило).
Я надеюсь, что у кого-то есть знания, чтобы подробнее рассказать об этом, что для меня кажется тонкой разницей, но, вероятно, гораздо более глубокой, чем я могу понять в это время.
Благодарим вас за подробный ответ, пример отличный.Должен признаться, что для того, чтобы заставить переменные переменные всегда были для меня несколько волшебными. –