Makefile的变量赋值

Makefile的变量赋值,makefile,gnu-make,Makefile,Gnu Make,我看到了一个问题: 然后我做了如下工作: 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

我看到了一个问题:

然后我做了如下工作:

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'
这样的句子不是变量赋值。 你们两个帮了我大忙。谢谢你的回答

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

配方中的每一行都在自己的shell中执行。因此,在取消注释目标“all”的4行之后,运行shell 5次,在第一次运行中设置的环境变量在第二次运行中将不会出现,以此类推

资料来源:

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

配方中的每一行都在自己的shell中执行。因此,在取消注释目标“all”的4行之后,运行shell 5次,在第一次运行中设置的环境变量在第二次运行中将不会出现,以此类推

来源:

这些行

HELLO='hello 3rd'
不是(生成)变量赋值,而是规则操作中的行

表示变量必须位于行的开头

正如您所写的,
HELLO=…
行只是操作行。在这些情况下,命令
HELLO='HELLO 3rd'
在一个新的shell中设置shell变量
HELLO
,然后该变量立即退出(如回答形式@sergei kurenkov所述,每一行在不同的shell中执行)。

这些行如下

HELLO='hello 3rd'
不是(生成)变量赋值,而是规则操作中的行

表示变量必须位于行的开头


正如您所写的,
HELLO=…
行只是操作行。在这些情况下,命令
HELLO='HELLO 3rd'
在一个新的shell中设置shell变量
HELLO
,然后该变量立即退出(正如回答表单@sergei kurenkov所提到的,每一行都在不同的shell中执行)。

练习:你能看到为什么
HELLO='HELLO 3rd';echo$(你好);echo$$HELLO
输出它的功能?输出是
HELLO 3rd
,一个空行
echo$$HELLO
等于
echo$('HELLO 3rd')
我指的是你对
HELLO
的定义。第一个
$(HELLO)
是一个makefile变量,make将其扩展为
HELLO第二个
——但是
$$HELLO
包含make变量
$
,该变量扩展为
$
,因此make将此行扩展为
HELLO='HELLO第三个';回声你好2;echo$HELLO
这三个命令的序列就是它在shell中执行的。此时,shell(1)定义变量
HELLO
,然后(2)回显两个文本参数
HELLO
2nd
,然后(3)将shell变量
$HELLO
展开为
HELLO 3rd
,并打印该变量。因此
hello 2nd
然后
hello 3rd
。练习:你能明白为什么
hello='hello 3rd';echo$(你好);echo$$HELLO
输出它的功能?输出是
HELLO 3rd
,一个空行
echo$$HELLO
等于
echo$('HELLO 3rd')
我指的是你对
HELLO
的定义。第一个
$(HELLO)
是一个makefile变量,make将其扩展为
HELLO第二个
——但是
$$HELLO
包含make变量
$
,该变量扩展为
$
,因此make将此行扩展为
HELLO='HELLO第三个';回声你好2;echo$HELLO
这三个命令的序列就是它在shell中执行的。此时,shell(1)定义变量
HELLO
,然后(2)回显两个文本参数
HELLO
2nd
,然后(3)将shell变量
$HELLO
展开为
HELLO 3rd
,并打印该变量。因此
hello 2nd
然后
hello 3rd