В gmake, как повторно использовать результаты функции, не вызывая ее снова?

#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. Ура! Вот := оно что. Спасибо!