echo中的Makefile变量赋值错误

时间:2017-02-10 11:03:52

标签: makefile

我制作了像这样的文件目标

foo: 
    i = 1
    @echo $(i)

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

$ make foo 

i = 1
make:i:找不到命令
Makefile:2:目标配方#foo'失败
make:[foo]错误127

但是,如果我没有在作业中给出空格(即)

i=1

然后没有错误但没有输出,i的值不打印

2 个答案:

答案 0 :(得分:2)

在第一种情况下,您指示var iframe = document.getElementById('iframeid'); iframe.src = iframe.src; 运行shell命令:make

如果您想要i = 1内的变量,则应设置不带前导空格/制表符。

我假设您使用的是GNU的Makefile,并且您想要检查Recipe Syntax(或其他make的类似内容):

  

“规则上下文”中的变量定义,由选项卡缩进   作为第一个字符,将被视为一部分   recipe,而不是make变量定义,并传递给shell。

答案 1 :(得分:0)

首次尝试运行带有参数i=的命令2。外壳中的适当分配具有no spaces on either side of the equals sign.

您的第二个问题是,在两条物理线上的配方将运行两个不相关的Shell实例。第一个将变量设置为值,然后退出并丢失该变量。第二个无关的实例不知道第一个实例是做什么的,当然也没有任何变量分配的痕迹。解决此问题的方法是将这两条逻辑上合并为一行(只要它们之间有分号,您仍然可以将这些行拆分为几条物理行):

foo: 
    i=1; \
    echo "$${i}"

还请注意我们需要如何使美元符号加倍,以防止make对其进行解释;并在外壳中正确使用引号引起来。 (在这种特殊情况下,我们知道该字符串不包含任何shell元字符;但是许多初学者也偶然发现了此字符。)

GNU Make或者允许您指定.ONESHELL,这将强制在单个shell实例中对配方中的命令进行全部评估;

.ONESHELL:
foo: 
    i=1
    echo "$${i}"