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
。