【问题标题】:Makefile variable assignment error in echo回显中的Makefile变量赋值错误
【发布时间】:2017-02-10 11:03:52
【问题描述】:

我有这样的文件目标

foo: 
    i = 1
    @echo $(i)

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

$ make foo 

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

但是如果我在赋值中不给空格(即)

i=1

那么没有错误但没有输出,i的值没有打印出来

【问题讨论】:

    标签: makefile


    【解决方案1】:

    第一次尝试运行带有参数=2 的命令i。在 shell 中正确的赋值有no spaces on either side of the equals sign.

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

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

    还要注意我们如何需要将美元符号加倍以防止make 解释它们;和 proper use of quotes around strings in the shell.(在这种特殊情况下,我们知道字符串不包含任何 shell 元字符;但许多初学者也遇到了这个问题。)

    GNU Make 也允许您指定 .ONESHELL,这会强制在单个 shell 实例中对配方中的所有命令进行评估;

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

    【讨论】:

      【解决方案2】:

      在第一种情况下,您指示 make 运行 shell 命令:i = 1

      如果你想在Makefile 中添加一个变量,你应该设置没有前导空格/制表符。

      我假设您使用 GNU 的 make 并且您想检查 Recipe Syntax(或类似的其他 makes):

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

      【讨论】:

      • 谢谢。如何打印 i 的值?
      • echo ${i},正如你所写:)
      • 不,它仍然没有使用您的语法 echo ${i} 和 echo $(i) 提供输出。我没有看到标准输出中打印的 1。
      • 你的Makefile是什么?
      • foo: i=1 @echo $(i)
      猜你喜欢
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多