停止变量在Makefile目标中动态更改

时间:2014-02-25 10:11:35

标签: makefile target

我将以下Makefile放在 / tmp

VAR := $$(basename $$(pwd))

do:
        echo $(VAR) && cd /usr && echo $(VAR) && cd /usr/share && echo $(VAR)

运行它,我期待这个输出:

tmp
tmp
tmp

但是得到:

tmp
usr
share

如何让它给我以前的输出?

1 个答案:

答案 0 :(得分:3)

如果您想要make来评估值,则无法转义$。通过逃避它们,你已经要求shell进行评估。你要求shell运行这个命令:

echo $(basename $(pwd)) && cd /usr && echo $(basename $(pwd)) && cd /usr/share && echo $(basename $(pwd))

给出了你看到的输出:shell一次运行一个命令,所以前一个命令在下一个命令之前生效。如果要在shell脚本中获取一个值,可以使用:

VAR := $$(basename $$(pwd))

do:
        tmp=$(VAR); echo $$tmp && cd /usr && echo $$tmp && cd /usr/share && echo $$tmp

将shell变量tmp分配给您想要的值,然后在脚本中使用它。

或者,您可以将值计算到make变量中,并在任何地方使用它:

VAR := $(notdir $(CURDIR))

do:
        echo $(VAR) && cd /usr && echo $(VAR) && cd /usr/share && echo $(VAR)

(请注意,您没有在$的分配中转义VAR,因此这是使用make函数而不是shell命令。