在gmake中,如何在不再次调用的情况下重用函数的结果?

In gmake, how to reuse the results of a function without calling it again?

考虑以下 GNUmakefile:

V=  $(shell set -x; date)

all:
    @echo 1 $V
    @echo 2 $V
    @echo 3 $V

如果你 运行 它,可以看到 shell 宏被调用了三次——调用了三个独立的 shells,每个调用 date(1).

虽然我明白,为什么这在一些情况下可能有用,但在其他情况下却很浪费。

我如何才能引用先前调用宏的结果 -- 而不会导致它每次都被再次调用?

注意,这似乎是 GNU-make 特有的。例如,BSD 的 make 看似等效的构造只调用了一次 shell,无论您以后重用该变量多少次:

V!= set -x; date

all:
    @echo 1 $V
    @echo 2 $V
    @echo 3 $V

嗯,答案是 GNU make 中的 = 不等同于 BSD make 中的 !=。 GNU make 中的运算符 = 等同于 BSD make 中的 = 运算符。

如果您只想评估一次,也可以使用 the := operator in GNU make. Or, if you have GNU make 4.0 or above, it supports the BSD-style != operator