8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

echo 中的 Makefile 变量赋值错误

Karson Jo 2月前

28 0

我有这样的 make 文件目标foo: i = 1 @echo $(i) 当我运行这样的 make 文件时:$ make foo i = 1make: i: 未找到命令Makefile:2: 目标“foo”的配方失败make...

我已经像这样制作文件目标

foo: 
    i = 1
    @echo $(i)

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

$ make foo 

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

但如果我在作业中没有留空格(即

i=1

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

帖子版权声明 1、本帖标题:echo 中的 Makefile 变量赋值错误
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Karson Jo在本站《docker》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 参数 i = 运行命令 2 。shell 中的正确赋值 在等号两边没有空格。

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

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

    还请注意,我们需要将美元符号加倍,以防止 make 对其进行解释;以及 在 shell 中正确使用引号括住字符串。 (在这个特定情况下,我们知道字符串不包含任何 shell 元字符;但许多初学者也会遇到这个问题。)

    另外,GNU Make 允许您指定 .ONESHELL ,强制在单个 shell 实例中评估配方中的所有命令;

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

    (命令替换,尝试运行命令 $(i) 并将其标准输出插入到下一步将执行的命令行的一部分)和 i (变量插值,也可以写成 ${i} 之间的区别 $i 使用圆括号来表示 make 确实令人困惑 make ;但同样,这是一个 shell 变量。简而言之,前面带有制表符的所有内容都由 shell 进行评估(但如果它包含 make 变量,或者在 GNU Make 中,包含函数调用,则将首先评估这些变量)。

  • 另外,不要在 makefile 中乱放 @,尤其是在调试时。一旦它工作正常,如果你不想看到它在做什么,可以用 make -s 运行它

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

    如果您想要一个内部变量, Makefile 则应该设置不带前导空格/制表符。

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

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

  • 不,使用您的语法 echo ${i} 和 echo $(i) 仍然没有给出输出。我没有看到 1 打印在标准输出中。

返回
作者最近主题: