在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。
考虑以下 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。