Рассмотрим следующий Makefile.
$(shell touch /tmp/example.txt)
FILE := /tmp/example.txt
CONTENTS = $(shell cat $(FILE); bash -c 'echo [debugging id: $$RANDOM]')
.PHONY: all
all:
@cat $(FILE)
@echo '$$(CONTENTS):' $(CONTENTS)
bash -c 'echo file-contents-$$RANDOM' > $(FILE)
@cat $(FILE)
@echo '$$(CONTENTS):' $(CONTENTS) # This line outputs the old contents. Why?
Он печатает содержимое файла, перезаписывает новое содержимое и снова печатает содержимое. Показывается как (после второго выстрела make
):
file-contents-1543
$(CONTENTS): file-contents-1543 [debugging id: 15172]
bash -c 'echo file-contents-$RANDOM' > /tmp/example.txt
file-contents-22441
$(CONTENTS): file-contents-1543 [debugging id: 151]
Старое содержимое - file-contents-1543
, новое - file-contents-22441
(числа случайные), но последняя строка echo $(CONTENTS)
не печатает новое содержимое.
Я думаю, что команда фактически вызывается дважды, как показывают идентификаторы отладки, но функция оболочки в переменной lazy, кажется, выполняется перед записью нового содержимого в файл.
Я ожидаю, что ленивая переменная в Makefile оценивается каждый раз, когда на нее ссылаются, команда echo $(CONTENTS)
всегда печатает самое последнее содержимое файла. В чем я не прав?
Кстати, я обнаружил, что использование CONTENTS = $$(cat $(FILE))
работает, как я ожидал. Я буду использовать это вместо функции оболочки, но это нормально?