Makefile的变量赋值

时间:2017-05-17 16:58:37

标签: makefile gnu-make

我看到了这个问题:

makefile-variable-assignment

然后我做了如下:

HELLO='hello 1st'
HELLO_WORLD='$(HELLO) world!'
HELLO='hello 2nd'

all :
    echo $(HELLO_WORLD)
    HELLO='hello 3rd'
    echo $(HELLO_WORLD)
    HELLO='hello 4th'
    echo $(HELLO_WORLD)

结果是:

root@ubuntu:~# make all -s
hello 2nd world!
hello 2nd world!
hello 2nd world!

我很困惑,为什么'HELLO'的值不是hello 4th而是hello 2nd

更新

我更新了我的代码:

HELLO='hello 1st'
HELLO_WORLD='$(HELLO) world!'
HELLO='hello 2nd'

all :
    HELLO='hello 3rd' &&  echo $(HELLO_WORLD)
    HELLO='hello 4th' &&  echo $(HELLO_WORLD)

结果:

root@ubuntu:~# make all -s 
hello 2nd world!
hello 2nd world!

我已经意识到像HELLO='hello 3rd'这样的句子最终不是变量赋值。 你们两个帮了我很多忙。谢谢你的回答!

2 个答案:

答案 0 :(得分:2)

这样的行
HELLO='hello 3rd'

不是(make)变量赋值,而是规则操作中的行。

relevant section of the make manual表示变量必须位于行的开头。

正如您所写,HELLO=...行只是行动路线。在这些情况下,命令HELLO='hello 3rd'在新shell中设置 shell 变量HELLO,然后立即退出(作为@ sergei-kurenkov提到的答案形式,每行都是在另一个shell中执行。)

答案 1 :(得分:0)

  

为什么终端打印不是hello 4th world而是hello 2nd world

食谱中的每一行都在自己的shell中执行。因此,在您取消注释4行之后,对于目标“all”,您将运行shell 5次,并且在第一次运行中设置的环境变量将不会在第二次运行中看到,等等。

来源:http://www.gnu.org/software/make/manual/html_node/Execution.html#Execution