Makefile 中赋值变量时出现的 echo 错误

5
我已经创建了如下的makefile目标:
foo: 
    i = 1
    @echo $(i)

当我像这样运行make文件时:
$ make foo 

i = 1
make: i:未找到命令
Makefile:2:针对目标“foo”的配方失败
make:[foo] 错误127

但如果我在赋值中没有加空格(即)

i=1

然后没有错误,但没有输出,i的值未打印。
2个回答

8
第一次尝试运行i命令,参数为=2。在shell中进行适当的赋值,等号两侧没有空格。参考此处。 你的第二个问题是,如果一个命令跨越两行,则会运行两个不相关的shell实例。第一个设置变量的值,然后退出并且失去了该变量。第二个不相关的实例不知道第一个实例所做的,并且当然也没有该变量的分配。解决方法是将其逻辑上合并成一个单行(您仍然可以将该行分成多个物理行,只要它们之间有分号即可)。
foo: 
    i=1; \
    echo "$${i}"

请注意,我们需要将美元符号加倍,以防止make解释它们; 以及在shell中字符串周围引用的正确使用方法。 (在这种特定情况下,我们知道该字符串不包含任何shell元字符; 但许多初学者也会遇到此问题。)
GNU Make还允许您指定.ONESHELL,它强制执行配方中的命令在单个shell实例中全部评估。
.ONESHELL:
foo: 
    i=1
    echo "$${i}"

不要在调试时在你的 makefile 中乱用 @。一旦它能正常工作,如果你不想看到它的操作过程,可以使用 make -s 运行它。 - tripleee

4
在第一种情况下,您指示 make 运行一个shell命令: i = 1
如果您想在 Makefile 中使用变量,则应该不带前导空格/制表符进行设置。
我假设您使用GNU的 make 并且想要检查 Recipe Syntax (或其他 make ):

在以制表符作为第一个字符缩进的“规则上下文”中定义的变量将被视为配方的一部分,而不是make变量定义,并传递给shell。


谢谢。如何打印i的值? - Ibrahim Quraish
echo ${i},就像你写的一样 :) - uzsolt
不,使用您的语法echo ${i}和echo $(i)仍未输出结果。我没有看到1被打印在stdout中。 - Ibrahim Quraish
你的 Makefile 是什么? - uzsolt
不,不是在开头,也不是作为一个make变量。抱歉,这个Windows系统不允许正确的格式。我已经在目标foo下声明了i=1,没有任何空格。 - Ibrahim Quraish
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接