#makefile #gnu-make
Вопрос:
Рассмотрим приведенное ниже GNUmakefile
:
V= $(shell set -x; date)
all:
@echo 1 $V
@echo 2 $V
@echo 3 $V
Если вы запустите его, shell
можно будет увидеть, как макрос-вызывается три раза-вызываются три отдельные оболочки, каждая из которых вызывает дату(1).
Хотя я понимаю, почему это может быть полезно в некоторых случаях, в других это довольно расточительно.
Как я могу ссылаться на результаты более раннего вызова макроса, не вызывая его повторного вызова каждый раз?
Обратите внимание, что это, по-видимому, относится конкретно к GNU-make. Кажущаяся эквивалентной конструкция BSD make, например, вызывает оболочку только один раз, независимо от того, сколько раз вы будете использовать переменную позже:
V!= set -x; date
all:
@echo 1 $V
@echo 2 $V
@echo 3 $V
Ответ №1:
Ну, ответ в том, что =
в GNU make это не эквивалентно !=
BSD make. Оператор =
в GNU make эквивалентен =
оператору в BSD make.
Если вы хотите оценить вещи только один раз, используйте :=
оператор в GNU make. Или, если у вас есть GNU make 4.0 или выше, он также поддерживает оператор в стиле BSD !=
.
Комментарии:
1. Ура! Вот
:=
оно что. Спасибо!