配方中的立即变量扩展

Immediate variable expansion in recipe

我正在制作构建系统,我需要在目标配方中立即进行变量扩展。

我的(简化的)makefile:

VAR=one

all:
    @echo one is $(VAR)

VAR=two

当我 运行 make 输出是:

one is two

输出是预期的(配方中的延迟扩展)但不是期望的。

使其工作的一种方法是遵循 makefile。然而,这使得配方总是被执行,而不是期望的:

VAR=one

all: $(VAR)
    @echo one is $(VAR)

$(VAR):
    $(eval VAR=$@)

VAR=two

有人吗?

你可以用这样的东西来得到你想要的。它使用 target-specific variable values 在解析时捕获变量。

$ cat Makefile
VAR=one

all: tgtone tgttwo

tgtone: VAR:=$(VAR)
tgtone:
        @echo $@: VAR is $(VAR)

tgttwo:
        @echo $@: VAR is $(VAR)

VAR=two
$ make
tgtone: VAR is one
tgttwo: VAR is two